"""Tests for Handlers.""" import json from unittest.mock import MagicMock, patch import pytest from owsresponse import response from product_store_mapping import api, handlers from product_store_mapping.logic import product, track @pytest.fixture def fixture_client(): """Create an api test client fixture.""" return api.app.test_client() @patch("product_store_mapping.handlers.g", spec=["log"]) def test_exception_handler(mock_g): """Verify exception_Handler returns 500 status code and json payload.""" message = ( "The server encountered an internal error " "and was unable to complete your request." ) mock_error = MagicMock() server_response = handlers.exception_handler(mock_error) mock_g.log.exception.assert_called_with(mock_error) # assert status code is 500 assert server_response.status_code == 500 # assert json payload response_message = json.loads(server_response.data.decode()) assert response_message["message"] == message assert response_message["code"] == response.error.ERROR_CODE_INTERNAL_ERROR @patch("product_store_mapping.logic.product.get_product_with_tracks") def test_get_product_with_tracks(mock_model, fixture_client): """Test get_product_mapping_with_tracks handler.""" mock_model.return_value = response.Response('{"status": "OK"}') result = fixture_client.get("/mapping/product/12313/store/1") assert result.status_code == 200 product.get_product_with_tracks.assert_called_with(12313, 1) @patch("product_store_mapping.logic.product.get_product_with_tracks") def test_get_product_with_tracks_not_found(mock_model, fixture_client): """Test get_product_mapping_with_tracks handler.""" mock_model.return_value = response.create_not_found_response() result = fixture_client.get("/mapping/product/12313/store/1") assert result.status_code == 404 product.get_product_with_tracks.assert_called_with(12313, 1) @patch("product_store_mapping.logic.product.get_product") def test_get_product(mock_model, fixture_client): """Test for get_product_mapping handler.""" mock_model.return_value = response.Response('{"status": "OK"}') result = fixture_client.get("/mapping/product/12313/store/1/product") assert result.status_code == 200 product.get_product.assert_called_with(12313, 1) @patch("product_store_mapping.logic.product.get_product") def test_get_product_not_found(mock_model, fixture_client): """Test for non-existent get_product_mapping handler.""" mock_model.return_value = response.create_not_found_response() result = fixture_client.get("/mapping/product/12313/store/1/product") assert result.status_code == 404 product.get_product.assert_called_with(12313, 1) @patch("product_store_mapping.logic.track.get_track") def test_get_track(mock_model, fixture_client): """Test get track store mapping handler.""" mock_model.return_value = response.Response('{"status": "OK"}') result = fixture_client.get("/mapping/track/123/store/345/track") assert result.status_code == 200 track.get_track.assert_called_with(123, 345) @patch("product_store_mapping.logic.product.delete_product") def test_delete_product(mock_model, fixture_client): """Test delete_product success handler.""" mock_model.return_value = response.Response([]) result = fixture_client.delete("/mapping/product/12313/store/1/product") assert result.status_code == 200 product.delete_product.assert_called_with(12313, 1) @patch("product_store_mapping.logic.product.save_product_data") def test_save_product_mapping_data(mock_logic, fixture_client): """Test save product mapping data handler.""" mock_logic.return_value = response.Response('{"status": "200"}') data = { "provider": "Orchard", "video_order_id": "USALL0300140", "store_unique_id": 1, "track_unique_id": 4, } result = fixture_client.post( "/mapping/product/1234/store/463/product", data=json.dumps(data), content_type="application/json", ) assert result.status_code == 200 @patch("product_store_mapping.logic.product.save_product_data") def test_save_product_mapping_data_with_error(mock_logic, fixture_client): """Test save product mapping data handler with error.""" mock_logic.return_value = response.create_error_response("400", "Invalid input") data = { "video_order_id": "USALL0300140", "store_unique_id": 1, "track_unique_id": 4, } result = fixture_client.post( "/mapping/product/1234/store/463/product", data=json.dumps(data), content_type="application/json", ) assert result.status_code == 400