"""Tests for sales goal model.""" import copy from datetime import datetime from oto import response as oto_response import pytest from sales_goals.connectors import mysql from sales_goals.models import sales_goal @pytest.fixture def sales_goal_data(): """Dictionary with data suitable to create SalesGoal object.""" return { 'notes': 'test notes', 'hmv_notes': 'test hmv_notes', 'updated_by': 'oa:1234', 'product_id': 8765432, } def test_sales_goal_to_dict(test_database, sales_goal_data): """Assert SalesGoal object can convert itself to dict.""" sales_goal_obj = sales_goal.SalesGoal(**sales_goal_data) with mysql.sales_goals_session_scope() as session: session.add(sales_goal_obj) session.commit() sales_goal_obj = session.query(sales_goal.SalesGoal).first() sales_goal_data['sales_goal_id'] = 1 sales_goal_data['updated_at'] = sales_goal_obj.updated_at assert sales_goal_obj.to_dict() == sales_goal_data def test_manual_sales_goal_updated_at_raises_exc( test_database, sales_goal_data): """Assert can not change SalesGoal.updated_at directly.""" sales_goal_obj = sales_goal.SalesGoal(**sales_goal_data) with mysql.sales_goals_session_scope() as session: session.add(sales_goal_obj) sales_goal_obj = session.query(sales_goal.SalesGoal).first() initial_change_date = sales_goal_obj.updated_at manual_change_date = datetime.utcnow() with pytest.raises(AttributeError): sales_goal_obj.updated_at = manual_change_date session.commit() sales_goal_obj = session.query(sales_goal.SalesGoal).first() assert initial_change_date < manual_change_date assert initial_change_date == sales_goal_obj.updated_at def test_create_sales_goal(test_database, sales_goal_data): """Assert sales_goal object can be created.""" response = sales_goal.create(**sales_goal_data) with mysql.sales_goals_session_scope() as session: tasks = session.query(sales_goal.SalesGoal).all() assert len(tasks) == 1 sales_goal_obj = session.query( sales_goal.SalesGoal).first() sales_goal_data['sales_goal_id'] = 1 sales_goal_data['updated_at'] = sales_goal_obj.updated_at assert sales_goal_obj.to_dict() == sales_goal_data assert isinstance(response, oto_response.Response) assert response.message == sales_goal_data def test_fetch_sales_goal_by_product_id(test_database, sales_goal_data): """Assert sales_goal object can be fetched.""" created_goal = sales_goal.create(**sales_goal_data) product_id = created_goal.message['product_id'] response = sales_goal.fetch_by_product_id(product_id) sales_goal_data['sales_goal_id'] = 1 sales_goal_data['updated_at'] = response.message['updated_at'] assert isinstance(response, oto_response.Response) assert response.message == sales_goal_data def test_fetch_sales_goal_by_product_id_does_not_exist(test_database): """Assert sales_goal fetch for not found response.""" product_id = 1099511235 response = sales_goal.fetch_by_product_id(product_id) assert response.status == 404 def test_update_sales_goal(test_database, sales_goal_data): """Assert sales_goal object can be updated.""" sales_goal.create(**sales_goal_data) old_goal = sales_goal.fetch_by_product_id( product_id=sales_goal_data['product_id']).message new_notes = 'New test notes' new_user = 'oa:991188441' update_values = { 'updated_by': new_user, 'notes': new_notes} sales_goal.update( sales_goal_id=old_goal['sales_goal_id'], values=update_values) updated_goal = sales_goal.fetch_by_product_id( product_id=sales_goal_data['product_id']).message assert updated_goal['updated_at'] > old_goal['updated_at'] assert updated_goal['updated_by'] == new_user assert updated_goal['notes'] == new_notes def test_update_sales_goal_no_such_goal(test_database, sales_goal_data): """Assert try to update not existed sales_goal returns error.""" wrong_id = 99999 update_values = { 'updated_by': 'oa:991188441'} updated_goal = sales_goal.update( sales_goal_id=wrong_id, values=update_values) assert not updated_goal assert updated_goal.errors['message'] == ( 'Sales goals with id {sales_goal_id} do not exist'.format( sales_goal_id=wrong_id)) @pytest.mark.parametrize( 'notes', ['hi', 'yo']) def test_update_sales_goal_by_product_id( test_database, notes, sales_goal_data): """Assert sales_goal object can be updated.""" sales_goal.create(**sales_goal_data) sales_goal_update_data = sales_goal_data sales_goal_update_data['notes'] = notes sales_goal_update_data['updated_by'] = 'alw: 333' response = sales_goal.update_by_product_id(**sales_goal_update_data) with mysql.sales_goals_session_scope() as session: sales_goal_obj = session.query( sales_goal.SalesGoal).first() sales_goal_data['sales_goal_id'] = 1 sales_goal_data['updated_at'] = sales_goal_obj.updated_at assert isinstance(response, oto_response.Response) assert response.message == sales_goal_update_data def test_update_sales_goal_by_product_id_values_not_passed( test_database, sales_goal_data): """Expect to update the sales_goal correctly if values are None.""" sales_goal.create(**sales_goal_data) sales_goal_update_data = copy.deepcopy(sales_goal_data) sales_goal_update_data['notes'] = None sales_goal_update_data['hmv_notes'] = None response = sales_goal.update_by_product_id(**sales_goal_update_data) with mysql.sales_goals_session_scope() as session: sales_goal_obj = session.query( sales_goal.SalesGoal).first() sales_goal_data['sales_goal_id'] = 1 sales_goal_data['updated_at'] = sales_goal_obj.updated_at assert isinstance(response, oto_response.Response) assert response.message == sales_goal_data def test_update_sales_goal_by_product_id_no_such_goal( test_database, sales_goal_data): """Assert try to update not existing sales_goal returns error.""" wrong_product_id = 99999 sales_goal_data['product_id'] = wrong_product_id updated_goal = sales_goal.update_by_product_id(**sales_goal_data) assert not updated_goal assert updated_goal.errors['message'] == ( 'Sales goals for id {product_id} do not exist'.format( product_id=wrong_product_id))