from unittest.mock import MagicMock from unittest.mock import patch import pytest from ows_accounting import features from ows_accounting.models import fact_sales from ows_accounting.models.sql import revenue @pytest.mark.parametrize( 'account_type, account_id, sql_template, periods_list, periods_converted, ' 'subaccount_gross_net_enabled, vendor_gross_net_enabled', [ ( 'vendor', 1000, revenue.SQL_GET_VENDOR_REVENUE, [200, 201], [200, 201], False, False), ( 'vendor', 1000, revenue.SQL_GET_GROSS_VENDOR_REVENUE, [200, 201], [200, 201], False, True), ( 'subaccount', 1111, revenue.SQL_GET_SUBACCOUNT_REVENUE, [215, 216], [215, 216], False, False), ( 'subaccount', 1111, revenue.SQL_GET_SUBACCOUNT_NET_GROSS_REVENUE, [215, 216], [215, 216], True, False), ( 'vendor', 1500, revenue.SQL_GET_VENDOR_REVENUE, [], [0], False, False) ] ) @patch('ows_accounting.models.fact_sales.snowflake') def test_get_snowflake_account_revenue( mock_snowflake, monkeypatch, account_type, account_id, sql_template, periods_list, periods_converted, subaccount_gross_net_enabled, vendor_gross_net_enabled): """Test get_account_revenue from snowflake.""" monkeypatch.setattr( features, 'is_subaccount_gross_net_enabled', MagicMock(return_value=subaccount_gross_net_enabled)) monkeypatch.setattr( features, 'is_vendor_gross_net_enabled', MagicMock(return_value=vendor_gross_net_enabled)) mock_session = MagicMock() mock_context = MagicMock() mock_result = MagicMock() mock_session.execute.return_value = mock_result mock_snowflake.db_session.return_value = mock_context mock_context.__enter__.return_value = mock_session fact_sales.get_account_revenue( account_type, account_id, periods_list) sql = sql_template.format(**revenue.SNOWFLAKE_REVENUE_PARAMS) mock_session.execute.assert_any_call( sql, {'account_id': account_id, 'periods': periods_converted}) @patch('ows_accounting.models.fact_sales.snowflake') def test_get_average_monthly_net_revenue(mock_snowflake, monkeypatch): """Test getting the average monthly net revenue.""" account_type = 'vendor' account_id = 1234 sql = revenue.SQL_GET_AVERAGE_MONTHLY_NET_REVENUE.format( account_type='label') mock_session = MagicMock() mock_context = MagicMock() mock_result = MagicMock() mock_result.fetchall.return_value = [[1000.32]] mock_session.execute.return_value = mock_result mock_snowflake.db_session.return_value = mock_context mock_context.__enter__.return_value = mock_session result = fact_sales.get_average_monthly_net_revenue( account_type, account_id) mock_session.execute.assert_called_once_with( sql, {'account_id': account_id}) assert result.message == {'average_monthly_net_revenue': 1000} @patch('ows_accounting.models.fact_sales.snowflake') def test_get_budget_caps(mock_snowflake, monkeypatch): """Test getting the budget caps for all the labels.""" sql = revenue.SQL_GET_BUDGET_CAPS_BASED_ON_REVENUE.format(env='test') mock_session = MagicMock() mock_context = MagicMock() mock_result = MagicMock() mock_result.fetchall.return_value = [(123, 2500, 'white_list')] mock_session.execute.return_value = mock_result mock_snowflake.db_session.return_value = mock_context mock_context.__enter__.return_value = mock_session result = fact_sales.get_budget_caps() mock_session.execute.assert_called_once_with(sql) assert result.message == { 'items': [{ 'account_type': 'vendor', 'account_id': 123, 'monthly_total_budget': 2500, 'budget_type': 'white_list' }]} @patch('ows_accounting.models.fact_sales.snowflake') def test_get_budget_caps_with_null_values(mock_snowflake, monkeypatch): """Test getting the budget caps for all the labels with budget as null.""" sql = revenue.SQL_GET_BUDGET_CAPS_BASED_ON_REVENUE.format(env='test') mock_session = MagicMock() mock_context = MagicMock() mock_result = MagicMock() mock_result.fetchall.return_value = [ (123, None, 'general'), (124, 2500, 'white_list'), (124, 0, 'white_list')] mock_session.execute.return_value = mock_result mock_snowflake.db_session.return_value = mock_context mock_context.__enter__.return_value = mock_session result = fact_sales.get_budget_caps() mock_session.execute.assert_called_once_with(sql) assert result.message == { 'items': [ { 'account_type': 'vendor', 'account_id': 124, 'monthly_total_budget': 2500, 'budget_type': 'white_list'}]} @patch('ows_accounting.models.fact_sales.snowflake') def test_get_first_sale_accounting_period(mock_snowflake, monkeypatch): """ Test getting the first accounting period for which the account has sales. """ account_type = 'vendor' account_id = 1234 period = 240 sql = revenue.SQL_GET_FIRST_SALE_ACCOUNTING_PERIOD.format( account_type='label' ) mock_session = MagicMock() mock_context = MagicMock() mock_result = MagicMock() mock_result.fetchone.return_value = [period] mock_session.execute.return_value = mock_result mock_snowflake.db_session.return_value = mock_context mock_context.__enter__.return_value = mock_session result = fact_sales.get_first_sale_accounting_period( account_type, account_id) mock_session.execute.assert_called_once_with( sql, {'account_id': account_id}) assert result.message == 240