// E2E стоп-листа: логин кальянщиком → стоп табака витринного микса → проверка. const BASE = process.env.CRM_URL ?? "http://127.0.0.1:47613"; // F-12: креды только через окружение — в коде их нет const CRM_LOGIN = process.env.CRM_LOGIN; const CRM_PASSWORD = process.env.CRM_PASSWORD; if (!CRM_LOGIN || !CRM_PASSWORD) { console.error("Задайте CRM_LOGIN и CRM_PASSWORD (учётка кальянщика)"); process.exit(1); } const ID = "bliss-lime"; const j = async (path, opts = {}) => { const r = await fetch(BASE + path, { ...opts, headers: { "Content-Type": "application/json", ...(opts.headers || {}) }, signal: AbortSignal.timeout(8000), }); const text = await r.text(); let data = null; try { data = JSON.parse(text); } catch { data = null; } return { status: r.status, data }; }; const login = await j("/api/login", { method: "POST", body: JSON.stringify({ login: CRM_LOGIN, password: CRM_PASSWORD }), }); if (login.status !== 200 || !login.data?.token) { console.log("E2E_LOGIN_FAIL status=" + login.status); process.exit(1); } const token = login.data.token; const before = await j("/api/stoplist"); const beforeIds = before.data?.stopped_tobacco ?? []; const patch = await j(`/api/tobacco/${ID}`, { method: "PATCH", headers: { "X-Auth-Token": token }, body: JSON.stringify({ stopped: true }), }); const after = await j("/api/stoplist"); const afterIds = after.data?.stopped_tobacco ?? []; console.log( `E2E login=${login.status} role=${login.data?.role ?? login.data?.user?.role ?? "?"} ` + `before=${beforeIds.length} patch=${patch.status} after=${afterIds.length} ` + `contains=${afterIds.includes(ID) ? 1 : 0}`, );