Files
cms-SiteForge/tests/test_v833_theme_integration.py
T
浅念 e21dbb6518 upgrade: adopt V8.33.1 — final merge, our patches upstreamed natively
V8.33.0 absorbed our entire platform patch set as native features
(discovery/env_for macro override/blocks.css priority/type-mapping fix/
frontend entries/locale override) and synced trade-pro from our remote;
V8.33.1 adds HESU PIPE industrial-theme home fixes (1.3.1).

Zero patch re-application this round — all verified native. Theme
suites 35/35; full run 428 passed + same 10 known Windows env fails
(FAILED set unchanged). Live: container 8.33.1-dev.1 healthy, hesupipe
192 entries intact, trade-pro build 203 pages 0 errors.

Patch registry retired to archive — future upgrades are plain overlay.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-26 14:27:17 +08:00

77 lines
3.5 KiB
Python

"""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