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

Lill Lindfors – En Sång Att Ta Hem (LP, Album)

150 kr

1 i lager
Artikel Nr 1061684879
Media Mint (M)
Omslag Near Mint (NM or M-)
Lagerplats LP.01520B

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)

Specification

Vikt 0,23 kg
Genre

Funk / Soul
Jazz
Non-Music
Rock

Musikstil

Bossa Nova
Funk
Pop Rock
Spoken Word

Media

Mint (M)

Omslag

Near Mint (NM or M-)

Lagerplats

LP.01520B

Format

LP

#

MLP 15.602

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