"""Test graphql router connector.""" import re from unittest import mock from gql import gql as gql_query import pytest from src.connectors.graphql_router import GraphQLConnector from src.constants.graphql import METADATA_QUERY from src.exceptions import GraphQLMetadataNotFound @mock.patch('src.connectors.graphql_router.Client.execute') def test_make_request(mock_client_execute): """Test graphql request.""" test_query = """ query Product($upc: String!) { productByUpc(upc: $upc) { productId } } """ expected_gql_query = gql_query(test_query) expected_params = {'upc': '1234567891011'} expected_metadata = \ { 'productByUpc': { 'productId': 12345 } } mock_client_execute.return_value = expected_metadata graphql_router_connector = GraphQLConnector() result = graphql_router_connector.make_request( test_query, params=expected_params) assert mock_client_execute.called assert mock_client_execute.call_args_list == [ mock.call( expected_gql_query, variable_values=expected_params ) ] assert result == expected_metadata @mock.patch('src.connectors.graphql_router.GraphQLConnector.make_request') def test_get_metadata_by_upc(mock_request): """Test graphql product metadata execute query.""" graphql_router_connector = GraphQLConnector() upc = '1234567891011' expected_params = {'upc': upc} mock_request.return_value = \ { 'productByUpc': { 'productId': 1234567, 'notForDistribution': 'N', 'tracks': [ { 'volumeNumber': 1, 'trackNumber': 1, 'isrc': 'DAP1234567' }, { 'volumeNumber': 1, 'trackNumber': 2, 'isrc': 'DAP1234568' } ] } } result = graphql_router_connector.get_metadata_by_upc(upc) expected_result = \ { 'metadata': { 'productId': 1234567, 'notForDistribution': 'N', 'tracks': [ { 'volumeNumber': 1, 'trackNumber': 1, 'isrc': 'DAP1234567' }, { 'volumeNumber': 1, 'trackNumber': 2, 'isrc': 'DAP1234568' } ] } } assert mock_request.called assert mock_request.call_args_list == [ mock.call( METADATA_QUERY, params=expected_params ) ] assert result == expected_result @mock.patch('src.connectors.graphql_router.GraphQLConnector.make_request') def test_get_metadata_by_upc_exception(mock_request): """Test exception product metadata query.""" mock_request.return_value = \ { 'productByUpc': None } upc = '1234567891011' graphql_router_connector = GraphQLConnector() with pytest.raises( GraphQLMetadataNotFound, match=re.escape( 'No metadata found for UPC: 1234567891011' ), ): graphql_router_connector.get_metadata_by_upc(upc)