Fix unnecessary call to organisation API endpoint

We’re caching the organisation name, but still talking to the API
to see if the organisation exists.

`Service().organisation_id` only goes to the JSON for the service.

`Service().organisation` makes a separate API call.

We only need the former to know if a service belongs to an organisation.
This commit is contained in:
Chris Hill-Scott
2020-04-02 15:06:03 +01:00
parent a709ee4a29
commit 047ca8a48c
3 changed files with 54 additions and 2 deletions

View File

@@ -472,7 +472,7 @@ class Service(JSONModel):
@property
def organisation_name(self):
if not self.organisation:
if not self.organisation_id:
return None
return organisations_client.get_organisation_name(self.organisation_id)

View File

@@ -296,7 +296,7 @@
{% call row() %}
{{ text_field('Live')}}
{% if current_service.trial_mode and not current_service.organisation %}
{% if current_service.trial_mode and not current_service.organisation_id %}
{{ text_field('No (organisation must be set first)') }}
{{ text_field('') }}
{% else %}

View File

@@ -1,5 +1,6 @@
import uuid
from app.models.organisation import Organisation
from app.models.service import Service
from app.models.user import User
from tests import organisation_json
@@ -195,3 +196,54 @@ def test_organisation_type_when_service_and_its_org_both_have_an_org_type(mocker
mocker.patch('app.organisations_client.get_organisation', return_value=org)
assert service.organisation_type == 'local'
def test_organisation_name_comes_from_cache(mocker, service_one):
mock_redis_get = mocker.patch(
'app.extensions.RedisClient.get',
return_value=b'"Borchester Council"',
)
mock_get_organisation = mocker.patch('app.organisations_client.get_organisation')
service = Service(service_one)
service._dict['organisation'] = ORGANISATION_ID
assert service.organisation_name == 'Borchester Council'
mock_redis_get.assert_called_once_with(f'organisation-{ORGANISATION_ID}-name')
assert mock_get_organisation.called is False
def test_organisation_name_goes_into_cache(mocker, service_one):
mocker.patch(
'app.extensions.RedisClient.get',
return_value=None,
)
mock_redis_set = mocker.patch(
'app.extensions.RedisClient.set',
)
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_json(),
)
service = Service(service_one)
service._dict['organisation'] = ORGANISATION_ID
assert service.organisation_name == 'Test Organisation'
mock_redis_set.assert_called_once_with(
f'organisation-{ORGANISATION_ID}-name',
'"Test Organisation"',
ex=604800,
)
def test_service_without_organisation_doesnt_need_org_api(mocker, service_one):
mock_redis_get = mocker.patch('app.extensions.RedisClient.get')
mock_get_organisation = mocker.patch('app.organisations_client.get_organisation')
service = Service(service_one)
service._dict['organisation'] = None
assert service.organisation_id is None
assert service.organisation_name is None
assert isinstance(service.organisation, Organisation)
assert mock_redis_get.called is False
assert mock_get_organisation.called is False