"""Tests for statement_period handlers.""" from unittest.mock import MagicMock, patch import pytest from flask import testing as flask_testing from owsresponse import response from royalties.tests.utils.factories import StatementPeriodFactory @patch('royalties.blueprints.statement_period.logic') def test_get_recent_statement_periods(mock_logic, fixture_client): """Get recent statement periods.""" fixture_client.get('/statement-periods/recent') mock_logic.get_recent_statement_periods.assert_called_once() @patch('royalties.blueprints.statement_period.logic') def test_get_upcoming_statement_periods(mock_logic, fixture_client): """Get upcoming statement periods.""" fixture_client.get('/statement-periods/upcoming') mock_logic.get_upcoming_statement_periods.assert_called_once() @patch('royalties.blueprints.statement_period.logic') def test_get_current_statement_period(mock_logic, fixture_client): """Get current statement period.""" fixture_client.get('/statement-period/current') mock_logic.get_current_statement_period.assert_called_once() @patch('royalties.blueprints.statement_period.logic') def test_close_statement_period(mock_logic, fixture_client): """Close specified statement period.""" fixture_client.put('/statement-period/1/close') mock_logic.close_statement_period.assert_called_once_with(1) @patch('royalties.blueprints.statement_period.logic') def test_get_statement_period_exchange_rates(mock_logic, fixture_client): """Get exchange rates for specified statement period.""" mock_logic.get_statement_period_exchange_rates.return_value = response.Response( status=200, message='OK' ) result = fixture_client.get('/statement-period/1/bulk-exchange-rates') result.status_code = 200 mock_logic.get_statement_period_exchange_rates.assert_called_once_with(1, 'json') @patch('royalties.blueprints.statement_period.logic') def test_get_statement_periods_by_years(mock_logic, fixture_client): """Get statement periods by a list of statement_years.""" statement_periods = StatementPeriodFactory.create_batch(4) statement_years = [sp.statement_year for sp in statement_periods] mock_logic.get_statement_periods_by_years.return_value = response.Response( status=200, message='OK' ) res = fixture_client.post('/statement-periods/', json=statement_years) assert res.status_code == 200 mock_logic.get_statement_periods_by_years.assert_called_once_with(statement_years) @pytest.mark.parametrize( ['endpoint', 'standalone_check_result', 'pdp_check_result', 'status_code'], [ pytest.param( '/statement-periods/', True, None, 200, id='/statement-periods/ standalone check pass', ), pytest.param( '/statement-periods/', False, False, 403, id='/statement-periods/ PDP check fail', ), pytest.param( '/statement-periods/', False, True, 200, id='/statement-periods/ PDP check pass', ), pytest.param( '/statement-periods/recent', True, None, 200, id='/statement-periods/recent standalone check pass', ), pytest.param( '/statement-periods/recent', False, False, 403, id='/statement-periods/recent PDP check fail', ), pytest.param( '/statement-periods/recent', False, True, 200, id='/statement-periods/recent PDP check pass', ), pytest.param( '/statement-periods/upcoming', True, None, 200, id='/statement-periods/upcoming standalone check pass', ), pytest.param( '/statement-periods/upcoming', False, False, 403, id='/statement-periods/upcoming PDP check fail', ), pytest.param( '/statement-periods/upcoming', False, True, 200, id='/statement-periods/upcoming PDP check pass', ), ], ) @patch('royalties.blueprints.statement_period.authorization') @patch('royalties.blueprints.statement_period.flask_request') def test_get_statement_periods_endpoints_authorization( mock_flask_request: MagicMock, mock_authorization: MagicMock, endpoint: str, standalone_check_result: bool, pdp_check_result: bool | None, status_code: int, fixture_client: flask_testing.FlaskClient, ): """Test authorization for get recent statement periods endpoint.""" mock_flask_request.verify_rules_access_standalone.return_value = ( standalone_check_result ) mock_authorization.pdp_authorize_resource.return_value = pdp_check_result response = fixture_client.get(endpoint) assert response.status_code == status_code mock_flask_request.verify_rules_access_standalone.assert_called_once() if not standalone_check_result: mock_authorization.pdp_authorize_resource.assert_called_once_with( resource_id=0, resource_type='statement_period', )