Merge pull request #90 from aniav/master

Fix tests, move from PUBLIC_SCHEMA_URL_TOKEN to PUBLIC_SCHEMA_URLCONF
This commit is contained in:
Bernardo Pires 2013-11-20 07:55:01 -08:00
commit 45c32caff3
5 changed files with 71 additions and 24 deletions

View File

@ -151,7 +151,7 @@ Optional Settings
Tenant View-Routing
-------------------
.. attribute:: PUBLIC_SCHEMA_URL_TOKEN
.. attribute:: PUBLIC_SCHEMA_URLCONF
:Default: ``None``

View File

@ -1,14 +1,18 @@
from django.conf import settings
from django.db import connection
from django.test import TransactionTestCase
from django.test.client import RequestFactory
from tenant_schemas.middleware import TenantMiddleware
from tenant_schemas.tests.models import Tenant
from tenant_schemas.utils import get_public_schema_name
class RoutesTestCase(TransactionTestCase):
@classmethod
def setUpClass(cls):
settings.TENANT_APPS = ('tenant_schemas', 'django.contrib.contenttypes', 'django.contrib.auth', )
settings.TENANT_APPS = ('tenant_schemas',
'django.contrib.contenttypes',
'django.contrib.auth', )
def setUp(self):
self.factory = RequestFactory()
@ -16,11 +20,11 @@ class RoutesTestCase(TransactionTestCase):
# settings needs some patching
settings.TENANT_MODEL = 'tenant_schemas.Tenant'
settings.PUBLIC_SCHEMA_URL_TOKEN = '/public'
# add the public tenant
self.public_tenant_domain = 'test.com'
self.public_tenant = Tenant(domain_url=self.public_tenant_domain, schema_name='public')
self.public_tenant = Tenant(domain_url=self.public_tenant_domain,
schema_name='public')
self.public_tenant.save()
# add a test tenant
@ -29,6 +33,23 @@ class RoutesTestCase(TransactionTestCase):
self.tenant.save()
def tearDown(self):
"""
Delete all tenant schemas. Tenant schema are not deleted
automatically by django.
"""
connection.set_schema_to_public()
do_not_delete = [get_public_schema_name(), 'information_schema']
cursor = connection.cursor()
# Use information_schema.schemata instead of pg_catalog.pg_namespace in
# utils.schema_exists, so that we only "see" schemas that we own
cursor.execute('SELECT schema_name FROM information_schema.schemata')
for row in cursor.fetchall():
if not row[0].startswith('pg_') and row[0] not in do_not_delete:
print("Deleting schema %s" % row[0])
cursor.execute('DROP SCHEMA %s CASCADE' % row[0])
Tenant.objects.all().delete()
def test_tenant_routing(self):
@ -36,7 +57,8 @@ class RoutesTestCase(TransactionTestCase):
request path should not be altered
"""
request_url = '/any/request/'
request = self.factory.get('/any/request/', HTTP_HOST=self.tenant_domain)
request = self.factory.get('/any/request/',
HTTP_HOST=self.tenant_domain)
self.tm.process_request(request)
self.assertEquals(request.path_info, request_url)
@ -46,13 +68,14 @@ class RoutesTestCase(TransactionTestCase):
def test_public_schema_routing(self):
"""
request path should get prepended with PUBLIC_SCHEMA_URL_TOKEN
request path should not be altered
"""
request_url = '/any/request/'
request = self.factory.get('/any/request/', HTTP_HOST=self.public_tenant_domain)
request = self.factory.get('/any/request/',
HTTP_HOST=self.public_tenant_domain)
self.tm.process_request(request)
self.assertEquals(request.path_info, settings.PUBLIC_SCHEMA_URL_TOKEN + request_url)
self.assertEquals(request.path_info, request_url)
# request.tenant should also have been set
self.assertEquals(request.tenant, self.public_tenant)
self.assertEquals(request.tenant, self.public_tenant)

View File

@ -2,15 +2,27 @@ from django.conf import settings
from django.db import connection
from django.test.testcases import TransactionTestCase
from tenant_schemas.tests.models import Tenant, NonAutoSyncTenant, DummyModel
from tenant_schemas.utils import tenant_context, schema_exists, get_public_schema_name
from tenant_schemas.utils import (tenant_context, schema_exists,
get_public_schema_name)
class TenantTestCase(TransactionTestCase):
@classmethod
def setUpClass(cls):
settings.TENANT_APPS = ('tenant_schemas', 'django.contrib.contenttypes', 'django.contrib.auth', )
settings.TENANT_APPS = ('tenant_schemas',
'django.contrib.contenttypes',
'django.contrib.auth', )
def setUp(self):
# settings needs some patching
settings.TENANT_MODEL = 'tenant_schemas.Tenant'
# add the public tenant
self.public_tenant_domain = 'test.com'
self.public_tenant = Tenant(domain_url=self.public_tenant_domain,
schema_name='public')
self.public_tenant.save()
connection.set_schema_to_public()
def tearDown(self):
@ -28,14 +40,17 @@ class TenantTestCase(TransactionTestCase):
for row in cursor.fetchall():
if not row[0].startswith('pg_') and row[0] not in do_not_delete:
print "Deleting schema %s" % row[0]
print("Deleting schema %s" % row[0])
cursor.execute('DROP SCHEMA %s CASCADE' % row[0])
Tenant.objects.all().delete()
NonAutoSyncTenant.objects.all().delete()
def test_tenant_schema_is_created(self):
"""
when saving a tenant, it's schema should be created
"""
tenant = Tenant(domain_url='test.com', schema_name='test')
tenant = Tenant(domain_url='something.test.com', schema_name='test')
tenant.save()
self.assertTrue(schema_exists(tenant.schema_name))
@ -47,16 +62,17 @@ class TenantTestCase(TransactionTestCase):
"""
self.assertFalse(schema_exists('non_auto_sync_tenant'))
tenant = NonAutoSyncTenant(domain_url='test.com', schema_name='test')
tenant = NonAutoSyncTenant(domain_url='something.test.com',
schema_name='test')
tenant.save()
self.assertFalse(schema_exists(tenant.schema_name))
def test_edit_tenant(self):
def test_sync_tenant(self):
"""
when editing an existing tenant, all data should be kept
"""
tenant = Tenant(domain_url='test.com', schema_name='test')
tenant = Tenant(domain_url='something.test.com', schema_name='test')
tenant.save()
# go to tenant's path
@ -71,13 +87,16 @@ class TenantTestCase(TransactionTestCase):
tenant.domain_url = 'example.com'
tenant.save()
connection.set_tenant(tenant)
# test if data is still there
self.assertEquals(DummyModel.objects.count(), 2)
def test_switching_search_path(self):
dummies_tenant1_count, dummies_tenant2_count = 0, 0
tenant1 = Tenant(domain_url='test.com', schema_name='tenant1')
tenant1 = Tenant(domain_url='something.test.com',
schema_name='tenant1')
tenant1.save()
connection.set_schema_to_public()

