Export Web/SCORM : corrige les URLs absolues cassées en local (file://)
Bug signalé : icône disparue et texte suivant du dialogue absent après export. render_icone.py (et son miroir JS, forgeRenderIcone) bakaient une URL "/static/icons/..." en dur, correcte en ligne (racine du serveur Flask) mais bloquée par CORS une fois ouverte en local (file:///static/...). Même souci pour les fichiers envoyés par le créateur (/game/<slug>/uploads/..., jamais dans static/, jamais copiés par le paquet). Ajoute _relativize_absolute_urls (réécriture globale post-rendu du HTML) + copie du dossier uploads/, et relativise le port JS de l'icône pour toute régénération après action en mémoire. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
f3b72d73c9
commit
7bc4c89eaa
@@ -50,6 +50,32 @@ def test_export_scorm_index_html_is_offline_and_self_contained(client, game):
|
||||
assert "let gameData = " in html
|
||||
|
||||
|
||||
def test_export_scorm_icon_widget_uses_a_relative_url(client, game):
|
||||
"""Régression signalée par un utilisateur : render_icone.py construit
|
||||
son URL en dur avec un préfixe "/static/..." (correct EN LIGNE, où il
|
||||
part de la racine du serveur Flask) — jamais réécrit par le refactor
|
||||
asset_url de templates/play.html (celui-ci ne touche que les <script>/
|
||||
<link> du template, pas le rendered_html déjà bake dans le payload).
|
||||
Sans _relativize_absolute_urls (build_scorm_package.py), un index.html
|
||||
ouvert en local (file://) déclenchait un blocage CORS sur cette icône
|
||||
("la requête CORS n'utilise pas HTTP") — voir aussi le miroir JS
|
||||
(forgeRenderIcone, static/js/play/offline/render-special-widgets.js),
|
||||
qui régénère ce même widget après une action, et devait être corrigé
|
||||
séparément."""
|
||||
import re
|
||||
resp = client.post(f"/game/{game}/screens/new", data={"name": "Accueil"}, follow_redirects=False)
|
||||
screen_id = int(re.search(r"/screens/(\d+)/edit", resp.headers["Location"]).group(1))
|
||||
resp = client.post(f"/game/{game}/screens/{screen_id}/elements/add", data={"widget": "icone"}, follow_redirects=False)
|
||||
assert resp.status_code == 302, resp.data
|
||||
|
||||
resp = client.post(f"/game/{game}/export-scorm")
|
||||
import io
|
||||
with zipfile.ZipFile(io.BytesIO(resp.data)) as zf:
|
||||
html = zf.read("index.html").decode("utf-8")
|
||||
assert "static/icons/star.svg" in html
|
||||
assert "/static/icons/star.svg" not in html
|
||||
|
||||
|
||||
def test_export_scorm_manifest_lists_index_html_as_the_sco(client, game):
|
||||
resp = client.post(f"/game/{game}/export-scorm")
|
||||
import io
|
||||
|
||||
Reference in New Issue
Block a user