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() REP.SATS HJULCYLINDER FORD MUSTANG MERCURY FALCON 1966-72, RAYBESTOS WK483 – matonostalgi.se

REP.SATS HJULCYLINDER FORD MUSTANG MERCURY FALCON 1966-72, RAYBESTOS WK483

160 kr

1 i lager
Artikel Nr WK483
Märke Raybestos
Lagerplats VIKSJÖ REPSATS HJULCYL 2

Beskrivning

REP.SATS HJULCYLINDER 

FORD MUSTANG MERCURY FALCON 1966-72,

RAYBESTOS WK483 

Ersätter art: EISC1005

OE-nummer: C5DZ2128B, D2DZ2128B, 5463148

 Ford:Falcon (1966-1970),Maverick(1970-1972),Mustang(1966-1970) Merc:Comet(1965,1971-1972)

FORD FALCON 1966-1970
FORD MAVERICK 1970-1972
FORD MUSTANG 1966-1970
MERCURY COMET 1965-1972

Specification

Vikt 0,5 kg
Märke

Raybestos

Lagerplats

VIKSJÖ REPSATS HJULCYL 2

Här ser du vilka fordon produkten är registrerad att passa till. Öppna ett bilmärke för att se modeller, år och noter.

Mercury1 modeller / 8 rader

Vi använder cookies, web beacons och liknande tekniker (gemensamt kallade ”cookies”) för att förbättra din upplevelse hos oss.