"""Test ows-abacus-state requests.""" from unittest import mock import urllib.parse from faker import Faker import httpx from owsclient import OwsClient from owsclient.test import OwsClientMock import pytest from src.connectors.ows_state import bulk_query_abacus_states, OwsStateException from tests.unit.factories import AbacusStateFactory def test_bulk_query_abacus_states_success( ows_client_mock: OwsClientMock, faker: Faker ) -> None: """Test bulk_query_abacus_states success.""" states = AbacusStateFactory.batch(faker.pyint(1, 5)) action_name = faker.word() parent_table_name = faker.word() parent_table_ids = faker.pylist(allowed_types=[int]) limit = faker.pyint() offset = faker.pyint() query_string = urllib.parse.urlencode({'limit': limit, 'offset': offset}) path_pattern = f'/abacus-states/query?{query_string}' request_body = { 'action_name': action_name, 'parent_table_name': parent_table_name, 'parent_table_ids': parent_table_ids, } ows_client_mock.post('ows-abacus-state', path_pattern, json=request_body).mock( return_value=httpx.Response( status_code=200, json={ 'items': [state.model_dump(mode='json') for state in states], 'limit': limit, 'offset': offset, 'total': len(states), }, ) ) res = bulk_query_abacus_states( action_name=action_name, parent_table_name=parent_table_name, parent_table_ids=parent_table_ids, limit=limit, offset=offset, ) assert res.items == states assert res.limit == limit assert res.offset == offset assert res.total == len(states) def test_bulk_query_abacus_states_failure( ows_client_mock: OwsClientMock, faker: Faker ) -> None: """Test bulk_query_abacus_states failure.""" action_name = faker.word() parent_table_name = faker.word() parent_table_ids = faker.pylist(allowed_types=[int]) limit = faker.pyint() offset = faker.pyint() query_string = urllib.parse.urlencode({'limit': limit, 'offset': offset}) path_pattern = f'/abacus-states/query?{query_string}' request_body = { 'action_name': action_name, 'parent_table_name': parent_table_name, 'parent_table_ids': parent_table_ids, } ows_client_mock.post('ows-abacus-state', path_pattern, json=request_body).mock( return_value=httpx.Response(status_code=400, json='error') ) with pytest.raises( OwsStateException, match=f'ERROR in POST {path_pattern.replace("?", r"\?")}' ): bulk_query_abacus_states( action_name=action_name, parent_table_name=parent_table_name, parent_table_ids=parent_table_ids, limit=limit, offset=offset, )