import assert from "node:assert/strict"; import { ErrorCode } from "@batch-cooking/shared"; import { Given, Then, When } from "@cucumber/cucumber"; import type { CustomWorld } from "../support/world.js"; Given("I have a household named {string}", async function (this: CustomWorld, name: string) { const res = await this.agent.post("/house").send({ name }); assert.equal(res.status, 201, JSON.stringify(res.body)); }); When("I create a household named {string}", async function (this: CustomWorld, name: string) { this.response = await this.agent.post("/house").send({ name }); }); When("I rename my household to {string}", async function (this: CustomWorld, name: string) { this.response = await this.agent.patch("/house/current").send({ name }); }); When("I leave the household", async function (this: CustomWorld) { this.response = await this.agent.post("/house/leave"); }); When("I remove the second user from my household", async function (this: CustomWorld) { const secondMe = await this.secondAgent.get("/auth/me"); this.response = await this.agent.delete(`/house/members/${secondMe.body.id}`); }); Then("my household should be named {string}", async function (this: CustomWorld, name: string) { const res = await this.agent.get("/house/current"); assert.equal(res.body.name, name); }); // --- Steps involving a second, independently signed-in user --------------- // The first ("a profile already exists with email ...") step is reused // as-is for the second user too — it just inserts a row, agent-agnostic. When( "the second user logs in with email {string} and password {string}", async function (this: CustomWorld, email: string, password: string) { this.secondResponse = await this.secondAgent.post("/auth/login").send({ email, password }); }, ); When( "the second user joins my household using its invite code", async function (this: CustomWorld) { const house = await this.agent.get("/house/current"); this.secondResponse = await this.secondAgent .post("/house/join") .send({ inviteCode: house.body.inviteCode }); }, ); When("the second user tries to delete the household", async function (this: CustomWorld) { this.secondResponse = await this.secondAgent.delete("/house/current"); }); Then( "the second user's response status should be {int}", function (this: CustomWorld, status: number) { assert.equal(this.secondResponse.status, status); }, ); Then( "the second user's response error code should be {string}", function (this: CustomWorld, code: string) { const expected = ErrorCode[code as keyof typeof ErrorCode]; assert.notEqual(expected, undefined, `Unknown ErrorCode member: "${code}"`); assert.equal(this.secondResponse.body.code, expected); }, ); Then("the second user should be a member of my household", async function (this: CustomWorld) { const house = await this.agent.get("/house/current"); const secondMe = await this.secondAgent.get("/auth/me"); const memberIds = (house.body.members as Array<{ id: number }>).map((member) => member.id); assert.ok(memberIds.includes(secondMe.body.id)); }); Then("the second user should be the household's admin", async function (this: CustomWorld) { const secondMe = await this.secondAgent.get("/auth/me"); const house = await this.secondAgent.get("/house/current"); assert.equal(house.body.adminId, secondMe.body.id); }); Then("the second user should have no household", async function (this: CustomWorld) { const secondMe = await this.secondAgent.get("/auth/me"); assert.equal(secondMe.body.houseId, null); });