"""Tests for target market goal model.""" from oto import response as oto_response import pytest from sales_goals.connectors import mysql from sales_goals.models import target_market_goal @pytest.fixture def target_market_goal_data(): """Dictionary with data suitable to create TargetMarketGoal object.""" return { 'sales_goal_id': 12345, 'store_id': 2, 'label_goal_value': 50, 'distribution_goal_value': 30, 'country_id': 1, 'country_name': 'USA' } def test_target_market_goal_to_dict(test_database, target_market_goal_data): """Assert TargetMarketGoal object can convert itself to dict.""" target_market_goal_obj = target_market_goal.TargetMarketGoal( **target_market_goal_data) with mysql.sales_goals_session_scope() as session: session.add(target_market_goal_obj) session.commit() target_market_goal_obj = session.query( target_market_goal.TargetMarketGoal).first() target_market_goal_data['target_market_goal_id'] = 1 assert target_market_goal_obj.to_dict() == target_market_goal_data def test_create_target_market_goal(test_database, target_market_goal_data): """Assert target market goal object can be created.""" response = target_market_goal.create(**target_market_goal_data) with mysql.sales_goals_session_scope() as session: tasks = session.query(target_market_goal.TargetMarketGoal).all() assert len(tasks) == 1 target_market_goal_obj = session.query( target_market_goal.TargetMarketGoal).first() target_market_goal_data['target_market_goal_id'] = 1 assert target_market_goal_obj.to_dict() == target_market_goal_data assert isinstance(response, oto_response.Response) assert response.message == target_market_goal_data def test_fetch_by_sales_goal_id(test_database, target_market_goal_data): """Assert target market goal object can be fetched.""" goals_count = 3 expected_results = [] for goal_number in range(goals_count): target_market_goal_data['label_goal_value'] += goal_number expected_results.append( target_market_goal.create(**target_market_goal_data).message) other_goal = { 'sales_goal_id': 9999, 'store_id': 5, 'label_goal_value': 12, 'distribution_goal_value': 12, 'country_id': 2, 'country_name': 'UK'} target_market_goal.create(**other_goal) response = target_market_goal.fetch_by_sales_goal_id( target_market_goal_data['sales_goal_id']) assert isinstance(response, oto_response.Response) assert response.message == expected_results assert other_goal not in response.message def test_fetch_by_sales_goal_id_no_goals( test_database, target_market_goal_data): """Assert target market goals fetch for not found response.""" response = target_market_goal.fetch_by_sales_goal_id( target_market_goal_data['sales_goal_id']) assert isinstance(response, oto_response.Response) assert response.status == 404 def test_update(test_database, target_market_goal_data): """Assert target_market_goal object can be updated.""" target_market_goal_id = 1 new_label_goal_value = 222 new_distribution_goal_value = 333 target_goal_created = target_market_goal.create(**target_market_goal_data) target_market_goal_data['target_market_goal_id'] = target_market_goal_id assert target_goal_created.message == target_market_goal_data target_market_goal_update_data = { 'target_market_goal_id': target_market_goal_id, 'label_goal_value': new_label_goal_value, 'distribution_goal_value': new_distribution_goal_value } response = target_market_goal.update(**target_market_goal_update_data) assert isinstance(response, oto_response.Response) assert response.message['label_goal_value'] == new_label_goal_value assert response.message['distribution_goal_value'] == new_distribution_goal_value def test_update_empty_values(test_database, target_market_goal_data): """Assert target_market_goal object can be updated with empty values.""" target_market_goal_id = 1 new_label_goal_value = new_distribution_goal_value = '' target_goal_created = target_market_goal.create(**target_market_goal_data) target_market_goal_data['target_market_goal_id'] = target_market_goal_id assert target_goal_created.message == target_market_goal_data target_market_goal_update_data = { 'target_market_goal_id': target_market_goal_id, 'label_goal_value': new_label_goal_value, 'distribution_goal_value': new_distribution_goal_value } response = target_market_goal.update(**target_market_goal_update_data) assert isinstance(response, oto_response.Response) assert response.message['label_goal_value'] == new_label_goal_value assert response.message['distribution_goal_value'] == new_distribution_goal_value def test_update_no_such_target_market_goal(test_database): """Assert try to update not existing target_market_goal returns error.""" wrong_target_market_goal_id = 99999 target_market_goal_update_data = { 'target_market_goal_id': wrong_target_market_goal_id, 'label_goal_value': 10 } updated_goal = target_market_goal.update(**target_market_goal_update_data) assert not updated_goal assert updated_goal.errors['message'] == ( 'Target Market Goal with id {target_market_goal_id} does not ' 'exist'.format(target_market_goal_id=wrong_target_market_goal_id)) def test_delete_by_sales_goal_id_and_country_id_success( test_database, target_market_goal_data): """Test delete_by_sales_goal_id_and_country_id successful result.""" goal = target_market_goal.create(**target_market_goal_data).message target_market_goal_data['store_id'] = 3 target_market_goal.create(**target_market_goal_data) fetch_goal = target_market_goal.fetch_by_sales_goal_id( goal['sales_goal_id']) assert fetch_goal assert len(fetch_goal.message) == 2 result = target_market_goal.delete_by_sales_goal_id_and_country_id( sales_goal_id=target_market_goal_data['sales_goal_id'], country_id=target_market_goal_data['country_id']) assert result fetch_deleted_goal = target_market_goal.fetch_by_sales_goal_id( goal['sales_goal_id']) assert not fetch_deleted_goal assert fetch_deleted_goal.status == 404 def test_delete_by_sales_goal_id_and_country_id_not_found( test_database, target_market_goal_data): """Test delete_by_sales_goal_id_and_country_id failed due to absence.""" sales_goal_id = target_market_goal_data['sales_goal_id'] country_id = target_market_goal_data['country_id'] error_msg = ( 'Target Market Goal for sales goal id {sales_goal_id} ' 'and country id {country_id} does not exist'.format( sales_goal_id=sales_goal_id, country_id=country_id)) result = target_market_goal.delete_by_sales_goal_id_and_country_id( sales_goal_id=sales_goal_id, country_id=country_id) assert not result assert result.status == 404 assert result.errors['message'] == error_msg