Files
cms-SiteForge/tests/test_v833_theme_integration.py
T

77 lines
3.5 KiB
Python
Raw Normal View History

"""V8.33 five-theme, preview parity and business-safe migration checks."""
import json
from pathlib import Path
from test_factory_v2 import factory,site
from app import core, theme_store, theme_pro
ROOT=Path(__file__).resolve().parents[1]
def test_registry_includes_five_themes_and_old_manifests():
assert set(core.THEMES)==set(theme_pro.THEMES)==set(theme_store.BUILTIN)
assert len(core.THEMES)==5
assert 'trade-pro' in core.THEMES
for name in ('automotive','industrial','corporate','minimal'):
assert theme_store.resolve(name,'1.1.0').is_dir()
assert theme_store.compatibility('trade-pro')['valid']
def test_theme_gallery_and_editor_offer_trade_pro(factory):
gallery=factory.get('/theme-gallery')
assert gallery.status_code==200
assert '<option value="trade-pro">' in gallery.text
assert "'trade-pro'" in gallery.text
sid=site(factory)
editor=factory.get(f'/studio/{sid}')
assert editor.status_code in (200, 404)
src=(ROOT/'app/templates/editor.html').read_text(encoding='utf-8')
assert '<option value="trade-pro">' in src
assert 'sandbox="allow-scripts"' in src
assert 'allow-same-origin' not in src
def test_five_theme_preview_styles_and_frame_security(factory):
for name in core.THEMES:
response=factory.get(f'/api/factory/themes/{name}/preview',params={'page_type':'home'})
assert response.status_code==200,(name,response.text[:200])
assert 'text/html' in response.headers.get('content-type','')
assert response.headers['x-frame-options']=='SAMEORIGIN'
assert 'preview.blocks.css' in response.text or (name=='automotive' and 'preview.bundle.css' in response.text)
stylesheet=factory.get(f'/api/factory/themes/{name}/preview.blocks.css')
assert stylesheet.status_code==200
assert 'text/css' in stylesheet.headers.get('content-type','')
src=(ROOT/'themes/trade-pro/blocks.css').read_text(encoding='utf-8')
assert '.sf-theme-trade-pro' in src
def test_theme_preview_several_real_page_types(factory):
for kind in ('listing','product','about','contact','brand','article','faq'):
res=factory.get('/api/factory/themes/trade-pro/preview',params={'page_type':kind})
assert res.status_code==200,(kind,res.text[:250])
assert 'pro-trade-pro' in res.text
assert 'lang="en"' in res.text
def test_trade_pro_preserves_original_routes_and_pinned_build(factory):
sid=site(factory)
path='/product/exact-original-slug/'
created=factory.post(f'/api/sites/{sid}/entries',json={'type':'product','title':'Hydraulic Pump','route':path,'seo_title':'Precise SEO Title','summary':'Export pump'})
assert created.status_code in (200,201)
changed=factory.put(f'/api/factory/sites/{sid}/theme',json={'theme':'trade-pro','version':'1.0.0'})
assert changed.status_code==200
result=factory.post(f'/api/sites/{sid}/builds',json={})
assert result.status_code==200,result.text
bid=result.json()['version']
page=factory.get(f'/preview/{sid}/{bid}{path}')
assert page.status_code==200
assert '<html lang="en"' in page.text
assert 'Precise SEO Title' in page.text
assert factory.get(f'/preview/{sid}/{bid}/assets/blocks.css').status_code==200
assert theme_store.pinned(sid)['version']=='1.0.0'
def test_trade_pro_defensive_preview_and_runtime_css(factory):
res=factory.get('/api/factory/themes/trade-pro/preview',params={'page_type':'unknown'})
assert res.status_code==400
res=factory.get('/api/factory/themes/not-here/preview.blocks.css')
assert res.status_code==404