Files
JQC_multi_tenant/tests/test_landing.py
T

85 lines
3.2 KiB
Python

"""
Tests for the public apex landing page (app/routes/landing.py) and the
apex-host routing in the tenant middleware (app/tenancy/middleware.py).
Two invariants:
1. GET /welcome always renders the landing page (tenant-exempt, any host).
2. When multi-tenancy is on, the apex host (TENANT_BASE_DOMAIN + www.) serves
the landing page at '/' and bounces any other non-exempt path back to '/',
while /signup stays reachable. Tenant subdomains are unaffected (still 404
for unknown hosts, dashboard still owns '/').
"""
import pytest
def test_welcome_renders_landing(app):
"""/welcome is public and renders the marketing page (MT inert here)."""
client = app.test_client()
r = client.get('/welcome')
assert r.status_code == 200
assert b'Quality control for janitorial contracts' in r.data
assert b'/signup' in r.data # funnels to existing signup
assert b'Simple plans that grow with you' in r.data # pricing section
def test_apex_serves_landing_even_with_mt_disabled(app):
"""Regression guard: the apex landing must work in single-tenant mode too.
The base `app` fixture has MULTI_TENANT_ENABLED=False and the default
TENANT_BASE_DOMAIN='jqc.app'. Before the fix, the apex fell through to the
default database (tenant-zero) instead of the landing page.
"""
client = app.test_client()
r = client.get('/', headers={'Host': 'jqc.app'})
assert r.status_code == 200
assert b'Quality control for janitorial contracts' in r.data
# A non-root apex path still bounces back to '/' even with MT off.
r2 = client.get('/dashboard', headers={'Host': 'jqc.app'})
assert r2.status_code == 302
assert r2.headers['Location'] == '/'
@pytest.fixture
def mt_app(app):
"""The shared app with multi-tenancy temporarily enabled (apex = jqc.app).
Reuses the single app instance — create_app cannot be called twice in one
process because the /api/v1 parent blueprint is a module-level singleton.
The middleware reads current_app.config per request, so toggling config here
is sufficient. Config is restored afterwards so other tests are unaffected.
"""
prev_mt = app.config.get('MULTI_TENANT_ENABLED')
prev_base = app.config.get('TENANT_BASE_DOMAIN')
app.config.update(MULTI_TENANT_ENABLED=True, TENANT_BASE_DOMAIN='jqc.app')
yield app
app.config.update(MULTI_TENANT_ENABLED=prev_mt, TENANT_BASE_DOMAIN=prev_base)
def test_apex_root_serves_landing(mt_app):
client = mt_app.test_client()
r = client.get('/', headers={'Host': 'jqc.app'})
assert r.status_code == 200
assert b'Quality control for janitorial contracts' in r.data
def test_www_apex_serves_landing(mt_app):
client = mt_app.test_client()
r = client.get('/', headers={'Host': 'www.jqc.app'})
assert r.status_code == 200
assert b'Quality control for janitorial contracts' in r.data
def test_apex_other_path_redirects_to_root(mt_app):
client = mt_app.test_client()
r = client.get('/issues', headers={'Host': 'jqc.app'})
assert r.status_code == 302
assert r.headers['Location'] == '/'
def test_apex_signup_is_reachable(mt_app):
client = mt_app.test_client()
r = client.get('/signup', headers={'Host': 'jqc.app'})
assert r.status_code == 200