#!/usr/bin/env python3
"""Run against disposable XAMPP with TEST_BASE_URL, TEST_UNIT_A_SLUG,
TEST_UNIT_B_SLUG and TEST_B_EVENT_SLUG set. Optional TEST_OLD_UNIT_SLUG,
TEST_OLD_EVENT_SLUG should be existing retained aliases for B.
"""
import os
from urllib.error import HTTPError
from urllib.request import build_opener, HTTPRedirectHandler

required=('TEST_BASE_URL','TEST_UNIT_A_SLUG','TEST_UNIT_B_SLUG','TEST_B_EVENT_SLUG')
missing=[key for key in required if not os.environ.get(key)]
if missing:raise SystemExit('Missing staging fixture variables: '+', '.join(missing))
base=os.environ['TEST_BASE_URL'].rstrip('/')
a=os.environ['TEST_UNIT_A_SLUG'];b=os.environ['TEST_UNIT_B_SLUG'];event=os.environ['TEST_B_EVENT_SLUG']
class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self,*args,**kwargs):return None
opener=build_opener(NoRedirect())
def request(path):
    try:response=opener.open(base+path,timeout=15)
    except HTTPError as error:response=error
    with response:return response.status,response.headers, response.read()
status,headers,body=request('/'+a+'/'+event)
assert status==404 and event.encode() not in body,'Unit A exposed Unit B event'
status,headers,body=request('/'+b+'/'+event)
assert status==200 and b'canonical' in body,'Canonical event route unavailable'
status,headers,body=request('/'+a)
assert status==200 and b'canonical' in body,'Unit selection route unavailable'
status,headers,body=request('/unit/'+b+'/event/'+event)
assert status==301 and headers['Location']=='/'+b+'/'+event,'Old event URL did not redirect'
oldunit=os.environ.get('TEST_OLD_UNIT_SLUG')
if oldunit:
    status,headers,_=request('/'+oldunit+'/'+event)
    assert status==301 and headers['Location']=='/'+b+'/'+event,'Retained unit slug did not redirect'
oldev=os.environ.get('TEST_OLD_EVENT_SLUG')
if oldev:
    status,headers,_=request('/'+b+'/'+oldev)
    assert status==301 and headers['Location']=='/'+b+'/'+event,'Retained event slug did not redirect'
print('Public routing, canonical redirects and cross-unit denial passed.')
