"""Tests for marketing drivers model.""" from sales_goals import features from sales_goals.connectors import mysql from sales_goals.models import digital_projections def test_upsert_digital_projection_insert( test_database, add_digital_store): """Upsert does an insert.""" data = {} result = digital_projections.upsert_global_projections(1, data, '1') with mysql.sales_goals_session_scope() as session: highlights = session.query( digital_projections.DigitalProjection).all() assert len(highlights) == 1 assert highlights[0].updated_by == '1' assert result.message == { 'product_id': 1, 'internal_note': None } def test_clear_product_territory_projections( test_database, add_digital_store, mock_territories, ): """Test clearing all product territory projections.""" product_id = 123 with mysql.sales_goals_session_scope() as session: session.add(digital_projections.DigitalProjectionByCountry( other_projection=1, country_id=1, country_name='jim', downloads_projection=1, product_id=product_id, )) session.add(digital_projections.DigitalProjectionByCountry( other_projection=1, country_id=2, country_name='bob', downloads_projection=1, product_id=product_id, )) session.add(digital_projections.DigitalProjectionByCountry( other_projection=1, country_id=3, country_name='jane', downloads_projection=1, product_id=456, )) session.commit() digital_projections.clear_product_territory_projections(product_id) with mysql.sales_goals_session_scope() as session: projections = session.query( digital_projections.DigitalProjectionByCountry).all() assert len(projections) == 1 def test_delete_territory_projection( test_database, add_digital_store, mock_territories, ): """Test deleting a territory projection.""" with mysql.sales_goals_session_scope() as session: projection = digital_projections.DigitalProjectionByCountry( other_projection=1, country_id=1, country_name='jim', downloads_projection=1, product_id=1, ) session.add(projection) session.flush() session.refresh(projection) digital_projections.delete_territory_projection(1, projection.pk) with mysql.sales_goals_session_scope() as session: projections = session.query( digital_projections.DigitalProjectionByCountry).all() assert len(projections) == 0 def test_fetch_digital_projections( test_database, add_digital_store, mock_territories): """Fetch digital projections.""" data = { 'internal_note': 'aacb' } digital_projections.upsert_global_projections(1, data, '1') digital_projections.upsert_territory_projections( 1, { 'items': [{ 'territory_id': 1 }] }, '1' ) response = digital_projections.get_projections_by_product_id(1) assert response.message == { 'product_id': 1, 'internal_note': 'aacb', 'projections': [{ 'id': None, 'product_id': 1, 'territory_id': 1 }], } def test_dataload_digital_product_projections( test_database, add_digital_store, mock_territories): """Dataload digital product projections.""" digital_projections.upsert_global_projections( 1, {'internal_note': 'note 1'}, 'oa_user_id' ) digital_projections.upsert_global_projections( 2, {'internal_note': 'note 2'}, 'oa_user_id' ) digital_projections.upsert_global_projections( 3, {'internal_note': 'note 3'}, 'oa_user_id' ) digital_projections.upsert_territory_projections( 1, { 'items': [{'territory_id': 1}] }, 'oa_user_id' ) digital_projections.upsert_territory_projections( 2, { 'items': [ {'territory_id': 2}, {'territory_id': 3}, ] }, 'oa_user_id' ) response = digital_projections.dataload_digital_product_projections([1, 2, 3]) assert response.message == [ { 'product_id': 1, 'internal_note': 'note 1', 'projections': [ {'id': None, 'product_id': 1, 'territory_id': 1} ] }, { 'product_id': 2, 'internal_note': 'note 2', 'projections': [ {'id': None, 'product_id': 2, 'territory_id': 2}, {'id': None, 'product_id': 2, 'territory_id': 3} ] }, { 'product_id': 3, 'internal_note': 'note 3', 'projections': [] } ] def test_upsert_territory_projections( test_database, add_digital_store, mock_territories): """Test upserting territory projections.""" response = digital_projections.upsert_territory_projections( 1, { 'items': [{ 'territory_id': 1, }] }, '1' ) with mysql.sales_goals_session_scope() as session: projections = session.query( digital_projections.DigitalProjectionByCountry).all() assert len(projections) == 1 assert projections[0].updated_by == '1' items = response.message['items'][0] assert items['territory_id'] == 1 def test_upsert_digital_projection_update( test_database, add_digital_store): """Upsert does an update.""" data = { 'internal_note': 'hi' } digital_projections.upsert_global_projections(1, data, '1') data_changes = { 'territory_id': 1 } result = digital_projections.upsert_global_projections( 1, data_changes, '2') with mysql.sales_goals_session_scope() as session: highlights = session.query( digital_projections.DigitalProjection).all() assert len(highlights) == 1 assert highlights[0].updated_by == '2' assert result.message == { 'internal_note': 'hi', 'product_id': 1 } def test_upsert_digital_projection_update_with_empty_internal_note( test_database, add_digital_store): """Upsert does an update.""" data = { 'internal_note': '' } digital_projections.upsert_global_projections(1, data, '1') data_changes = { 'territory_id': 1 } result = digital_projections.upsert_global_projections( 1, data_changes, '2') with mysql.sales_goals_session_scope() as session: highlights = session.query( digital_projections.DigitalProjection).all() assert len(highlights) == 1 assert highlights[0].updated_by == '2' assert result.message == { 'internal_note': '', 'product_id': 1 } def test_upsert_project_marketing_projection_insert(test_database): """Upsert does an insert.""" data = {} result = digital_projections.upsert_project_marketing_projection(1, data, '1') with mysql.sales_goals_session_scope() as session: highlights = session.query( digital_projections.ProjectMarketingProjections).all() assert len(highlights) == 1 assert highlights[0].updated_by == '1' assert result.message == { 'internal_note': None, 'project_id': 1 } def test_upsert_project_marketing_projection_update(test_database): """Upsert does an update.""" data = { 'internal_note': 'hi' } digital_projections.upsert_project_marketing_projection(1, data, '1') data_changes = { 'territory_id': 1 } result = digital_projections.upsert_project_marketing_projection( 1, data_changes, '2') with mysql.sales_goals_session_scope() as session: highlights = session.query( digital_projections.ProjectMarketingProjections).all() assert len(highlights) == 1 assert highlights[0].updated_by == '2' assert result.message == { 'internal_note': 'hi', 'project_id': 1 } def test_upsert_project_projection_update_with_empty_internal_note( test_database): """Upsert does an update.""" data = { 'internal_note': '' } digital_projections.upsert_project_marketing_projection(1, data, '1') result = digital_projections.upsert_project_marketing_projection( 1, data, '2') with mysql.sales_goals_session_scope() as session: highlights = session.query( digital_projections.ProjectMarketingProjections).all() assert len(highlights) == 1 assert highlights[0].updated_by == '2' assert result.message == { 'internal_note': '', 'project_id': 1 } def test_get_project_marketing_projection(test_database): """Test get project marketing projections.""" data = { 'internal_note': 'aacb' } digital_projections.upsert_project_marketing_projection(1, data, 'oa:1') response = digital_projections.get_project_marketing_projection(1) assert response == { 'internal_note': 'aacb', 'project_id': 1 } def test_dataload_project_marketing_projection(test_database): """Test dataload project marketing projections.""" project_ids = [1, 2, 3] digital_projections.upsert_project_marketing_projection( 1, {'internal_note': 'note 1'}, 'oa_user_id', ) digital_projections.upsert_project_marketing_projection( 2, {'internal_note': 'note 2'}, 'oa_user_id', ) digital_projections.upsert_project_marketing_projection( 3, {'internal_note': 'note 3'}, 'oa_user_id', ) response = digital_projections.dataload_project_marketing_projection( project_ids) assert response.message == [ { 'internal_note': 'note 1', 'project_id': 1, }, { 'internal_note': 'note 2', 'project_id': 2, }, { 'internal_note': 'note 3', 'project_id': 3, }, ]