Esempio n. 1
0
class TestEsiApp(unittest.TestCase):

    ESI_CACHE_PREFIX = 'esipy_test'
    ESI_V1_CACHE_KEY = '%s:app://esi.evetech.net/v1/swagger.json' % (
        ESI_CACHE_PREFIX
    )
    ESI_META_SWAGGER = 'test/resources/meta_swagger.json'
    ESI_V1_SWAGGER = 'test/resources/swagger.json'

    @mock.patch('six.moves.urllib.request.urlopen')
    def setUp(self, urlopen_mock):
        # I hate those mock... thx urlopen instead of requests...
        urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
        with httmock.HTTMock(*_swagger_spec_mock_):
            self.app = EsiApp(cache_prefix='esipy_test')

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_op_attribute(self, urlopen_mock):
        self.assertTrue(self.app.op)
        self.assertEqual(
            self.app.op['verify'].url,
            '//esi.evetech.net/verify/'
        )

        urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
        with httmock.HTTMock(*_swagger_spec_mock_):
            app = EsiApp(cache_prefix='esipy_test', cache_time=-1)
            self.assertEqual(app.expire, 86400)

    def test_app_getattr_fail(self):
        with self.assertRaises(AttributeError):
            self.app.doesnotexist

        with self.assertRaises(AttributeError):
            self.app.verify

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_invalid_cache_value(self, urlopen_mock):
        cache = DictCache()
        cache.set(self.app.esi_meta_cache_key, 'somerandomvalue')
        urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
        with httmock.HTTMock(*_swagger_spec_mock_):
            EsiApp(cache_prefix='esipy_test', cache=cache)

        self.assertNotEqual(
            cache.get(self.app.esi_meta_cache_key),
            'somerandomvalue'
        )

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_getattr_and_cache(self, urlopen_mock):
        with httmock.HTTMock(*_swagger_spec_mock_):
            urlopen_mock.return_value = open(TestEsiApp.ESI_V1_SWAGGER)
            self.assertIsNotNone(
                self.app.cache.get(self.app.esi_meta_cache_key, None)
            )
            self.assertEqual(len(self.app.cache._dict), 1)
            appv1 = self.app.get_v1_swagger

            self.assertTrue(isinstance(appv1, App))
            self.assertEqual(
                self.app.cache.get(self.ESI_V1_CACHE_KEY)[0],
                appv1
            )
            appv1_bis = self.app.get_v1_swagger
            self.assertEqual(appv1, appv1_bis)

            self.app.clear_cached_endpoints()
            self.assertIsNone(
                self.app.cache.get(self.app.esi_meta_cache_key, None)
            )
            self.assertIsNone(self.app.cache.get(self.ESI_V1_CACHE_KEY, None))

            urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
            self.app.op
            self.assertIsNotNone(
                self.app.cache.get(self.app.esi_meta_cache_key, None)
            )

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_getattr_no_cache(self, urlopen_mock):
        with httmock.HTTMock(*_swagger_spec_mock_):
            urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
            app_nocache = EsiApp(
                cache=None, cache_prefix=self.ESI_CACHE_PREFIX)

            urlopen_mock.return_value = open(TestEsiApp.ESI_V1_SWAGGER)
            self.assertIsNone(
                app_nocache.cache.get(self.app.esi_meta_cache_key, None)
            )
            appv1 = app_nocache.get_v1_swagger

            self.assertTrue(isinstance(appv1, App))
            self.assertIsNone(
                app_nocache.cache.get(self.ESI_V1_CACHE_KEY, None))

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_expired_header_etag(self, urlopen_mock):
        @httmock.all_requests
        def check_etag(url, request):
            self.assertEqual(
                request.headers.get('If-None-Match'),
                '"esipyetag"')
            return httmock.response(
                headers={
                    'Expires': make_expire_time_str(),
                    'Etag': '"esipyetag"'
                },
                status_code=304)

        cache = DictCache()
        with httmock.HTTMock(*_swagger_spec_mock_):
            urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
            self.assertEqual(len(cache._dict), 0)
            app = EsiApp(
                cache_time=None, cache=cache, cache_prefix='esipy_test')
            self.assertEqual(len(cache._dict), 1)

        cache.get(
            app.esi_meta_cache_key
        )[1]['expires'] = make_expired_time_str()
        cached_app = cache.get(app.esi_meta_cache_key)[0]

        with httmock.HTTMock(check_etag):
            urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
            esiapp = EsiApp(
                cache_time=None, cache=cache, cache_prefix='esipy_test')
            self.assertEqual(cached_app, esiapp.app)
            urlopen_mock.return_value.close()

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_expired_header_no_etag(self, urlopen_mock):
        cache = DictCache()
        with httmock.HTTMock(*_swagger_spec_mock_):
            urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
            app = EsiApp(
                cache_time=None, cache=cache, cache_prefix='esipy_test')

            urlopen_mock.return_value = open(TestEsiApp.ESI_V1_SWAGGER)
            appv1 = app.get_v1_swagger
            cache.get(self.ESI_V1_CACHE_KEY)[1]['Expires'] = None

            urlopen_mock.return_value = open(TestEsiApp.ESI_V1_SWAGGER)
            appv1_uncached = app.get_v1_swagger
            self.assertNotEqual(appv1, appv1_uncached)

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_valid_header_etag(self, urlopen_mock):
        @httmock.all_requests
        def fail_if_request(url, request):
            self.fail('Cached data is not supposed to do requests')

        cache = DictCache()

        with httmock.HTTMock(*_swagger_spec_mock_):
            urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
            EsiApp(cache_time=None, cache=cache, cache_prefix='esipy_test')

        with httmock.HTTMock(fail_if_request):
            urlopen_mock.return_value = open(TestEsiApp.ESI_META_SWAGGER)
            EsiApp(cache_time=None, cache=cache, cache_prefix='esipy_test')
            urlopen_mock.return_value.close()
