Project

General

Profile

Bug #157 » dc_wizard_test_report.html

HTML page: <title>DC Wizard Test Report</title> - Akshath Shettigara, 10/19/2026 02:52 PM

 
<!doctype html><html><head><meta charset=utf8><meta name=viewport content="width=device-width,initial-scale=1,viewport-fit=cover"><style>:root{color-scheme:light;box-sizing:border-box;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}html{scroll-padding-top:env(safe-area-inset-top,0px)}body{margin:0;padding:0;font:14px -apple-system,BlinkMacSystemFont,sans-serif;background:#faf9f5;color:#141413}img{max-width:100%}[hidden]:not([hidden=until-found i]){display:none!important}</style></head><body>
<title>DC Wizard Test Report</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500;600&display=swap" rel="stylesheet">
<style>
/* Layout: one-column report, 64rem measure; summary table up top, then findings, then the full case ledger. */
:root{
--bg:#f6f7f8; --surface:#ffffff; --fg:#1b2127; --muted:#5d6872; --line:#dde2e6;
--pass:#1f7a4d; --pass-bg:#e5f3ec; --fail:#b3261e; --fail-bg:#fbe9e7; --accent:#2c5d8a; --accent-bg:#e7eff7;
--sans:"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",sans-serif; --mono:"IBM Plex Mono",ui-monospace,Menlo,Consolas,monospace;
}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){
--bg:#14181c; --surface:#1c2227; --fg:#e6eaed; --muted:#9aa5ae; --line:#2e373e;
--pass:#5cc590; --pass-bg:#173326; --fail:#f2877f; --fail-bg:#3a1f1d; --accent:#8db8e3; --accent-bg:#1c2b3a; color-scheme:dark}}
:root[data-theme="dark"]{
--bg:#14181c; --surface:#1c2227; --fg:#e6eaed; --muted:#9aa5ae; --line:#2e373e;
--pass:#5cc590; --pass-bg:#173326; --fail:#f2877f; --fail-bg:#3a1f1d; --accent:#8db8e3; --accent-bg:#1c2b3a; color-scheme:dark}
body{background:var(--bg);color:var(--fg);font:15px/1.55 var(--sans);padding-inline:16px;padding-block:28px 56px}
.wrap{max-width:64rem;margin:0 auto;display:flex;flex-direction:column;gap:36px}
h1{font-size:1.75rem;line-height:1.2;margin:0;font-weight:600;text-wrap:balance}
h2{font-size:1.15rem;margin:0 0 12px;font-weight:600}
p{margin:0}
.muted{color:var(--muted)}
.mono{font-family:var(--mono);font-size:.85em}
header{display:flex;flex-direction:column;gap:10px}
.verdict{display:flex;flex-wrap:wrap;gap:10px 28px;align-items:baseline;padding:16px 18px;background:var(--surface);border:1px solid var(--line);border-radius:6px}
.verdict .big{font-size:2.4rem;font-weight:600;color:var(--pass);font-variant-numeric:tabular-nums;line-height:1}
.facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));gap:10px 24px;flex:1;min-width:0}
.facts div{display:flex;flex-direction:column}
.facts b{font-weight:600;font-variant-numeric:tabular-nums}
.facts span{font-size:.8rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}
.scroll{overflow-x:auto;background:var(--surface);border:1px solid var(--line);border-radius:6px}
table{border-collapse:collapse;width:100%;min-width:34rem}
th,td{text-align:left;padding:9px 12px;border-bottom:1px solid var(--line);vertical-align:top}
th{font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-weight:500}
tr:last-child td{border-bottom:0}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.bar{height:6px;background:var(--line);border-radius:3px;overflow:hidden;min-width:70px}
.bar i{display:block;height:100%;background:var(--pass)}
.defects{display:flex;flex-direction:column;gap:10px;margin:0;padding:0;list-style:none}
.defects li{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:12px 14px;display:grid;grid-template-columns:minmax(0,1fr);gap:4px}
.defects strong{font-weight:600}
.tag{display:inline-block;font-size:.72rem;letter-spacing:.04em;text-transform:uppercase;padding:1px 7px;border-radius:3px;background:var(--accent-bg);color:var(--accent);margin-right:8px;font-weight:500;vertical-align:1px}
.notes{margin:0;padding-left:1.1em;display:flex;flex-direction:column;gap:6px}
.controls{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.controls button,.controls input{font:inherit;font-size:.9rem;color:var(--fg);background:var(--surface);border:1px solid var(--line);border-radius:5px;padding:6px 11px}
.controls button{cursor:pointer}
.controls button[aria-pressed="true"]{background:var(--accent-bg);border-color:var(--accent);color:var(--accent)}
.controls input{flex:1;min-width:12rem}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.group{margin-bottom:18px}
.group h3{font-size:.95rem;margin:0 0 2px;font-weight:600}
.group p{font-size:.85rem;color:var(--muted);margin-bottom:8px}
.case{display:grid;grid-template-columns:4.2rem minmax(0,1fr) auto;gap:4px 12px;padding:8px 12px;border-bottom:1px solid var(--line);align-items:baseline}
.case:last-child{border-bottom:0}
.case .id{font-family:var(--mono);font-size:.8rem;color:var(--muted)}
.case .t{min-width:0;overflow-wrap:anywhere}
.case .sub{display:block;font-size:.8rem;color:var(--muted);margin-top:1px}
.case .res{display:flex;gap:10px;align-items:baseline;white-space:nowrap;font-variant-numeric:tabular-nums;font-size:.85rem;color:var(--muted)}
.pill{font-size:.72rem;font-weight:600;letter-spacing:.05em;padding:1px 8px;border-radius:3px;background:var(--pass-bg);color:var(--pass)}
.pill.fail{background:var(--fail-bg);color:var(--fail)}
.empty{padding:14px;color:var(--muted)}
@media (max-width:520px){.case{grid-template-columns:3.6rem minmax(0,1fr)}.case .res{grid-column:2}}
</style>
<div class="wrap">
<header>
<p class="muted mono">canofy_custom_eh · Delivery Challan Wizard · 6 Oct 2026</p>
<h1>Delivery Challan Wizard end-to-end test report</h1>
<p class="muted">Every test drives the real wizard in Chromium against the local site. Cases ran one at a time, in order, and each one creates real documents.</p>
<div class="verdict">
<div><div class="big" id="bigpass"></div><div class="muted">cases passed</div></div>
<div class="facts" id="facts"></div>
</div>
</header>

<section>
<h2>Results by area</h2>
<div class="scroll"><table id="sumtable"></table></div>
</section>

<section>
<h2>Defects found by this run and fixed</h2>
<ul class="defects">
<li><span><span class="tag">Data</span><strong>Partial return failed on create.</strong></span><span class="muted">Editing Qty from 10 to 4 on a return row kept the original Qty Received, and the server rejected the document. Qty Received now follows Qty, as on the standard form.</span></li>
<li><span><span class="tag">Data</span><strong>Pre-filled addresses were sometimes blanked.</strong></span><span class="muted">Business Partner is a title link, so the page read the display title instead of the record ID and the address lookup came back empty. Seen in about 2 of 6 return-flow runs. The handlers now use the record ID.</span></li>
<li><span><span class="tag">Navigation</span><strong>Edit on Start wiped everything.</strong></span><span class="muted">Start now opens with the current choice selected and the data kept. Only picking a different entry mode discards it.</span></li>
<li><span><span class="tag">Form</span><strong>Estimated Return Date stayed hidden on returnable DC types.</strong></span><span class="muted">Visibility was checked before the Returnable value had finished setting.</span></li>
<li><span><span class="tag">Errors</span><strong>Server errors showed as "Validation failed."</strong></span><span class="muted">Review and Send for Approval now show the real server message, and Frappe's duplicate error pop-up no longer covers the page.</span></li>
<li><span><span class="tag">Form</span><strong>E-Way Bill Sub Type was free text.</strong></span><span class="muted">It is a link to Supply Type, so a typed value failed on Save with "Could not find Sub Type". It is now a proper link field.</span></li>
<li><span><span class="tag">Keyboard</span><strong>GST Rate column broke Tab order.</strong></span><span class="muted">Tab out of Unit Cost added a blank row and skipped GST Rate. The column now sits after HSN, and a keyboard regression test covers it.</span></li>
</ul>
</section>

<section>
<h2>Run details and open items</h2>
<ul class="notes">
<li><b>Mode.</b> This final run was headless. The WSLg display stopped answering partway through the day, so headed Chromium would not launch. An earlier headed run passed 96 of 100, and the four misses were the browser window closing mid-run. They passed when re-run.</li>
<li><b>Test data.</b> No test documents were removed. The PWTEST business partners, addresses, DC Types and the Delivery Challans the run created are still on the site.</li>
<li><b>Existing data issue, not changed.</b> The DC Type fixture sets <span class="mono">default_eway_bill_sub_type</span> to "Exhibition or Fairs (Outward)", which is not a Supply Type (only Inward, Import, Outward and Job Work exist). That default would fail on Save.</li>
<li><b>Backend.</b> The 30 backend unit tests pass alongside this suite.</li>
<li><b>Not committed.</b> All wizard changes and fixes are in the working tree only.</li>
</ul>
</section>

<section>
<h2>All test cases</h2>
<div class="controls">
<input id="q" type="search" placeholder="Filter by scenario text" aria-label="Filter test cases">
<span id="chips" style="display:contents"></span>
</div>
<div id="ledger"></div>
</section>
</div>
<script>
const DATA = {"cases": [{"id": "TC-001", "file": "00-smoke.spec.js", "line": 3, "group": "", "title": "API harness works: create + approve + dispatch an outward DC", "ok": true, "ms": 514}, {"id": "TC-002", "file": "01-start.spec.js", "line": 5, "group": "Step 1 - Start", "title": "initial state: a single step and four entry cards", "ok": true, "ms": 1248}, {"id": "TC-003", "file": "01-start.spec.js", "line": 13, "group": "Step 1 - Start", "title": "Outward and Inward each reveal the right second-level options", "ok": true, "ms": 1404}, {"id": "TC-004", "file": "01-start.spec.js", "line": 26, "group": "Step 1 - Start", "title": "selection highlight is single-select and switching branch resets the lower levels", "ok": true, "ms": 1672}, {"id": "TC-005", "file": "01-start.spec.js", "line": 40, "group": "Step 1 - Start", "title": "hovering a card highlights it in black", "ok": true, "ms": 1447}, {"id": "TC-006", "file": "01-start.spec.js", "line": 49, "group": "Step 1 - Start", "title": "Next without a DC Type is blocked with a message", "ok": true, "ms": 1590}, {"id": "TC-007", "file": "01-start.spec.js", "line": 58, "group": "Step 1 - Start", "title": "DC Type picker is filtered by direction and by Return source type", "ok": true, "ms": 5713}, {"id": "TC-008", "file": "01-start.spec.js", "line": 90, "group": "Step 1 - Start", "title": "New Outward: five merged steps, same for either direction", "ok": true, "ms": 4139}, {"id": "TC-009", "file": "01-start.spec.js", "line": 90, "group": "Step 1 - Start", "title": "New Inward: five merged steps, same for either direction", "ok": true, "ms": 4079}, {"id": "TC-010", "file": "01-start.spec.js", "line": 101, "group": "Step 1 - Start", "title": "pre-creation steps in the indicator are not clickable", "ok": true, "ms": 4279}, {"id": "TC-011", "file": "01-start.spec.js", "line": 110, "group": "Step 1 - Start", "title": "Continue an Existing DC: blank is blocked, a real DC lands on its post-creation step", "ok": true, "ms": 4055}, {"id": "TC-012", "file": "02-header-party.spec.js", "line": 9, "group": "Step 2 - Header & Party (merged with Dispatch From)", "title": "Dispatch From fields live on this same page", "ok": true, "ms": 4338}, {"id": "TC-013", "file": "02-header-party.spec.js", "line": 14, "group": "Step 2 - Header & Party (merged with Dispatch From)", "title": "nothing filled: Next is blocked", "ok": true, "ms": 4107}, {"id": "TC-014", "file": "02-header-party.spec.js", "line": 20, "group": "Step 2 - Header & Party (merged with Dispatch From)", "title": "Branch is required even when everything else is filled", "ok": true, "ms": 8958}, {"id": "TC-015", "file": "02-header-party.spec.js", "line": 29, "group": "Step 2 - Header & Party (merged with Dispatch From)", "title": "company/party auto-fill their addresses and show the full address underneath", "ok": true, "ms": 10921}, {"id": "TC-016", "file": "02-header-party.spec.js", "line": 39, "group": "Step 2 - Header & Party (merged with Dispatch From)", "title": "Dispatch From mirrors Company + Company Address until the user overrides it", "ok": true, "ms": 18860}, {"id": "TC-017", "file": "02-header-party.spec.js", "line": 55, "group": "Step 2 - Header & Party (merged with Dispatch From)", "title": "Consignee: 'Same as Party' hides the field, unticking requires one", "ok": true, "ms": 14855}, {"id": "TC-018", "file": "02-header-party.spec.js", "line": 73, "group": "Step 2 - Header & Party (merged with Dispatch From)", "title": "values survive Next -> Back", "ok": true, "ms": 10840}, {"id": "TC-019", "file": "03-items.spec.js", "line": 17, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "one GST Rate column replaces separate IGST/CGST/SGST inputs", "ok": true, "ms": 11549}, {"id": "TC-020", "file": "03-items.spec.js", "line": 27, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "keyboard: Tab walks HSN -> GST Rate -> Qty -> Unit Cost without spawning stray rows", "ok": true, "ms": 15666}, {"id": "TC-021", "file": "03-items.spec.js", "line": 46, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "GST Rate offers exactly the standard slabs", "ok": true, "ms": 12562}, {"id": "TC-022", "file": "03-items.spec.js", "line": 53, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Inter State: the single rate lands on IGST", "ok": true, "ms": 16673}, {"id": "TC-023", "file": "03-items.spec.js", "line": 61, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Intra State: the single rate splits evenly into CGST + SGST", "ok": true, "ms": 16554}, {"id": "TC-024", "file": "03-items.spec.js", "line": 69, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "changing Tax Category after rows exist re-splits every row live", "ok": true, "ms": 20055}, {"id": "TC-025", "file": "03-items.spec.js", "line": 83, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "0% GST yields zero tax, 28% works, mixed rows add up", "ok": true, "ms": 18435}, {"id": "TC-026", "file": "03-items.spec.js", "line": 90, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Product Master autofills Description and HSN", "ok": true, "ms": 15630}, {"id": "TC-027", "file": "03-items.spec.js", "line": 102, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "deleting a row recalculates the running totals", "ok": true, "ms": 19493}, {"id": "TC-028", "file": "03-items.spec.js", "line": 114, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "invalid HSN warns immediately", "ok": true, "ms": 13911}, {"id": "TC-029", "file": "03-items.spec.js", "line": 122, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next: Tax Category required first", "ok": true, "ms": 14793}, {"id": "TC-030", "file": "03-items.spec.js", "line": 129, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next: GST rate entered before a Tax Category warns", "ok": true, "ms": 14724}, {"id": "TC-031", "file": "03-items.spec.js", "line": 135, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next: at least one item row", "ok": true, "ms": 12323}, {"id": "TC-032", "file": "03-items.spec.js", "line": 148, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next blocked: missing HSN", "ok": true, "ms": 14708}, {"id": "TC-033", "file": "03-items.spec.js", "line": 148, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next blocked: missing Qty", "ok": true, "ms": 14992}, {"id": "TC-034", "file": "03-items.spec.js", "line": 148, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next blocked: zero Qty", "ok": true, "ms": 15345}, {"id": "TC-035", "file": "03-items.spec.js", "line": 148, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next blocked: missing Unit Cost", "ok": true, "ms": 14904}, {"id": "TC-036", "file": "03-items.spec.js", "line": 148, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "Next blocked: missing GST Rate", "ok": true, "ms": 14901}, {"id": "TC-037", "file": "03-items.spec.js", "line": 159, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "valid rows + category proceed to Movement; Back restores category, rows and rate", "ok": true, "ms": 16946}, {"id": "TC-038", "file": "03-items.spec.js", "line": 176, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "CSV template exposes GST Rate % but not the derived IGST/CGST/SGST columns", "ok": true, "ms": 11528}, {"id": "TC-039", "file": "03-items.spec.js", "line": 185, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "CSV upload replaces rows and derives tax from GST Rate + category", "ok": true, "ms": 12771}, {"id": "TC-040", "file": "03-items.spec.js", "line": 197, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "CSV upload with unrecognised columns is rejected", "ok": true, "ms": 11569}, {"id": "TC-041", "file": "03-items.spec.js", "line": 205, "group": "Step 3 - Items (Tax Category + GST Rate)", "title": "upload and download buttons are the same height", "ok": true, "ms": 11248}, {"id": "TC-042", "file": "04-movement.spec.js", "line": 22, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Outward shows the Dispatch Details fields on this same page", "ok": true, "ms": 15334}, {"id": "TC-043", "file": "04-movement.spec.js", "line": 29, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Inward has no Dispatch Details fields", "ok": true, "ms": 16092}, {"id": "TC-044", "file": "04-movement.spec.js", "line": 36, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Purpose of Movement is required", "ok": true, "ms": 15891}, {"id": "TC-045", "file": "04-movement.spec.js", "line": 43, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Returnable is read-only and follows the DC Type default (returnable type)", "ok": true, "ms": 15736}, {"id": "TC-046", "file": "04-movement.spec.js", "line": 52, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Returnable is read-only and unticked for a non-returnable DC Type; return date hidden", "ok": true, "ms": 16804}, {"id": "TC-047", "file": "04-movement.spec.js", "line": 60, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Rule 55 declaration is seeded from the DC Type", "ok": true, "ms": 15811}, {"id": "TC-048", "file": "04-movement.spec.js", "line": 65, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Additional details: contact is a single-line Data field, short fields share a row, Remarks is full width", "ok": true, "ms": 16248}, {"id": "TC-049", "file": "04-movement.spec.js", "line": 83, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "every Movement + Dispatch + Additional value flows to Review and into the saved document", "ok": true, "ms": 24981}, {"id": "TC-050", "file": "04-movement.spec.js", "line": 120, "group": "Step 4 - Movement Details (merged with Dispatch Details)", "title": "Movement values survive Next -> Back from Review", "ok": true, "ms": 18730}, {"id": "TC-051", "file": "05-review.spec.js", "line": 15, "group": "Step 5 - Review (value-based Outward, two items)", "title": "header shows the entry-mode badge and the E-Way Bill Required badge", "ok": true, "ms": 21538}, {"id": "TC-052", "file": "05-review.spec.js", "line": 20, "group": "Step 5 - Review (value-based Outward, two items)", "title": "cards are merged: no separate Dispatch From / Dispatch Details card", "ok": true, "ms": 21671}, {"id": "TC-053", "file": "05-review.spec.js", "line": 25, "group": "Step 5 - Review (value-based Outward, two items)", "title": "company, ship-to and dispatch-from addresses are shown in full, not as codes", "ok": true, "ms": 21507}, {"id": "TC-054", "file": "05-review.spec.js", "line": 35, "group": "Step 5 - Review (value-based Outward, two items)", "title": "Items card shows Tax Category and both rows", "ok": true, "ms": 21669}, {"id": "TC-055", "file": "05-review.spec.js", "line": 42, "group": "Step 5 - Review (value-based Outward, two items)", "title": "totals card: taxable, IGST, grand total and amount in words", "ok": true, "ms": 21471}, {"id": "TC-056", "file": "05-review.spec.js", "line": 50, "group": "Step 5 - Review (value-based Outward, two items)", "title": "Edit on Items returns to Review with the change applied ('Save & Return to Review')", "ok": true, "ms": 22526}, {"id": "TC-057", "file": "05-review.spec.js", "line": 64, "group": "Step 5 - Review (value-based Outward, two items)", "title": "Edit on Header & Party and on Movement Details round-trip back to Review", "ok": true, "ms": 22872}, {"id": "TC-058", "file": "05-review.spec.js", "line": 83, "group": "Step 5 - Review (value-based Outward, two items)", "title": "Back from Review lands on Movement Details", "ok": true, "ms": 22021}, {"id": "TC-059", "file": "05-review.spec.js", "line": 90, "group": "Review - E-Way Bill badge follows the DC Type rule and the value threshold", "title": "Not-Required DC Type: no badge even for a large value", "ok": true, "ms": 18755}, {"id": "TC-060", "file": "05-review.spec.js", "line": 96, "group": "Review - E-Way Bill badge follows the DC Type rule and the value threshold", "title": "Value-Based DC Type below the threshold: no badge", "ok": true, "ms": 17585}, {"id": "TC-061", "file": "05-review.spec.js", "line": 102, "group": "Review - E-Way Bill badge follows the DC Type rule and the value threshold", "title": "Value-Based DC Type above the threshold: badge shown", "ok": true, "ms": 17515}, {"id": "TC-062", "file": "05-review.spec.js", "line": 109, "group": "Review - editing the Start choice", "title": "Edit on Start keeps the current choice pre-selected and all entered data; Save & Return goes back to Review", "ok": true, "ms": 19027}, {"id": "TC-063", "file": "05-review.spec.js", "line": 124, "group": "Review - editing the Start choice", "title": "Re-clicking the already-selected Level 1 card does not wipe the data", "ok": true, "ms": 19063}, {"id": "TC-064", "file": "05-review.spec.js", "line": 134, "group": "Review - editing the Start choice", "title": "Switching to a different entry mode on Start discards the previous data (by design)", "ok": true, "ms": 19103}, {"id": "TC-065", "file": "06-lifecycle-outward.spec.js", "line": 12, "group": "Outward value-based DC: full lifecycle through the UI", "title": "create via the wizard and land on Approval (Pending for Approval)", "ok": true, "ms": 19087}, {"id": "TC-066", "file": "06-lifecycle-outward.spec.js", "line": 27, "group": "Outward value-based DC: full lifecycle through the UI", "title": "Approval layout: actions first, summary next, Print Preview last; no duplicate buttons", "ok": true, "ms": 3594}, {"id": "TC-067", "file": "06-lifecycle-outward.spec.js", "line": 44, "group": "Outward value-based DC: full lifecycle through the UI", "title": "saved document: numbering, tax split, address displays, standard form opens clean", "ok": true, "ms": 2957}, {"id": "TC-068", "file": "06-lifecycle-outward.spec.js", "line": 65, "group": "Outward value-based DC: full lifecycle through the UI", "title": "Print Preview: loads the real format, refetches on every expand, PDF downloads", "ok": true, "ms": 4841}, {"id": "TC-069", "file": "06-lifecycle-outward.spec.js", "line": 89, "group": "Outward value-based DC: full lifecycle through the UI", "title": "Reject sends it back to Draft; only Submit for Approval / Cancel remain; resubmit works", "ok": true, "ms": 4075}, {"id": "TC-070", "file": "06-lifecycle-outward.spec.js", "line": 100, "group": "Outward value-based DC: full lifecycle through the UI", "title": "Approve moves to the E-Way Bill step (dynamic step list unchanged)", "ok": true, "ms": 3706}, {"id": "TC-071", "file": "06-lifecycle-outward.spec.js", "line": 109, "group": "Outward value-based DC: full lifecycle through the UI", "title": "can go back to Approval from E-Way Bill (button + indicator) read-only, and forward again", "ok": true, "ms": 4036}, {"id": "TC-072", "file": "06-lifecycle-outward.spec.js", "line": 125, "group": "Outward value-based DC: full lifecycle through the UI", "title": "manual E-Way Bill: empty blocked, non-digits rejected, spaces stripped, advances to Dispatch", "ok": true, "ms": 5841}, {"id": "TC-073", "file": "06-lifecycle-outward.spec.js", "line": 148, "group": "Outward value-based DC: full lifecycle through the UI", "title": "Dispatch: blocked without transport details, then dispatches the (non-returnable) DC", "ok": true, "ms": 7922}, {"id": "TC-074", "file": "06-lifecycle-outward.spec.js", "line": 166, "group": "Outward value-based DC: full lifecycle through the UI", "title": "printed document: LR/Vehicle shown, address moved to the footer, three copies, item table class", "ok": true, "ms": 95}, {"id": "TC-075", "file": "06-lifecycle-outward.spec.js", "line": 182, "group": "Other outward lifecycle paths", "title": "Cancel asks for a reason, then locks the document", "ok": true, "ms": 4568}, {"id": "TC-076", "file": "06-lifecycle-outward.spec.js", "line": 200, "group": "Other outward lifecycle paths", "title": "DC Type without an E-Way Bill requirement skips straight from Approval to Dispatch", "ok": true, "ms": 3945}, {"id": "TC-077", "file": "06-lifecycle-outward.spec.js", "line": 209, "group": "Other outward lifecycle paths", "title": "returnable DC ends in 'Dispatched & Awaiting Return' with no further dispatch action", "ok": true, "ms": 3968}, {"id": "TC-078", "file": "06-lifecycle-outward.spec.js", "line": 220, "group": "Other outward lifecycle paths", "title": "'Continue in Wizard' exists on the standard form for a non-Draft DC, and not for a Draft", "ok": true, "ms": 3726}, {"id": "TC-079", "file": "06-lifecycle-outward.spec.js", "line": 236, "group": "Other outward lifecycle paths", "title": "GSP flow: Save creates the E-Way Bill Request and offers Validate (GST portal is NOT called)", "ok": true, "ms": 6339}, {"id": "TC-080", "file": "07-inward.spec.js", "line": 9, "group": "Inward (External Receipt) lifecycle through the UI, Intra State", "title": "create a New Inward DC with Intra State tax", "ok": true, "ms": 17182}, {"id": "TC-081", "file": "07-inward.spec.js", "line": 25, "group": "Inward (External Receipt) lifecycle through the UI, Intra State", "title": "step list uses 'Receipt' and never an E-Way Bill step", "ok": true, "ms": 3557}, {"id": "TC-082", "file": "07-inward.spec.js", "line": 31, "group": "Inward (External Receipt) lifecycle through the UI, Intra State", "title": "Approve -> Receipt; Mark as Received -> 'Received & Pending Return'", "ok": true, "ms": 3806}, {"id": "TC-083", "file": "07-inward.spec.js", "line": 40, "group": "Inward (External Receipt) lifecycle through the UI, Intra State", "title": "Inward print format is used and its CGST/SGST branch renders", "ok": true, "ms": 4150}, {"id": "TC-084", "file": "08-returns-redirect.spec.js", "line": 39, "group": "Start - predecessor pickers", "title": "DC Type chosen after the predecessor sticks (regression: blur re-fired the predecessor handler and wiped it)", "ok": true, "ms": 7463}, {"id": "TC-085", "file": "08-returns-redirect.spec.js", "line": 56, "group": "Start - predecessor pickers", "title": "Next needs both a predecessor and a DC Type", "ok": true, "ms": 4210}, {"id": "TC-086", "file": "08-returns-redirect.spec.js", "line": 70, "group": "Start - predecessor pickers", "title": "only eligible predecessors are offered (a Pending-for-Approval DC is not)", "ok": true, "ms": 6407}, {"id": "TC-087", "file": "08-returns-redirect.spec.js", "line": 90, "group": "Start - predecessor pickers", "title": "Return Against Inward DC only offers received, returnable External Receipts", "ok": true, "ms": 3885}, {"id": "TC-088", "file": "08-returns-redirect.spec.js", "line": 113, "group": "Return Against Outward DC (discharge) - quantities and locked rows", "title": "setup: a dispatched returnable Outward DC of 10 units", "ok": true, "ms": 345}, {"id": "TC-089", "file": "08-returns-redirect.spec.js", "line": 118, "group": "Return Against Outward DC (discharge) - quantities and locked rows", "title": "header is pre-filled from the predecessor; Branch still has to be chosen", "ok": true, "ms": 6290}, {"id": "TC-090", "file": "08-returns-redirect.spec.js", "line": 126, "group": "Return Against Outward DC (discharge) - quantities and locked rows", "title": "Items are locked: only Qty is editable, no add row, no Tax Category, GST shown read-only", "ok": true, "ms": 10339}, {"id": "TC-091", "file": "08-returns-redirect.spec.js", "line": 151, "group": "Return Against Outward DC (discharge) - quantities and locked rows", "title": "Qty above the outstanding quantity warns immediately and blocks Next", "ok": true, "ms": 8986}, {"id": "TC-092", "file": "08-returns-redirect.spec.js", "line": 164, "group": "Return Against Outward DC (discharge) - quantities and locked rows", "title": "partial return of 4: approve, receive -> predecessor becomes Partially Returned (outstanding 6)", "ok": true, "ms": 10312}, {"id": "TC-093", "file": "08-returns-redirect.spec.js", "line": 196, "group": "Return Against Outward DC (discharge) - quantities and locked rows", "title": "a second return is now capped at the remaining 6 and completes the original", "ok": true, "ms": 10346}, {"id": "TC-094", "file": "08-returns-redirect.spec.js", "line": 226, "group": "Redirect and Return Against Inward DC", "title": "Redirect creates a new Outward DC linked to the original", "ok": true, "ms": 9724}, {"id": "TC-095", "file": "08-returns-redirect.spec.js", "line": 249, "group": "Redirect and Return Against Inward DC", "title": "Return Against Inward DC dispatches goods back out, capped by what was received", "ok": true, "ms": 10349}, {"id": "TC-096", "file": "09-edge-cases.spec.js", "line": 6, "group": "Cross-cutting edge cases", "title": "double-clicking Send for Approval creates exactly one document", "ok": true, "ms": 19022}, {"id": "TC-097", "file": "09-edge-cases.spec.js", "line": 16, "group": "Cross-cutting edge cases", "title": "a server-side validation failure (bad HSN) surfaces on Review, blocks sending, and is fixable via Edit", "ok": true, "ms": 16391}, {"id": "TC-098", "file": "09-edge-cases.spec.js", "line": 42, "group": "Cross-cutting edge cases", "title": "refreshing the page mid-wizard returns to a clean Start (no stale state, no crash)", "ok": true, "ms": 10990}, {"id": "TC-099", "file": "09-edge-cases.spec.js", "line": 51, "group": "Cross-cutting edge cases", "title": "after creation only post-creation steps are clickable, and never the one you're on", "ok": true, "ms": 3716}, {"id": "TC-100", "file": "09-edge-cases.spec.js", "line": 61, "group": "Cross-cutting edge cases", "title": "the Tax Category survives a trip through Review's Edit and is not silently reset", "ok": true, "ms": 19158}], "groups": {"00-smoke.spec.js": ["Test harness", "Confirms the API-driven setup (create, approve, dispatch a Delivery Challan) that the UI scenarios depend on."], "01-start.spec.js": ["Step 1 · Start", "Entry cards, DC Type and predecessor pickers, and the rules for what can be chosen first."], "02-header-party.spec.js": ["Step 2 · Header & Party", "The merged Company, Party, Consignee and Dispatch From page: defaults, auto-fill, required fields."], "03-items.spec.js": ["Step 3 · Items", "Tax Category, the single GST Rate column and its IGST or CGST+SGST split, totals, keyboard entry and CSV bulk fill."], "04-movement.spec.js": ["Step 4 · Movement Details", "Purpose, read-only Returnable, Rule 55 text, contact person and the Dispatch Details block for outward documents."], "05-review.spec.js": ["Step 5 · Review", "Summary cards, totals, E-Way Bill badge rules and the Edit links that return to Review."], "06-lifecycle-outward.spec.js": ["Outward lifecycle", "Create, approve, reject, E-Way Bill (manual and GSP), dispatch, cancel, print preview and the printed document."], "07-inward.spec.js": ["Inward lifecycle", "Inward document creation, approval and receipt."], "08-returns-redirect.spec.js": ["Returns and Redirect", "Predecessor pickers, locked return rows, quantity limits, partial and repeat returns, redirect and return against inward."], "09-edge-cases.spec.js": ["Cross-cutting edge cases", "Double submit, server validation errors, page refresh, step-indicator rules and Tax Category persistence."]}};
const cases = DATA.cases, groups = DATA.groups;
const files = Object.keys(groups);
const fmt = ms => ms >= 60000 ? (ms/60000).toFixed(1)+" min" : ms >= 1000 ? (ms/1000).toFixed(1)+" s" : Math.round(ms)+" ms";
const esc = s => s.replace(/[&<>"]/g, c => ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c]));
const passed = cases.filter(c => c.ok).length, total = cases.length, totalMs = cases.reduce((a,c)=>a+c.ms,0);
document.getElementById("bigpass").textContent = passed + " / " + total;
document.getElementById("facts").innerHTML = [
["Failed", total-passed],["Skipped",0],["Flaky",0],["Test time", fmt(totalMs)],["Slowest", fmt(Math.max(...cases.map(c=>c.ms)))],["Workers","1 (serial)"]
].map(([k,v])=>`<div><b>${v}</b><span>${k}</span></div>`).join("");

let rows = `<thead><tr><th>Area</th><th>What it covers</th><th class="num">Cases</th><th class="num">Passed</th><th>Pass rate</th><th class="num">Time</th></tr></thead><tbody>`;
for (const f of files) {
const cs = cases.filter(c=>c.file===f), p = cs.filter(c=>c.ok).length, t = cs.reduce((a,c)=>a+c.ms,0);
rows += `<tr><td><b>${esc(groups[f][0])}</b><div class="mono muted">${f}</div></td><td>${esc(groups[f][1])}</td><td class="num">${cs.length}</td><td class="num">${p}</td><td><div class="bar" title="${p} of ${cs.length}"><i style="width:${100*p/cs.length}%"></i></div></td><td class="num">${fmt(t)}</td></tr>`;
}
rows += `<tr><td><b>Total</b></td><td></td><td class="num"><b>${total}</b></td><td class="num"><b>${passed}</b></td><td></td><td class="num"><b>${fmt(totalMs)}</b></td></tr></tbody>`;
document.getElementById("sumtable").innerHTML = rows;

let active = "all";
const chips = document.getElementById("chips");
chips.innerHTML = [["all","All"]].concat(files.map(f=>[f, groups[f][0].replace(/^Step (\d) · /,"$1 · ")])).map(([k,l])=>`<button type="button" data-k="${k}" aria-pressed="${k===active}">${esc(l)}</button>`).join("");
chips.addEventListener("click", e => { const b = e.target.closest("button"); if(!b) return; active = b.dataset.k; chips.querySelectorAll("button").forEach(x=>x.setAttribute("aria-pressed", x.dataset.k===active)); draw(); });
document.getElementById("q").addEventListener("input", draw);

function draw(){
const q = document.getElementById("q").value.trim().toLowerCase();
let html = "";
for (const f of files) {
if (active!=="all" && active!==f) continue;
const cs = cases.filter(c => c.file===f && (!q || (c.title+" "+c.group).toLowerCase().includes(q)));
if (!cs.length) continue;
html += `<div class="group"><h3>${esc(groups[f][0])}</h3><p>${esc(groups[f][1])}</p><div class="scroll">` +
cs.map(c=>`<div class="case"><span class="id">${c.id}</span><span class="t">${esc(c.title)}<span class="sub">${esc(c.group)} · ${c.file}:${c.line}</span></span><span class="res"><span>${fmt(c.ms)}</span><span class="pill ${c.ok?"":"fail"}">${c.ok?"PASS":"FAIL"}</span></span></div>`).join("") + `</div></div>`;
}
document.getElementById("ledger").innerHTML = html || `<div class="empty">No test case matches that filter.</div>`;
}
draw();
</script>

</body></html>
(2-2/2)