Testing

This is how you set up dynamic tenants for testing.

Pytest

You can define some tenants in the test configuration.

import pytest
from tenants.models import Tenant, Domain

@pytest.fixture(scope="session", autouse=True)
def setup(django_db_setup, django_db_blocker):

    with django_db_blocker.unblock():
        tenant = Tenant.objects.get_or_create(schema_name="tenant1")
        Domain.objects.get_or_create(
            tenant=tenant,
            domain="tenant1.mydomain.com",
            is_primary=True,
        )

And also provide them as fixtures:

@pytest.fixture
def tenant(db):
    return Tenant.objects.get(schema_name="tenant1")

If you want the tenant to be activated automatically in your test cases, you can so as follows. Using the tenants as context manager is useful in activating the tenant only in the scope of each test.

@pytest.fixture
def tenant(db):
    with (tenant := Tenant.objects.get(schema_name="tenant1")):
        yield tenant

You can also define a fixture for a client, including the necessary headers:

from django.test import Client

@pytest.fixture
def domain_client():
    return Client(headers={"host": "tenant1.mydomain.com"})

@pytest.fixture
def header_client():
    return Client(headers={"tenant": "tenant1"})

Django test cases

This package does not provide base clases to be used in place for Django's TestCase. If you need support in this regard, please visit the dicussions section in the package's repository.