Esempio n. 2
0
class TestEsiApp(unittest.TestCase):

    ESI_CACHE_PREFIX = 'esipy_test'
    ESI_V1_CACHE_KEY = '%s:app://esi.evetech.net/v1/swagger.json' % (
        ESI_CACHE_PREFIX
    )

    @mock.patch('six.moves.urllib.request.urlopen')
    def setUp(self, urlopen_mock):
        # I hate those mock... thx urlopen instead of requests...
        urlopen_mock.return_value = open('test/resources/meta_swagger.json')
        self.app = EsiApp(cache_time=None, cache_prefix='esipy_test')

    def test_app_op_attribute(self):
        self.assertTrue(self.app.op)
        self.assertEqual(
            self.app.op['verify'].url,
            '//esi.evetech.net/verify/'
        )

    def test_app_getattr_fail(self):
        with self.assertRaises(AttributeError):
            self.app.doesnotexist

        with self.assertRaises(AttributeError):
            self.app.verify

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_getattr_and_cache(self, urlopen_mock):
        urlopen_mock.return_value = open('test/resources/swagger.json')
        self.assertIsNotNone(
            self.app.cache.get(self.app.esi_meta_cache_key, None)
        )
        self.assertEqual(len(self.app.cache._dict), 1)
        appv1 = self.app.get_v1_swagger

        self.assertTrue(isinstance(appv1, App))
        self.assertEqual(self.app.cache.get(self.ESI_V1_CACHE_KEY), appv1)
        appv1_bis = self.app.get_v1_swagger
        self.assertEqual(appv1, appv1_bis)

        self.app.clear_cached_endpoints()
        self.assertIsNone(
            self.app.cache.get(self.app.esi_meta_cache_key, None)
        )
        self.assertIsNone(self.app.cache.get(self.ESI_V1_CACHE_KEY, None))

        urlopen_mock.return_value = open('test/resources/meta_swagger.json')
        self.app.op
        self.assertIsNotNone(
            self.app.cache.get(self.app.esi_meta_cache_key, None)
        )

    @mock.patch('six.moves.urllib.request.urlopen')
    def test_app_getattr_no_cache(self, urlopen_mock):
        urlopen_mock.return_value = open('test/resources/meta_swagger.json')
        app_nocache = EsiApp(cache=None, cache_prefix=self.ESI_CACHE_PREFIX)

        urlopen_mock.return_value = open('test/resources/swagger.json')
        self.assertIsNone(
            app_nocache.cache.get(self.app.esi_meta_cache_key, None)
        )
        appv1 = app_nocache.get_v1_swagger

        self.assertTrue(isinstance(appv1, App))
        self.assertIsNone(app_nocache.cache.get(self.ESI_V1_CACHE_KEY, None))