Make plan deletion visible and reliable with in-page confirmation
Test and deploy / test-and-deploy (push) Successful in 1m28s
Test and deploy / test-and-deploy (push) Successful in 1m28s
This commit is contained in:
1 parent
f2abdcefe1
commit
a72aec9f86
4 files changed
+100
-8
No files matched your search
@@ -717,3 +717,47 @@ test(
|
||||
assert.deepEqual(errors, []);
|
||||
},
|
||||
);
|
||||
|
||||
test("browser: deleting a plan confirms in-page, supports retry, and preserves roast records", browserOptions, async (t) => {
|
||||
const { page, base, create, db, csrfToken, errors } = await session(t);
|
||||
const plan = blankPlan();
|
||||
const saved = await create(plan, "Burundi — previous light roast plan");
|
||||
const keep = await create(plan, "Keep this plan");
|
||||
await page.request.put(base + "/api/plans/" + saved.id, {
|
||||
headers: { "x-csrf-token": csrfToken }, data: { name: "Burundi — previous light roast plan revised" },
|
||||
});
|
||||
const owner = (await db.query("SELECT user_id FROM roast_plans WHERE id=$1", [saved.id])).rows[0].user_id;
|
||||
const roast = (await db.query("INSERT INTO actual_roasts(user_id,roast_plan_id,filename,original_content,parsed,plan_snapshot) VALUES($1,$2,'saved.alog','{}',$3,$4) RETURNING id", [owner,saved.id,{roast:{}},plan])).rows[0];
|
||||
// Browser popup suppression must not turn Delete into a silent no-op.
|
||||
await page.addInitScript(() => { window.confirm = () => false; });
|
||||
await page.goto(base + "/plans");
|
||||
const remove = page.getByRole("button", {name: "Delete Burundi — previous light roast plan revised", exact:true});
|
||||
await remove.click();
|
||||
const dialog = page.getByRole("dialog", {name:"Delete this plan?"});
|
||||
await dialog.waitFor();
|
||||
await page.screenshot({path:"/tmp/delete-plan-desktop.png"});
|
||||
await page.setViewportSize({width:390,height:844});
|
||||
await page.screenshot({path:"/tmp/delete-plan-mobile.png"});
|
||||
assert.equal(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth), true);
|
||||
await dialog.getByRole("button",{name:"Cancel",exact:true}).click();
|
||||
assert.equal((await page.request.get(base + "/api/plans/" + saved.id)).status(),200);
|
||||
await remove.click();
|
||||
await page.route("**/api/plans/" + saved.id, async (route) => {
|
||||
if (route.request().method() === "DELETE") await route.fulfill({status:503,contentType:"application/json",body:JSON.stringify({error:"Temporary service failure"})});
|
||||
else await route.continue();
|
||||
});
|
||||
await dialog.getByRole("button",{name:"Delete plan",exact:true}).click();
|
||||
await page.getByRole("alert").filter({hasText:"Temporary service failure"}).waitFor();
|
||||
assert.equal(await dialog.isVisible(),true);
|
||||
await page.unroute("**/api/plans/" + saved.id);
|
||||
await dialog.getByRole("button",{name:"Delete plan",exact:true}).click();
|
||||
await dialog.waitFor({state:"hidden"});
|
||||
await page.waitForFunction(() => document.getElementById("plans-status").textContent === "1–1 of 1 plans");
|
||||
assert.equal((await page.request.get(base + "/api/plans/" + saved.id)).status(),404);
|
||||
assert.equal((await page.request.get(base + "/api/plans/" + keep.id)).status(),200);
|
||||
assert.equal((await db.query("SELECT * FROM plan_revisions WHERE plan_id=$1",[saved.id])).rows.length,0);
|
||||
const remaining = (await db.query("SELECT * FROM actual_roasts WHERE id=$1",[roast.id])).rows[0];
|
||||
assert.equal(remaining.roast_plan_id,null);
|
||||
assert.deepEqual(remaining.plan_snapshot,plan);
|
||||
assert.deepEqual(errors,[]);
|
||||
});
|
||||
Reference in new issue
Block a user