"""Tests for revenue.""" from unittest.mock import MagicMock import pytest from ows_accounting import response from ows_accounting.connectors import redis from ows_accounting.logic import accounting_intervals from ows_accounting.logic import revenue from ows_accounting.models import currency from ows_accounting.models import fact_sales as fact_sales_model from ows_accounting.models import period as period_model # from ows_accounting.models import revenue as revenue_model from ows_accounting.presentation import fact_sales as fact_sales_presentation @pytest.fixture def fixture_fact_sales_snowflake_revenue(): """Fixture for revenue info from snowflake.""" return [ ('207', '100.10', '10'), ('208', '200.20', '20'), ('210', '400', '40') ] @pytest.fixture def fixture_currency(): """Fixture for currency model.""" return { 'id': 1, 'code': 'USD', 'symbol': '$', 'name': 'United States Dollar' } # @pytest.mark.parametrize('snowflake_feature', [True, False]) # def test_get_revenue( # monkeypatch, snowflake_feature, fixture_accounting_intervals, # fixture_fact_sales_redshift_revenue, # fixture_fact_sales_snowflake_revenue, fixture_currency): # """Test getting revenue.""" # expected_revenue = [ # { # 'min_accounting_period': 222, # 'max_accounting_period': 222, # 'interval': { # 'type': 'month', # 'number': 9, # 'year': 2016 # }, # 'currency_id': 1, # 'currency_symbol': '$', # 'revenue': 0, # 'num_transactions': 0 # }, { # 'min_accounting_period': 208, # 'max_accounting_period': 210, # 'interval': { # 'type': 'quarter', # 'number': 2, # 'year': 2016 # }, # 'currency_id': 1, # 'currency_symbol': '$', # 'revenue': 900.5, # 'num_transactions': 90 # }, { # 'min_accounting_period': 207, # 'max_accounting_period': 207, # 'interval': { # 'type': 'month', # 'number': 3, # 'year': 2016 # }, # 'currency_id': 1, # 'currency_symbol': '$', # 'revenue': 100.10, # 'num_transactions': 10 # } # ] # # redis.client.flushall() # revenue_model.save('vendor', 100, 209, 300.30, 30) # if snowflake_feature: # fact_sales_data = fixture_fact_sales_snowflake_revenue.copy() # else: # fact_sales_data = fixture_fact_sales_redshift_revenue.copy() # # monkeypatch.setattr( # features, 'is_accounting_first_statement_period_enabled', # MagicMock(return_value=False)) # monkeypatch.setattr( # accounting_intervals, 'get_intervals_from_contracts', # MagicMock(return_value=fixture_accounting_intervals)) # monkeypatch.setattr( # fact_sales_model, 'get_account_revenue', # MagicMock(return_value=fact_sales_data)) # monkeypatch.setattr( # currency, 'get_currency_by_id', # MagicMock(return_value=response.Response(fixture_currency))) # # result = revenue.get_revenue('vendor', 100, 4) # # accounting_intervals.get_intervals_from_contracts.assert_called_with( # 'vendor', 100, 4) # fact_sales_model.get_account_revenue.assert_called_with( # 'vendor', 100, [222, 210, 208, 207]) # # assert result.status # assert result.message == expected_revenue def test_get_revenue_with_wrong_intervals(monkeypatch): """Test getting revenue with wrong accounting intervals.""" monkeypatch.setattr( accounting_intervals, 'get_intervals_from_contracts', MagicMock(return_value=response.create_error_response( 'code', 'message'))) result = revenue.get_revenue('vendor', 100, 4) accounting_intervals.get_intervals_from_contracts.assert_called_with( 'vendor', 100, 4) assert result.status == 400 def test_get_revenue_with_wrong_currency( monkeypatch, fixture_accounting_intervals, fixture_fact_sales_snowflake_revenue): """Test getting revenue with wrong currency id.""" redis.client.flushall() fact_sales_data = fixture_fact_sales_snowflake_revenue.copy() monkeypatch.setattr( accounting_intervals, 'get_intervals_from_contracts', MagicMock(return_value=fixture_accounting_intervals)) monkeypatch.setattr( revenue, '_get_first_statement_period', MagicMock(return_value=fixture_accounting_intervals.message)) monkeypatch.setattr(fact_sales_model, 'get_account_revenue', MagicMock()) monkeypatch.setattr( fact_sales_presentation, 'revenues', MagicMock(return_value=fact_sales_data)) monkeypatch.setattr( currency, 'get_currency_by_id', MagicMock(return_value=response.create_not_found_response())) result = revenue.get_revenue('vendor', 100, 4) accounting_intervals.get_intervals_from_contracts.assert_called_with( 'vendor', 100, 4) fact_sales_model.get_account_revenue.assert_called_with( 'vendor', 100, [222, 210, 209, 208, 207]) assert fact_sales_presentation.revenues.called assert result.status == 404 @pytest.mark.parametrize('account_type', ['vendor', 'subaccount']) def test_get_first_statement_period(monkeypatch, account_type): """Test filtering intervals.""" given_intervals = [ { 'type': 'month', 'number': 12, 'year': '2017', 'currency_id': 1, 'periods': [228] }, { 'type': 'month', 'number': 11, 'year': '2017', 'currency_id': 1, 'periods': [227] }, { 'type': 'month', 'number': 10, 'year': '2017', 'currency_id': 1, 'periods': [226] }, { 'type': 'month', 'number': 9, 'year': '2017', 'currency_id': 1, 'periods': [225] } ] expected_intervals = [ { 'type': 'month', 'number': 12, 'year': '2017', 'currency_id': 1, 'periods': [228] }, { 'type': 'month', 'number': 11, 'year': '2017', 'currency_id': 1, 'periods': [227] } ] monkeypatch.setattr( period_model, 'get_first_statement_period', MagicMock(return_value=response.Response(227))) result = revenue._get_first_statement_period( 123, account_type, given_intervals) assert result == expected_intervals @pytest.mark.parametrize('account_type', ['vendor', 'subaccount']) def test_get_first_statement_called( monkeypatch, fixture_accounting_intervals, fixture_fact_sales_snowflake_revenue, account_type): """Test get first period statement called.""" fact_sales_data = fixture_fact_sales_snowflake_revenue.copy() monkeypatch.setattr( accounting_intervals, 'get_intervals_from_contracts', MagicMock(return_value=fixture_accounting_intervals)) monkeypatch.setattr(fact_sales_model, 'get_account_revenue', MagicMock()) monkeypatch.setattr( fact_sales_presentation, 'revenues', MagicMock(return_value=fact_sales_data)) monkeypatch.setattr( currency, 'get_currency_by_id', MagicMock(return_value=response.create_not_found_response())) monkeypatch.setattr( revenue, '_get_first_statement_period', MagicMock(return_value=fixture_accounting_intervals.message)) revenue.get_revenue(account_type, 100, 4) revenue._get_first_statement_period.assert_called_with( 100, account_type, fixture_accounting_intervals.message) def test_get_average_monthly_net_revenue(monkeypatch): """Test getting the average monthly net revenue.""" payload = {'average_monthly_net_revenue': 1000} monkeypatch.setattr( fact_sales_model, 'get_average_monthly_net_revenue', MagicMock(return_value=response.Response(payload))) account_type = 'vendor' account_id = 1234 result = revenue.get_average_monthly_net_revenue(account_type, account_id) fact_sales_model.get_average_monthly_net_revenue.assert_called_once_with( account_type, account_id) assert result.message == payload