fix(vinpin): Renault-decode robustness for a DOWN Rpartstore (ffmpeg + flyout/close/logout/cooldown)
Root cause: ffmpeg is absent in the prod worker, so vinpin.ocr cropScale silently returns the full 1600x900 frame — the tiny centered Rpartstore launch-error modal is illegible, so a DOWN Rpartstore is misread as a spinner and thrashes the seat. - Dockerfile: install ffmpeg so cropScale actually crops+3x-upscales (restores all clipped OCR: modal-crop error detect, Fiat modal, Renault header). - ensureRpartstore: gate the "already open" short-circuit on a CONTENT token (rpartstoreLoaded), not rpartstoreOpen which false-matches the flyout/title word "Rpartstore"; click the flyout entry when the submenu is up over the grid; keep a late open-window branch so a spinner/vehicle-page window still counts as present. - closeRpartstoreTab: never click windowClose(1298,14) (it hits the language selector and wedges the grid); gate the retry on a content token; Escape after. - cleanTeardown: dismiss any blocking modal BEFORE "Çıkış yap" so logout is a clean RDS log-off (not a dirty channel disconnect); recover a Disconnected dialog via disconnectedClose(953,505) + relaunch VINPIN app for a fresh grid. - Rpartstore-down cooldown (10m): a launch-error / repeated load-failure routes Renault decodes straight to Dialogys (skip reopening a down catalog); a confirmed load clears it. - ensureBrandGrid: dismiss a wedging launch-error modal + short-retry instead of burning the 84s dead-wait. - parseRenaultHeader: ignore the status-bar license-expiry date when reading the model year; sessionAlive matches RDST01/RDST02 (seat load-balances). - Keeps never-throw, VINPIN_DECODE_BUDGET_MS, sessionPoisoned, the acquire cap, spinner-guard, relogin-cap and the Fiat/Dialogys fallbacks intact. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -88,6 +88,19 @@ describe("parseRenaultHeader", () => {
|
||||
expect(p.modelYear).toBe("2011");
|
||||
});
|
||||
|
||||
it("does NOT mis-grab the status-bar license-expiry date as the model year", () => {
|
||||
// The full-frame OCR fallback sweeps in the Rpartstore/Dialogys status bar,
|
||||
// whose license EXPIRY date ("…14.07.2026") used to be read as the model year.
|
||||
const p = parseRenaultHeader("RENAULT KADJAR (RFE) Şasi: VF1RFE00653633190 Lisans: 14.07.2026");
|
||||
expect(p.model).toBe("KADJAR");
|
||||
expect(p.modelYear).toBeNull(); // NOT "2026" from the expiry date
|
||||
});
|
||||
|
||||
it("still prefers a genuine generation range even when an expiry date is present", () => {
|
||||
const p = parseRenaultHeader("RENAULT LATITUDE (2011-2015) Lisans: 14.07.2026");
|
||||
expect(p.modelYear).toBe("2011"); // the (2011-2015) range wins over the date
|
||||
});
|
||||
|
||||
it("returns no model / unusable for headers without a known token", () => {
|
||||
const p = parseRenaultHeader("İlişikli araç bulunamadı");
|
||||
expect(p.model).toBeNull();
|
||||
|
||||
Reference in New Issue
Block a user