aboutsummaryrefslogtreecommitdiffstats
path: root/test/e2e/dm-send.spec.ts
blob: f87abc2b7def07a447d5016977a640349f8a26d7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { expect, test } from "@playwright/test";
import { login, bobUsername, bobPassword, aliceUsername, apiBaseUrl } from "./helpers";

test("bob sends a DM to alice via /messages page", async ({ browser }) => {
  const bobContext = await browser.newContext();
  const bobPage = await bobContext.newPage();

  // Collect console logs for diagnostics
  const consoleLogs: string[] = [];
  bobPage.on("console", (msg) => consoleLogs.push(`[${msg.type()}] ${msg.text()}`));
  const pageErrors: string[] = [];
  bobPage.on("pageerror", (err) => pageErrors.push(err.message));

  // Login as bob (sets auth cookies + nsec in localStorage)
  await login(bobPage, bobUsername, bobPassword);

  // Resolve Alice's pubkey from username
  const aliceRes = await bobPage.request.get(`${apiBaseUrl}/users/${aliceUsername}`);
  const alicePubkey = (await aliceRes.json()).pubkey;
  expect(alicePubkey, "Alice should have a pubkey").toBeTruthy();

  // Navigate to /messages selecting alice by pubkey
  await bobPage.goto(`/messages/${alicePubkey}`);
  await bobPage.waitForLoadState("domcontentloaded");

  // Wait for the message textarea to become visible
  const textarea = bobPage.locator("#message-contents");
  await expect(textarea).toBeVisible({ timeout: 15_000 });

  // Type a test message
  const testMessage = `e2e test message ${Date.now()}`;
  await textarea.fill(testMessage);

  // Wait for send button to be enabled (groupId must be set by MLS group creation)
  const sendButton = bobPage.locator('button[aria-label="Send"]');
  const isEnabled = await sendButton.isEnabled({ timeout: 15_000 }).catch(() => false);

  if (!isEnabled) {
    // MLS group creation may have failed — check console
    const errors = consoleLogs.filter((l) => /error|fail/i.test(l));
    console.log("[e2e] Console errors:", errors.slice(-10).join("\n  "));
    console.log("[e2e] Page errors:", pageErrors.join("\n  "));
    test.skip(true, "MLS group creation failed — send button never enabled");
    await bobContext.close();
    return;
  }

  await sendButton.click();

  // Wait for textarea to clear (message sent)
  await expect(textarea).toHaveValue("", { timeout: 15_000 });

  // Verify the message appears in the chat (optimistic UI)
  const sentBubble = bobPage.locator(".message").filter({ hasText: testMessage });
  await expect(sentBubble).toBeVisible({ timeout: 10_000 });

  // Verify no error message appeared in the UI
  const sendError = bobPage.locator(".warning em");
  const hasError = await sendError
    .filter({ hasText: /failed|error/i })
    .isVisible({ timeout: 1_000 })
    .catch(() => false);
  if (hasError) {
    const errorText = await sendError.innerText();
    console.log(`[e2e] UI error: ${errorText}`);
  }
  expect(hasError, "No send error should appear").toBeFalsy();

  // Dump diagnostics
  const errors = consoleLogs.filter((l) => /error|fail|blocked/i.test(l));
  if (errors.length) {
    console.log("[e2e] Console errors:\n  " + errors.join("\n  "));
  }

  await bobContext.close();
});