"""Functional tests for fetching statement periods.""" from unittest.mock import ANY from oto import status as response_code import pytest from collaborator.constants.statement_period import StatementPeriodStatus from collaborator.models.ows import ows_abacus_account from tests.testutils import db, mock_auth @pytest.fixture(autouse=True) def _mock_models(mocker, mock_account): """Mock permissions for a test.""" mock_auth(mocker, mock_account.id) mocker.patch.object( ows_abacus_account, "get_abacus_account_metadata", return_value={"currency_code": "USD"}, ) @db.test_schema_default_seed def test_get_statement_periods(auth_client, mocker, mock_account): """Test get statement periods handler.""" result = auth_client.get( "/statement-periods", query_string={ "vendor_id": mock_account.id, "sort_direction": "DESC", }, ) assert result.json == { "items": [ { "id": 2, "vendor_id": 24601, "name": "SP 2", "status": "OPEN", "created_date": "2022-04-06T06:07:08", "updated_date": "2022-04-06T06:07:08", "abacus_statement_period_id": None, }, { "id": 1, "vendor_id": 24601, "name": "SP 1", "status": "CLOSED", "created_date": "2022-04-05T06:07:08", "updated_date": "2022-04-05T06:07:08", "abacus_statement_period_id": None, }, ], "pagination": {"total_records": 2, "type": "standard"}, } assert result.status_code == 200 @db.test_schema_default_seed def test_get_statement_periods_with_sorting(auth_client, mocker, mock_account): """Test get statement periods handler.""" result = auth_client.get( "/statement-periods", query_string={ "vendor_id": mock_account.id, "sort_key": "updated_date", "sort_direction": "ASC", }, ) assert result.json == { "items": [ { "id": 1, "vendor_id": 24601, "name": "SP 1", "status": "CLOSED", "created_date": "2022-04-05T06:07:08", "updated_date": "2022-04-05T06:07:08", "abacus_statement_period_id": None, }, { "id": 2, "vendor_id": 24601, "name": "SP 2", "status": "OPEN", "created_date": "2022-04-06T06:07:08", "updated_date": "2022-04-06T06:07:08", "abacus_statement_period_id": None, }, ], "pagination": {"total_records": 2, "type": "standard"}, } assert result.status_code == 200 @db.test_schema_default_seed def test_get_statement_periods_with_status(auth_client, mocker, mock_account): """Test get statement periods with status.""" result = auth_client.get( "/statement-periods", query_string={ "vendor_id": mock_account.id, # TODO: remove .value once on Python 3.12+ — str(StrEnum) returns the value directly "status": StatementPeriodStatus.CLOSED.value, }, ) assert result.json == { "items": [ { "id": 1, "vendor_id": 24601, "name": "SP 1", "status": "CLOSED", "created_date": "2022-04-05T06:07:08", "updated_date": "2022-04-05T06:07:08", "abacus_statement_period_id": None, } ], "pagination": {"total_records": 1, "type": "standard"}, } assert result.status_code == 200 @db.test_schema_default_seed def test_get_statement_periods_with_limit_offset(auth_client, mocker, mock_account): """Test get statement periods with limit/offset.""" result = auth_client.get( "/statement-periods", query_string={ "vendor_id": mock_account.id, "sort_direction": "DESC", "limit": 1, "offset": 1, }, ) assert result.json == { "items": [ { "id": 1, "vendor_id": 24601, "name": "SP 1", "status": "CLOSED", "created_date": "2022-04-05T06:07:08", "updated_date": "2022-04-05T06:07:08", "abacus_statement_period_id": None, } ], "pagination": {"total_records": 2, "type": "standard"}, } assert result.status_code == 200 @pytest.mark.parametrize( "term, expected", [ ( None, [ { "id": 2, "name": "SP 2", "vendor_id": 24601, "status": StatementPeriodStatus.OPEN, "created_date": ANY, "updated_date": ANY, "abacus_statement_period_id": None, }, { "id": 1, "vendor_id": 24601, "name": "SP 1", "status": StatementPeriodStatus.CLOSED, "created_date": ANY, "updated_date": ANY, "abacus_statement_period_id": None, }, ], ), ( "1", [ { "id": 1, "vendor_id": 24601, "name": "SP 1", "status": StatementPeriodStatus.CLOSED, "created_date": ANY, "updated_date": ANY, "abacus_statement_period_id": None, } ], ), ( "2", [ { "id": 2, "name": "SP 2", "vendor_id": 24601, "status": StatementPeriodStatus.OPEN, "created_date": ANY, "updated_date": ANY, "abacus_statement_period_id": None, } ], ), ], ) @db.test_schema_default_seed def test_get_statement_periods_with_term( auth_client, mocker, mock_account, term, expected ): """Test get statement periods with term.""" result = auth_client.get( "/statement-periods", query_string={ "vendor_id": mock_account.id, "sort_direction": "DESC", "term": term, }, ) assert result.json == { "items": expected, "pagination": {"total_records": len(expected), "type": "standard"}, } assert result.status_code == 200 def test_get_statement_periods_error(auth_client, mock_account): """Test get statement period failure case.""" result = auth_client.get( "/statement-periods", query_string={"vendor_id": mock_account.id}, headers=[ ("orchard-identity-id", "7ec441df-7b21-4a71-a9da"), ("orchard-profile-id", "90003"), ("orchard-profile-type", "BogusProfile"), ], ) assert result.status_code == response_code.FORBIDDEN def test_get_statement_periods_no_access(auth_client, mock_account, mocker): """Test get statement period failure case.""" mock_auth(mocker, 0) result = auth_client.get( "/statement-periods", query_string={"vendor_id": mock_account.id} ) assert result.status_code == response_code.FORBIDDEN