Skip to content

Commit

Permalink
Merge pull request #58 from BirkbeckCTP/56-currency-region
Browse files Browse the repository at this point in the history
Make sure data is available for finding exchange rates
  • Loading branch information
joemull authored Mar 22, 2024
2 parents 0228497 + e515479 commit 98ede91
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 33 deletions.
26 changes: 15 additions & 11 deletions logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,19 @@ def get_base_band(level=None):
return get_base_band()
else:
try:
return models.Band.objects.filter(
base=True
).latest()
default_level = utils.get_standard_support_level()
if default_level:
return models.Band.objects.filter(
base=True,
level=default_level,
).latest()
else:
return models.Band.objects.filter(
base=True,
).latest()

except models.Band.DoesNotExist:
logger.warning('No base band found')
logger.warning('No default base band found.')


def latest_multiplier_for_indicator(
Expand Down Expand Up @@ -257,10 +265,6 @@ def keep_default_unique(obj):
:obj: an unsaved model instance with a property named 'default'
"""
if obj.default:
try:
other = type(obj).objects.get(default=True)
if obj != other:
other.default = False
other.save()
except type(obj).DoesNotExist:
pass
type(obj).objects.filter(default=True).exclude(pk=obj.pk).update(
default=False,
)
2 changes: 1 addition & 1 deletion models.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ def exchange_rate(self, base_band=None) -> Tuple[decimal.Decimal, str]:
base_band = logic.get_base_band()

if base_band:
base_key = base_band.country.alpha3
base_key = base_band.currency.region
else:
# This is needed during initial configuration
base_key = '---'
Expand Down
35 changes: 32 additions & 3 deletions tests/test_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,24 +48,53 @@ def test_get_indicator_by_country(self, open_saved):
data = logic.get_indicator_by_country(self.fake_indicator, 2050)
self.assertEqual(data['NLD'], 12345)

def test_get_base_band(self):

def test_get_base_band_base_level(self):
base_band = logic.get_base_band(self.level_base)
self.assertEqual(
self.band_base,
base_band,
)

def test_get_base_band_other_level(self):
other_base_band = logic.get_base_band(self.level_other)
self.assertEqual(
self.band_base_level_other,
other_base_band,
)

def test_get_base_band_no_args(self):
base_band = logic.get_base_band()
self.assertEqual(
self.band_base,
base_band,
)

def test_get_base_band_no_args_no_default_level(self):

# Make it so there is no default level
self.level_base.default = False
self.level_base.save()

base_band = logic.get_base_band()

# Restore data
self.level_base.default = True
self.level_base.save()

self.assertEqual(
self.band_base,
base_band,
)

def test_get_base_bands(self):

base_bands = logic.get_base_bands()
self.assertListEqual(
[self.band_base_level_other, self.band_base],
[
self.band_base_country_other,
self.band_base_level_other,
self.band_base
],
base_bands,
)

Expand Down
61 changes: 44 additions & 17 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from django.http import HttpRequest

from plugins.consortial_billing import models, plugin_settings
from plugins.consortial_billing import utils
from utils.testing import helpers
from press import models as press_models
from cms.models import Page
Expand Down Expand Up @@ -72,6 +73,10 @@ def setUpClass(cls):
name='Higher',
order=1,
)
cls.level_third = models.SupportLevel.objects.create(
name='Even Higher',
order=0,
)
cls.currency_base = models.Currency.objects.create(
code='GBP',
region='GBR',
Expand Down Expand Up @@ -100,6 +105,15 @@ def setUpClass(cls):
billing_agent=cls.agent_default,
base=True,
)
cls.band_base_country_other = models.Band.objects.create(
size=cls.size_other,
country='DE',
currency=cls.currency_other,
level=cls.level_third,
fee=5000,
billing_agent=cls.agent_default,
base=True,
)
cls.band_other_one = models.Band.objects.create(
size=cls.size_base,
country='GB',
Expand Down Expand Up @@ -192,9 +206,12 @@ def tearDownClass(cls):
cls.supporter_one.delete()
cls.band_other_two.delete()
cls.band_other_one.delete()
cls.band_base_country_other.delete()
cls.band_base_level_other.delete()
cls.band_base.delete()
cls.currency_other.delete()
cls.currency_base.delete()
cls.level_third.delete()
cls.level_other.delete()
cls.level_base.delete()
cls.size_other.delete()
Expand Down Expand Up @@ -242,23 +259,33 @@ def test_billing_agent_save(self):
self.assertFalse(other_has_country)
self.assertFalse(default_still_default)

def test_currency_exchange_rate(self):
with patch(
'plugins.consortial_billing.logic.latest_multiplier_for_indicator'
) as latest_multiplier:
self.currency_other.exchange_rate()
self.assertIn(
plugin_settings.RATE_INDICATOR,
latest_multiplier.call_args.args,
)
self.assertIn(
self.currency_other.region,
latest_multiplier.call_args.args,
)
self.assertIn(
self.currency_other.region,
latest_multiplier.call_args.args,
)
@patch('plugins.consortial_billing.logic.latest_multiplier_for_indicator')
def test_currency_exchange_rate_with_typical_args(self, latest_multiplier):
self.currency_base.exchange_rate(base_band=self.band_base_country_other)
expected_args = (
plugin_settings.RATE_INDICATOR,
self.currency_base.region, # Target currency
self.currency_other.region, # Specified base currency
utils.setting('missing_data_exchange_rate')
)
self.assertTupleEqual(
expected_args,
latest_multiplier.call_args.args,
)

@patch('plugins.consortial_billing.logic.latest_multiplier_for_indicator')
def test_currency_exchange_rate_with_no_args(self, latest_multiplier):
self.currency_other.exchange_rate()
expected_args = (
plugin_settings.RATE_INDICATOR,
self.currency_other.region, # Target currency
self.currency_base.region, # Default base currency
utils.setting('missing_data_exchange_rate')
)
self.assertTupleEqual(
expected_args,
latest_multiplier.call_args.args,
)

def test_band_economic_disparity(self):
with patch(
Expand Down
6 changes: 5 additions & 1 deletion tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ def test_manager_context_essential(self, latest_multiplier):
response.context['plugin'],
)
self.assertListEqual(
[self.band_base_level_other, self.band_base],
[
self.band_base_country_other,
self.band_base_level_other,
self.band_base
],
response.context['base_bands'],
)
self.assertEqual(
Expand Down
6 changes: 6 additions & 0 deletions utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,12 @@ def get_standard_support_level():
try:
return models.SupportLevel.objects.get(default=True)
except models.SupportLevel.DoesNotExist:
logger.error(
'No default support level found. '
'Using the support level ordered last, '
'but that may produce unintended results. '
'For best results, set a level as the default.'
)
return models.SupportLevel.objects.all().last()


Expand Down

0 comments on commit 98ede91

Please sign in to comment.