"""Statement period model tests.""" from datetime import date from unittest.mock import patch from royalties.constants.constants import ( ACCOUNTING_PERIOD_STATUSES, CLOSED_STATEMENT_PERIODS_COUNT, OPEN_STATEMENT_PERIODS_COUNT, STATEMENT_PERIOD_STATUSES, ) from royalties.models.statement_period import StatementPeriod from royalties.tests.utils.factories import ( AccountingPeriodFactory, ExchangeRateFactory, StatementPeriodFactory, StatementPeriodPaymentEntityFactory, ) def test_create(): """Test creating a statement_period.""" StatementPeriod.create( statement_period_id=200, statement_period_name='Month Year', ) statement_periods = StatementPeriod.query.all() assert statement_periods assert len(statement_periods) == 1 assert statement_periods[0].statement_period_id == 200 assert statement_periods[0].statement_period_name == 'Month Year' assert ( statement_periods[0].statement_period_status == STATEMENT_PERIOD_STATUSES.OPEN ) assert statement_periods[0].statement_month == date.today().month assert statement_periods[0].statement_year == date.today().year assert not statement_periods[0].closed_date assert not statement_periods[0].closed_by def test_get_recent_statement_periods(statement_period_fixtures): """Test for getting recent statement periods.""" recent_periods = StatementPeriod.get_recent_periods() assert len(recent_periods) == CLOSED_STATEMENT_PERIODS_COUNT + 1 assert ( recent_periods[0].statement_period_status == STATEMENT_PERIOD_STATUSES.CURRENT ) assert all( [ period.statement_period_status == STATEMENT_PERIOD_STATUSES.CLOSED for period in recent_periods[1:] ] ) def test_get_upcoming_statement_periods(statement_period_fixtures): """Test for getting upcoming statement periods.""" upcoming_periods = StatementPeriod.get_upcoming_periods() assert len(upcoming_periods) == OPEN_STATEMENT_PERIODS_COUNT assert all( [ period.statement_period_status == STATEMENT_PERIOD_STATUSES.OPEN for period in upcoming_periods ] ) def test_get_current_statement_period(statement_period_fixtures): """Test to get current statement period.""" statement_periods = StatementPeriod.get_current_statement_period() assert ( statement_periods.statement_period_status == STATEMENT_PERIOD_STATUSES.CURRENT ) def test_close_period(): """Test close_period method.""" period = StatementPeriodFactory.create( statement_period_name='Month 10', statement_period_status='current', closed_date=None, closed_by=None, ) period.close_period() assert period.statement_period_status == STATEMENT_PERIOD_STATUSES.CLOSED assert period.closed_date is not None assert period.closed_by is not None def test_has_active_accounting_periods(): """Test to check if there are active acc periods is statement period.""" statement_period = StatementPeriodFactory.create( statement_period_name='Month 10', statement_period_status='current', closed_date=None, closed_by=None, ) accounting_period = AccountingPeriodFactory.create( statement_period=statement_period ) assert statement_period.has_active_accounting_periods() is True accounting_period.accounting_period_status = ACCOUNTING_PERIOD_STATUSES.CLOSED assert statement_period.has_active_accounting_periods() is False @patch( 'royalties.models.statement_period.is_statement_period_query_optimization_ff_enabled' ) def test_exchange_rates_delivered_ff_disabled(mock_feature): """Test whether a statement period has exchange rates delivered when ff is disabled.""" mock_feature.return_value = False period_with_rates = StatementPeriodFactory.build() period_without_rates = StatementPeriodFactory.build() ExchangeRateFactory.build(statement_period=period_with_rates) assert period_with_rates.exchange_rates_delivered assert not period_without_rates.exchange_rates_delivered @patch( 'royalties.models.statement_period.is_statement_period_query_optimization_ff_enabled' ) def test_exchange_rates_delivered_ff_enabled(mock_feature): """Test whether a statement period has exchange rates delivered when FF enabled.""" mock_feature.return_value = True period_with_rates = StatementPeriodFactory.build() period_without_rates = StatementPeriodFactory.build() ExchangeRateFactory.build(statement_period=period_with_rates) assert not period_with_rates.exchange_rates_delivered assert not period_without_rates.exchange_rates_delivered @patch( 'royalties.models.statement_period.is_statement_period_query_optimization_ff_enabled' ) def test_exchange_rates_delivered_ff_enabled_and_is_recent_period(mock_feature): """Test whether recent statement period has exchange rates delivered when FF enabled.""" mock_feature.return_value = True period_with_rates = StatementPeriodFactory.build() period_with_rates._is_recent_period = True period_without_rates = StatementPeriodFactory.build() period_without_rates._is_recent_period = True ExchangeRateFactory.build(statement_period=period_with_rates) assert period_with_rates.exchange_rates_delivered assert not period_without_rates.exchange_rates_delivered def test_statement_period_not_accepting_files(): """Test conditions where a statement period will not accept files.""" invalid_statuses = [ STATEMENT_PERIOD_STATUSES.OPEN, STATEMENT_PERIOD_STATUSES.CLOSED, ] for status in invalid_statuses: statement_period = StatementPeriodFactory( closed_date=None, statement_period_status=status ) result = statement_period.is_accepting_file_attachments() assert not result closed_statement_period = StatementPeriodFactory(closed_date='2019-01-15') result = closed_statement_period.is_accepting_file_attachments() assert not result def test_statement_period_accepts_files(): """Test that a statement period is currently accepting files.""" valid_statuses = [STATEMENT_PERIOD_STATUSES.CURRENT] for status in valid_statuses: statement_period = StatementPeriodFactory.build( closed_date=None, statement_period_status=status ) result = statement_period.is_accepting_file_attachments() assert result def test_default_order(): """Test the listing order of statement periods.""" for ind in [3, 1]: StatementPeriodFactory.create( statement_period_name=f'Month {ind}', statement_period_status='closed', closed_date='2021-01-01', closed_by='admin', ) statement_periods = StatementPeriod.query.all() assert statement_periods[0].statement_period_id == 1 assert statement_periods[1].statement_period_id == 2 def test_all_balances_closed( payment_entities_actions_fixtures, reference_payment_entity_fixtures, ): """Test property all_balances_closed.""" statement_period = StatementPeriodFactory.create() StatementPeriodPaymentEntityFactory.create( statement_period_payment_entity_id=1, reference_payment_entity_id=1, statement_period=statement_period, ) assert statement_period.all_balances_closed StatementPeriodPaymentEntityFactory.create( statement_period_payment_entity_id=2, reference_payment_entity_id=2, statement_period=statement_period, ) assert not statement_period.all_balances_closed def test_get_by_ids(): """Test getting statement periods by a list of IDs.""" statement_period_ids = [123, 124, 125] [ StatementPeriodFactory.create(statement_period_id=statement_period_id) for statement_period_id in statement_period_ids ] result = StatementPeriod.get_by_ids([122, 123, 124, 125, 126]) assert len(result) == len(statement_period_ids) assert all([res.statement_period_id in statement_period_ids for res in result]) def test_get_by_statement_years(): """Test get_by_statement_years function.""" statement_years = [2023, 2024, 2025] [ StatementPeriodFactory.create(statement_year=statement_year) for statement_year in statement_years ] result = StatementPeriod.get_by_statement_years([2022, 2023, 2024, 2025, 2026]) assert len(result) == len(statement_years) assert all([res.statement_year in statement_years for res in result])