|
1 | | -import { launch } from "@astral/astral"; |
| 1 | +import { Browser, launch } from "@astral/astral"; |
2 | 2 | import { assert } from "@std/assert"; |
3 | | -import { login } from "./utils.ts"; |
| 3 | +import { |
| 4 | + addCharm, |
| 5 | + inspectCharm, |
| 6 | + login, |
| 7 | + sleep, |
| 8 | + waitForSelectorWithText, |
| 9 | +} from "./utils.ts"; |
4 | 10 |
|
5 | | -const FRONTEND_URL = "http://localhost:5173/"; |
| 11 | +const TOOLSHED_API_URL = Deno.env.get("TOOLSHED_API_URL") ?? |
| 12 | + "http://localhost:8000/"; |
| 13 | +const FRONTEND_URL = Deno.env.get("FRONTEND_URL") ?? "http://localhost:5173/"; |
| 14 | + |
| 15 | +async function main(browser: Browser) { |
| 16 | + console.log(`TOOLSHED_API_URL=${TOOLSHED_API_URL}`); |
| 17 | + console.log(`FRONTEND_URL=${FRONTEND_URL}`); |
| 18 | + |
| 19 | + const { charmId, space } = await addCharm(TOOLSHED_API_URL); |
| 20 | + console.log(`Charm added`, { charmId, space }); |
6 | 21 |
|
7 | | -async function main() { |
8 | | - const browser = await launch(); |
9 | 22 | console.log(`Waiting to open website at ${FRONTEND_URL}`); |
10 | 23 | const page = await browser.newPage(FRONTEND_URL); |
11 | 24 | console.log(`Opened website at ${FRONTEND_URL}`); |
12 | 25 |
|
| 26 | + console.log("Logging in"); |
13 | 27 | await login(page); |
14 | 28 |
|
| 29 | + console.log("Checking if logged in"); |
15 | 30 | const anchor = await page.waitForSelector("nav a"); |
16 | 31 | assert( |
17 | 32 | (await anchor.innerText()) === "common-knowledge", |
18 | 33 | "Logged in and Common Knowledge title renders", |
19 | 34 | ); |
20 | | - await browser.close(); |
| 35 | + |
| 36 | + await page.goto(`${FRONTEND_URL}${space}/${charmId}`); |
| 37 | + console.log(`Waiting for charm to render`); |
| 38 | + |
| 39 | + await waitForSelectorWithText( |
| 40 | + page, |
| 41 | + "a[aria-current='charm-title']", |
| 42 | + "Simple Value: 1", |
| 43 | + ); |
| 44 | + console.log("Charm rendered."); |
| 45 | + |
| 46 | + console.log("Clicking button"); |
| 47 | + // Sometimes clicking this button throws: |
| 48 | + // https://jsr.io/@astral/astral/0.5.2/src/element_handle.ts#L192 |
| 49 | + // As if the reference was invalidated by a spurious re-render between |
| 50 | + // getting an element handle, and clicking it. |
| 51 | + await sleep(1000); |
| 52 | + const button = await page.waitForSelector( |
| 53 | + "div[aria-label='charm-content'] button", |
| 54 | + ); |
| 55 | + await button.click(); |
| 56 | + |
| 57 | + console.log("Checking if title changed"); |
| 58 | + await waitForSelectorWithText( |
| 59 | + page, |
| 60 | + "a[aria-current='charm-title']", |
| 61 | + "Simple Value: 2", |
| 62 | + ); |
| 63 | + console.log("Title changed"); |
| 64 | + |
| 65 | + console.log("Inspecting charm to verify updates propagated from browser."); |
| 66 | + const charm = await inspectCharm(TOOLSHED_API_URL, space, charmId); |
| 67 | + console.log("Charm:", charm); |
| 68 | + assert(charm.includes("Simple Value: 2"), "Charm updates propagated."); |
21 | 69 | } |
22 | 70 |
|
| 71 | +let browser = null; |
23 | 72 | try { |
24 | | - await main(); |
| 73 | + browser = await launch(); |
| 74 | + await main(browser); |
| 75 | + await browser.close(); |
25 | 76 | } catch (e) { |
| 77 | + if (browser) { |
| 78 | + await browser.close(); |
| 79 | + } |
26 | 80 | console.error(e); |
27 | 81 | Deno.exit(1); |
28 | 82 | } |
0 commit comments