def setUpClass(cls): tenant = TenantModel(schema_name="tenant") tenant.save(verbosity=0) catalog = Catalog.objects.create() Catalog.objects.create() with SchemaDescriptor.create(schema_name="www"): user = User.objects.create(email="*****@*****.**", display_name="Main User") user.set_password("weakpassword") user.save() MainData.objects.create() with SchemaDescriptor.create(schema_name="blog"): user = User.objects.create(email="*****@*****.**", display_name="Blog User") user.set_password("weakpassword") user.save() BlogEntry.objects.create(user=user) with TenantModel.objects.first(): user = User.objects.create(email="*****@*****.**", display_name="Tenant User") user.set_password("weakpassword") user.save() TenantData.objects.create(user=user, catalog=catalog) activate_public() super().setUpClass()
def test_file_url_simple(self): with SchemaDescriptor.create(schema_name=""): self.assertEqual(self.storage.url("test.file"), "/base-url/test.file") with SchemaDescriptor.create(schema_name="public"): self.assertEqual(self.storage.url("test.file"), "/base-url/public/test.file") with SchemaDescriptor.create(schema_name="tenant", folder="folder"): self.assertEqual(self.storage.url("test.file"), "/base-url/test.file")
def test_base_url(self): with SchemaDescriptor.create(schema_name=""): self.assertEquals(self.storage.base_url, "/base-url/") with SchemaDescriptor.create(schema_name="public"): self.assertEquals(self.storage.base_url, "/base-url/public/") with SchemaDescriptor.create(schema_name="blog"): self.assertEquals(self.storage.base_url, "/base-url/blog/") with SchemaDescriptor.create(schema_name="tenant", folder="folder"): self.assertEquals(self.storage.base_url, "/base-url/")
def test_base_location(self): with SchemaDescriptor.create(schema_name=""): self.assertEquals(self.storage.base_location, self.temp_dir + "/") with SchemaDescriptor.create(schema_name="public"): self.assertEquals(self.storage.base_location, self.temp_dir + "/public/") with SchemaDescriptor.create(schema_name="blog"): self.assertEquals(self.storage.base_location, self.temp_dir + "/blog/") with SchemaDescriptor.create(schema_name="tenant", folder="folder"): self.assertEquals(self.storage.base_location, self.temp_dir + "/tenant/")
def test_path_identifier_basic(self): with SchemaDescriptor.create(schema_name=""): self.assertEquals(self.storage.get_schema_path_identifier(), "") with SchemaDescriptor.create(schema_name="public"): self.assertEquals(self.storage.get_schema_path_identifier(), "public") with SchemaDescriptor.create(schema_name="blog"): self.assertEquals(self.storage.get_schema_path_identifier(), "blog") with TenantModel(schema_name="tenant"): self.assertEquals(self.storage.get_schema_path_identifier(), "tenant")
def test_file_path(self): self.assertFalse(self.storage.exists("test.file")) with SchemaDescriptor.create(schema_name="tenant1"): f = ContentFile("random content") f_name = self.storage.save("test.file", f) self.assertEqual(os.path.join(self.temp_dir, "tenant1", f_name), self.storage.path(f_name)) self.storage.delete(f_name) self.assertFalse(self.storage.exists("test.file"))
def test_cross_authentication(self): with SchemaDescriptor.create(schema_name="www"): self.assertTrue(authenticate(email="*****@*****.**", password="******")) # good self.assertFalse(authenticate(email="*****@*****.**", password="******")) # bad self.assertFalse(authenticate(email="*****@*****.**", password="******")) # bad with SchemaDescriptor.create(schema_name="blog"): self.assertTrue(authenticate(email="*****@*****.**", password="******")) # good self.assertFalse(authenticate(email="*****@*****.**", password="******")) # bad self.assertFalse(authenticate(email="*****@*****.**", password="******")) # bad with TenantModel.objects.first(): self.assertTrue(authenticate(email="*****@*****.**", password="******")) # good self.assertFalse(authenticate(email="*****@*****.**", password="******")) # bad self.assertFalse(authenticate(email="*****@*****.**", password="******")) # bad # Switching to public schema activate_public() with self.assertRaises(ProgrammingError): authenticate(email="*****@*****.**", password="******") # unexisting, error
def test_file_save_with_path(self): self.assertFalse(self.storage.exists("path/to")) with SchemaDescriptor.create(schema_name="tenant1"): self.storage.save("path/to/test.file", ContentFile("file saved with path")) self.assertTrue(self.storage.exists("path/to")) with self.storage.open("path/to/test.file") as f: self.assertEqual(f.read(), b"file saved with path") self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "tenant1", "path", "to", "test.file"))) self.storage.delete("path/to/test.file") self.assertFalse(self.storage.exists("test.file"))
def test_file_url_complex(self): with SchemaDescriptor.create(schema_name="tenant"): self.assertEqual( self.storage.url(r"~!*()'@#$%^&*abc`+ =.file"), "/base-url/tenant/~!*()'%40%23%24%25%5E%26*abc%60%2B%20%3D.file", ) self.assertEqual(self.storage.url("ab\0c"), "/base-url/tenant/ab%00c") self.assertEqual(self.storage.url("a/b\\c.file"), "/base-url/tenant/a/b/c.file") self.assertEqual(self.storage.url(""), "/base-url/tenant/") self.assertEqual(self.storage.url(None), "/base-url/tenant/")
def test_filter(self): class FakeRecord: pass record = FakeRecord() scf = SchemaContextFilter() with SchemaDescriptor.create(schema_name="some-tenant", domain_url="some-tenant.some-url.com"): scf.filter(record) self.assertEqual(record.schema_name, "some-tenant") self.assertEqual(record.domain_url, "some-tenant.some-url.com")
def test_synced_main_apps(self): with SchemaDescriptor.create(schema_name="www"): # Expected synced apps self.assertEqual(2, Catalog.objects.count()) self.assertEqual(1, MainData.objects.count()) self.assertEqual(1, User.objects.count()) # Not expected synced apps with self.assertRaises(ProgrammingError): list(BlogEntry.objects.all()) with self.assertRaises(ProgrammingError): list(TenantData.objects.all())
def test_tenant_prefix(self): tpp = TenantPrefixPattern() for tenant in TenantModel.objects.all(): # Try with folder tenant.domain_url = "everyone.test.com" # This should be set by middleware with tenant: self.assertEqual(tpp.tenant_prefix, tenant.get_primary_domain().folder + "/") # Try with subdomain tenant.domain_url = "{}.test.com".format(tenant.schema_name) # This should be set by middleware with tenant: self.assertEqual(tpp.tenant_prefix, "/") with SchemaDescriptor.create(schema_name="tenant1", domain_url="unexisting-domain.test.com"): self.assertEqual(tpp.tenant_prefix, "/")
def test_synced_blog_apps(self): with SchemaDescriptor.create(schema_name="blog"): # Expected synced apps self.assertEqual(2, Catalog.objects.count()) self.assertEqual(1, BlogEntry.objects.count()) self.assertEqual(1, User.objects.count()) # Direct and reverse relations self.assertEqual(User.objects.first(), BlogEntry.objects.first().user) self.assertEqual(User.objects.first().blogs.first(), BlogEntry.objects.first()) # Not expected synced apps with self.assertRaises(ProgrammingError): list(MainData.objects.all()) with self.assertRaises(ProgrammingError): list(TenantData.objects.all())
def test_schema_activate(self): response = {} params = { "schema_name": "test", "domain_url": "localhost", "folder": "folder", } def receiver(sender, schema, **kwargs): response["value"] = schema schema_activate.connect(receiver) activate(SchemaDescriptor.create(**params)) schema_activate.disconnect(receiver) for key, value in params.items(): self.assertEqual(value, getattr(response["value"], key))
def test_blog(self): schema = SchemaDescriptor.create(schema_name="blog", domain_url="blog.test.com") urlconf = get_urlconf_from_schema(schema) self.assertEqual(urlconf, "app_blog.urls")
def test_www(self): schema = SchemaDescriptor.create(schema_name="www", domain_url="test.com") urlconf = get_urlconf_from_schema(schema) self.assertEqual(urlconf, "app_main.urls")
def test_sample(self): schema = SchemaDescriptor.create(schema_name="sample") urlconf = get_urlconf_from_schema(schema) self.assertEqual(urlconf, None)
def setUpClass(cls): tenant = SchemaDescriptor.create(schema_name="tenant1", domain_url="everyone.test.com") cls.tenant_client = TenantClient(tenant)