8884e100f9
Overlay 190 upstream items (V8.22→8.31) preserving trade-pro theme, registry tests, and design docs. Re-applied full patch set on identical anchors (discovery/env_for/blocks.css/type-mapping/locale-override/ theme_color/frontend entries/test_theme_pro_v3 mods) plus compose pins. Verified: theme suites 35/35; dual-baseline full run 415 passed vs pristine 386+29 ours, FAILED-set diff EMPTY (same 10 Windows env fails). Live: container 8.31.1-dev.1 healthy, hesupipe 192 entries intact, trade-pro build 203 pages 0 errors. Co-Authored-By: Claude Code <noreply@anthropic.com>
61 lines
3.0 KiB
Python
61 lines
3.0 KiB
Python
"""V8.30 shipped page-composition regression: data-safe, versioned, six real page types."""
|
|
from pathlib import Path
|
|
from bs4 import BeautifulSoup
|
|
from app import theme_store
|
|
from test_factory_v2 import factory,site
|
|
|
|
ROOT=Path(__file__).resolve().parents[1]
|
|
THEMES=('automotive','industrial','corporate','minimal')
|
|
KINDS=('home','listing','product','article','about','contact')
|
|
|
|
|
|
def test_new_and_legacy_page_layouts_are_version_isolated(factory):
|
|
for name in THEMES:
|
|
assert theme_store.latest(name)==('1.4.1' if name=='automotive' else '1.3.0')
|
|
assert theme_store.compatibility(name,'1.2.0')['valid']
|
|
assert theme_store.compatibility(name,'1.3.0')['valid']
|
|
old=theme_store.resolve(name,'1.2.0')
|
|
new=theme_store.resolve(name,'1.3.0')
|
|
assert 'pro-v30-page' not in (old/'pages/product.html').read_text()
|
|
assert 'pro-v30-page' in (new/'pages/product.html').read_text()
|
|
assert 'V8.30 REAL PAGE COMPOSITION' not in (old/'pro.css').read_text()
|
|
assert 'V8.30 REAL PAGE COMPOSITION' in (new/'pro.css').read_text()
|
|
|
|
|
|
def test_all_six_real_page_types_have_useful_structure(factory):
|
|
for name in THEMES:
|
|
for kind in KINDS:
|
|
response=factory.get(f'/api/factory/themes/{name}/preview',params={'page_type':kind})
|
|
assert response.status_code==200,(name,kind,response.text[:200])
|
|
doc=BeautifulSoup(response.text,'html.parser')
|
|
assert len(doc.select('h1'))==1,(name,kind)
|
|
assert doc.select_one('.pro-header') and doc.select_one('.pro-footer')
|
|
if kind=='home':assert doc.select_one('.pro-home-hero')
|
|
else:assert doc.select_one('.pro-v30-'+kind),(name,kind)
|
|
if kind=='listing':
|
|
assert doc.select_one('.pro-filter-scope')
|
|
assert doc.select_one('[data-pro-filter-search]')
|
|
if kind=='product':
|
|
assert doc.select_one('.pro-specs')
|
|
assert doc.select_one('.pro-product-media')
|
|
if kind=='article':assert doc.select_one('.pro-v30-reading-content')
|
|
if kind=='contact':
|
|
# No fake phone, email or working form without configured destination.
|
|
assert not doc.select_one('form[action=""]')
|
|
|
|
|
|
def test_new_product_theme_preserves_seo_and_archive_is_buildable(factory):
|
|
sid=site(factory)
|
|
for name in THEMES:
|
|
for version in ('1.2.0','1.3.0'):
|
|
selected=factory.put(f'/api/factory/sites/{sid}/theme',json={'theme':name,'version':version})
|
|
assert selected.status_code==200,selected.text
|
|
built=factory.post(f'/api/sites/{sid}/builds',json={})
|
|
assert built.status_code==200,built.text
|
|
bid=built.json()['version']
|
|
page=factory.get(f'/preview/{sid}/{bid}/')
|
|
assert page.status_code==200
|
|
css=factory.get(f'/preview/{sid}/{bid}/assets/pro.css').text
|
|
assert ('V8.30 REAL PAGE COMPOSITION' in css)==(version=='1.3.0')
|
|
assert '<meta name="robots"' in page.text
|