View File

@ -1,14 +1,18 @@
import warnings
from django.conf import settings
from django.core.urlresolvers import reverse as reverse_default
from django.utils.functional import lazy
from tenant_schemas.utils import clean_tenant_url
def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None):
warnings.warn("PUBLIC_SCHEMA_URL_TOKEN is deprecated. Use PUBLIC_SCHEMA_URLCONF instead.",
category=DeprecationWarning)
def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None,
current_app=None):
if hasattr(settings, 'PUBLIC_SCHEMA_URL_TOKEN'):
warnings.warn("PUBLIC_SCHEMA_URL_TOKEN is deprecated. "
"Use PUBLIC_SCHEMA_URLCONF instead.",
category=DeprecationWarning)
url = reverse_default(viewname, urlconf, args, kwargs, prefix, current_app)
return clean_tenant_url(url)
reverse_lazy = lazy(reverse, str)
reverse_lazy = lazy(reverse, str)

View File

@ -37,9 +37,10 @@ def clean_tenant_url(url_string):
"""
Removes the TENANT_TOKEN from a particular string
"""
if hasattr(settings, 'PUBLIC_SCHEMA_URL_TOKEN'):
if settings.PUBLIC_SCHEMA_URL_TOKEN and url_string.startswith(settings.PUBLIC_SCHEMA_URL_TOKEN):
url_string = url_string[len(settings.PUBLIC_SCHEMA_URL_TOKEN):]
if hasattr(settings, 'PUBLIC_SCHEMA_URLCONF'):
if (settings.PUBLIC_SCHEMA_URLCONF
and url_string.startswith(settings.PUBLIC_SCHEMA_URLCONF)):
url_string = url_string[len(settings.PUBLIC_SCHEMA_URLCONF):]
return url_string