mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-12 14:00:17 +02:00
Change to on-demand loading for debug and failed starts only
This commit is contained in:
parent
331100370c
commit
bb0a7c014e
@ -1,9 +1,16 @@
|
|||||||
from esi.clients import esi_client_factory
|
|
||||||
from bravado.exception import HTTPNotFound, HTTPUnprocessableEntity
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'swagger.json')
|
from bravado.exception import HTTPNotFound, HTTPUnprocessableEntity, HTTPError
|
||||||
|
from jsonschema.exceptions import RefResolutionError
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from esi.clients import esi_client_factory
|
||||||
|
|
||||||
|
|
||||||
|
SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(
|
||||||
|
os.path.abspath(__file__)), 'swagger.json'
|
||||||
|
)
|
||||||
"""
|
"""
|
||||||
Swagger spec operations:
|
Swagger spec operations:
|
||||||
|
|
||||||
@ -151,7 +158,23 @@ class EveProvider(object):
|
|||||||
|
|
||||||
class EveSwaggerProvider(EveProvider):
|
class EveSwaggerProvider(EveProvider):
|
||||||
def __init__(self, token=None, adapter=None):
|
def __init__(self, token=None, adapter=None):
|
||||||
|
if settings.DEBUG:
|
||||||
self._client = None
|
self._client = None
|
||||||
|
logger.info(
|
||||||
|
'DEBUG mode detected: ESI client will be loaded on-demand.'
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
self._client = esi_client_factory(
|
||||||
|
token=token, spec_file=SWAGGER_SPEC_PATH
|
||||||
|
)
|
||||||
|
except (HTTPError, RefResolutionError):
|
||||||
|
logger.exception(
|
||||||
|
'Failed to load ESI client on startup. '
|
||||||
|
'Switching to on-demand loading for ESI client.'
|
||||||
|
)
|
||||||
|
self._client = None
|
||||||
|
|
||||||
self._token = token
|
self._token = token
|
||||||
self.adapter = adapter or self
|
self.adapter = adapter or self
|
||||||
|
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def set_logger(logger_name: str, name: str) -> object:
|
||||||
|
"""set logger for current test module
|
||||||
|
|
||||||
|
Args:
|
||||||
|
- logger: current logger object
|
||||||
|
- name: name of current module, e.g. __file__
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
- amended logger
|
||||||
|
"""
|
||||||
|
|
||||||
|
# reconfigure logger so we get logging from tested module
|
||||||
|
f_format = logging.Formatter(
|
||||||
|
'%(asctime)s - %(levelname)s - %(module)s:%(funcName)s - %(message)s'
|
||||||
|
)
|
||||||
|
f_handler = logging.FileHandler(
|
||||||
|
'{}.log'.format(os.path.splitext(name)[0]),
|
||||||
|
'w+'
|
||||||
|
)
|
||||||
|
f_handler.setFormatter(f_format)
|
||||||
|
logger = logging.getLogger(logger_name)
|
||||||
|
logger.level = logging.DEBUG
|
||||||
|
logger.addHandler(f_handler)
|
||||||
|
logger.propagate = False
|
||||||
|
return logger
|
1
allianceauth/eveonline/tests/swagger_old.json
Normal file
1
allianceauth/eveonline/tests/swagger_old.json
Normal file
File diff suppressed because one or more lines are too long
@ -1,13 +1,24 @@
|
|||||||
|
import os
|
||||||
from unittest.mock import Mock, patch
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
from bravado.exception import HTTPNotFound, HTTPUnprocessableEntity
|
from bravado.exception import HTTPNotFound, HTTPUnprocessableEntity
|
||||||
|
from jsonschema.exceptions import RefResolutionError
|
||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
|
from . import set_logger
|
||||||
from ..models import EveCharacter, EveCorporationInfo, EveAllianceInfo
|
from ..models import EveCharacter, EveCorporationInfo, EveAllianceInfo
|
||||||
from ..providers import ObjectNotFound, Entity, Character, Corporation, \
|
from ..providers import ObjectNotFound, Entity, Character, Corporation, \
|
||||||
Alliance, ItemType, EveProvider, EveSwaggerProvider
|
Alliance, ItemType, EveProvider, EveSwaggerProvider
|
||||||
|
|
||||||
|
|
||||||
|
MODULE_PATH = 'allianceauth.eveonline.providers'
|
||||||
|
SWAGGER_OLD_SPEC_PATH = os.path.join(os.path.dirname(
|
||||||
|
os.path.abspath(__file__)), 'swagger_old.json'
|
||||||
|
)
|
||||||
|
set_logger(MODULE_PATH, __file__)
|
||||||
|
|
||||||
|
|
||||||
class TestObjectNotFound(TestCase):
|
class TestObjectNotFound(TestCase):
|
||||||
|
|
||||||
def test_str(self):
|
def test_str(self):
|
||||||
@ -65,7 +76,7 @@ class TestEntity(TestCase):
|
|||||||
|
|
||||||
class TestCorporation(TestCase):
|
class TestCorporation(TestCase):
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_alliance')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_alliance')
|
||||||
def test_alliance_defined(self, mock_provider_get_alliance):
|
def test_alliance_defined(self, mock_provider_get_alliance):
|
||||||
my_alliance = Alliance(
|
my_alliance = Alliance(
|
||||||
id=3001,
|
id=3001,
|
||||||
@ -89,7 +100,7 @@ class TestCorporation(TestCase):
|
|||||||
self.assertEqual(mock_provider_get_alliance.call_count, 1)
|
self.assertEqual(mock_provider_get_alliance.call_count, 1)
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_alliance')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_alliance')
|
||||||
def test_alliance_not_defined(self, mock_provider_get_alliance):
|
def test_alliance_not_defined(self, mock_provider_get_alliance):
|
||||||
mock_provider_get_alliance.return_value = None
|
mock_provider_get_alliance.return_value = None
|
||||||
|
|
||||||
@ -100,7 +111,7 @@ class TestCorporation(TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_character')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_character')
|
||||||
def test_ceo(self, mock_provider_get_character):
|
def test_ceo(self, mock_provider_get_character):
|
||||||
my_ceo = Character(
|
my_ceo = Character(
|
||||||
id=1001,
|
id=1001,
|
||||||
@ -162,7 +173,7 @@ class TestAlliance(TestCase):
|
|||||||
if corp_id:
|
if corp_id:
|
||||||
return corps[int(corp_id)]
|
return corps[int(corp_id)]
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_corp')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
|
||||||
def test_corp(self, mock_provider_get_corp):
|
def test_corp(self, mock_provider_get_corp):
|
||||||
mock_provider_get_corp.side_effect = TestAlliance._get_corp
|
mock_provider_get_corp.side_effect = TestAlliance._get_corp
|
||||||
|
|
||||||
@ -190,7 +201,7 @@ class TestAlliance(TestCase):
|
|||||||
self.assertEqual(mock_provider_get_corp.call_count, 2)
|
self.assertEqual(mock_provider_get_corp.call_count, 2)
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_corp')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
|
||||||
def test_corps(self, mock_provider_get_corp):
|
def test_corps(self, mock_provider_get_corp):
|
||||||
mock_provider_get_corp.side_effect = TestAlliance._get_corp
|
mock_provider_get_corp.side_effect = TestAlliance._get_corp
|
||||||
|
|
||||||
@ -203,7 +214,7 @@ class TestAlliance(TestCase):
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_corp')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
|
||||||
def test_executor_corp(self, mock_provider_get_corp):
|
def test_executor_corp(self, mock_provider_get_corp):
|
||||||
mock_provider_get_corp.side_effect = TestAlliance._get_corp
|
mock_provider_get_corp.side_effect = TestAlliance._get_corp
|
||||||
|
|
||||||
@ -229,7 +240,7 @@ class TestCharacter(TestCase):
|
|||||||
alliance_id=3001
|
alliance_id=3001
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_corp')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
|
||||||
def test_corp(self, mock_provider_get_corp):
|
def test_corp(self, mock_provider_get_corp):
|
||||||
my_corp = Corporation(
|
my_corp = Corporation(
|
||||||
id=2001,
|
id=2001,
|
||||||
@ -244,8 +255,8 @@ class TestCharacter(TestCase):
|
|||||||
self.assertEqual(mock_provider_get_corp.call_count, 1)
|
self.assertEqual(mock_provider_get_corp.call_count, 1)
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_alliance')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_alliance')
|
||||||
@patch('allianceauth.eveonline.providers.EveSwaggerProvider.get_corp')
|
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
|
||||||
def test_alliance_has_one(
|
def test_alliance_has_one(
|
||||||
self,
|
self,
|
||||||
mock_provider_get_corp,
|
mock_provider_get_corp,
|
||||||
@ -312,7 +323,6 @@ class TestEveProvider(TestCase):
|
|||||||
|
|
||||||
class TestEveSwaggerProvider(TestCase):
|
class TestEveSwaggerProvider(TestCase):
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def esi_get_alliances_alliance_id(alliance_id):
|
def esi_get_alliances_alliance_id(alliance_id):
|
||||||
alliances = {
|
alliances = {
|
||||||
@ -437,13 +447,13 @@ class TestEveSwaggerProvider(TestCase):
|
|||||||
raise HTTPNotFound(Mock())
|
raise HTTPNotFound(Mock())
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.esi_client_factory')
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
def test_str(self, mock_esi_client_factory):
|
def test_str(self, mock_esi_client_factory):
|
||||||
my_provider = EveSwaggerProvider()
|
my_provider = EveSwaggerProvider()
|
||||||
self.assertEqual(str(my_provider), 'esi')
|
self.assertEqual(str(my_provider), 'esi')
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.esi_client_factory')
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
def test_get_alliance(self, mock_esi_client_factory):
|
def test_get_alliance(self, mock_esi_client_factory):
|
||||||
mock_esi_client_factory.return_value\
|
mock_esi_client_factory.return_value\
|
||||||
.Alliance.get_alliances_alliance_id \
|
.Alliance.get_alliances_alliance_id \
|
||||||
@ -472,7 +482,7 @@ class TestEveSwaggerProvider(TestCase):
|
|||||||
my_provider.get_alliance(3999)
|
my_provider.get_alliance(3999)
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.esi_client_factory')
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
def test_get_corp(self, mock_esi_client_factory):
|
def test_get_corp(self, mock_esi_client_factory):
|
||||||
mock_esi_client_factory.return_value\
|
mock_esi_client_factory.return_value\
|
||||||
.Corporation.get_corporations_corporation_id \
|
.Corporation.get_corporations_corporation_id \
|
||||||
@ -499,7 +509,7 @@ class TestEveSwaggerProvider(TestCase):
|
|||||||
my_provider.get_corp(2999)
|
my_provider.get_corp(2999)
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.esi_client_factory')
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
def test_get_character(self, mock_esi_client_factory):
|
def test_get_character(self, mock_esi_client_factory):
|
||||||
mock_esi_client_factory.return_value\
|
mock_esi_client_factory.return_value\
|
||||||
.Character.get_characters_character_id \
|
.Character.get_characters_character_id \
|
||||||
@ -527,7 +537,7 @@ class TestEveSwaggerProvider(TestCase):
|
|||||||
my_provider.get_character(1999)
|
my_provider.get_character(1999)
|
||||||
|
|
||||||
|
|
||||||
@patch('allianceauth.eveonline.providers.esi_client_factory')
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
def test_get_itemtype(self, mock_esi_client_factory):
|
def test_get_itemtype(self, mock_esi_client_factory):
|
||||||
mock_esi_client_factory.return_value\
|
mock_esi_client_factory.return_value\
|
||||||
.Universe.get_universe_types_type_id \
|
.Universe.get_universe_types_type_id \
|
||||||
@ -543,3 +553,53 @@ class TestEveSwaggerProvider(TestCase):
|
|||||||
# type not found
|
# type not found
|
||||||
with self.assertRaises(ObjectNotFound):
|
with self.assertRaises(ObjectNotFound):
|
||||||
my_provider.get_itemtype(4999)
|
my_provider.get_itemtype(4999)
|
||||||
|
|
||||||
|
@patch(MODULE_PATH + '.settings.DEBUG', False)
|
||||||
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
|
def test_create_client_on_normal_startup(self, mock_esi_client_factory):
|
||||||
|
my_provider = EveSwaggerProvider()
|
||||||
|
self.assertTrue(mock_esi_client_factory.called)
|
||||||
|
self.assertIsNotNone(my_provider._client)
|
||||||
|
|
||||||
|
@patch(MODULE_PATH + '.SWAGGER_SPEC_PATH', SWAGGER_OLD_SPEC_PATH)
|
||||||
|
@patch(MODULE_PATH + '.settings.DEBUG', False)
|
||||||
|
@patch('socket.socket')
|
||||||
|
def test_create_client_on_normal_startup_w_old_swagger_spec(
|
||||||
|
self, mock_socket
|
||||||
|
):
|
||||||
|
mock_socket.side_effect = Exception('Network blocked for testing')
|
||||||
|
my_provider = EveSwaggerProvider()
|
||||||
|
self.assertIsNone(my_provider._client)
|
||||||
|
|
||||||
|
@patch(MODULE_PATH + '.settings.DEBUG', True)
|
||||||
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
|
def test_dont_create_client_on_debug_startup(self, mock_esi_client_factory):
|
||||||
|
my_provider = EveSwaggerProvider()
|
||||||
|
self.assertFalse(mock_esi_client_factory.called)
|
||||||
|
self.assertIsNone(my_provider._client)
|
||||||
|
|
||||||
|
@patch(MODULE_PATH + '.settings.DEBUG', False)
|
||||||
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
|
def test_dont_create_client_if_client_creation_fails_on_normal_startup(
|
||||||
|
self, mock_esi_client_factory
|
||||||
|
):
|
||||||
|
mock_esi_client_factory.side_effect = RefResolutionError(cause='Test')
|
||||||
|
my_provider = EveSwaggerProvider()
|
||||||
|
self.assertTrue(mock_esi_client_factory.called)
|
||||||
|
self.assertIsNone(my_provider._client)
|
||||||
|
|
||||||
|
@patch(MODULE_PATH + '.settings.DEBUG', True)
|
||||||
|
@patch(MODULE_PATH + '.esi_client_factory')
|
||||||
|
def test_client_loads_on_demand(
|
||||||
|
self, mock_esi_client_factory
|
||||||
|
):
|
||||||
|
mock_esi_client_factory.return_value = 'my_client'
|
||||||
|
my_provider = EveSwaggerProvider()
|
||||||
|
self.assertFalse(mock_esi_client_factory.called)
|
||||||
|
self.assertIsNone(my_provider._client)
|
||||||
|
my_client = my_provider.client
|
||||||
|
self.assertTrue(mock_esi_client_factory.called)
|
||||||
|
self.assertIsNotNone(my_provider._client)
|
||||||
|
self.assertEqual(my_client, 'my_client')
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user