"""Author: Sandeep Belgavi. Tenant, scope, cache and capacity contracts.""" import unittest from pattern_12 import Principal, TenantStore class TenantTests(unittest.TestCase): def setUp(self): self.a = Principal('a', frozenset({'a'}), frozenset({'read', 'write'})) self.b = Principal('b', frozenset({'b'}), frozenset({'read', 'write'})) self.s = TenantStore(limit=1) def test_same_identifier_separate_tenants(self): self.s.write(self.a, 'a', '1', 'alpha') self.s.write(self.b, 'b', '1', 'beta') self.assertEqual(self.s.read(self.a, 'a', '1'), 'alpha') self.assertEqual(self.s.read(self.b, 'b', '1'), 'beta') def test_cross_tenant_denied_before_cache(self): self.s.write(self.b, 'b', '1', 'secret') self.s.read(self.b, 'b', '1') with self.assertRaises(PermissionError): self.s.read(self.a, 'b', '1') def test_read_scope_not_write(self): reader = Principal('a', frozenset({'a'}), frozenset({'read'})) with self.assertRaises(PermissionError): self.s.write(reader, 'a', '1', 'text') self.assertEqual(self.s.rows, {}) def test_per_tenant_limit_does_not_consume_other_capacity(self): self.s.write(self.a, 'a', '1', 'alpha') with self.assertRaises(OverflowError): self.s.write(self.a, 'a', '2', 'more') self.s.write(self.b, 'b', '2', 'beta') self.assertEqual(self.s.counts, {'a': 1, 'b': 1}) def test_update_invalidates_cache(self): self.s.write(self.a, 'a', '1', 'old') self.s.read(self.a, 'a', '1') self.s.write(self.a, 'a', '1', 'new') self.assertEqual(self.s.read(self.a, 'a', '1'), 'new') self.assertEqual(self.s.counts['a'], 1) def test_revoked_membership_denied(self): self.s.write(self.a, 'a', '1', 'private') self.s.read(self.a, 'a', '1') revoked = Principal('a', frozenset(), frozenset({'read'})) with self.assertRaises(PermissionError): self.s.read(revoked, 'a', '1') def test_untrusted_object_rejected(self): with self.assertRaises(PermissionError): self.s.read({'subject': 'a'}, 'a', '1') def test_missing_does_not_cache(self): with self.assertRaises(KeyError): self.s.read(self.a, 'a', 'missing') self.assertEqual(self.s.cache, {}) if __name__ == '__main__': unittest.main()