"""Functional tests for getting Instant Grats data.""" import datetime import json from oto import response from oto import status as response_code from unittest.mock import MagicMock, patch from backend.constants import error from tests.testutils import db @db.test_schema_no_seed def test_get_instant_grats_for_product( client, track_factory, instant_grat_factory): """Expect to get list of product instant grats.""" product_id = 1 created_at = datetime.datetime(year=2018, month=5, day=20) tracks = [track_factory(), track_factory()] grats = [ instant_grat_factory( tuid=tracks[0].tuid, user_id='25824', user_type='oa', date_created=created_at), instant_grat_factory( tuid=tracks[1].tuid, user_id='25824', user_type='oa', date_created=created_at)] db.merge_model_objects(tracks) db.merge_model_objects(grats) expected_res = response.Response({ 'items': [ {'tuid': 1, 'grats': [ {'created_at': created_at.isoformat(), 'created_by': 'oa:25824', 'store_id': 1, 'active': 'Y', 'date': '2017-05-20T00:00:00'}]}, {'tuid': 2, 'grats': [ {'created_at': created_at.isoformat(), 'created_by': 'oa:25824', 'store_id': 1, 'active': 'Y', 'date': '2017-05-20T00:00:00'}]}]}) res = client.get('/product/{product_id}/tracks/grats'.format( product_id=product_id)) res_data = json.loads(res.data.decode()) assert res.status_code == response_code.OK assert res_data == expected_res.message @db.test_schema_no_seed def test_get_instant_grats_for_product_no_such_instant_grats( client, track_factory): """Expect to get 404 error trying to get instant grats.""" product_id = 1 tracks = [track_factory(), track_factory()] db.merge_model_objects(tracks) expected_res = response.create_not_found_response( error.INSTANT_GRATS_NOT_FOUND_MSG) res = client.get('/product/{product_id}/tracks/grats'.format( product_id=product_id)) res_data = json.loads(res.data.decode()) assert res.status_code == response_code.NOT_FOUND assert res_data == expected_res.errors @db.test_schema_no_seed def test_get_instant_grats_for_product_no_tracks(client): """Expect to get 404 error if product have no tracks.""" product_id = 1 res = client.get('/product/{product_id}/tracks/grats'.format( product_id=product_id)) assert res.status_code == response_code.NOT_FOUND @db.test_schema_no_seed @patch('backend.handlers.instant_grat_handlers.g') @patch('backend.utils.handlers.is_jwt_identity_authorized') @patch('backend.handlers.instant_grat_handlers.flask_request.verify_rules_access_standalone') def test_get_instant_grats_with_valid_jwt( mock_rule_access: MagicMock, mock_is_jwt_identity_authorized: MagicMock, mock_g: MagicMock, client, track_factory, instant_grat_factory, fixture_app): """Expect to get list of product instant grats.""" mock_rule_access.return_value = False mock_g.request_context.jwt_identity_id = 'dummy_token' mock_is_jwt_identity_authorized.return_value = True product_id = 1 created_at = datetime.datetime(year=2018, month=5, day=20) tracks = [track_factory(), track_factory()] grats = [ instant_grat_factory( tuid=tracks[0].tuid, user_id='25824', user_type='oa', date_created=created_at), instant_grat_factory( tuid=tracks[1].tuid, user_id='25824', user_type='oa', date_created=created_at)] db.merge_model_objects(tracks) db.merge_model_objects(grats) expected_res = response.Response({ 'items': [ {'tuid': 1, 'grats': [ {'created_at': created_at.isoformat(), 'created_by': 'oa:25824', 'store_id': 1, 'active': 'Y', 'date': '2017-05-20T00:00:00'}]}, {'tuid': 2, 'grats': [ {'created_at': created_at.isoformat(), 'created_by': 'oa:25824', 'store_id': 1, 'active': 'Y', 'date': '2017-05-20T00:00:00'}]}]}) res = client.get('/product/{product_id}/tracks/grats'.format( product_id=product_id)) res_data = json.loads(res.data.decode()) assert res.status_code == response_code.OK assert res_data == expected_res.message mock_rule_access.assert_called_once() mock_is_jwt_identity_authorized.assert_called_once_with('dummy_token') @db.test_schema_no_seed @patch('backend.handlers.instant_grat_handlers.g') @patch('backend.utils.handlers.is_jwt_identity_authorized') @patch('backend.handlers.instant_grat_handlers.flask_request.verify_rules_access_standalone') def test_get_instant_grats_with_invalid_jwt( mock_rule_access: MagicMock, mock_is_jwt_identity_authorized: MagicMock, mock_g: MagicMock, client, fixture_app): """Test get instant grats with invalid jwt.""" mock_rule_access.return_value = False mock_g.request_context.jwt_identity_id = 'dummy_token' mock_is_jwt_identity_authorized.return_value = False product_id = 1 res = client.get('/product/{product_id}/tracks/grats'.format( product_id=product_id)) res_body = json.loads(res.data.decode()) assert res.status_code == 403 assert res_body['code'] == error.ERROR_CODE_AUTHORIZATION assert res_body['message'] == 'Unauthorized' mock_rule_access.assert_called_once() mock_is_jwt_identity_authorized.assert_called_once_with('dummy_token') @db.test_schema_no_seed @patch('backend.handlers.instant_grat_handlers.g') @patch('backend.handlers.instant_grat_handlers.flask_request.verify_rules_access_standalone') def test_get_instant_grats_without_jwt( mock_rule_access, mock_g: MagicMock, client, fixture_app): """Test get instant grats without jwt.""" mock_rule_access.return_value = False mock_g.request_context.jwt_identity_id = '' product_id = 1 res = client.get('/product/{product_id}/tracks/grats'.format( product_id=product_id)) assert res.status_code == 401 res_body = json.loads(res.data.decode()) assert res_body['code'] == error.ERROR_CODE_NOT_FOUND mock_rule_access.assert_called_once()