from pathlib import Path
import unittest
PLUGIN_ROOT = Path(__file__).resolve().parents[1]
PHP = (PLUGIN_ROOT / "matnostalgi-hotrod-loader.php").read_text(encoding="utf-8")
JS = (PLUGIN_ROOT / "assets" / "hotrod-loader.js").read_text(encoding="utf-8")
CSS = (PLUGIN_ROOT / "assets" / "hotrod-loader.css").read_text(encoding="utf-8")
class HotrodCatalogBridgeTests(unittest.TestCase):
def test_version_is_bumped(self):
self.assertIn("Version: 1.3.1", PHP)
self.assertIn("private const VERSION = '1.3.1'", PHP)
def test_drag_tree_and_burnout_markup_are_rendered(self):
self.assertIn('mn-hotrod-loader__tree', PHP)
self.assertIn('mn-hotrod-loader__tree-light--amber-c', PHP)
self.assertIn('mn-hotrod-loader__tree-light--green', PHP)
self.assertIn('mn-hotrod-loader__burnout-mark', PHP)
def test_countdown_phase_and_wheelie_logic_exist(self):
self.assertIn('const RANDOM_GREEN_MIN_DELAY = 160', JS)
self.assertIn('const RANDOM_GREEN_MAX_DELAY = 680', JS)
self.assertIn('const COUNTDOWN_GO_MS = 140', JS)
self.assertIn('function beginCountdown', JS)
self.assertIn('setPhase("countdown")', JS)
self.assertIn('state.phase === "countdown"', JS)
self.assertIn('state.greenLightDelay = RANDOM_GREEN_MIN_DELAY + Math.random() * (RANDOM_GREEN_MAX_DELAY - RANDOM_GREEN_MIN_DELAY);', JS)
self.assertIn('if (phaseElapsed < state.greenLightDelay) setTreeState("staged")', JS)
self.assertIn('else if (phaseElapsed < state.greenLightDelay + COUNTDOWN_GO_MS) setTreeState("green")', JS)
self.assertIn('setCarAttitude(-18 * launchProgress, -18 * launchProgress)', JS)
self.assertIn('state.mode !== "pending-load"', JS)
def test_css_contains_tree_burnout_and_wheelie_support(self):
self.assertIn('--mn-loader-burnout-mark-width', CSS)
self.assertIn('--mn-loader-car-tilt', CSS)
self.assertIn('.mn-hotrod-loader__tree', CSS)
self.assertIn('.mn-hotrod-loader__burnout-mark', CSS)
self.assertIn('@keyframes mn-hotrod-wheel-spin', CSS)
self.assertIn('@keyframes mn-hotrod-tree-go', CSS)
self.assertIn('rotate(calc(var(--mn-loader-car-tilt)', CSS)
def test_navigation_waits_for_catalog_warmup_with_a_hard_cap(self):
self.assertIn("window.MatNostalgiCatalogNavigation", JS)
self.assertIn("catalogNavigation?.canWarm?.(url.href)", JS)
self.assertIn("warmupPromise = catalogNavigation.warm(url.href)", JS)
self.assertIn("NAVIGATION_DELAY = 520", JS)
self.assertIn("CATALOG_WARMUP_MAX_WAIT = 3000", JS)
self.assertIn("function waitForWarmupOrTimeout", JS)
navigation_block = JS[JS.index("function installNavigationTriggers"):JS.index("function catalogEventRequestId")]
self.assertLess(navigation_block.index("catalogNavigation.warm(url.href)"), navigation_block.index("writePendingNavigation(url.href)"))
self.assertIn("const minimumDelayPromise = new Promise", navigation_block)
self.assertIn("const warmupGatePromise = waitForWarmupOrTimeout", navigation_block)
self.assertIn("Promise.all([minimumDelayPromise, warmupGatePromise]).then(navigate)", navigation_block)
self.assertIn("clearTimeout(state.navigationCancelTimer)", navigation_block)
self.assertNotIn("Promise.resolve(catalogNavigation.warm(url.href)).catch(() => {})", navigation_block)
def test_catalog_dom_heuristics_are_removed(self):
self.assertNotIn("function isCatalogBusy", JS)
self.assertNotIn("installCatalogTriggers", JS)
self.assertNotIn(".woocommerce.mn-catalog-refreshing", JS)
def test_loader_uses_catalog_events_and_tracks_overlap(self):
self.assertIn('window.addEventListener("mn:catalog-load-start"', JS)
self.assertIn('window.addEventListener("mn:catalog-load-complete"', JS)
self.assertIn('window.addEventListener("mn:catalog-load-error"', JS)
self.assertIn("catalogRequestIds: new Set()", JS)
self.assertIn("state.catalogRequestIds.size > 0", JS)
def test_catalog_refresh_restarts_loader_during_exit_or_fade(self):
start = JS.index("function handleCatalogLoadStart")
end = JS.index("function handleCatalogLoadSettled", start)
handler = JS[start:end]
self.assertIn('!["exiting", "trail-fading", "idle"].includes(state.phase)', handler)
self.assertIn("if (!canJoinCurrentRun)", handler)
self.assertIn("startCatalogRefresh()", handler)
self.assertLess(handler.index("startCatalogRefresh()"), handler.index("state.catalogRequestIds.add(requestId)"))
refresh_start = JS.index("function startCatalogRefresh")
refresh_end = JS.index("function tick", refresh_start)
refresh = JS[refresh_start:refresh_end]
self.assertIn('!["exiting", "trail-fading", "idle"].includes(state.phase)', refresh)
self.assertIn('startEntering("catalog-refresh")', refresh)
def test_pagehide_keeps_loader_visible_until_document_is_replaced(self):
pagehide_start = JS.index('window.addEventListener("pagehide"')
pagehide_end = JS.index('window.addEventListener("pageshow"', pagehide_start)
pagehide_block = JS[pagehide_start:pagehide_end]
self.assertIn("clearTimeout(state.navigationCancelTimer)", pagehide_block)
self.assertNotIn("hideLoader", pagehide_block)
self.assertIn("if (event.persisted)", JS[pagehide_end:])
self.assertIn("hideLoader(true)", JS[pagehide_end:])
def test_exit_animation_cannot_teleport_after_catalog_layout_stall(self):
self.assertIn("const MAX_VISUAL_FRAME_STEP = 50", JS)
self.assertIn("state.exitElapsed += visualFrameElapsed", JS)
self.assertIn("state.exitElapsed / state.exitDuration", JS)
self.assertNotIn("phaseElapsed / state.exitDuration", JS)
self.assertIn("state.trailFadeElapsed += visualFrameElapsed", JS)
self.assertIn("state.trailFadeElapsed >= TRAIL_FADE_DURATION", JS)
if __name__ == "__main__":
unittest.main()
Lill Lindfors – En Sång Att Ta Hem (LP, Album) – matonostalgi.se
”Robert Palmer – You Are In My System (7, Single)” har lagts i din varukorg.
Visa varukorg
Beskrivning
OBS! Lånad bild. Vid begäran skickar vi korrekt produktbild. Skivans och omslagets skick finns graderat nedan och följer den internationella standarden för gradering av skivor.
Lill Lindfors – En Sång Att Ta Hem (LP, Album) Metronome – MLP 15.602
Mediaskick: Mint (M) Omslagsskick: Near Mint (NM or M-) Genre: Jazz / Rock / Funk / Soul / Non-Music Style: Bossa Nova / Pop Rock / Spoken Word / Funk Utgiven: 1976 – Sweden
Tracklist: A1 Hjärtligt Tack A2 Herrar A3 Tänk Vilket Liv (Yall Got It!) A4 Nära A5 Ack, Den Kärleken A6 Skilsmässan A7 Då E De Härligt Att Va Me (Taint Nobodys Bizness If I Do) A8 Mördartango (Cell Block Tango) B1 Aha (Gunga Me Oss) (Tô Com Deus, Tô Com Amor) B2 Telefon Till Scenen B3 Entrigone (Balettmusik) B4 Söderjäntans Söndag B5 Har Du Visor, Min Vän B6 Åh, Vilken Morgon B7 Operadöden B8 En Sång Att Ta Hem (Voce Abusou)
×
Välj fordon
Valet sparas på den här enheten och används när sökfilter är aktiverat.
Tips: du kan även skriva historiska modell- eller trimnamn, exempelvis 62 Cutlass , 1959 Oldsmobile eller 59 Impala i den vanliga sökrutan högst upp på sidan.
Årsmodell
Laddar …
Bilmärke
Välj årsmodell först
Modell
Välj bilmärke först
Spara fordon
Rensa fordon
Vi använder cookies, web beacons och liknande tekniker (gemensamt kallade ”cookies”) för att förbättra din upplevelse hos oss.
Acceptera