class TestCachedTemplate(SimpleTestCase): """Test the single cached angular template tag.""" def setUp(self): """Patch in a local memory cache.""" self.locmem_cache = LocMemCache('default', {}) self.locmem_cache.clear() self.patch = mock.patch.object(angular, 'cache', self.locmem_cache) self.patch.start() def tearDown(self): """Stop the patch.""" self.patch.stop() @tag('unit') @mock.patch('web.templatetags.angular.finders.get_finders') @mock.patch( 'builtins.open', new_callable=mock.mock_open, read_data='some_data' ) def test_not_cached(self, m_file, m_get_finders): """Test behaviour of a template that is not cached.""" m_get_finders.return_value = [FakeFinder(['a'])] key = '_angular_template_a' self.assertFalse(self.locmem_cache.get(key)) html = CAT('a') expected = ( '<script type="text/ng-template" id="/static/a">' 'some_data' '</script>' ) self.assertEqual(html, expected) self.assertEqual(self.locmem_cache.get(key), expected) @tag('unit') @mock.patch('web.templatetags.angular.finders.get_finders') @mock.patch( 'builtins.open', new_callable=mock.mock_open, read_data='some_data' ) def test_cached(self, m_file, m_get_finders): """Test behavior of a template that is cached.""" m_get_finders.return_value = [FakeFinder(['a'])] key = '_angular_template_a' self.locmem_cache.add(key, 'the_data') html = CAT('a') expected = 'the_data' self.assertEqual(html, expected) self.assertEqual(self.locmem_cache.get(key), expected)
def test_sensitive_cache_data_is_encrypted(settings, mocker): "fields marked as `encrypted` are stored in the cache with encryption" settings.registry.register('AWX_ENCRYPTED', field_class=fields.CharField, category=_('System'), category_slug='system', encrypted=True) def rot13(obj, attribute): assert obj.pk == 123 return getattr(obj, attribute).encode('rot13') native_cache = LocMemCache(str(uuid4()), {}) cache = EncryptedCacheProxy(native_cache, settings.registry, encrypter=rot13, decrypter=rot13) # Insert the setting value into the database; the encryption process will # use its primary key as part of the encryption key setting_from_db = mocker.Mock(pk=123, key='AWX_ENCRYPTED', value='SECRET!') mocks = mocker.Mock( **{ 'order_by.return_value': mocker.Mock( **{ '__iter__': lambda self: iter([setting_from_db]), 'first.return_value': setting_from_db }), }) with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks): cache.set('AWX_ENCRYPTED', 'SECRET!') assert cache.get('AWX_ENCRYPTED') == 'SECRET!' assert native_cache.get('AWX_ENCRYPTED') == 'FRPERG!'
class InMemoryCache(CacheBase): def __init__(self, params=None): self.cache = LocMemCache(name='Hydro', params={}) def get(self, key): try: value = self.cache.get(key) except Exception, err: value = None return value
def test_readonly_sensitive_cache_data_is_encrypted(settings): "readonly fields marked as `encrypted` are stored in the cache with encryption" settings.registry.register('AWX_ENCRYPTED', field_class=fields.CharField, category=_('System'), category_slug='system', read_only=True, encrypted=True) def rot13(obj, attribute): assert obj.pk is None return codecs.encode(getattr(obj, attribute), 'rot_13') native_cache = LocMemCache(str(uuid4()), {}) cache = EncryptedCacheProxy(native_cache, settings.registry, encrypter=rot13, decrypter=rot13) cache.set('AWX_ENCRYPTED', 'SECRET!') assert cache.get('AWX_ENCRYPTED') == 'SECRET!' assert native_cache.get('AWX_ENCRYPTED') == 'FRPERG!'
class InMemoryCache(CacheBase): def __init__(self, params=None): self.cache = LocMemCache(name='Hydro', params={}) def get(self, key): try: value = self.cache.get(key) except Exception as err: value = None return value def put(self, key, value, ttl=Configurator.CACHE_IN_MEMORY_KEY_EXPIRE): # just in case the default was changed during the running if ttl > Configurator.CACHE_IN_MEMORY_KEY_EXPIRE: ttl = Configurator.CACHE_IN_MEMORY_KEY_EXPIRE self.cache.set(key, value, ttl)
class TransactionCacheTestCase(base.JohnnyTestCase): def setUp(self): self.backend = LocMemCache('', {}) self.cache = TransactionCache(self.backend) self.cache.timeout = 1000 def test_get(self): self.backend.set('a', '1') self.assertEqual(self.cache.get('a'), '1') self.assertIsNone(self.cache.get('missing')) def test_local_caching(self): self.backend.set('a', '1') self.assertEqual(self.cache.get('a'), '1') self.backend.clear() self.assertEqual(self.cache.get('a'), '1') def test_get_many_local_caching(self): self.backend.set('a', '1') self.backend.set('b', '2') self.assertEqual( self.cache.get_many(['a', 'b', 'c']), {'a': '1', 'b': '2'}, ) self.backend.clear() self.backend.set('c', '3') self.assertEqual( self.cache.get_many(['a', 'b', 'c']), {'a': '1', 'b': '2'}, ) def test_get_many_looks_up_missing(self): self.cache.get('a') with patch.object(self.backend, 'get_many') as get_many: self.cache.get_many(['a', 'b', 'c']) get_many.assert_called_with(['b', 'c']) def test_set_get(self): self.backend.set('a', '1') self.assertEqual(self.cache.get('a'), '1') self.cache.set('a', '2') self.assertEqual(self.cache.get('a'), '2') self.assertEqual(self.backend.get('a'), '1') def test_set_many(self): self.cache.set_many({'a': '1', 'b': '2'}) self.assertEqual(self.cache.get('a'), '1') self.assertEqual(self.cache.get('b'), '2') def test_delete_get(self): self.backend.set('a', '1') self.assertEqual(self.cache.get('a'), '1') self.cache.delete('a') self.assertIsNone(self.cache.get('a')) self.assertEqual(self.backend.get('a'), '1') def test_delete_many(self): self.backend.set_many({'a': '1', 'b': '2'}) self.cache.delete_many(['a', 'b']) self.assertIsNone(self.cache.get('a')) self.assertIsNone(self.cache.get('b')) def test_rollback(self): self.backend.set('a', '1') self.assertEqual(self.cache.get('a'), '1') self.backend.set('a', '2') self.assertEqual(self.cache.get('a'), '1') self.cache.rollback() self.assertEqual(self.cache.get('a'), '2') def test_commit(self): self.backend.set('a', '1') self.backend.set('b', '2') self.cache.set('a', '3') self.cache.delete('b') self.assertEqual(self.backend.get('a'), '1') self.assertEqual(self.backend.get('b'), '2') self.cache.commit() self.assertEqual(self.backend.get('a'), '3') self.assertIsNone(self.backend.get('b')) def test_rollback_savepoint(self): self.cache.set('a', '1') self.cache.savepoint('sp1') self.cache.set('a', '2') self.cache.savepoint('sp2') self.cache.set('a', '3') self.assertEqual(self.cache.get('a'), '3') self.cache.rollback_savepoint('sp2') self.assertEqual(self.cache.get('a'), '2') self.cache.rollback_savepoint('sp1') self.assertEqual(self.cache.get('a'), '1') self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp0') def test_rollback_savepoint_skip(self): self.cache.set('a', '1') self.cache.savepoint('sp1') self.cache.set('a', '2') self.cache.savepoint('sp2') self.cache.set('a', '3') self.assertEqual(self.cache.get('a'), '3') self.cache.rollback_savepoint('sp1') self.assertEqual(self.cache.get('a'), '1') self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp2') def test_rollback_savepoint_same_name(self): self.cache.set('a', '1') self.cache.savepoint('sp') self.cache.set('a', '2') self.cache.savepoint('sp') self.cache.set('a', '3') self.assertEqual(self.cache.get('a'), '3') self.cache.rollback_savepoint('sp') self.assertEqual(self.cache.get('a'), '2') self.cache.rollback_savepoint('sp') self.assertEqual(self.cache.get('a'), '1') self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp') def test_commit_savepoint(self): self.cache.set('a', '1') self.cache.savepoint('sp1') self.cache.set('a', '2') self.assertEqual(self.cache.get('a'), '2') self.cache.commit_savepoint('sp1') self.assertEqual(self.cache.get('a'), '2') self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp1') def test_commit_savepoint_same_name(self): self.cache.set('a', '1') self.cache.savepoint('sp') self.cache.set('a', '2') self.cache.savepoint('sp') self.cache.set('a', '3') self.assertEqual(self.cache.get('a'), '3') self.cache.commit_savepoint('sp') self.assertEqual(self.cache.get('a'), '3') self.cache.rollback_savepoint('sp') self.assertEqual(self.cache.get('a'), '1') self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp')