"""Tests for marketing drivers model.""" from unittest.mock import patch from flexmock import flexmock import json import pytest from sales_goals.connectors import mysql from sales_goals.constants import models from sales_goals.logic import countries from sales_goals.models import marketing_drivers @pytest.fixture def marketing_driver_data(): """Dictionary with data suitable to create MarketingDriver object.""" return { 'value': 'Here are test marketing drivers', 'slogan': None, 'country_id': 1, 'country_name': 'USA', 'project_id': 1, } def test_marketing_driver_to_dict(test_database, marketing_driver_data): """Assert MarketingDriver object can convert itself to dict.""" marketing_driver_obj = marketing_drivers.MarketingDriver( **marketing_driver_data) with mysql.sales_goals_session_scope() as session: session.add(marketing_driver_obj) session.commit() marketing_driver_obj = session.query( marketing_drivers.MarketingDriver).first() marketing_driver_data['marketing_driver_id'] = 1 assert marketing_driver_obj.to_dict() == marketing_driver_data def test_upsert_marketing_driver_insert(test_database, feature_engine): """Upsert does an insert.""" (flexmock(countries) .should_receive('get_country_name_from_id') .and_return('US')) marketing_drivers.upsert_marketing_driver(1, 1, 'hi', 'Banzai') with mysql.sales_goals_session_scope() as session: tasks = session.query(marketing_drivers.MarketingDriver).all() assert len(tasks) == 1 marketing_driver_obj = session.query( marketing_drivers.MarketingDriver).first() assert marketing_driver_obj.to_dict() == { 'country_name': 'US', 'slogan': 'Banzai', 'value': 'hi', 'country_id': 1, 'marketing_driver_id': 1, 'project_id': 1, } def test_upsert_marketing_driver_update(test_database): """Upsert does an update.""" (flexmock(countries) .should_receive('get_country_name_from_id') .and_return('US')) marketing_drivers.upsert_marketing_driver(1, 1, 'hi') marketing_drivers.upsert_marketing_driver(1, 1, 'bye', 'Banzai') with mysql.sales_goals_session_scope() as session: tasks = session.query(marketing_drivers.MarketingDriver).all() assert len(tasks) == 1 marketing_driver_obj = session.query( marketing_drivers.MarketingDriver).first() assert marketing_driver_obj.to_dict() == { 'country_name': 'US', 'value': 'bye', 'slogan': 'Banzai', 'country_id': 1, 'marketing_driver_id': 1, 'project_id': 1, } def test_fetch_marketing_drivers(test_database): """Fetch marketing drivers.""" (flexmock(countries) .should_receive('get_country_name_from_id') .and_return('US')) marketing_drivers.upsert_marketing_driver(1, 1, 'hi') marketing_drivers.upsert_marketing_driver(1, 2, 'hi') response = marketing_drivers.fetch_marketing_drivers(1) assert len(response) == 2 def test_upsert_global_marketing_driver_insert(test_ar_database): """Insert global marketing drivers.""" marketing_drivers.upsert_global_marketing_driver(1, 'hi') response = marketing_drivers.fetch_global_marketing_driver( 1, models.MARKETING_HIGHLIGHTS_ID) response_dict = response.to_dict() assert response_dict.pop('date_added') assert response_dict.pop('last_updated') assert response_dict == { 'description': 'hi', 'client': 'alw', 'info_for': 'project', 'info_for_id': 1, 'mkt_program_id': 20, 'mkt_program_info_id': 1, 'subject': 'Project Highlights', 'scope': 'public', 'attachment': 'N', } def test_upsert_global_marketing_driver_update(test_ar_database): """Update global marketing drivers.""" marketing_drivers.upsert_global_marketing_driver(1, 'hi') marketing_drivers.upsert_global_marketing_driver(1, 'bye') response = marketing_drivers.fetch_global_marketing_driver( 1, models.MARKETING_HIGHLIGHTS_ID) response_dict = response.to_dict() assert response_dict.pop('date_added') assert response_dict.pop('last_updated') assert response_dict == { 'description': 'bye', 'client': 'alw', 'info_for': 'project', 'info_for_id': 1, 'mkt_program_id': 20, 'mkt_program_info_id': 1, 'subject': 'Project Highlights', 'scope': 'public', 'attachment': 'N', } def test_upsert_global_sync_driver_insert(test_ar_database): """Insert global marketing drivers.""" marketing_drivers.upsert_global_sync_driver(1, 'hi') response = marketing_drivers.fetch_global_marketing_driver( 1, models.SYNC_HIGHLIGHTS_ID) response_dict = response.to_dict() assert response_dict.pop('date_added') assert response_dict.pop('last_updated') assert response_dict == { 'description': 'hi', 'client': 'alw', 'info_for': 'project', 'info_for_id': 1, 'mkt_program_id': 22, 'mkt_program_info_id': 1, 'subject': 'Project Sync Highlights', 'scope': 'public', 'attachment': 'N', } def test_upsert_global_sync_driver_update(test_ar_database): """Update global marketing drivers.""" marketing_drivers.upsert_global_sync_driver(1, 'hi') marketing_drivers.upsert_global_sync_driver(1, 'bye') response = marketing_drivers.fetch_global_marketing_driver( 1, models.SYNC_HIGHLIGHTS_ID) response_dict = response.to_dict() assert response_dict.pop('date_added') assert response_dict.pop('last_updated') assert response_dict == { 'description': 'bye', 'client': 'alw', 'info_for': 'project', 'info_for_id': 1, 'mkt_program_id': 22, 'mkt_program_info_id': 1, 'subject': 'Project Sync Highlights', 'scope': 'public', 'attachment': 'N', } def test_create_delete_marketing_program_info(test_ar_database): """Test creating and deleting marketing program infos.""" entity_id = '123' entity_type = 'release' entity_data = {'info_for': entity_id, 'info_for_id': entity_type} create_data = [ { 'subject': 'Product Highlights', 'client': 'alw', 'description': 'Text value', 'mkt_program_id': 20, 'attachment': 'Y', 'scope': 'internal_only', **entity_data }, { 'subject': 'Product Marketing Blurb', 'client': 'oa', 'description': 'Another text value', 'mkt_program_id': 15, 'attachment': 'N', 'scope': 'public', **entity_data, } ] marketing_drivers.create_marketing_program_info(create_data[0]) marketing_drivers.create_marketing_program_info(create_data[1]) response = marketing_drivers.get_marketing_program_info(**entity_data) date_added_1 = response[0].pop('date_added') date_added_2 = response[1].pop('date_added') last_updated_1 = response[0].pop('last_updated') last_updated_2 = response[1].pop('last_updated') assert date_added_1 assert date_added_2 assert last_updated_1 assert last_updated_2 # Make sure dates are JSON serializable assert json.dumps({ 'A': date_added_1, 'B': date_added_2, 'C': last_updated_1, 'D': last_updated_2, }) assert response == [ {'mkt_program_info_id': 1, **create_data[0]}, {'mkt_program_info_id': 2, **create_data[1]}, ] marketing_drivers.delete_marketing_program_infos([1, 2]) response = marketing_drivers.get_marketing_program_info(**entity_data) assert response == [] @patch( 'sales_goals.models.marketing_drivers.countries.get_country_name_from_id', return_value='Canada' ) def test_delete_marketing_driver(mock_get_country_name, test_database): """Tets deleting a marketing driver.""" marketing_drivers.upsert_marketing_driver(1, 2, 'text') marketing_drivers.delete_marketing_driver(1, 2) response = marketing_drivers.fetch_marketing_drivers(1) assert response == [] def test_delete_marketing_driver_failure(test_database): """Delete marketing driver failure.""" response = marketing_drivers.delete_marketing_driver(1, 1) assert response.status == 404 @patch( 'sales_goals.models.marketing_drivers.countries.get_country_name_from_id', return_value='Canada' ) def test_bulk_delete_marketing_drivers(mock_get_country_name, test_database): """Test bulk deleting marketing drivers.""" marketing_drivers.upsert_marketing_driver(1, 1, 'text 1') marketing_drivers.upsert_marketing_driver(1, 2, 'text 2') marketing_drivers.upsert_marketing_driver(1, 3, 'text 3') marketing_drivers.upsert_marketing_driver(1, 4, 'text 4') marketing_drivers.upsert_marketing_driver(1, 5, 'text 5') marketing_drivers.bulk_delete_marketing_drivers(1, [2, 3, 4]) response = marketing_drivers.fetch_marketing_drivers(1) country_ids = {item.country_id for item in response} assert country_ids == {1, 5} def test_upsert_digital_marketing_driver_insert( test_database, add_digital_store): """Upsert does an insert.""" marketing_drivers.upsert_digital_marketing_driver(1, 'apple', 'hi') with mysql.sales_goals_session_scope() as session: highlights = session.query( marketing_drivers.DigitalStoreHighlight).all() assert len(highlights) == 1 assert highlights[0].to_dict() == { 'value': 'hi', 'id': 1, 'store_id': 1, 'project_id': 1, } def test_upsert_digital_marketing_driver_update( test_database, add_digital_store): """Upsert does an update.""" marketing_drivers.upsert_digital_marketing_driver(1, 'apple', 'hi') marketing_drivers.upsert_digital_marketing_driver(1, 'apple', 'bye') with mysql.sales_goals_session_scope() as session: highlights = session.query( marketing_drivers.DigitalStoreHighlight).all() assert len(highlights) == 1 assert highlights[0].to_dict() == { 'value': 'bye', 'id': 1, 'store_id': 1, 'project_id': 1, } def test_fetch_digital_marketing_drivers(test_database, add_digital_store): """Fetch digital marketing drivers.""" marketing_drivers.upsert_digital_marketing_driver(1, 'apple', 'hi') marketing_drivers.upsert_digital_marketing_driver(1, 'spotify', 'hi') response = marketing_drivers.fetch_digital_marketing_drivers(1) assert len(response) == 2