diff --git a/ventures/havre/tests/smoke.mjs b/ventures/havre/tests/smoke.mjs index cb22c70..c4a8809 100644 --- a/ventures/havre/tests/smoke.mjs +++ b/ventures/havre/tests/smoke.mjs @@ -325,7 +325,7 @@ async function main() { assert.match(await textOf(page, "#who-name"), /^chat$/i); await has(page, "#log .line.note .said", /paste your venice key/); assert.ok(await page.locator("#cast-box").isHidden(), "the harbor's own aren't listed"); - assert.equal(await page.locator("#harbor-empty").evaluate((e) => e.hidden), false, "the empty harbor says so"); + assert.equal(await page.locator("#roster tr.newrow").count(), 1, "the harbor always has a row for someone new"); assert.equal(await page.locator("#card-empty").evaluate((e) => e.hidden), false, "so does the empty card"); assert.ok(await page.locator("#card").isHidden(), "the card lives in the harbor tab, not under the characters"); assert.ok(await page.locator("#say").isDisabled(), "nobody to talk to yet"); @@ -334,13 +334,14 @@ async function main() { await page.click("#lt-harbor"); assert.ok(await page.locator("#card-new").isVisible(), "an empty harbor opens on a new character to write"); assert.match(await textOf(page, "#card-h"), /^NEW CHARACTER$/); + assert.match(await textOf(page, "#roster tr.newrow"), /\+ new character/); await page.click("#lt-chars"); await shot(page, "desktop.png"); // a card comes in through the import dialog, and talks from its own examples without a key await page.click("#import"); await page.setInputFiles("#file", { name: "ro.json", mimeType: "application/json", buffer: Buffer.from(JSON.stringify(v2)) }); - await count(page, "#roster tr", 1); + await count(page, "#roster tr:not(.newrow)", 1); await has(page, "#who-name", /^Captain Ro$/); await has(page, "#log .line.them .said", /We're closed\. Mostly\./); await has(page, "#roster td", /Ported from Captain Ro by someone/); @@ -420,7 +421,7 @@ async function main() { assert.equal(hello.messages[0].role, "system"); assert.match(hello.messages[0].content, /you can send photos of yourself/); assert.equal(hello.messages[1].role, "user"); - await count(page, "#roster tr", 2); + await count(page, "#roster tr:not(.newrow)", 2); assert.match(await page.locator('#vgrid .tile[aria-pressed="true"]').evaluate((el) => el.textContent), /Sable Penrose.*talking now/); // the model: their own on Venice to start with, and any other Venice model from the picker await has(page, "#model-btn", /^GLM 5\.2$/); @@ -794,7 +795,7 @@ async function main() { await shot(page, "desktop-remix.png"); await page.locator("#rx-draft button", { hasText: "KEEP IN HARBOR" }).click(); await has(page, "#who-name", /^Ines Corbel$/); - await count(page, "#roster tr", 4); + await count(page, "#roster tr:not(.newrow)", 4); await has(page, "#log .line.them .said", /Where are you headed\?/); assert.equal(await page.locator("#studio.pane-chat").count(), 1, "a kept remix opens their chat, to say hello"); assert.ok(await page.locator("#chat-back").isHidden(), "a wide screen shows the list and the chat side by side, so no way back is needed"); @@ -1060,7 +1061,7 @@ async function main() { await page.click("#lt-chars"); await page.click("#import"); await page.setInputFiles("#file", png); - await count(page, "#roster tr", 5); + await count(page, "#roster tr:not(.newrow)", 5); // the security policy: nothing but api.venice.ai (and its private-share links for clips) assert.equal(await page.evaluate(() => fetch("https://example.com/").then(() => "reached", () => "blocked")), "blocked"); @@ -1131,7 +1132,7 @@ async function main() { taskmaster: [{ role: "user", content: "Plan my week" }, { role: "assistant", content: "Monday first." }] })); }); await p2.reload(); - await count(p2, "#roster tr", 1); + await count(p2, "#roster tr:not(.newrow)", 1); const left = await p2.evaluate(() => { const threads = JSON.parse(localStorage.getItem("havre.threads.v1") || "{}"), t = Object.values(threads)[0]; return { cards: JSON.parse(localStorage.getItem("havre.cards.v1")), seeded: localStorage.getItem("havre.seeded.v1"), @@ -1179,7 +1180,7 @@ async function main() { await has(p5, "#cast .tile[data-cast=maren] .go", /^talk again$/); await p5.goto(base + "?meet=maren"); await has(p5, "#who-name", /^Maren$/); - await count(p5, "#roster tr", 2); + await count(p5, "#roster tr:not(.newrow)", 2); assert.ok(await p5.locator("#log .line.me .said", { hasText: "What is this place?" }).isVisible(), "the same chat, not a new copy of her"); await own.close();