"""Tests for sales file logic.""" from unittest.mock import patch import pytest from flask import g from royalties.constants import error from royalties.constants.constants import ACCOUNTING_PERIOD_STATUSES from royalties.logic import sales_file as logic from royalties.tests.utils.factories import AccountingPeriodFactory, SalesFileFactory @pytest.fixture def mock_models(): """Mock the model layer.""" with patch('royalties.logic.sales_file.models') as models: yield models @pytest.fixture def sales_file_data(): """Fixture generic sales file data.""" return {'accounting_period_id': '123', 'file_name': 'Fake sales file'} @patch('royalties.logic.sales_file.period_logic') def test_create_sales_file_success(mock_period_logic, mock_models, sales_file_data): """Test successful creation of a sales file.""" g.user_details = {'type': 'foo', 'id': '17'} accounting_period = AccountingPeriodFactory.build() mock_models.AccountingPeriod.get_by_id.return_value = accounting_period mock_models.SalesFile.find_by_name.return_value = None mock_period_logic.validate_accounting_period_state.return_value = None sales_file = SalesFileFactory.build( accounting_period=accounting_period, file_name=sales_file_data.get('file_name') ) mock_models.SalesFile.create.return_value = sales_file res = logic.create_sales_file(**sales_file_data) assert res.status == 201 assert res.message == { 'accounting_period_id': sales_file.accounting_period_id, 'amount_usd': sales_file.amount_usd, 'file_name': sales_file_data.get('file_name'), 'main_url': sales_file.main_url, 'row_count': sales_file.row_count, 'sales_file_id': sales_file.sales_file_id, } @patch('royalties.logic.sales_file.period_logic') def test_create_sales_file_fails_if_duplicate_name( mock_period_logic, mock_models, sales_file_data ): """Test creation fails when file of same name exists.""" mock_period_logic.validate_accounting_period_state.return_value = None mock_models.SalesFile.find_by_name.return_value = '' res = logic.create_sales_file(**sales_file_data) assert res.status == 400 assert res.errors['message'] == error.ERROR_ALREADY_EXISTS.format( object_type='Sales File' ) def test_update_sales_file_changes_the_period_statuses(mock_models): """Test successful sales file update changes the acct period status.""" current_period = AccountingPeriodFactory.build() sales_file = SalesFileFactory.build(accounting_period=current_period) params = { 'main_url': 'some-main-url', 'amount_usd': 450000340.45, 'row_count': 44500030, } res = logic.update_sales_file(sales_file, **params) assert res.status == 200 assert sales_file.main_url == 'some-main-url' assert sales_file.amount_usd == 450000340.45 assert sales_file.row_count == 44500030 assert current_period.accounting_period_status == ACCOUNTING_PERIOD_STATUSES.OPEN mock_models.SalesFile.commit_changes.assert_called_once()