From 385c8efd725c9d63b7d4fc2961a36f50d1ba4d72 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 1 Oct 2021 15:37:13 +0200 Subject: [PATCH 1/2] tests: refactor multitenant conftest (#57019) --- tests_multitenant/conftest.py | 62 ++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/tests_multitenant/conftest.py b/tests_multitenant/conftest.py index 6498c97..5821ed0 100644 --- a/tests_multitenant/conftest.py +++ b/tests_multitenant/conftest.py @@ -1,26 +1,22 @@ -import json -import os -import shutil -import tempfile - -import django_webtest import pytest -@pytest.fixture(scope='function') -def tenants(transactional_db, request, settings): +@pytest.fixture +def make_tenant(tmp_path, transactional_db, settings, request): + import json + from hobo.multitenant.models import Tenant - base = tempfile.mkdtemp('combo-tenant-base') - settings.TENANT_BASE = base + base = tmp_path / 'combo-tenant-base' + base.mkdir() + settings.TENANT_BASE = str(base) - @pytest.mark.django_db def make_tenant(name): - tenant_dir = os.path.join(base, name) - os.mkdir(tenant_dir) - with open(os.path.join(tenant_dir, 'unsecure'), 'w') as fd: + tenant_dir = base / name + tenant_dir.mkdir() + with (tenant_dir / 'unsecure').open(mode='w') as fd: fd.write('1') - with open(os.path.join(tenant_dir, 'settings.json'), 'w') as fd: + with (tenant_dir / 'settings.json').open(mode='w') as fd: json.dump( { 'HOBO_TEST_VARIABLE': name, @@ -29,7 +25,7 @@ def tenants(transactional_db, request, settings): }, fd, ) - with open(os.path.join(tenant_dir, 'hobo.json'), 'w') as fd: + with (tenant_dir / 'hobo.json').open(mode='w') as fd: json.dump( { 'variables': { @@ -94,26 +90,40 @@ def tenants(transactional_db, request, settings): ) t = Tenant(domain_url=name, schema_name=name.replace('-', '_').replace('.', '_')) t.create_schema() + + def drop_tenant(): + from django.db import connection + + from hobo.multitenant.middleware import TenantMiddleware, TenantNotFound + + connection.set_schema_to_public() + try: + TenantMiddleware.get_tenant_by_hostname(t.domain_url) + except TenantNotFound: + pass + else: + t.delete(True) + + request.addfinalizer(drop_tenant) return t - tenants = [make_tenant('tenant1.example.net'), make_tenant('tenant2.example.net')] + return make_tenant - def fin(): - from django.db import connection - from hobo.multitenant.middleware import TenantMiddleware +@pytest.fixture +def tenants(make_tenant): + return [make_tenant('tenant1.example.net'), make_tenant('tenant2.example.net')] - connection.set_schema_to_public() - for t in TenantMiddleware.get_tenants(): - t.delete(True) - shutil.rmtree(base) - request.addfinalizer(fin) - return tenants +@pytest.fixture +def tenant(make_tenant): + return make_tenant('tenant.example.net') @pytest.fixture def app(request): + import django_webtest + wtm = django_webtest.WebTestMixin() wtm._patch_settings() yield django_webtest.DjangoTestApp() -- 2.33.0