import pytest from unittest.mock import patch from datetime import date from db import db from workers.google_campaigns_worker import GoogleCampaignsWorker from utils.snowflake.google_data.models import ( LinkfireLink, GoogleCampaignModel, GRASCampaignNetworkType, GRASCampaignUrl ) from tests.delphi_tables.utils import ( Verifier, Requests, provider_id_from_account, label_id_from_account, objective_from_from_bid_type, campaign_types_from_from_network_type, ) from tests.delphi_tables.models import ExternalCampaignModel from tests import BaseTestCase, mock from tests.test_utils import FixtureLoader from models import models from tests.delphi_tables.fixtures.delphi_tables_fixture import fixture from migrations.fixtures.delphi_tables.v9.data_migrator import DataMigrator from migrations.fixtures.delphi_tables.views import DelphiViewsV9 from migrations.fixtures.delphi_tables.v9.tables import DelphiTables @patch("auth.atlas.atlas_token_decoder.jwt.decode", mock.jwt_decode) class TestExternalCampaignsTable(BaseTestCase): def setUp(self): super().setUp() self.verifier = Verifier(self) self.requests = Requests(self) self.restore_tables_and_triggers() def restore_tables_and_triggers(self): FixtureLoader(models=models).import_as_sql(fixture) DelphiViewsV9(db.session).create() delphi_tables = DelphiTables(db.session) delphi_tables.drop() delphi_tables.create() DataMigrator(db.session).execute() db.session.commit() def __campaign_model_from_gras_model( self, model: GoogleCampaignModel, source: str, is_pending: bool ) -> ExternalCampaignModel: types = campaign_types_from_from_network_type(model.types) return ExternalCampaignModel( id=f"{source}_{model.id}", name=model.name, start_date=model.start_date, end_date=model.end_date, spend=model.spend, budget=model.budget, provider=provider_id_from_account(str(model.account)), objective=objective_from_from_bid_type(model.bidding_type), category=types[0], subcategory=types[1], is_pending=is_pending, label=label_id_from_account(str(model.account)), ) def __default_campaign_model(self) -> GoogleCampaignModel: model = GoogleCampaignModel( id="10697529516", name="Chris Brown - CA (Go Crazy Video) - RT TVIS", bidding_type="cpv", types=[GRASCampaignNetworkType("YouTube Videos", "YouTube Videos")], genders=["Female", "Male", "Undetermined"], ages=["45-54", "35-44", "25-34", "55-64", "65 or more", "18-24", "Undetermined"], start_date=date(2020, 7, 29), end_date=date(2020, 8, 12), links=[GRASCampaignUrl("www.youtube.com/GoCrazy", ["https://www.youtube.com/watch?v=dPhwbZBvW2o"])], territories=[2124], account=8653387137, spend=1278.76, budget=1500.0, linkfire_links=[LinkfireLink(link_id="2b190f7c-cf68-4741-9c06-2718c473f6e5", link_url="lnk.to/Blink_182")], ) model.artists = ["GRAS_10", "GRAS_20"] return model def test_campaign_created_from_external_source_should_create_entity_in_campaigns_table(self): sut = GoogleCampaignsWorker() model = self.__default_campaign_model() sut.perform([model]) campaign = self.__campaign_model_from_gras_model(model, "google", False) self.verifier.verify_campaign(campaign) def test_pending_campaign_created_from_external_source_should_create_entity_in_campaigns_table(self): sut = GoogleCampaignsWorker() model = self.__default_campaign_model() model.artists = ["GRAS_990"] sut.perform([model]) campaign = self.__campaign_model_from_gras_model(model, "google", True) self.verifier.verify_campaign(campaign) @pytest.mark.skip(reason="Test skipped because Phase logic changed") def test_update_campaign_should_update_entity_in_campaigns_table(self): campaign = ExternalCampaignModel( id="facebook_123456789", name="Test Campaign 07", start_date=date(2020, 6, 29), end_date=date(2020, 7, 29), spend=1000, budget=2000, provider=2, objective=1, category=1, subcategory=7, is_pending=False, label=6, ) self.requests.update_campaign(502, 107, campaign) self.verifier.verify_campaign(campaign) def test_create_manual_campaign_should_not_create_entity_in_campaigns_table(self): campaign = ExternalCampaignModel( id="none", name="Test Campaign 01", start_date=date(2020, 6, 29), end_date=date(2020, 7, 29), spend=1000, budget=2000, provider=2, objective=1, category=1, subcategory=2, is_pending=False, label=1, ) self.requests.create_campaign(502, campaign) self.verifier.verify_campaign_not_exists(campaign)