@chrryai/waffles 1.2.68 → 1.2.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/chat.ts","../src/signIn.ts","../src/collaboration.ts","../src/limit.ts","../src/thread.ts"],"names":["dotenv","path","expect","creditsInfo","thread","process","faker","fileChooserPromise","fileChooser","userMessages","guestMessages","threadId","artifactsButton","instructionModal","email","TEST_URL"],"mappings":"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","file":"index.js","sourcesContent":["import * as dotenv from \"dotenv\"\nimport { Page } from \"@playwright/test\"\n\nexport const TEST_GUEST_FINGERPRINTS = [\"EDIT\"]\nexport const TEST_MEMBER_FINGERPRINTS = [\"EDIT\"]\nexport const TEST_MEMBER_EMAILS = [\"EDIT\"]\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL_1!\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD_1!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS[0]\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1]\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2]\n\ndotenv.config()\n\nexport const TEST_URL = process.env.TEST_URL!\nexport const LIVE_URL = \"https://chrry.ai\"\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.NEXT_PUBLIC_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n }: {\n isLive: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n },\n) => {\n const base = isLive ? LIVE_URL : TEST_URL\n return isMember\n ? `${base}${path}?fp=${fingerprint || TEST_MEMBER_FINGERPRINTS[0]}`\n : `${base}${path}?fp=${fingerprint || TEST_GUEST_FINGERPRINTS[0]}`\n}\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nexport {\n wait,\n getURL,\n simulateInputPaste,\n simulatePaste,\n capitalizeFirstLetter,\n}\n","import { expect, Page } from \"@playwright/test\"\n// Re-export modelName type for convenience\nexport type modelName = \"chatGPT\" | \"claude\" | \"deepSeek\" | \"gemini\" | \"flux\"\nimport {\n getURL,\n simulateInputPaste,\n wait,\n capitalizeFirstLetter,\n simulatePaste,\n} from \"./utils\"\nimport path from \"path\"\nimport process from \"process\"\nimport { faker } from \"@faker-js/faker\"\n\nexport const chat = async ({\n artifacts,\n page,\n isMember,\n isSubscriber,\n\n instruction = \"This thread will be all about React Native, are you ready?\",\n prompts = [\n {\n stop: false,\n text: \"Hello\",\n agentMessageTimeout: 500000,\n webSearch: false,\n delete: true,\n mix: {\n image: 0,\n video: 0,\n audio: 0,\n paste: 0,\n pdf: 0,\n },\n },\n ],\n agentMessageTimeout = 50 * 1000,\n isNewChat = true,\n isLiveTest = false,\n threadId,\n creditsConsumed = 0,\n bookmark = true,\n}: {\n isSubscriber?: boolean\n artifacts?: {\n text?: number\n paste?: number\n pdf?: number\n }\n page: Page\n isMember?: boolean\n instruction?: string\n prompts?: {\n debateAgent?: modelName\n stop?: boolean\n text: string\n instruction?: string\n deleteMessage?: boolean\n deleteAgentMessage?: boolean\n model?: modelName\n agentMessageTimeout?: number\n shouldFail?: boolean\n like?: boolean\n delete?: boolean\n webSearch?: boolean\n image?: number\n video?: number\n audio?: number\n paste?: number\n pdf?: number\n mix?: {\n image?: number\n video?: number\n audio?: number\n paste?: number\n pdf?: number\n }\n }[]\n agentMessageTimeout?: number\n isNewChat?: boolean\n isLiveTest?: boolean\n threadId?: string\n creditsConsumed?: number\n bookmark?: boolean\n}) => {\n page.on(\"console\", (msg) => {\n console.log(`[browser][${msg.type()}] ${msg.text()}`, msg)\n })\n\n if (threadId) {\n instruction = \"\"\n }\n\n const hourlyLimit = isSubscriber ? 100 : isMember ? 30 : 10 // guests: 10, members: 30, subscribers: 100\n\n const getModelCredits = (model: string) =>\n model === \"flux\"\n ? 2\n : isMember\n ? model === \"chatGPT\"\n ? 4\n : model === \"deepSeek\"\n ? 1\n : model === \"claude\"\n ? 3\n : 1\n : 1\n\n const MAX_FILE_SIZE = 4\n\n if (\n prompts?.some(\n (p) =>\n (p.pdf && p.pdf > MAX_FILE_SIZE) ||\n (p.image && p.image > MAX_FILE_SIZE) ||\n (p.video && p.video > MAX_FILE_SIZE) ||\n (p.audio && p.audio > MAX_FILE_SIZE) ||\n (p.paste && p.paste > MAX_FILE_SIZE) ||\n Object.values(p.mix || {}).some((v) => v > MAX_FILE_SIZE),\n )\n ) {\n throw new Error(\"Test file size limit exceeded\")\n }\n\n if (isLiveTest) {\n await page.goto(getURL({ isLive: true, isMember }), {\n waitUntil: \"networkidle\",\n })\n await wait(3000)\n } else if (isNewChat) {\n await page.goto(getURL({ isLive: false, isMember }), {\n waitUntil: \"networkidle\",\n })\n await wait(3000)\n }\n\n let credits = isSubscriber ? 2000 : (isMember ? 150 : 30) - creditsConsumed\n let hourlyUsage = creditsConsumed || 0 // Track hourly usage for assertions\n\n const agentModal = page.getByTestId(\"agent-modal\")\n await expect(agentModal).not.toBeVisible()\n\n const signInModal = page.getByTestId(\"sign-in-modal\")\n await expect(signInModal).not.toBeVisible()\n\n const agentSelectButton = page.getByTestId(\"agent-select-button\")\n await expect(agentSelectButton).toBeVisible()\n\n const addDebateAgentButton = page.getByTestId(\"add-debate-agent-button\")\n await expect(addDebateAgentButton).toBeVisible()\n\n const getAgentName = async () => {\n return page\n .getByTestId(\"agent-select-button\")\n .getAttribute(\"data-agent-name\")\n }\n\n const getDebateAgentName = async () => {\n return page\n .getByTestId(\"add-debate-agent-button\")\n .getAttribute(\"data-agent-name\")\n }\n\n !isMember && expect(await getAgentName()).toBe(\"deepSeek\")\n\n const chatTextarea = page.getByTestId(\"chat-textarea\")\n await expect(chatTextarea).toBeVisible()\n\n const creditsInfo = page.getByTestId(\"credits-info\")\n await expect(creditsInfo).toBeVisible()\n const scrollToBottom = async () => {\n await page.evaluate(() => {\n window.scrollTo(0, document.body.scrollHeight)\n })\n await wait(500) // Give time for scroll to complete\n }\n\n const getCreditsLeft = async () => {\n await scrollToBottom() // Ensure credit info is visible\n const creditsInfo = page.getByTestId(\"credits-info\")\n const isCreditsVisible = await creditsInfo.isVisible().catch(() => false)\n if (!isCreditsVisible) {\n return null // Credits info is hidden when hourly limit is shown\n }\n return await creditsInfo.getAttribute(\"data-credits-left\", {\n timeout: 1000,\n })\n }\n\n const getHourlyUsageLeft = async () => {\n await scrollToBottom() // Ensure hourly limit info is visible\n const hourlyLimitInfo = page.getByTestId(\"hourly-limit-info\")\n\n return await hourlyLimitInfo.getAttribute(\"data-hourly-left\", {\n timeout: 1000,\n })\n }\n\n const subscribeButton = page.getByTestId(\"subscribe-from-chat-button\")\n await expect(subscribeButton).toBeVisible()\n\n expect(await getCreditsLeft()).toBe(credits.toString())\n\n const thread = page.getByTestId(\"thread\")\n\n let willFail = false\n\n const why = page.getByTestId(\"instruction-why\")\n let instructionButton = page.getByTestId(\"instruction-button\")\n let artifactsButton = page.getByTestId(\"instruction-artifacts-button\")\n\n if (!threadId) {\n await expect(thread).not.toBeVisible()\n\n await expect(why).toBeVisible()\n } else {\n await expect(instructionButton).not.toBeVisible()\n\n instructionButton = page.getByTestId(\"chat-instruction-button\")\n artifactsButton = page.getByTestId(\"chat-artifacts-button\")\n await expect(thread).toBeVisible()\n await expect(why).not.toBeVisible()\n }\n\n await expect(instructionButton).toBeVisible()\n const instructionModal = page.getByTestId(\"instruction-modal\")\n await expect(instructionModal).not.toBeVisible()\n\n if (instruction) {\n await instructionButton.click()\n\n await expect(instructionModal).toBeVisible()\n\n const modalMaxCharCount = page.getByTestId(\n \"instruction-modal-max-char-count\",\n )\n\n await expect(modalMaxCharCount).toBeVisible()\n\n const modalTextarea = page.getByTestId(\"instruction-modal-textarea\")\n await expect(modalTextarea).toBeVisible()\n\n await modalTextarea.fill(instruction)\n\n const modalCharLeft = page.getByTestId(\"instruction-modal-char-left\")\n await expect(modalCharLeft).toBeVisible()\n await expect(modalMaxCharCount).not.toBeVisible()\n\n const modalSaveButton = page.getByTestId(\"instruction-modal-save-button\")\n await expect(modalSaveButton).toBeVisible()\n\n await modalSaveButton.click()\n }\n\n if (artifacts) {\n await artifactsButton.click()\n\n const dataTestId = threadId ? \"chat\" : \"instruction\"\n await expect(instructionModal).toBeVisible()\n\n if (artifacts.pdf) {\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n await page.getByTestId(`${dataTestId}-artifacts-upload-button`).click()\n\n const testUsedPaths = Array.from({ length: artifacts.pdf }, (_, i) => {\n const fileType = \"pdf\"\n const fileName = `test${capitalizeFirstLetter(fileType)}${i + 1}`\n const extension = \"pdf\"\n\n return path.join(\n process.cwd(),\n \"tests/shared\",\n fileType,\n `${fileName}.${extension}`,\n )\n })\n\n const fileChooser = await fileChooserPromise\n await fileChooser.setFiles(testUsedPaths)\n }\n\n if (artifacts.paste) {\n for (let i = 0; i < artifacts.paste; i++) {\n await simulatePaste(page, faker.lorem.sentence({ min: 550, max: 750 }))\n }\n }\n\n if ((artifacts.pdf || 0) + (artifacts.paste || 0) > 5) {\n await expect(page.getByText(\"Maximum 5 files allowed\")).toBeVisible()\n }\n\n const modalSaveButton = page.getByTestId(`${dataTestId}-modal-save-button`)\n await expect(modalSaveButton).toBeVisible()\n\n await modalSaveButton.click()\n\n expect(await page.getByText(\"Updated\").count()).toBeGreaterThan(0)\n }\n\n const getAgentModalButton = (agent: string) => {\n const agentModalButton = page.getByTestId(`agent-modal-button-${agent}`)\n return agentModalButton\n }\n\n for (const prompt of prompts) {\n const debateAgentDeleteButton = page.getByTestId(\n \"debate-agent-delete-button\",\n )\n const isDebateAgentVisible = await debateAgentDeleteButton.isVisible()\n\n if (isDebateAgentVisible) {\n await debateAgentDeleteButton.click()\n }\n if (prompt.model && prompt.model !== (await getAgentName())) {\n await agentSelectButton.click()\n\n await expect(agentModal).toBeVisible()\n\n const agentModalButton = getAgentModalButton(prompt.model)\n\n await agentModalButton.click()\n\n if (prompt.model === \"gemini\") {\n const agentModalCloseButton = page.getByTestId(\n \"agent-modal-close-button\",\n )\n\n await expect(agentModalCloseButton).toBeVisible()\n await agentModalCloseButton.click()\n expect(await getAgentName()).toBe(isMember ? \"chatGPT\" : \"flux\")\n } else {\n if (!isMember) {\n if (![\"flux\", \"deepSeek\", \"gemini\"].includes(prompt.model)) {\n await expect(signInModal).toBeVisible()\n const signInModalCloseButton = page.getByTestId(\n \"sign-in-modal-close-button\",\n )\n await expect(signInModalCloseButton).toBeVisible()\n await signInModalCloseButton.click()\n\n expect(await getAgentName()).toBe(\"deepSeek\")\n }\n } else {\n expect(await getAgentName()).toBe(prompt.model)\n }\n }\n }\n\n if (prompt.debateAgent) {\n {\n await addDebateAgentButton.click()\n\n await expect(agentModal).toBeVisible()\n\n const geminiButton = page.getByTestId(`agent-modal-button-gemini`)\n\n const fluxButton = page.getByTestId(`agent-modal-button-flux`)\n\n expect(geminiButton).not.toBeVisible()\n expect(fluxButton).not.toBeVisible()\n\n const agentModalButton = page.getByTestId(\n `agent-modal-button-${prompt.debateAgent}`,\n )\n\n await agentModalButton.click()\n }\n if (!isMember) {\n expect(prompt.shouldFail).toBe(true)\n willFail = true\n } else {\n expect(await getDebateAgentName()).toBe(prompt.debateAgent)\n await addDebateAgentButton.click()\n\n await expect(getAgentModalButton(prompt.debateAgent)).not.toBeVisible()\n\n const agentModalCloseButton = page.getByTestId(\n \"agent-modal-close-button\",\n )\n\n await expect(agentModalCloseButton).toBeVisible()\n await agentModalCloseButton.click()\n\n await agentSelectButton.click()\n await expect(agentModal).toBeVisible()\n\n const fluxButton = getAgentModalButton(\"flux\")\n await expect(fluxButton).toBeVisible()\n await fluxButton.click()\n await wait(1000)\n\n await expect(addDebateAgentButton).not.toBeVisible()\n\n await agentSelectButton.click()\n\n const promptAgentModalButton = page.getByTestId(\n `agent-modal-button-${prompt.model}`,\n )\n\n await promptAgentModalButton.click()\n\n expect(await getAgentName()).toBe(prompt.model)\n await addDebateAgentButton.click()\n await expect(addDebateAgentButton).toBeVisible()\n\n await getAgentModalButton(prompt.debateAgent).click()\n expect(await getDebateAgentName()).toBe(prompt.debateAgent)\n expect(await getAgentName()).toBe(prompt.model)\n }\n }\n\n if (willFail) {\n return\n }\n\n const attachButton = page.getByTestId(\"attach-button\")\n const attachButtonClose = page.getByTestId(\"attach-button-close\")\n const attachButtonImage = page.getByTestId(\"attach-button-image\")\n const attachButtonVideo = page.getByTestId(\"attach-button-video\")\n const attachButtonAudio = page.getByTestId(\"attach-button-audio\")\n const attachButtonPdf = page.getByTestId(\"attach-button-pdf\")\n\n if (prompt.image) {\n for (let i = 0; i < prompt.image; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n await attachButtonImage.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/image/testImage${i + 1}.jpeg`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.image > 3 ? 3 : prompt.image\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonImage).toBeVisible()\n await attachButtonImage.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.image }, (_, i) =>\n path.join(\n process.cwd(),\n \"tests/shared/image\",\n `testImage${i + 1}.jpeg`,\n ),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.image > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.audio) {\n for (let i = 0; i < prompt.audio; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n await attachButtonAudio.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/audio/testAudio${i + 1}.wav`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.audio > 3 ? 3 : prompt.audio\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonAudio).toBeVisible()\n await attachButtonAudio.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.audio }, (_, i) =>\n path.join(process.cwd(), \"tests/shared/audio\", `testAudio${i + 1}.wav`),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.audio > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.video) {\n for (let i = 0; i < prompt.video; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n await attachButtonAudio.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/video/testVideo${i + 1}.webm`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.video > 3 ? 3 : prompt.video\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonAudio).toBeVisible()\n await attachButtonAudio.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.video }, (_, i) =>\n path.join(\n process.cwd(),\n \"tests/shared/video\",\n `testVideo${i + 1}.webm`,\n ),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.video > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.pdf) {\n for (let i = 0; i < prompt.pdf; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n await attachButtonPdf.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/pdf/testPdf${i + 1}.pdf`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.pdf > 3 ? 3 : prompt.pdf\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonPdf).toBeVisible()\n await attachButtonPdf.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.pdf }, (_, i) =>\n path.join(process.cwd(), \"tests/shared/pdf\", `testPdf${i + 1}.pdf`),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.pdf > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.paste) {\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.paste > 3 ? 3 : prompt.paste\n\n for (let i = 0; i < prompt.paste; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n await page.waitForTimeout(1000)\n }\n\n if (prompt.paste > 3) {\n await expect(page.getByText(\"Too many files\")).toBeVisible()\n }\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n for (let i = 0; i < count; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n }\n } else if (prompt.mix) {\n const fileExtensions = {\n image: \"jpeg\",\n video: \"mp4\",\n audio: \"wav\",\n pdf: \"pdf\",\n }\n\n const size = Object.values(prompt.mix).reduce((a, b) => a + b)\n const to = size > 3 ? 3 : size\n\n // Create array of individual files to attach\n let filesToAttach: string[] = []\n let filesToPaste = 0\n\n for (const [key, count] of Object.entries(prompt.mix)) {\n if (key === \"paste\") {\n filesToPaste = count\n } else {\n // Add multiple files of same type\n for (let i = 0; i < count; i++) {\n filesToAttach.push(key)\n }\n }\n }\n\n // Limit to max 3 total files\n filesToAttach = filesToAttach.slice(0, 3 - filesToPaste)\n\n for (let i = 0; i < filesToPaste; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n await page.waitForTimeout(1000)\n }\n\n for (let i = 0; i < filesToAttach.length; i++) {\n const key = filesToAttach[i]\n if (!key) break\n\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n if (i > to) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n if (key === \"audio\") {\n await expect(attachButtonAudio).toBeVisible()\n await attachButtonAudio.click()\n } else if (key === \"image\") {\n await expect(attachButtonImage).toBeVisible()\n await attachButtonImage.click()\n } else if (key === \"video\") {\n await expect(attachButtonVideo).toBeVisible()\n await attachButtonVideo.click()\n } else if (key === \"pdf\") {\n await expect(attachButtonPdf).toBeVisible()\n await attachButtonPdf.click()\n }\n\n {\n const fileChooser = await fileChooserPromise\n\n const extension =\n fileExtensions[key as keyof typeof fileExtensions] || \"jpeg\"\n\n const fileIndex = filesToAttach\n .slice(0, i + 1)\n .filter((k) => k === key).length\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/${key}/test${capitalizeFirstLetter(key)}${fileIndex}.${extension}`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n for (let i = 0; i < to; i++) {\n const filePreviewClear = filePreviewClears.nth(0)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n for (let i = 0; i < filesToPaste; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n await page.waitForTimeout(1000)\n }\n\n if (filesToAttach.length > 0) {\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n const key = filesToAttach[0]\n\n if (key === \"image\") {\n await attachButtonImage.click()\n } else if (key === \"video\") {\n await attachButtonVideo.click()\n } else if (key === \"audio\") {\n await attachButtonAudio.click()\n } else if (key === \"pdf\") {\n await attachButtonPdf.click()\n }\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = await Promise.all(\n Array.from({ length: filesToAttach.length }, async (_, i) => {\n // Determine file type based on prompt.mix configuration\n const fileType = filesToAttach[i]\n\n if (!fileType) {\n return null\n }\n\n const fileName = `test${capitalizeFirstLetter(fileType)}${i + 1}`\n const extension =\n fileExtensions[fileType as keyof typeof fileExtensions] || \"jpeg\"\n\n return path.join(\n process.cwd(),\n \"tests/shared\",\n fileType,\n `${fileName}.${extension}`,\n )\n }),\n )\n\n await fileChooser.setFiles(\n testUsedPaths.filter((path): path is string => path !== null),\n )\n\n if (filesToAttach.length + filesToPaste > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n }\n }\n\n await chatTextarea.fill(prompt.text)\n\n if (prompt.webSearch) {\n const webSearchButton = page.getByTestId(\"web-search-button-disabled\")\n await expect(webSearchButton).toBeVisible()\n\n await webSearchButton.click()\n\n if (!isMember) {\n await expect(agentModal).toBeVisible()\n\n const agentModalCloseButton = page.getByTestId(\n \"agent-modal-close-button\",\n )\n\n await expect(agentModalCloseButton).toBeVisible()\n await agentModalCloseButton.click()\n }\n }\n\n const sendButton = page.getByTestId(\"chat-send-button\")\n await expect(sendButton).toBeVisible()\n\n // Handle shouldFail case - test hourly limit boundary\n if (prompt.shouldFail) {\n console.log(\n `🚫 Testing hourly limit boundary with message: \"${prompt.text}\"`,\n )\n\n await expect(sendButton).toBeDisabled()\n\n // Exit the loop since we've tested the limit\n break\n }\n\n await scrollToBottom() // Ensure send button is visible\n await sendButton.click()\n\n if (prompts.indexOf(prompt) === 0 && artifacts) {\n await expect(page.getByText(\"Uploading artifacts...\")).toBeVisible()\n }\n\n await page.waitForTimeout(5000)\n\n const stopButton = page.getByTestId(\"chat-stop-streaming-button\")\n await expect(stopButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const getLastMessage = async () => {\n // Wait for either user or guest messages to appear\n await page.waitForFunction(\n () => {\n const userMessages = document.querySelectorAll(\n '[data-testid=\"user-message\"]',\n )\n const guestMessages = document.querySelectorAll(\n '[data-testid=\"guest-message\"]',\n )\n console.log(\n `Debug: Found ${userMessages.length} user messages, ${guestMessages.length} guest messages`,\n )\n return userMessages.length > 0 || guestMessages.length > 0\n },\n { timeout: 10000 },\n )\n\n // Try both user and guest message types since the test ID depends on actual user context\n const userMessages = page.getByTestId(\"user-message\")\n const guestMessages = page.getByTestId(\"guest-message\")\n\n const userCount = await userMessages.count()\n const guestCount = await guestMessages.count()\n\n console.log(\n `Debug: After wait - ${userCount} user messages, ${guestCount} guest messages`,\n )\n\n if (userCount > 0) {\n console.log(`Debug: Using user message (${userCount} found)`)\n return userMessages.nth(userCount - 1)\n } else if (guestCount > 0) {\n console.log(`Debug: Using guest message (${guestCount} found)`)\n return guestMessages.nth(guestCount - 1)\n } else {\n throw new Error(\"No user or guest messages found after waiting\")\n }\n }\n\n await expect(await getLastMessage()).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const lastMessage = await getLastMessage()\n console.log(`Debug: Got last message, looking for delete button...`)\n\n if (prompt.stop) {\n await stopButton.click()\n await expect(stopButton).not.toBeVisible({\n timeout: 8000,\n })\n\n prompt.model && (credits -= getModelCredits(prompt.model))\n } else {\n hourlyUsage += 1 + (prompt.debateAgent ? 1 : 0)\n }\n // Check if delete button exists\n const deleteMessageButton = lastMessage.locator(\n \"[data-testid=delete-message]\",\n )\n const deleteButtonCount = await deleteMessageButton.count()\n console.log(\n `Debug: Found ${deleteButtonCount} delete buttons in last message`,\n )\n\n // // Get the message text directly from the element with the expected text\n const userMessageContent = (await getLastMessage()).getByText(prompt.text)\n await expect(userMessageContent).toBeVisible({\n timeout: agentMessageTimeout,\n })\n // Get all agent messages and wait for the last one to be visible\n\n const getLastAgentMessage = async () => {\n const agentMessages = page.getByTestId(\"agent-message\")\n const messageCount = await agentMessages.count()\n return agentMessages.nth(messageCount - 1)\n }\n\n const getLastUserMessage = async () => {\n const userMessages = page.getByTestId(\n `${isMember ? \"user\" : \"guest\"}-message`,\n )\n const messageCount = await userMessages.count()\n return userMessages.nth(messageCount - 1)\n }\n\n // Wait for the last message to be visible and have content\n await expect(await getLastAgentMessage()).toBeVisible()\n // await expect(\n // lastAgentMessage.locator(\"[data-testid=markdown-paragraph]\"),\n // ).toBeVisible({\n // timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n // })\n\n const deleteAgentMessageButton = (await getLastAgentMessage()).locator(\n \"[data-testid=delete-message]\",\n )\n await expect(deleteAgentMessageButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n visible: !prompt.stop,\n })\n\n if (prompt.image) {\n const userMessageImageCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-image\")\n .count()\n\n expect(userMessageImageCount).toBe(prompt.image > 3 ? 3 : prompt.image)\n } else if (prompt.mix?.image) {\n const userMessageImageCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-image\")\n .count()\n\n expect(userMessageImageCount).toBe(\n prompt.mix.image > 3 ? 3 : prompt.mix.image,\n )\n } else if (prompt.video) {\n const userMessageVideoCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-video\")\n .count()\n\n expect(userMessageVideoCount).toBe(prompt.video > 3 ? 3 : prompt.video)\n } else if (prompt.mix?.video) {\n const userMessageVideoCount = (await getLastUserMessage())\n .getByTestId(\"user-message-video\")\n .count()\n\n expect(userMessageVideoCount).toBe(\n prompt.mix.video > 3 ? 3 : prompt.mix.video,\n )\n } else if (prompt.audio) {\n const userMessageAudioCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-audio\")\n .count()\n\n expect(userMessageAudioCount).toBe(prompt.audio > 3 ? 3 : prompt.audio)\n } else if (prompt.mix?.audio) {\n const userMessageAudioCount = (await getLastUserMessage())\n .getByTestId(\"user-message-audio\")\n .count()\n\n expect(userMessageAudioCount).toBe(\n prompt.mix.audio > 3 ? 3 : prompt.mix.audio,\n )\n } else if (prompt.pdf) {\n const userMessagePdfCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-pdf\")\n .count()\n\n expect(userMessagePdfCount).toBe(prompt.pdf > 3 ? 3 : prompt.pdf)\n } else if (prompt.mix?.pdf) {\n const userMessagePdfCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-pdf\")\n .count()\n\n expect(userMessagePdfCount).toBe(prompt.mix.pdf > 3 ? 3 : prompt.mix.pdf)\n }\n\n if (prompt.webSearch) {\n const webSearchResults = (await getLastAgentMessage()).getByTestId(\n \"web-search-results\",\n )\n await expect(webSearchResults).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const webSearchResult = webSearchResults.getByTestId(\"web-search-result\")\n expect(await webSearchResult.count()).toBe(4)\n }\n\n await wait(1000)\n\n const threadUrl = page.url()\n const threadId = threadUrl.split(\"/threads/\")[1]?.split(\"?\")[0]\n expect(threadId).toBeTruthy()\n console.log(\"Thread:\", threadId)\n\n const likeButton = (await getLastAgentMessage()).locator(\n \"[data-testid=like-button]\",\n )\n\n if (prompts.indexOf(prompt) === 0 && artifacts) {\n const dataTestId = threadId ? \"chat\" : \"instruction\"\n let artifactsButton = page.getByTestId(\n `${dataTestId}-instruction-artifacts-button`,\n )\n await artifactsButton.click()\n\n const instructionModal = page.getByTestId(\n `${dataTestId}-instruction-modal`,\n )\n\n await expect(instructionModal).toBeVisible()\n\n const filePreviewClears = page.getByTestId(\n `${dataTestId}-instruction-file-preview-clear`,\n )\n\n let count = (artifacts.pdf || 0) + (artifacts.paste || 0)\n\n if (count > 5) {\n count = 5\n }\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(1000)\n }\n\n expect(await filePreviewClears.count()).toBe(0)\n\n if (artifacts.paste) {\n for (let i = 0; i < artifacts.paste; i++) {\n await simulatePaste(\n page,\n faker.lorem.sentence({ min: 550, max: 750 }),\n )\n }\n }\n\n if (artifacts.pdf) {\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n await page\n .getByTestId(`${dataTestId}-instruction-artifacts-upload-button`)\n .click()\n const testUsedPaths = Array.from({ length: artifacts.pdf }, (_, i) => {\n const fileType = \"pdf\"\n const fileName = `test${capitalizeFirstLetter(fileType)}${i + 1}`\n const extension = \"pdf\"\n\n return path.join(\n process.cwd(),\n \"tests/shared\",\n fileType,\n `${fileName}.${extension}`,\n )\n })\n\n const fileChooser = await fileChooserPromise\n await fileChooser.setFiles(testUsedPaths)\n }\n\n if ((artifacts.pdf || 0) + (artifacts.paste || 0) > 5) {\n await expect(page.getByText(\"Maximum 5 files allowed\")).toBeVisible()\n }\n\n const modalSaveButton = page.getByTestId(\n `${dataTestId}-instruction-modal-save-button`,\n )\n await expect(modalSaveButton).toBeVisible()\n\n await modalSaveButton.click()\n\n await wait(10000)\n\n const modalCloseButton = page.getByTestId(\n `${dataTestId}-instruction-modal-close-button`,\n )\n await expect(modalCloseButton).toBeVisible()\n\n await modalCloseButton.click()\n }\n\n if (!prompt.stop) {\n await expect(likeButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n const dislikeButton = (await getLastAgentMessage()).locator(\n \"[data-testid=dislike-button]\",\n )\n\n await expect(dislikeButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const getFilterLikedButton = ({ liked }: { liked: boolean }) =>\n page.getByTestId(`${liked ? \"unfilter\" : \"filter\"}-liked-button`)\n await expect(getFilterLikedButton({ liked: false })).toBeVisible({\n timeout: 10000,\n })\n\n if (prompt.like) {\n await getFilterLikedButton({ liked: false }).click()\n\n await expect(await getLastAgentMessage()).not.toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: true }).click()\n\n await expect(await getLastAgentMessage()).toBeVisible({\n timeout: 8000,\n })\n\n await likeButton.click()\n await wait(4000)\n\n await getFilterLikedButton({ liked: false }).click()\n\n const unlikeButton = (await getLastAgentMessage()).locator(\n \"[data-testid=unlike-button]\",\n )\n\n await expect(unlikeButton).toBeVisible({\n timeout: 8000,\n })\n\n await unlikeButton.click()\n\n await expect(await getLastAgentMessage()).not.toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: true }).click()\n\n await expect(await getLastAgentMessage()).toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: false }).click()\n\n await expect(await getLastAgentMessage()).not.toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: true }).click()\n await wait(4000)\n }\n // // Verify delete button is visible\n\n if (prompt.model) {\n credits -= getModelCredits(prompt.model)\n\n if (prompt.debateAgent) {\n credits -= getModelCredits(prompt.debateAgent)\n }\n }\n\n // Increment hourly usage counter\n\n // Check if hourly limit info should be visible based on actual component logic\n // Component shows hourly limit when: hourlyUsageLeft < (selectedAgent?.creditCost || 0) * 3\n const hourlyLimitInfo = page.getByTestId(\"hourly-limit-info\")\n\n // await expect(hourlyLimitInfo).toBeVisible({\n // visible: 30 - hourlyUsage <= 10,\n // })\n // Try to get the hourly limit info visibility state from the DOM\n\n if (hourlyLimit - hourlyUsage === 0) {\n willFail = true\n return\n }\n\n const hourlyUsageLeft = await getHourlyUsageLeft()\n expect(hourlyUsageLeft).toBe((hourlyLimit - hourlyUsage).toString())\n\n // Assert appropriate values based on what's visible\n\n // When credits are shown, assert the credits left value\n const creditsLeft = await getCreditsLeft()\n if (creditsLeft !== null) {\n expect(creditsLeft).toBe(credits.toString())\n console.log(\n `✅ Credits assertion: ${creditsLeft} left (expected: ${credits})`,\n )\n }\n\n if (prompt.model === \"flux\") {\n const imageGenerationButton = page.getByTestId(\n \"image-generation-button\",\n )\n\n // First click: Toggle off image generation\n await imageGenerationButton.click()\n\n // Wait for agent to change away from flux\n await expect.poll(getAgentName, { timeout: 5000 }).not.toBe(\"flux\")\n\n // Verify agent changed to expected default\n const expectedDefaultAgent = !isMember ? \"deepSeek\" : \"chatGPT\"\n expect(await getAgentName()).toBe(expectedDefaultAgent)\n\n // Second click: Toggle image generation back on\n await imageGenerationButton.click()\n\n // Wait for agent to change back to flux\n await expect.poll(getAgentName, { timeout: 5000 }).toBe(\"flux\")\n await imageGenerationButton.click()\n await page.waitForTimeout(2000)\n expect(await getAgentName()).toBe(!isMember ? \"deepSeek\" : \"chatGPT\")\n }\n }\n\n if (prompt.delete) {\n await deleteMessageButton.click()\n await wait(200)\n await deleteMessageButton.click()\n await wait(4000)\n await expect(deleteMessageButton).not.toBeVisible()\n }\n }\n\n const getNthMenuThread = async (nth: number) => {\n const threads = page.getByTestId(\"menu-thread-item\")\n const threadCount = await threads.count()\n return threads.nth(nth)\n }\n const getFirstMenuThread = async () => {\n return getNthMenuThread(0)\n }\n\n if (bookmark) {\n ;(await getFirstMenuThread()).hover()\n\n const bookmarkButton = page.getByTestId(\"thread-not-bookmarked\")\n await expect(bookmarkButton).toBeVisible()\n\n await bookmarkButton.click()\n\n const menuBookmarked = page.getByTestId(\"menu-bookmarked\")\n await expect(menuBookmarked).toBeVisible({\n timeout: 10000,\n })\n\n await menuBookmarked.click()\n\n const threadNotBookmarked = page.getByTestId(\"thread-not-bookmarked\")\n await expect(threadNotBookmarked).toBeVisible({\n timeout: 10000,\n })\n ;(await getFirstMenuThread()).hover()\n const menuNotBookmarked = page.getByTestId(\"menu-not-bookmarked\")\n await expect(menuNotBookmarked).toBeVisible()\n\n await threadNotBookmarked.click()\n await wait(2000)\n }\n\n if (isNewChat) {\n await page.getByTestId(\"new-chat-button\").click()\n await wait(5000)\n\n await expect(\n isMember\n ? page.getByTestId(\"user-message\")\n : page.getByTestId(\"guest-message\"),\n ).not.toBeVisible({\n timeout: 5000,\n })\n\n // page.close()\n }\n}\n","import { expect, Page, test } from \"@playwright/test\"\nimport { wait } from \"./utils\"\n\nexport const signIn = async ({\n page,\n isOpened = false,\n signOut = false,\n register = false,\n email = process.env.VEX_TEST_EMAIL_2!,\n password = process.env.VEX_TEST_PASSWORD_2!,\n}: {\n page: Page\n isOpened?: boolean\n signOut?: boolean\n register?: boolean\n email?: string\n password?: string\n}) => {\n const signInButton = page.getByTestId(\"login-button\")\n\n if (!isOpened) {\n await expect(signInButton).toBeVisible({\n timeout: 15000,\n })\n await signInButton.click()\n }\n\n const isExtension = page.url().includes(\"extension\")\n\n const modal = page.getByTestId(\"sign-in-modal\")\n await expect(modal).toBeVisible()\n\n const emailInput = page.getByTestId(\"sign-in-email\")\n await expect(emailInput).toBeVisible()\n\n await emailInput.fill(email)\n\n const passwordInput = page.getByTestId(\"sign-in-password\")\n await expect(passwordInput).toBeVisible()\n\n await passwordInput.fill(password)\n\n await wait(2000)\n\n const signInSubmit = page.getByTestId(\"login-submit\")\n await expect(signInSubmit).toBeVisible()\n\n await signInSubmit.click({\n force: true,\n })\n\n if (!!process.env.CI) {\n // Wait for the redirect URL attribute to be set\n await page.waitForFunction(\n () => {\n const submitButton = document.querySelector(\n '[data-testid=\"login-submit\"]',\n )\n return submitButton && submitButton.hasAttribute(\"data-redirect-url\")\n },\n { timeout: 15000 },\n )\n\n const redirectUrl = await signInSubmit.getAttribute(\"data-redirect-url\")\n\n if (!redirectUrl) {\n throw new Error(\"Redirect URL not found\")\n }\n await page.goto(redirectUrl)\n }\n\n await wait(4000)\n\n await expect(signInButton).not.toBeVisible()\n\n const accountButton = page.getByTestId(\"account-button\")\n await expect(accountButton).toBeVisible()\n\n if (signOut) {\n await accountButton.click()\n\n const email = page.getByTestId(\"account-email\")\n await expect(email).toBeVisible()\n\n const logoutButton = page.getByTestId(\"account-logout-button\")\n await expect(logoutButton).toBeVisible()\n\n await logoutButton.click()\n\n await expect(signInButton).toBeVisible({\n timeout: 15000,\n })\n }\n}\n","import { Browser, expect, test, Page } from \"@playwright/test\"\nimport { getURL, wait } from \"./utils\"\nimport { chat } from \"./chat\"\nimport { signIn } from \"./signIn\"\n\nexport async function collaboration({\n page,\n isLive = false,\n isMember = false,\n browser,\n withShareLink = true,\n fingerprint,\n collaborate = \"feedbackwallet@gmail.com\",\n}: {\n page: Page\n isLive?: boolean\n isMember?: boolean\n browser: Browser\n withShareLink?: boolean\n collaborate?: string\n fingerprint?: string\n}) {\n const TEST_URL = getURL({\n fingerprint,\n isLive,\n isMember,\n })\n\n const getMemberUrl = (path?: string) =>\n getURL({\n isLive,\n isMember: true,\n path,\n })\n\n // Create two separate browser contexts (simulating two different users)\n const context1 = await browser.newContext()\n\n const page1 = page\n\n // User 1: Create a new thread and get the thread ID\n await page1.goto(TEST_URL, { waitUntil: \"networkidle\" })\n\n // Send first message to create thread\n\n await chat({\n bookmark: false,\n page: page1,\n isNewChat: false,\n isMember,\n instruction: \"Let's plan a trip together\",\n prompts: [\n {\n text: \"I want to visit Japan. What should I know?\",\n model: \"deepSeek\",\n },\n ],\n })\n\n // Get the thread ID from URL\n await page1.waitForTimeout(2000) // Wait for navigation\n const threadUrl = page1.url()\n const threadId = threadUrl.split(\"/threads/\")[1]?.split(\"?\")[0]\n\n expect(threadId).toBeTruthy()\n console.log(\"Thread:\", threadId)\n\n // User 1: Share the thread (make it public or get collaboration link)\n const threadShareButton = page1.getByTestId(\"thread-share-button\")\n expect(threadShareButton).toBeVisible()\n // User 1: Share the thread (make it public or get collaboration link)\n const chatShareButton = page1.getByTestId(\"chat-share-button\")\n await chatShareButton.click()\n await wait(1000)\n\n const chatCollaborateButton = page1.getByTestId(\"chat-collaborate-button\")\n expect(chatCollaborateButton).toBeVisible()\n await chatCollaborateButton.click()\n await wait(1000)\n\n const shareInput = page1.getByTestId(\"chat-share-input\")\n await expect(shareInput).toHaveValue(threadUrl)\n const shareCopyButton = page1.getByTestId(\"chat-share-copy-button\")\n expect(shareCopyButton).toBeVisible()\n await shareCopyButton.click()\n await wait(1000)\n\n const collaborateInput = page1.getByTestId(\"chat-collaborate-input\")\n expect(collaborateInput).toBeVisible()\n\n await collaborateInput.fill(\"iliyan@chrry.ai\")\n\n const collaborateAddButton = page1.getByTestId(\"chat-collaborate-add-button\")\n await collaborateAddButton.click()\n\n const collaborateName = page1.getByTestId(\"chat-collaborator-name\")\n await expect(collaborateName).toBeVisible({\n timeout: 8000,\n })\n\n const collaborateEmail = page1.getByTestId(\"chat-collaborator-email\")\n await expect(collaborateEmail).toBeVisible()\n\n const collaborateStatus = page1.getByTestId(\"chat-collaborator-status\")\n await expect(collaborateStatus).toHaveText(\"pending\")\n\n const collaboratorRevokeButton = page1.getByTestId(\n \"chat-collaborator-revoke-button\",\n )\n\n await expect(collaboratorRevokeButton).toBeVisible()\n await collaboratorRevokeButton.click()\n await wait(1000)\n await collaboratorRevokeButton.click()\n await wait(1000)\n await expect(collaborateName).not.toBeVisible({\n timeout: 8000,\n })\n await expect(collaborateEmail).not.toBeVisible()\n\n await collaborateInput.fill(collaborate)\n\n await collaborateAddButton.click()\n await expect(collaborateName).toBeVisible({\n timeout: 8000,\n })\n await expect(collaborateEmail).toBeVisible()\n await expect(collaborateStatus).toHaveText(\"pending\")\n\n await page1.getByTestId(\"chat-share-modal-close-button\").click()\n await wait(1000)\n const chatInput1 = page1.getByTestId(\"chat-textarea\")\n\n const context2 = await browser.newContext()\n const page2 = await context2.newPage()\n\n await page2.goto(getMemberUrl(), {\n waitUntil: \"networkidle\",\n })\n\n await signIn({ page: page2 })\n\n // User 2: Join the same thread\n await page2.goto(\n withShareLink ? `${getMemberUrl(`/threads/${threadId}`)}` : getMemberUrl(),\n {\n waitUntil: \"networkidle\",\n },\n )\n\n // Verify both users can see the thread\n const chatInput2 = page2.getByTestId(\"chat-textarea\")\n // User 2: Send a message\n await expect(chatInput2).toBeDisabled()\n\n const acceptCollaborationButton = page2.getByTestId(\n \"chat-accept-collaboration\",\n )\n\n expect(acceptCollaborationButton).toBeVisible()\n\n const rejectCollaborationButton = page2.getByTestId(\n \"chat-reject-collaboration\",\n )\n\n expect(rejectCollaborationButton).toBeVisible()\n\n await acceptCollaborationButton.click()\n\n await expect(chatInput2).toBeEnabled({\n timeout: 8000,\n })\n\n await chat({\n page: page2,\n isNewChat: false,\n threadId: threadId,\n isMember: true, // Member user (signed in)\n prompts: [\n {\n text: \"I've been to Tokyo before! The cherry blossoms are amazing in spring.\",\n model: \"deepSeek\",\n },\n ],\n })\n\n await page1.bringToFront()\n\n // User 1: Verify they can see User 2's message\n await page1.waitForTimeout(3000) // Wait for real-time sync\n const messages1 = page1.getByTestId(\"message\")\n const count1 = await messages1.count()\n expect(count1).toBeGreaterThanOrEqual(3) // Original + AI response + User 2's message\n\n // User 1: Send another message\n await chat({\n page: page1,\n isNewChat: false,\n threadId: threadId,\n isMember,\n creditsConsumed: 1,\n prompts: [\n {\n text: \"That's great! When is the best time to see cherry blossoms?\",\n model: \"deepSeek\",\n },\n ],\n })\n\n await page2.bringToFront()\n // User 2: Verify they can see User 1's new message\n await page2.waitForTimeout(3000) // Wait for real-time sync\n const messages2 = page2.getByTestId(\"message\")\n const count2 = await messages2.count()\n expect(count2).toBeGreaterThanOrEqual(5) // All previous + User 1's new message\n\n // Test typing indicators (if implemented)\n\n await page1.bringToFront()\n\n // User 1 starts typing\n await chatInput1.click()\n await chatInput1.fill(\"I'm typing...\")\n\n // User 2 should see typing indicator\n await page2.bringToFront()\n await page2.waitForTimeout(2000)\n\n expect(\n await page2.getByTestId(\"typing-indicator\").count(),\n ).toBeGreaterThanOrEqual(1)\n\n await page2.waitForTimeout(5000)\n expect(await page2.getByTestId(\"typing-indicator\").count()).toBe(0)\n\n await chatInput2.click()\n await chatInput2.fill(\"I'm typing too...\")\n\n await page1.bringToFront()\n await page1.waitForTimeout(2000)\n expect(\n await page1.getByTestId(\"typing-indicator\").count(),\n ).toBeGreaterThanOrEqual(1)\n await page1.waitForTimeout(3000)\n expect(await page1.getByTestId(\"typing-indicator\").count()).toBe(0)\n // Clean up\n await context1.close()\n await context2.close()\n}\n","import { Page } from \"@playwright/test\"\nimport { chat, modelName } from \"./chat\"\nimport { faker } from \"@faker-js/faker\"\n\nexport const limit = async ({\n page,\n isMember,\n isSubscriber,\n}: {\n page: Page\n isMember?: boolean\n isSubscriber?: boolean\n}) => {\n // Calculate exact hourly limit for guest users\n const hourlyLimit = isSubscriber ? 100 : isMember ? 30 : 10 // guests: 10, members: 30, subscribers: 100\n\n console.log(\n `🎯 Testing hourly limit: ${hourlyLimit} requests for ${isMember ? \"member\" : \"guest\"}`,\n )\n\n // Create prompts to consume exactly the hourly limit with mixed models\n const limitPrompts = Array.from({ length: hourlyLimit }, (_, i) => {\n const isFluxMessage = i % (isMember ? 5 : 3) === 0 // Every 3rd message is Flux\n const isClaudeMessage = isMember && i % 5 === 0 // Every 5th message in last 3 requests\n const isChatGPTMessage = isMember && i % 3 === 0 // Every 6th message in last 3 requests\n\n const isWebSearch =\n (isClaudeMessage || isChatGPTMessage) && !isFluxMessage && i % 2 === 0 // Every 4th message in last 3 requests\n\n const like = isWebSearch || isFluxMessage ? true : false\n\n return {\n text: isFluxMessage\n ? `Create a beautiful ${faker.color.human()} ${faker.animal.type()} in a ${faker.location.city()} setting, digital art style`\n : i === hourlyLimit\n ? `Find latest news about ${faker.company.name()}`\n : `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: isFluxMessage\n ? (\"flux\" as modelName)\n : isClaudeMessage\n ? (\"claude\" as modelName)\n : isChatGPTMessage\n ? (\"chatGPT\" as modelName)\n : (\"deepSeek\" as modelName),\n agentMessageTimeout: isFluxMessage ? 60000 : 30000, // Flux needs more time\n webSearch: isWebSearch,\n shouldFail: i === hourlyLimit, // Only fail on last message\n like,\n }\n })\n\n // Add one extra prompt that should fail\n const failPrompt = {\n text: \"This message should fail due to hourly limit\",\n model: \"deepSeek\" as modelName,\n agentMessageTimeout: 30000,\n shouldFail: true, // Flag to indicate this should fail\n webSearch: true, // Test web search on the failing request too\n }\n\n await chat({\n isNewChat: true,\n page,\n isMember,\n instruction: `Testing hourly limit of ${hourlyLimit} requests`,\n prompts: [...limitPrompts, failPrompt],\n })\n}\n","import { expect, Page } from \"@playwright/test\"\nimport { signIn } from \"./signIn\"\nimport { wait } from \"./utils\"\nimport { chat } from \"./chat\"\nimport { faker } from \"@faker-js/faker\"\n\nexport const thread = async ({\n page,\n isMember,\n bookmark,\n createChat = true,\n}: {\n page: Page\n isMember?: boolean\n createChat?: boolean\n bookmark?: boolean\n}) => {\n createChat &&\n (await chat({\n bookmark,\n isNewChat: true,\n page,\n isMember,\n instruction: \"Help me write a short story\",\n prompts: Array.from({ length: 3 }, (_, i) => {\n return {\n text: `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: \"deepSeek\",\n agentMessageTimeout: 30000,\n }\n }),\n }))\n\n const getNthMenuThread = async (nth: number) => {\n const threads = page.getByTestId(\"menu-thread-item\")\n const threadCount = await threads.count()\n return threads.nth(nth)\n }\n const getFirstMenuThread = async () => {\n return getNthMenuThread(0)\n }\n\n const getNthThread = async (nth: number) => {\n const threads = page.getByTestId(\"threads-item\")\n const threadCount = await threads.count()\n return threads.nth(nth)\n }\n\n const getFirstThread = async () => {\n return getNthThread(0)\n }\n\n const getSecondThread = async () => {\n return getNthThread(1)\n }\n\n const threadsContainer = page.getByTestId(\"threads-container\")\n\n const loadMore = page.getByTestId(\"load-more-threads-menu\")\n\n if (createChat) {\n await expect(loadMore).toBeVisible()\n await loadMore.click()\n await wait(5000)\n }\n\n await expect(\n (await getFirstThread()).getByTestId(\"threads-bookmarked\"),\n ).toBeVisible({\n timeout: 15000,\n })\n\n await expect(\n (await getFirstThread()).getByTestId(\"threads-not-bookmarked\"),\n ).not.toBeVisible({\n timeout: 15000,\n })\n\n const threadsCount = page.getByTestId(\"threads-item\")\n const count = await threadsCount.count()\n\n createChat ? expect(count).toBe(1) : expect(count).toBe(2)\n\n await expect(threadsContainer).toBeVisible()\n\n const search = page.getByTestId(\"threads-search\")\n await expect(search).toBeVisible()\n\n const threadsCollaboration = page.getByTestId(\"threads-collaboration\")\n await expect(threadsCollaboration).toBeVisible()\n\n const threadsSortButtonDate = page.getByTestId(\"threads-sort-button-date\")\n await expect(threadsSortButtonDate).toBeVisible()\n\n await threadsSortButtonDate.click()\n\n const threadsSortButton = page.getByTestId(\"threads-sort-button-star\")\n await expect(threadsSortButton).toBeVisible()\n\n await threadsSortButton.click()\n\n const editThreadButton = (await getFirstThread()).getByTestId(\n \"edit-thread-button\",\n )\n\n await expect(editThreadButton).toBeVisible()\n\n await editThreadButton.click()\n\n const editThreadTextarea = page.getByTestId(\"edit-thread-textarea\")\n\n await editThreadTextarea.fill(\"New thread title\")\n\n const editThreadSaveButton = page.getByTestId(\"edit-thread-save-button\")\n\n await expect(editThreadSaveButton).toBeVisible()\n\n await editThreadSaveButton.click()\n\n const threadTitle = threadsContainer.getByText(\"New thread title\")\n\n await expect(threadTitle).toBeVisible()\n\n await editThreadButton.click()\n\n const editThreadGenerateTitleButton = page.getByTestId(\n \"edit-thread-generate-title-button\",\n )\n\n await expect(editThreadGenerateTitleButton).toBeVisible()\n\n await editThreadGenerateTitleButton.click()\n await wait(2000)\n await editThreadSaveButton.click()\n await wait(2000)\n\n await expect(threadTitle).not.toBeVisible()\n\n const threadTitleGenerated2 = (await getFirstThread()).getByTestId(\n \"threads-item-title\",\n )\n\n await expect(threadTitleGenerated2).toBeVisible()\n\n const newTitle = await threadTitleGenerated2.textContent()\n\n if (!newTitle) {\n throw new Error(\"Thread title not found\")\n }\n\n await editThreadButton.click()\n\n const deleteThreadButton = page.getByTestId(\"delete-thread-button\")\n\n await expect(deleteThreadButton).toBeVisible()\n\n await deleteThreadButton.click()\n\n await wait(1000)\n\n await deleteThreadButton.click()\n\n await wait(3000)\n\n await expect(threadsContainer).toBeVisible()\n\n await expect(page.getByText(newTitle)).not.toBeVisible()\n\n if (createChat) {\n await chat({\n isNewChat: true,\n page,\n isMember,\n instruction: \"Help me write a short story\",\n bookmark,\n prompts: Array.from({ length: 3 }, (_, i) => {\n return {\n text: `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: \"deepSeek\",\n agentMessageTimeout: 30000,\n }\n }),\n })\n\n const menuHomeButton = page.getByTestId(\"menu-home-button\")\n\n await expect(menuHomeButton).toBeVisible()\n\n await menuHomeButton.click()\n\n await wait(3000)\n\n await chat({\n isNewChat: false,\n creditsConsumed: 3,\n bookmark: false,\n page,\n isMember,\n instruction: \"Help me write a short story\",\n prompts: Array.from({ length: 3 }, (_, i) => {\n return {\n text: `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: \"deepSeek\",\n agentMessageTimeout: 30000,\n }\n }),\n })\n\n await loadMore.click()\n await wait(1000)\n\n await expect(\n (await getFirstThread()).getByTestId(\"threads-bookmarked\"),\n ).not.toBeVisible()\n\n await (await getFirstThread()).getByTestId(\"threads-not-bookmarked\").click()\n await wait(1000)\n\n await expect(\n (await getSecondThread()).getByTestId(\"threads-bookmarked\"),\n ).toBeVisible()\n\n await expect(\n (await getSecondThread()).getByTestId(\"threads-not-bookmarked\"),\n ).not.toBeVisible()\n\n await thread({\n page,\n isMember,\n createChat: false,\n })\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/chat.ts","../src/signIn.ts","../src/collaboration.ts","../src/limit.ts","../src/thread.ts"],"names":["dotenv","path","expect","creditsInfo","thread","process","faker","fileChooserPromise","fileChooser","userMessages","guestMessages","threadId","artifactsButton","instructionModal","email","TEST_URL"],"mappings":"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","file":"index.js","sourcesContent":["import * as dotenv from \"dotenv\"\nimport { Page } from \"@playwright/test\"\n\nexport const TEST_GUEST_FINGERPRINTS = [\"EDIT\"]\nexport const TEST_MEMBER_FINGERPRINTS = [\"EDIT\"]\nexport const TEST_MEMBER_EMAILS = [\"EDIT\"]\n\nexport const VEX_TEST_EMAIL = process.env.VEX_TEST_EMAIL_1!\nexport const VEX_TEST_PASSWORD = process.env.VEX_TEST_PASSWORD_1!\nexport const VEX_TEST_FINGERPRINT = TEST_MEMBER_FINGERPRINTS[0]\nexport const VEX_TEST_EMAIL_2 = process.env.VEX_TEST_EMAIL_2!\nexport const VEX_TEST_PASSWORD_2 = process.env.VEX_TEST_PASSWORD_2!\nexport const VEX_TEST_FINGERPRINT_2 = TEST_MEMBER_FINGERPRINTS[1]\nexport const VEX_TEST_EMAIL_3 = process.env.VEX_TEST_EMAIL_3!\nexport const VEX_TEST_PASSWORD_3 = process.env.VEX_TEST_PASSWORD_3!\nexport const VEX_TEST_FINGERPRINT_3 = TEST_MEMBER_FINGERPRINTS[2]\n\ndotenv.config()\n\nexport const TEST_URL = process.env.TEST_URL!\nexport const LIVE_URL = \"https://chrry.ai\"\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\nexport const isCI = process.env.NEXT_PUBLIC_CI || process.env.CI\n\nconst getURL = (\n {\n isLive = false,\n isMember = false,\n path = \"\",\n fingerprint = \"\",\n }: {\n isLive: boolean\n isMember?: boolean\n path?: string\n fingerprint?: string\n } = {\n isLive: false,\n isMember: false,\n path: \"\",\n fingerprint: \"\",\n },\n) => {\n const base = isLive ? LIVE_URL : TEST_URL\n return isMember\n ? `${base}${path}?fp=${fingerprint || TEST_MEMBER_FINGERPRINTS[0]}`\n : `${base}${path}?fp=${fingerprint || TEST_GUEST_FINGERPRINTS[0]}`\n}\n\nconst simulateInputPaste = async (page: Page, text: string) => {\n await page.evaluate((content: string) => {\n const textarea = document.querySelector(\n 'textarea[data-testid=\"chat-textarea\"]',\n ) as HTMLTextAreaElement\n if (!textarea) return\n\n // Create a basic event\n const pasteEvent = new Event(\"paste\", {\n bubbles: true,\n cancelable: true,\n })\n\n // Add clipboardData getter\n Object.defineProperty(pasteEvent, \"clipboardData\", {\n value: {\n getData: () => content,\n types: [\"text/plain\"],\n files: [],\n items: [\n {\n kind: \"string\",\n type: \"text/plain\",\n getAsString: (callback: (text: string) => void) =>\n callback(content),\n },\n ],\n },\n writable: false,\n })\n\n // Dispatch the event\n textarea.dispatchEvent(pasteEvent)\n\n // Set the value directly after the paste event\n textarea.value = content\n\n // Trigger input event to simulate actual typing\n const inputEvent = new Event(\"input\", { bubbles: true })\n textarea.dispatchEvent(inputEvent)\n }, text)\n}\nconst simulatePaste = async (page: Page, text: string) => {\n // Use Playwright's built-in clipboard API\n await page.evaluate(async (content: string) => {\n // Write to clipboard\n await navigator.clipboard.writeText(content)\n\n // Find the paste button and click it\n const pasteButton = document.querySelector(\n '[data-testid*=\"artifacts-paste-button\"]',\n ) as HTMLButtonElement\n if (pasteButton) {\n pasteButton.click()\n }\n }, text)\n}\n\nfunction capitalizeFirstLetter(val: string) {\n return String(val).charAt(0).toUpperCase() + String(val).slice(1)\n}\n\nexport {\n wait,\n getURL,\n simulateInputPaste,\n simulatePaste,\n capitalizeFirstLetter,\n}\n","import { expect, Page } from \"@playwright/test\"\n// Re-export modelName type for convenience\nexport type modelName = \"chatGPT\" | \"claude\" | \"deepSeek\" | \"gemini\" | \"flux\"\nimport {\n getURL,\n simulateInputPaste,\n wait,\n capitalizeFirstLetter,\n simulatePaste,\n} from \"./utils\"\nimport path from \"path\"\nimport process from \"process\"\nimport { faker } from \"@faker-js/faker\"\n\nexport const chat = async ({\n artifacts,\n page,\n isMember,\n isSubscriber,\n\n instruction = \"This thread will be all about React Native, are you ready?\",\n prompts = [\n {\n stop: false,\n text: \"Hello\",\n agentMessageTimeout: 500000,\n webSearch: false,\n delete: true,\n mix: {\n image: 0,\n video: 0,\n audio: 0,\n paste: 0,\n pdf: 0,\n },\n },\n ],\n agentMessageTimeout = 50 * 1000,\n isNewChat = true,\n isLiveTest = false,\n threadId,\n creditsConsumed = 0,\n bookmark = true,\n}: {\n isSubscriber?: boolean\n artifacts?: {\n text?: number\n paste?: number\n pdf?: number\n }\n page: Page\n isMember?: boolean\n instruction?: string\n prompts?: {\n debateAgent?: modelName\n stop?: boolean\n text: string\n instruction?: string\n deleteMessage?: boolean\n deleteAgentMessage?: boolean\n model?: modelName\n agentMessageTimeout?: number\n shouldFail?: boolean\n like?: boolean\n delete?: boolean\n webSearch?: boolean\n image?: number\n video?: number\n audio?: number\n paste?: number\n pdf?: number\n mix?: {\n image?: number\n video?: number\n audio?: number\n paste?: number\n pdf?: number\n }\n }[]\n agentMessageTimeout?: number\n isNewChat?: boolean\n isLiveTest?: boolean\n threadId?: string\n creditsConsumed?: number\n bookmark?: boolean\n}) => {\n page.on(\"console\", (msg) => {\n console.log(`[browser][${msg.type()}] ${msg.text()}`, msg)\n })\n\n if (threadId) {\n instruction = \"\"\n }\n\n const hourlyLimit = isSubscriber ? 100 : isMember ? 30 : 10 // guests: 10, members: 30, subscribers: 100\n\n const getModelCredits = (model: string) =>\n model === \"flux\"\n ? 2\n : isMember\n ? model === \"chatGPT\"\n ? 4\n : model === \"deepSeek\"\n ? 1\n : model === \"claude\"\n ? 3\n : 1\n : 1\n\n const MAX_FILE_SIZE = 4\n\n if (\n prompts?.some(\n (p) =>\n (p.pdf && p.pdf > MAX_FILE_SIZE) ||\n (p.image && p.image > MAX_FILE_SIZE) ||\n (p.video && p.video > MAX_FILE_SIZE) ||\n (p.audio && p.audio > MAX_FILE_SIZE) ||\n (p.paste && p.paste > MAX_FILE_SIZE) ||\n Object.values(p.mix || {}).some((v) => v > MAX_FILE_SIZE),\n )\n ) {\n throw new Error(\"Test file size limit exceeded\")\n }\n\n if (isLiveTest) {\n await page.goto(getURL({ isLive: true, isMember }), {\n waitUntil: \"networkidle\",\n })\n await wait(3000)\n } else if (isNewChat) {\n await page.goto(getURL({ isLive: false, isMember }), {\n waitUntil: \"networkidle\",\n })\n await wait(3000)\n }\n\n let credits = isSubscriber ? 2000 : (isMember ? 150 : 30) - creditsConsumed\n let hourlyUsage = creditsConsumed || 0 // Track hourly usage for assertions\n\n const agentModal = page.getByTestId(\"agent-modal\")\n await expect(agentModal).not.toBeVisible()\n\n const signInModal = page.getByTestId(\"sign-in-modal\")\n await expect(signInModal).not.toBeVisible()\n\n const agentSelectButton = page.getByTestId(\"agent-select-button\")\n await expect(agentSelectButton).toBeVisible()\n\n const addDebateAgentButton = page.getByTestId(\"add-debate-agent-button\")\n await expect(addDebateAgentButton).toBeVisible()\n\n const getAgentName = async () => {\n return page\n .getByTestId(\"agent-select-button\")\n .getAttribute(\"data-agent-name\")\n }\n\n const getDebateAgentName = async () => {\n return page\n .getByTestId(\"add-debate-agent-button\")\n .getAttribute(\"data-agent-name\")\n }\n\n !isMember && expect(await getAgentName()).toBe(\"deepSeek\")\n\n const chatTextarea = page.getByTestId(\"chat-textarea\")\n await expect(chatTextarea).toBeVisible()\n\n const creditsInfo = page.getByTestId(\"credits-info\")\n await expect(creditsInfo).toBeVisible()\n const scrollToBottom = async () => {\n await page.evaluate(() => {\n window.scrollTo(0, document.body.scrollHeight)\n })\n await wait(500) // Give time for scroll to complete\n }\n\n const getCreditsLeft = async () => {\n await scrollToBottom() // Ensure credit info is visible\n const creditsInfo = page.getByTestId(\"credits-info\")\n const isCreditsVisible = await creditsInfo.isVisible().catch(() => false)\n if (!isCreditsVisible) {\n return null // Credits info is hidden when hourly limit is shown\n }\n return await creditsInfo.getAttribute(\"data-credits-left\", {\n timeout: 1000,\n })\n }\n\n const getHourlyUsageLeft = async () => {\n await scrollToBottom() // Ensure hourly limit info is visible\n const hourlyLimitInfo = page.getByTestId(\"hourly-limit-info\")\n\n return await hourlyLimitInfo.getAttribute(\"data-hourly-left\", {\n timeout: 1000,\n })\n }\n\n const subscribeButton = page.getByTestId(\"subscribe-from-chat-button\")\n await expect(subscribeButton).toBeVisible()\n\n expect(await getCreditsLeft()).toBe(credits.toString())\n\n const thread = page.getByTestId(\"thread\")\n\n let willFail = false\n\n const why = page.getByTestId(\"instruction-why\")\n let instructionButton = page.getByTestId(\"instruction-button\")\n let artifactsButton = page.getByTestId(\"instruction-artifacts-button\")\n\n if (!threadId) {\n await expect(thread).not.toBeVisible()\n\n await expect(why).toBeVisible()\n } else {\n await expect(instructionButton).not.toBeVisible()\n\n instructionButton = page.getByTestId(\"chat-instruction-button\")\n artifactsButton = page.getByTestId(\"chat-artifacts-button\")\n await expect(thread).toBeVisible()\n await expect(why).not.toBeVisible()\n }\n\n await expect(instructionButton).toBeVisible()\n const instructionModal = page.getByTestId(\"instruction-modal\")\n await expect(instructionModal).not.toBeVisible()\n\n if (instruction) {\n await instructionButton.click()\n\n await expect(instructionModal).toBeVisible()\n\n const modalMaxCharCount = page.getByTestId(\n \"instruction-modal-max-char-count\",\n )\n\n await expect(modalMaxCharCount).toBeVisible()\n\n const modalTextarea = page.getByTestId(\"instruction-modal-textarea\")\n await expect(modalTextarea).toBeVisible()\n\n await modalTextarea.fill(instruction)\n\n const modalCharLeft = page.getByTestId(\"instruction-modal-char-left\")\n await expect(modalCharLeft).toBeVisible()\n await expect(modalMaxCharCount).not.toBeVisible()\n\n const modalSaveButton = page.getByTestId(\"instruction-modal-save-button\")\n await expect(modalSaveButton).toBeVisible()\n\n await modalSaveButton.click()\n }\n\n if (artifacts) {\n await artifactsButton.click()\n\n const dataTestId = threadId ? \"chat\" : \"instruction\"\n await expect(instructionModal).toBeVisible()\n\n if (artifacts.pdf) {\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n await page.getByTestId(`${dataTestId}-artifacts-upload-button`).click()\n\n const testUsedPaths = Array.from({ length: artifacts.pdf }, (_, i) => {\n const fileType = \"pdf\"\n const fileName = `test${capitalizeFirstLetter(fileType)}${i + 1}`\n const extension = \"pdf\"\n\n return path.join(\n process.cwd(),\n \"tests/shared\",\n fileType,\n `${fileName}.${extension}`,\n )\n })\n\n const fileChooser = await fileChooserPromise\n await fileChooser.setFiles(testUsedPaths)\n }\n\n if (artifacts.paste) {\n for (let i = 0; i < artifacts.paste; i++) {\n await simulatePaste(page, faker.lorem.sentence({ min: 550, max: 750 }))\n }\n }\n\n if ((artifacts.pdf || 0) + (artifacts.paste || 0) > 5) {\n await expect(page.getByText(\"Maximum 5 files allowed\")).toBeVisible()\n }\n\n const modalSaveButton = page.getByTestId(`${dataTestId}-modal-save-button`)\n await expect(modalSaveButton).toBeVisible()\n\n await modalSaveButton.click()\n\n expect(await page.getByText(\"Updated\").count()).toBeGreaterThan(0)\n }\n\n const getAgentModalButton = (agent: string) => {\n const agentModalButton = page.getByTestId(`agent-modal-button-${agent}`)\n return agentModalButton\n }\n\n for (const prompt of prompts) {\n const debateAgentDeleteButton = page.getByTestId(\n \"debate-agent-delete-button\",\n )\n const isDebateAgentVisible = await debateAgentDeleteButton.isVisible()\n\n if (isDebateAgentVisible) {\n await debateAgentDeleteButton.click()\n }\n if (prompt.model && prompt.model !== (await getAgentName())) {\n await agentSelectButton.click()\n\n await expect(agentModal).toBeVisible()\n\n const agentModalButton = getAgentModalButton(prompt.model)\n\n await agentModalButton.click()\n\n if (prompt.model === \"gemini\") {\n const agentModalCloseButton = page.getByTestId(\n \"agent-modal-close-button\",\n )\n\n await expect(agentModalCloseButton).toBeVisible()\n await agentModalCloseButton.click()\n expect(await getAgentName()).toBe(isMember ? \"chatGPT\" : \"flux\")\n } else {\n if (!isMember) {\n if (![\"flux\", \"deepSeek\", \"gemini\"].includes(prompt.model)) {\n await expect(signInModal).toBeVisible()\n const signInModalCloseButton = page.getByTestId(\n \"sign-in-modal-close-button\",\n )\n await expect(signInModalCloseButton).toBeVisible()\n await signInModalCloseButton.click()\n\n expect(await getAgentName()).toBe(\"deepSeek\")\n }\n } else {\n expect(await getAgentName()).toBe(prompt.model)\n }\n }\n }\n\n if (prompt.debateAgent) {\n {\n await addDebateAgentButton.click()\n\n await expect(agentModal).toBeVisible()\n\n const geminiButton = page.getByTestId(`agent-modal-button-gemini`)\n\n const fluxButton = page.getByTestId(`agent-modal-button-flux`)\n\n expect(geminiButton).not.toBeVisible()\n expect(fluxButton).not.toBeVisible()\n\n const agentModalButton = page.getByTestId(\n `agent-modal-button-${prompt.debateAgent}`,\n )\n\n await agentModalButton.click()\n }\n if (!isMember) {\n expect(prompt.shouldFail).toBe(true)\n willFail = true\n } else {\n expect(await getDebateAgentName()).toBe(prompt.debateAgent)\n await addDebateAgentButton.click()\n\n await expect(getAgentModalButton(prompt.debateAgent)).not.toBeVisible()\n\n const agentModalCloseButton = page.getByTestId(\n \"agent-modal-close-button\",\n )\n\n await expect(agentModalCloseButton).toBeVisible()\n await agentModalCloseButton.click()\n\n await agentSelectButton.click()\n await expect(agentModal).toBeVisible()\n\n const fluxButton = getAgentModalButton(\"flux\")\n await expect(fluxButton).toBeVisible()\n await fluxButton.click()\n await wait(1000)\n\n await expect(addDebateAgentButton).not.toBeVisible()\n\n await agentSelectButton.click()\n\n const promptAgentModalButton = page.getByTestId(\n `agent-modal-button-${prompt.model}`,\n )\n\n await promptAgentModalButton.click()\n\n expect(await getAgentName()).toBe(prompt.model)\n await addDebateAgentButton.click()\n await expect(addDebateAgentButton).toBeVisible()\n\n await getAgentModalButton(prompt.debateAgent).click()\n expect(await getDebateAgentName()).toBe(prompt.debateAgent)\n expect(await getAgentName()).toBe(prompt.model)\n }\n }\n\n if (willFail) {\n return\n }\n\n const attachButton = page.getByTestId(\"attach-button\")\n const attachButtonClose = page.getByTestId(\"attach-button-close\")\n const attachButtonImage = page.getByTestId(\"attach-button-image\")\n const attachButtonVideo = page.getByTestId(\"attach-button-video\")\n const attachButtonAudio = page.getByTestId(\"attach-button-audio\")\n const attachButtonPdf = page.getByTestId(\"attach-button-pdf\")\n\n if (prompt.image) {\n for (let i = 0; i < prompt.image; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n await attachButtonImage.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/image/testImage${i + 1}.jpeg`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.image > 3 ? 3 : prompt.image\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonImage).toBeVisible()\n await attachButtonImage.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.image }, (_, i) =>\n path.join(\n process.cwd(),\n \"tests/shared/image\",\n `testImage${i + 1}.jpeg`,\n ),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.image > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.audio) {\n for (let i = 0; i < prompt.audio; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n await attachButtonAudio.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/audio/testAudio${i + 1}.wav`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.audio > 3 ? 3 : prompt.audio\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonAudio).toBeVisible()\n await attachButtonAudio.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.audio }, (_, i) =>\n path.join(process.cwd(), \"tests/shared/audio\", `testAudio${i + 1}.wav`),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.audio > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.video) {\n for (let i = 0; i < prompt.video; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n await attachButtonAudio.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/video/testVideo${i + 1}.webm`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.video > 3 ? 3 : prompt.video\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonAudio).toBeVisible()\n await attachButtonAudio.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.video }, (_, i) =>\n path.join(\n process.cwd(),\n \"tests/shared/video\",\n `testVideo${i + 1}.webm`,\n ),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.video > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.pdf) {\n for (let i = 0; i < prompt.pdf; i++) {\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n if (i === 3) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n await attachButtonPdf.click()\n\n {\n const fileChooser = await fileChooserPromise\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/pdf/testPdf${i + 1}.pdf`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.pdf > 3 ? 3 : prompt.pdf\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n await expect(attachButtonPdf).toBeVisible()\n await attachButtonPdf.click()\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = Array.from({ length: prompt.pdf }, (_, i) =>\n path.join(process.cwd(), \"tests/shared/pdf\", `testPdf${i + 1}.pdf`),\n )\n\n await fileChooser.setFiles(testUsedPaths)\n\n if (prompt.pdf > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n } else if (prompt.paste) {\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n const count = prompt.paste > 3 ? 3 : prompt.paste\n\n for (let i = 0; i < prompt.paste; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n await page.waitForTimeout(1000)\n }\n\n if (prompt.paste > 3) {\n await expect(page.getByText(\"Too many files\")).toBeVisible()\n }\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n for (let i = 0; i < count; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n }\n } else if (prompt.mix) {\n const fileExtensions = {\n image: \"jpeg\",\n video: \"mp4\",\n audio: \"wav\",\n pdf: \"pdf\",\n }\n\n const size = Object.values(prompt.mix).reduce((a, b) => a + b)\n const to = size > 3 ? 3 : size\n\n // Create array of individual files to attach\n let filesToAttach: string[] = []\n let filesToPaste = 0\n\n for (const [key, count] of Object.entries(prompt.mix)) {\n if (key === \"paste\") {\n filesToPaste = count\n } else {\n // Add multiple files of same type\n for (let i = 0; i < count; i++) {\n filesToAttach.push(key)\n }\n }\n }\n\n // Limit to max 3 total files\n filesToAttach = filesToAttach.slice(0, 3 - filesToPaste)\n\n for (let i = 0; i < filesToPaste; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n await page.waitForTimeout(1000)\n }\n\n for (let i = 0; i < filesToAttach.length; i++) {\n const key = filesToAttach[i]\n if (!key) break\n\n attachButton.click()\n await wait(1000)\n await expect(attachButton).not.toBeVisible()\n await expect(attachButtonClose).toBeVisible()\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n if (i > to) {\n await expect(attachButtonImage).toBeDisabled()\n await expect(attachButtonVideo).toBeDisabled()\n await expect(attachButtonAudio).toBeDisabled()\n await expect(attachButtonPdf).toBeDisabled()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n\n break\n }\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n if (key === \"audio\") {\n await expect(attachButtonAudio).toBeVisible()\n await attachButtonAudio.click()\n } else if (key === \"image\") {\n await expect(attachButtonImage).toBeVisible()\n await attachButtonImage.click()\n } else if (key === \"video\") {\n await expect(attachButtonVideo).toBeVisible()\n await attachButtonVideo.click()\n } else if (key === \"pdf\") {\n await expect(attachButtonPdf).toBeVisible()\n await attachButtonPdf.click()\n }\n\n {\n const fileChooser = await fileChooserPromise\n\n const extension =\n fileExtensions[key as keyof typeof fileExtensions] || \"jpeg\"\n\n const fileIndex = filesToAttach\n .slice(0, i + 1)\n .filter((k) => k === key).length\n\n const testUsed = path.join(\n process.cwd(),\n `tests/shared/${key}/test${capitalizeFirstLetter(key)}${fileIndex}.${extension}`,\n )\n await fileChooser.setFiles(testUsed)\n\n await page.waitForTimeout(2000)\n\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n await expect(attachButtonImage).toBeVisible()\n await expect(attachButtonVideo).toBeVisible()\n await expect(attachButtonAudio).toBeVisible()\n await expect(attachButtonPdf).toBeVisible()\n\n await attachButtonClose.click()\n await expect(attachButton).toBeVisible()\n }\n }\n\n const filePreviewClears = page.getByTestId(\"file-preview-clear\")\n\n for (let i = 0; i < to; i++) {\n const filePreviewClear = filePreviewClears.nth(0)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(500)\n }\n\n for (let i = 0; i < filesToPaste; i++) {\n const text = faker.lorem.sentence({ min: 550, max: 750 })\n await simulateInputPaste(page, text)\n await page.waitForTimeout(1000)\n }\n\n if (filesToAttach.length > 0) {\n await expect(attachButton).toBeVisible()\n attachButton.click()\n\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n\n const key = filesToAttach[0]\n\n if (key === \"image\") {\n await attachButtonImage.click()\n } else if (key === \"video\") {\n await attachButtonVideo.click()\n } else if (key === \"audio\") {\n await attachButtonAudio.click()\n } else if (key === \"pdf\") {\n await attachButtonPdf.click()\n }\n\n const fileChooser = await fileChooserPromise\n\n const testUsedPaths = await Promise.all(\n Array.from({ length: filesToAttach.length }, async (_, i) => {\n // Determine file type based on prompt.mix configuration\n const fileType = filesToAttach[i]\n\n if (!fileType) {\n return null\n }\n\n const fileName = `test${capitalizeFirstLetter(fileType)}${i + 1}`\n const extension =\n fileExtensions[fileType as keyof typeof fileExtensions] || \"jpeg\"\n\n return path.join(\n process.cwd(),\n \"tests/shared\",\n fileType,\n `${fileName}.${extension}`,\n )\n }),\n )\n\n await fileChooser.setFiles(\n testUsedPaths.filter((path): path is string => path !== null),\n )\n\n if (filesToAttach.length + filesToPaste > 3) {\n await expect(page.getByText(\"Too many files selected\")).toBeVisible()\n }\n }\n }\n\n await chatTextarea.fill(prompt.text)\n\n if (prompt.webSearch) {\n const webSearchButton = page.getByTestId(\"web-search-button-disabled\")\n await expect(webSearchButton).toBeVisible()\n\n await webSearchButton.click()\n\n if (!isMember) {\n await expect(agentModal).toBeVisible()\n\n const agentModalCloseButton = page.getByTestId(\n \"agent-modal-close-button\",\n )\n\n await expect(agentModalCloseButton).toBeVisible()\n await agentModalCloseButton.click()\n }\n }\n\n const sendButton = page.getByTestId(\"chat-send-button\")\n await expect(sendButton).toBeVisible()\n\n // Handle shouldFail case - test hourly limit boundary\n if (prompt.shouldFail) {\n console.log(\n `🚫 Testing hourly limit boundary with message: \"${prompt.text}\"`,\n )\n\n await expect(sendButton).toBeDisabled()\n\n // Exit the loop since we've tested the limit\n break\n }\n\n await scrollToBottom() // Ensure send button is visible\n await sendButton.click()\n\n if (prompts.indexOf(prompt) === 0 && artifacts) {\n await expect(page.getByText(\"Uploading artifacts...\")).toBeVisible()\n }\n\n await page.waitForTimeout(5000)\n\n const stopButton = page.getByTestId(\"chat-stop-streaming-button\")\n await expect(stopButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const getLastMessage = async () => {\n // Wait for either user or guest messages to appear\n await page.waitForFunction(\n () => {\n const userMessages = document.querySelectorAll(\n '[data-testid=\"user-message\"]',\n )\n const guestMessages = document.querySelectorAll(\n '[data-testid=\"guest-message\"]',\n )\n console.log(\n `Debug: Found ${userMessages.length} user messages, ${guestMessages.length} guest messages`,\n )\n return userMessages.length > 0 || guestMessages.length > 0\n },\n { timeout: 10000 },\n )\n\n // Try both user and guest message types since the test ID depends on actual user context\n const userMessages = page.getByTestId(\"user-message\")\n const guestMessages = page.getByTestId(\"guest-message\")\n\n const userCount = await userMessages.count()\n const guestCount = await guestMessages.count()\n\n console.log(\n `Debug: After wait - ${userCount} user messages, ${guestCount} guest messages`,\n )\n\n if (userCount > 0) {\n console.log(`Debug: Using user message (${userCount} found)`)\n return userMessages.nth(userCount - 1)\n } else if (guestCount > 0) {\n console.log(`Debug: Using guest message (${guestCount} found)`)\n return guestMessages.nth(guestCount - 1)\n } else {\n throw new Error(\"No user or guest messages found after waiting\")\n }\n }\n\n await expect(await getLastMessage()).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const lastMessage = await getLastMessage()\n console.log(`Debug: Got last message, looking for delete button...`)\n\n if (prompt.stop) {\n await stopButton.click()\n await expect(stopButton).not.toBeVisible({\n timeout: 8000,\n })\n\n prompt.model && (credits -= getModelCredits(prompt.model))\n } else {\n hourlyUsage += 1 + (prompt.debateAgent ? 1 : 0)\n }\n // Check if delete button exists\n const deleteMessageButton = lastMessage.locator(\n \"[data-testid=delete-message]\",\n )\n const deleteButtonCount = await deleteMessageButton.count()\n console.log(\n `Debug: Found ${deleteButtonCount} delete buttons in last message`,\n )\n\n // // Get the message text directly from the element with the expected text\n const userMessageContent = (await getLastMessage()).getByText(prompt.text)\n await expect(userMessageContent).toBeVisible({\n timeout: agentMessageTimeout,\n })\n // Get all agent messages and wait for the last one to be visible\n\n const getLastAgentMessage = async () => {\n const agentMessages = page.getByTestId(\"agent-message\")\n const messageCount = await agentMessages.count()\n return agentMessages.nth(messageCount - 1)\n }\n\n const getLastUserMessage = async () => {\n const userMessages = page.getByTestId(\n `${isMember ? \"user\" : \"guest\"}-message`,\n )\n const messageCount = await userMessages.count()\n return userMessages.nth(messageCount - 1)\n }\n\n // Wait for the last message to be visible and have content\n await expect(await getLastAgentMessage()).toBeVisible()\n // await expect(\n // lastAgentMessage.locator(\"[data-testid=markdown-paragraph]\"),\n // ).toBeVisible({\n // timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n // })\n\n const deleteAgentMessageButton = (await getLastAgentMessage()).locator(\n \"[data-testid=delete-message]\",\n )\n await expect(deleteAgentMessageButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n visible: !prompt.stop,\n })\n\n if (prompt.image) {\n const userMessageImageCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-image\")\n .count()\n\n expect(userMessageImageCount).toBe(prompt.image > 3 ? 3 : prompt.image)\n } else if (prompt.mix?.image) {\n const userMessageImageCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-image\")\n .count()\n\n expect(userMessageImageCount).toBe(\n prompt.mix.image > 3 ? 3 : prompt.mix.image,\n )\n } else if (prompt.video) {\n const userMessageVideoCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-video\")\n .count()\n\n expect(userMessageVideoCount).toBe(prompt.video > 3 ? 3 : prompt.video)\n } else if (prompt.mix?.video) {\n const userMessageVideoCount = (await getLastUserMessage())\n .getByTestId(\"user-message-video\")\n .count()\n\n expect(userMessageVideoCount).toBe(\n prompt.mix.video > 3 ? 3 : prompt.mix.video,\n )\n } else if (prompt.audio) {\n const userMessageAudioCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-audio\")\n .count()\n\n expect(userMessageAudioCount).toBe(prompt.audio > 3 ? 3 : prompt.audio)\n } else if (prompt.mix?.audio) {\n const userMessageAudioCount = (await getLastUserMessage())\n .getByTestId(\"user-message-audio\")\n .count()\n\n expect(userMessageAudioCount).toBe(\n prompt.mix.audio > 3 ? 3 : prompt.mix.audio,\n )\n } else if (prompt.pdf) {\n const userMessagePdfCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-pdf\")\n .count()\n\n expect(userMessagePdfCount).toBe(prompt.pdf > 3 ? 3 : prompt.pdf)\n } else if (prompt.mix?.pdf) {\n const userMessagePdfCount = await (await getLastUserMessage())\n .getByTestId(\"user-message-pdf\")\n .count()\n\n expect(userMessagePdfCount).toBe(prompt.mix.pdf > 3 ? 3 : prompt.mix.pdf)\n }\n\n if (prompt.webSearch) {\n const webSearchResults = (await getLastAgentMessage()).getByTestId(\n \"web-search-results\",\n )\n await expect(webSearchResults).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const webSearchResult = webSearchResults.getByTestId(\"web-search-result\")\n expect(await webSearchResult.count()).toBe(4)\n }\n\n await wait(1000)\n\n const threadUrl = page.url()\n const threadId = threadUrl.split(\"/threads/\")[1]?.split(\"?\")[0]\n expect(threadId).toBeTruthy()\n console.log(\"Thread:\", threadId)\n\n const likeButton = (await getLastAgentMessage()).locator(\n \"[data-testid=like-button]\",\n )\n\n if (prompts.indexOf(prompt) === 0 && artifacts) {\n const dataTestId = threadId ? \"chat\" : \"instruction\"\n let artifactsButton = page.getByTestId(\n `${dataTestId}-instruction-artifacts-button`,\n )\n await artifactsButton.click()\n\n const instructionModal = page.getByTestId(\n `${dataTestId}-instruction-modal`,\n )\n\n await expect(instructionModal).toBeVisible()\n\n const filePreviewClears = page.getByTestId(\n `${dataTestId}-instruction-file-preview-clear`,\n )\n\n let count = (artifacts.pdf || 0) + (artifacts.paste || 0)\n\n if (count > 5) {\n count = 5\n }\n\n for (let i = 0; i < count; i++) {\n const filePreviewClear = filePreviewClears.nth(count - i - 1)\n await expect(filePreviewClear).toBeVisible()\n await filePreviewClear.click()\n await page.waitForTimeout(1000)\n }\n\n expect(await filePreviewClears.count()).toBe(0)\n\n if (artifacts.paste) {\n for (let i = 0; i < artifacts.paste; i++) {\n await simulatePaste(\n page,\n faker.lorem.sentence({ min: 550, max: 750 }),\n )\n }\n }\n\n if (artifacts.pdf) {\n const fileChooserPromise = page.waitForEvent(\"filechooser\")\n await page\n .getByTestId(`${dataTestId}-instruction-artifacts-upload-button`)\n .click()\n const testUsedPaths = Array.from({ length: artifacts.pdf }, (_, i) => {\n const fileType = \"pdf\"\n const fileName = `test${capitalizeFirstLetter(fileType)}${i + 1}`\n const extension = \"pdf\"\n\n return path.join(\n process.cwd(),\n \"tests/shared\",\n fileType,\n `${fileName}.${extension}`,\n )\n })\n\n const fileChooser = await fileChooserPromise\n await fileChooser.setFiles(testUsedPaths)\n }\n\n if ((artifacts.pdf || 0) + (artifacts.paste || 0) > 5) {\n await expect(page.getByText(\"Maximum 5 files allowed\")).toBeVisible()\n }\n\n const modalSaveButton = page.getByTestId(\n `${dataTestId}-instruction-modal-save-button`,\n )\n await expect(modalSaveButton).toBeVisible()\n\n await modalSaveButton.click()\n\n await wait(10000)\n\n const modalCloseButton = page.getByTestId(\n `${dataTestId}-instruction-modal-close-button`,\n )\n await expect(modalCloseButton).toBeVisible()\n\n await modalCloseButton.click()\n }\n\n if (!prompt.stop) {\n await expect(likeButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n const dislikeButton = (await getLastAgentMessage()).locator(\n \"[data-testid=dislike-button]\",\n )\n\n await expect(dislikeButton).toBeVisible({\n timeout: prompt.agentMessageTimeout || agentMessageTimeout,\n })\n\n const getFilterLikedButton = ({ liked }: { liked: boolean }) =>\n page.getByTestId(`${liked ? \"unfilter\" : \"filter\"}-liked-button`)\n await expect(getFilterLikedButton({ liked: false })).toBeVisible({\n timeout: 10000,\n })\n\n if (prompt.like) {\n await getFilterLikedButton({ liked: false }).click()\n\n await expect(await getLastAgentMessage()).not.toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: true }).click()\n\n await expect(await getLastAgentMessage()).toBeVisible({\n timeout: 8000,\n })\n\n await likeButton.click()\n await wait(4000)\n\n await getFilterLikedButton({ liked: false }).click()\n\n const unlikeButton = (await getLastAgentMessage()).locator(\n \"[data-testid=unlike-button]\",\n )\n\n await expect(unlikeButton).toBeVisible({\n timeout: 8000,\n })\n\n await unlikeButton.click()\n\n await expect(await getLastAgentMessage()).not.toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: true }).click()\n\n await expect(await getLastAgentMessage()).toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: false }).click()\n\n await expect(await getLastAgentMessage()).not.toBeVisible({\n timeout: 8000,\n })\n\n await getFilterLikedButton({ liked: true }).click()\n await wait(4000)\n }\n // // Verify delete button is visible\n\n if (prompt.model) {\n credits -= getModelCredits(prompt.model)\n\n if (prompt.debateAgent) {\n credits -= getModelCredits(prompt.debateAgent)\n }\n }\n\n // Increment hourly usage counter\n\n // Check if hourly limit info should be visible based on actual component logic\n // Component shows hourly limit when: hourlyUsageLeft < (selectedAgent?.creditCost || 0) * 3\n const hourlyLimitInfo = page.getByTestId(\"hourly-limit-info\")\n\n // await expect(hourlyLimitInfo).toBeVisible({\n // visible: 30 - hourlyUsage <= 10,\n // })\n // Try to get the hourly limit info visibility state from the DOM\n\n if (hourlyLimit - hourlyUsage === 0) {\n willFail = true\n return\n }\n\n const hourlyUsageLeft = await getHourlyUsageLeft()\n expect(hourlyUsageLeft).toBe((hourlyLimit - hourlyUsage).toString())\n\n // Assert appropriate values based on what's visible\n\n // When credits are shown, assert the credits left value\n const creditsLeft = await getCreditsLeft()\n if (creditsLeft !== null) {\n expect(creditsLeft).toBe(credits.toString())\n console.log(\n `✅ Credits assertion: ${creditsLeft} left (expected: ${credits})`,\n )\n }\n\n if (prompt.model === \"flux\") {\n const imageGenerationButton = page.getByTestId(\n \"image-generation-button\",\n )\n\n // First click: Toggle off image generation\n await imageGenerationButton.click()\n\n // Wait for agent to change away from flux\n await expect.poll(getAgentName, { timeout: 5000 }).not.toBe(\"flux\")\n\n // Verify agent changed to expected default\n const expectedDefaultAgent = !isMember ? \"deepSeek\" : \"chatGPT\"\n expect(await getAgentName()).toBe(expectedDefaultAgent)\n\n // Second click: Toggle image generation back on\n await imageGenerationButton.click()\n\n // Wait for agent to change back to flux\n await expect.poll(getAgentName, { timeout: 5000 }).toBe(\"flux\")\n await imageGenerationButton.click()\n await page.waitForTimeout(2000)\n expect(await getAgentName()).toBe(!isMember ? \"deepSeek\" : \"chatGPT\")\n }\n }\n\n if (prompt.delete) {\n await deleteMessageButton.click()\n await wait(200)\n await deleteMessageButton.click()\n await wait(4000)\n await expect(deleteMessageButton).not.toBeVisible()\n }\n }\n\n const getNthMenuThread = async (nth: number) => {\n const threads = page.getByTestId(\"menu-thread-item\")\n const threadCount = await threads.count()\n return threads.nth(nth)\n }\n const getFirstMenuThread = async () => {\n return getNthMenuThread(0)\n }\n\n if (bookmark) {\n ;(await getFirstMenuThread()).hover()\n\n const bookmarkButton = page.getByTestId(\"thread-not-bookmarked\")\n await expect(bookmarkButton).toBeVisible()\n\n await bookmarkButton.click()\n\n const menuBookmarked = page.getByTestId(\"menu-bookmarked\")\n await expect(menuBookmarked).toBeVisible({\n timeout: 10000,\n })\n\n await menuBookmarked.click()\n\n const threadNotBookmarked = page.getByTestId(\"thread-not-bookmarked\")\n await expect(threadNotBookmarked).toBeVisible({\n timeout: 10000,\n })\n ;(await getFirstMenuThread()).hover()\n const menuNotBookmarked = page.getByTestId(\"menu-not-bookmarked\")\n await expect(menuNotBookmarked).toBeVisible()\n\n await threadNotBookmarked.click()\n await wait(2000)\n }\n\n if (isNewChat) {\n await page.getByTestId(\"new-chat-button\").click()\n await wait(5000)\n\n await expect(\n isMember\n ? page.getByTestId(\"user-message\")\n : page.getByTestId(\"guest-message\"),\n ).not.toBeVisible({\n timeout: 5000,\n })\n\n // page.close()\n }\n}\n","import { expect, Page, test } from \"@playwright/test\"\nimport { wait } from \"./utils\"\n\nexport const signIn = async ({\n page,\n isOpened = false,\n signOut = false,\n register = false,\n email = process.env.VEX_TEST_EMAIL_2!,\n password = process.env.VEX_TEST_PASSWORD_2!,\n}: {\n page: Page\n isOpened?: boolean\n signOut?: boolean\n register?: boolean\n email?: string\n password?: string\n}) => {\n const signInButton = page.getByTestId(\"login-button\")\n\n if (!isOpened) {\n await expect(signInButton).toBeVisible({\n timeout: 15000,\n })\n await signInButton.click()\n }\n\n const isExtension = page.url().includes(\"extension\")\n\n const modal = page.getByTestId(\"sign-in-modal\")\n await expect(modal).toBeVisible()\n\n const emailInput = page.getByTestId(\"sign-in-email\")\n await expect(emailInput).toBeVisible()\n\n await emailInput.fill(email)\n\n const passwordInput = page.getByTestId(\"sign-in-password\")\n await expect(passwordInput).toBeVisible()\n\n await passwordInput.fill(password)\n\n await wait(2000)\n\n const signInSubmit = page.getByTestId(\"login-submit\")\n await expect(signInSubmit).toBeVisible()\n\n await signInSubmit.click({\n force: true,\n })\n\n if (!!process.env.CI) {\n // Wait for the redirect URL attribute to be set\n await page.waitForFunction(\n () => {\n const submitButton = document.querySelector(\n '[data-testid=\"login-submit\"]',\n )\n return submitButton && submitButton.hasAttribute(\"data-redirect-url\")\n },\n { timeout: 15000 },\n )\n\n const redirectUrl = await signInSubmit.getAttribute(\"data-redirect-url\")\n\n if (!redirectUrl) {\n throw new Error(\"Redirect URL not found\")\n }\n await page.goto(redirectUrl)\n }\n\n await wait(4000)\n\n await expect(signInButton).not.toBeVisible()\n\n const accountButton = page.getByTestId(\"account-button\")\n await expect(accountButton).toBeVisible()\n\n if (signOut) {\n await accountButton.click()\n\n const email = page.getByTestId(\"account-email\")\n await expect(email).toBeVisible()\n\n const logoutButton = page.getByTestId(\"account-logout-button\")\n await expect(logoutButton).toBeVisible()\n\n await logoutButton.click()\n\n await expect(signInButton).toBeVisible({\n timeout: 15000,\n })\n }\n}\n","import { Browser, expect, test, Page } from \"@playwright/test\"\nimport { getURL, wait } from \"./utils\"\nimport { chat } from \"./chat\"\nimport { signIn } from \"./signIn\"\n\nexport async function collaboration({\n page,\n isLive = false,\n isMember = false,\n browser,\n withShareLink = true,\n fingerprint,\n collaborate = \"feedbackwallet@gmail.com\",\n}: {\n page: Page\n isLive?: boolean\n isMember?: boolean\n browser: Browser\n withShareLink?: boolean\n collaborate?: string\n fingerprint?: string\n}) {\n const TEST_URL = getURL({\n fingerprint,\n isLive,\n isMember,\n })\n\n const getMemberUrl = (path?: string) =>\n getURL({\n isLive,\n isMember: true,\n path,\n })\n\n // Create two separate browser contexts (simulating two different users)\n const context1 = await browser.newContext()\n\n const page1 = page\n\n // User 1: Create a new thread and get the thread ID\n await page1.goto(TEST_URL, { waitUntil: \"networkidle\" })\n\n // Send first message to create thread\n\n await chat({\n bookmark: false,\n page: page1,\n isNewChat: false,\n isMember,\n instruction: \"Let's plan a trip together\",\n prompts: [\n {\n text: \"I want to visit Japan. What should I know?\",\n model: \"deepSeek\",\n },\n ],\n })\n\n // Get the thread ID from URL\n await page1.waitForTimeout(2000) // Wait for navigation\n const threadUrl = page1.url()\n const threadId = threadUrl.split(\"/threads/\")[1]?.split(\"?\")[0]\n\n expect(threadId).toBeTruthy()\n console.log(\"Thread:\", threadId)\n\n // User 1: Share the thread (make it public or get collaboration link)\n const threadShareButton = page1.getByTestId(\"thread-share-button\")\n expect(threadShareButton).toBeVisible()\n // User 1: Share the thread (make it public or get collaboration link)\n const chatShareButton = page1.getByTestId(\"chat-share-button\")\n await chatShareButton.click()\n await wait(1000)\n\n const chatCollaborateButton = page1.getByTestId(\"chat-collaborate-button\")\n expect(chatCollaborateButton).toBeVisible()\n await chatCollaborateButton.click()\n await wait(1000)\n\n const shareInput = page1.getByTestId(\"chat-share-input\")\n await expect(shareInput).toHaveValue(threadUrl)\n const shareCopyButton = page1.getByTestId(\"chat-share-copy-button\")\n expect(shareCopyButton).toBeVisible()\n await shareCopyButton.click()\n await wait(1000)\n\n const collaborateInput = page1.getByTestId(\"chat-collaborate-input\")\n expect(collaborateInput).toBeVisible()\n\n await collaborateInput.fill(\"iliyan@chrry.ai\")\n\n const collaborateAddButton = page1.getByTestId(\"chat-collaborate-add-button\")\n await collaborateAddButton.click()\n\n const collaborateName = page1.getByTestId(\"chat-collaborator-name\")\n await expect(collaborateName).toBeVisible({\n timeout: 8000,\n })\n\n const collaborateEmail = page1.getByTestId(\"chat-collaborator-email\")\n await expect(collaborateEmail).toBeVisible()\n\n const collaborateStatus = page1.getByTestId(\"chat-collaborator-status\")\n await expect(collaborateStatus).toHaveText(\"pending\")\n\n const collaboratorRevokeButton = page1.getByTestId(\n \"chat-collaborator-revoke-button\",\n )\n\n await expect(collaboratorRevokeButton).toBeVisible()\n await collaboratorRevokeButton.click()\n await wait(1000)\n await collaboratorRevokeButton.click()\n await wait(1000)\n await expect(collaborateName).not.toBeVisible({\n timeout: 8000,\n })\n await expect(collaborateEmail).not.toBeVisible()\n\n await collaborateInput.fill(collaborate)\n\n await collaborateAddButton.click()\n await expect(collaborateName).toBeVisible({\n timeout: 8000,\n })\n await expect(collaborateEmail).toBeVisible()\n await expect(collaborateStatus).toHaveText(\"pending\")\n\n await page1.getByTestId(\"chat-share-modal-close-button\").click()\n await wait(1000)\n const chatInput1 = page1.getByTestId(\"chat-textarea\")\n\n const context2 = await browser.newContext()\n const page2 = await context2.newPage()\n\n await page2.goto(getMemberUrl(), {\n waitUntil: \"networkidle\",\n })\n\n await signIn({ page: page2 })\n\n // User 2: Join the same thread\n await page2.goto(\n withShareLink ? `${getMemberUrl(`/threads/${threadId}`)}` : getMemberUrl(),\n {\n waitUntil: \"networkidle\",\n },\n )\n\n // Verify both users can see the thread\n const chatInput2 = page2.getByTestId(\"chat-textarea\")\n // User 2: Send a message\n await expect(chatInput2).toBeDisabled()\n\n const acceptCollaborationButton = page2.getByTestId(\n \"chat-accept-collaboration\",\n )\n\n expect(acceptCollaborationButton).toBeVisible()\n\n const rejectCollaborationButton = page2.getByTestId(\n \"chat-reject-collaboration\",\n )\n\n expect(rejectCollaborationButton).toBeVisible()\n\n await acceptCollaborationButton.click()\n\n await expect(chatInput2).toBeEnabled({\n timeout: 8000,\n })\n\n await chat({\n page: page2,\n isNewChat: false,\n threadId: threadId,\n isMember: true, // Member user (signed in)\n prompts: [\n {\n text: \"I've been to Tokyo before! The cherry blossoms are amazing in spring.\",\n model: \"deepSeek\",\n },\n ],\n })\n\n await page1.bringToFront()\n\n // User 1: Verify they can see User 2's message\n await page1.waitForTimeout(3000) // Wait for real-time sync\n const messages1 = page1.getByTestId(\"message\")\n const count1 = await messages1.count()\n expect(count1).toBeGreaterThanOrEqual(3) // Original + AI response + User 2's message\n\n // User 1: Send another message\n await chat({\n page: page1,\n isNewChat: false,\n threadId: threadId,\n isMember,\n creditsConsumed: 1,\n prompts: [\n {\n text: \"That's great! When is the best time to see cherry blossoms?\",\n model: \"deepSeek\",\n },\n ],\n })\n\n await page2.bringToFront()\n // User 2: Verify they can see User 1's new message\n await page2.waitForTimeout(3000) // Wait for real-time sync\n const messages2 = page2.getByTestId(\"message\")\n const count2 = await messages2.count()\n expect(count2).toBeGreaterThanOrEqual(5) // All previous + User 1's new message\n\n // Test typing indicators (if implemented)\n\n await page1.bringToFront()\n\n // User 1 starts typing\n await chatInput1.click()\n await chatInput1.fill(\"I'm typing...\")\n\n // User 2 should see typing indicator\n await page2.bringToFront()\n await page2.waitForTimeout(2000)\n\n expect(\n await page2.getByTestId(\"typing-indicator\").count(),\n ).toBeGreaterThanOrEqual(1)\n\n await page2.waitForTimeout(5000)\n expect(await page2.getByTestId(\"typing-indicator\").count()).toBe(0)\n\n await chatInput2.click()\n await chatInput2.fill(\"I'm typing too...\")\n\n await page1.bringToFront()\n await page1.waitForTimeout(2000)\n expect(\n await page1.getByTestId(\"typing-indicator\").count(),\n ).toBeGreaterThanOrEqual(1)\n await page1.waitForTimeout(3000)\n expect(await page1.getByTestId(\"typing-indicator\").count()).toBe(0)\n // Clean up\n await context1.close()\n await context2.close()\n}\n","import { Page } from \"@playwright/test\"\nimport { chat, modelName } from \"./chat\"\nimport { faker } from \"@faker-js/faker\"\n\nexport const limit = async ({\n page,\n isMember,\n isSubscriber,\n}: {\n page: Page\n isMember?: boolean\n isSubscriber?: boolean\n}) => {\n // Calculate exact hourly limit for guest users\n const hourlyLimit = isSubscriber ? 100 : isMember ? 30 : 10 // guests: 10, members: 30, subscribers: 100\n\n console.log(\n `🎯 Testing hourly limit: ${hourlyLimit} requests for ${isMember ? \"member\" : \"guest\"}`,\n )\n\n // Create prompts to consume exactly the hourly limit with mixed models\n const limitPrompts = Array.from({ length: hourlyLimit }, (_, i) => {\n const isFluxMessage = i % (isMember ? 5 : 3) === 0 // Every 3rd message is Flux\n const isClaudeMessage = isMember && i % 5 === 0 // Every 5th message in last 3 requests\n const isChatGPTMessage = isMember && i % 3 === 0 // Every 6th message in last 3 requests\n\n const isWebSearch =\n (isClaudeMessage || isChatGPTMessage) && !isFluxMessage && i % 2 === 0 // Every 4th message in last 3 requests\n\n const like = isWebSearch || isFluxMessage ? true : false\n\n return {\n text: isFluxMessage\n ? `Create a beautiful ${faker.color.human()} ${faker.animal.type()} in a ${faker.location.city()} setting, digital art style`\n : i === hourlyLimit\n ? `Find latest news about ${faker.company.name()}`\n : `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: isFluxMessage\n ? (\"flux\" as modelName)\n : isClaudeMessage\n ? (\"claude\" as modelName)\n : isChatGPTMessage\n ? (\"chatGPT\" as modelName)\n : (\"deepSeek\" as modelName),\n agentMessageTimeout: isFluxMessage ? 60000 : 30000, // Flux needs more time\n webSearch: isWebSearch,\n shouldFail: i === hourlyLimit, // Only fail on last message\n like,\n }\n })\n\n // Add one extra prompt that should fail\n const failPrompt = {\n text: \"This message should fail due to hourly limit\",\n model: \"deepSeek\" as modelName,\n agentMessageTimeout: 30000,\n shouldFail: true, // Flag to indicate this should fail\n webSearch: true, // Test web search on the failing request too\n }\n\n await chat({\n isNewChat: true,\n page,\n isMember,\n instruction: `Testing hourly limit of ${hourlyLimit} requests`,\n prompts: [...limitPrompts, failPrompt],\n })\n}\n","import { expect, Page } from \"@playwright/test\"\nimport { signIn } from \"./signIn\"\nimport { wait } from \"./utils\"\nimport { chat } from \"./chat\"\nimport { faker } from \"@faker-js/faker\"\n\nexport const thread = async ({\n page,\n isMember,\n bookmark,\n createChat = true,\n}: {\n page: Page\n isMember?: boolean\n createChat?: boolean\n bookmark?: boolean\n}) => {\n createChat &&\n (await chat({\n bookmark,\n isNewChat: true,\n page,\n isMember,\n instruction: \"Help me write a short story\",\n prompts: Array.from({ length: 3 }, (_, i) => {\n return {\n text: `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: \"deepSeek\",\n agentMessageTimeout: 30000,\n }\n }),\n }))\n\n const getNthMenuThread = async (nth: number) => {\n const threads = page.getByTestId(\"menu-thread-item\")\n const threadCount = await threads.count()\n return threads.nth(nth)\n }\n const getFirstMenuThread = async () => {\n return getNthMenuThread(0)\n }\n\n const getNthThread = async (nth: number) => {\n const threads = page.getByTestId(\"threads-item\")\n const threadCount = await threads.count()\n return threads.nth(nth)\n }\n\n const getFirstThread = async () => {\n return getNthThread(0)\n }\n\n const getSecondThread = async () => {\n return getNthThread(1)\n }\n\n const threadsContainer = page.getByTestId(\"threads-container\")\n\n const loadMore = page.getByTestId(\"load-more-threads-menu\")\n\n if (createChat) {\n await expect(loadMore).toBeVisible()\n await loadMore.click()\n await wait(5000)\n }\n\n await expect(\n (await getFirstThread()).getByTestId(\"threads-bookmarked\"),\n ).toBeVisible({\n timeout: 15000,\n })\n\n await expect(\n (await getFirstThread()).getByTestId(\"threads-not-bookmarked\"),\n ).not.toBeVisible({\n timeout: 15000,\n })\n\n const threadsCount = page.getByTestId(\"threads-item\")\n const count = await threadsCount.count()\n\n createChat ? expect(count).toBe(1) : expect(count).toBe(2)\n\n await expect(threadsContainer).toBeVisible()\n\n const search = page.getByTestId(\"threads-search\")\n await expect(search).toBeVisible()\n\n const threadsCollaboration = page.getByTestId(\"threads-collaboration\")\n await expect(threadsCollaboration).toBeVisible()\n\n const threadsSortButtonDate = page.getByTestId(\"threads-sort-button-date\")\n await expect(threadsSortButtonDate).toBeVisible()\n\n await threadsSortButtonDate.click()\n\n const threadsSortButton = page.getByTestId(\"threads-sort-button-star\")\n await expect(threadsSortButton).toBeVisible()\n\n await threadsSortButton.click()\n\n const editThreadButton = (await getFirstThread()).getByTestId(\n \"edit-thread-button\",\n )\n\n await expect(editThreadButton).toBeVisible()\n\n await editThreadButton.click()\n\n const editThreadTextarea = page.getByTestId(\"edit-thread-textarea\")\n\n await editThreadTextarea.fill(\"New thread title\")\n\n const editThreadSaveButton = page.getByTestId(\"edit-thread-save-button\")\n\n await expect(editThreadSaveButton).toBeVisible()\n\n await editThreadSaveButton.click()\n\n const threadTitle = threadsContainer.getByText(\"New thread title\")\n\n await expect(threadTitle).toBeVisible()\n\n await editThreadButton.click()\n\n const editThreadGenerateTitleButton = page.getByTestId(\n \"edit-thread-generate-title-button\",\n )\n\n await expect(editThreadGenerateTitleButton).toBeVisible()\n\n await editThreadGenerateTitleButton.click()\n await wait(2000)\n await editThreadSaveButton.click()\n await wait(2000)\n\n await expect(threadTitle).not.toBeVisible()\n\n const threadTitleGenerated2 = (await getFirstThread()).getByTestId(\n \"threads-item-title\",\n )\n\n await expect(threadTitleGenerated2).toBeVisible()\n\n const newTitle = await threadTitleGenerated2.textContent()\n\n if (!newTitle) {\n throw new Error(\"Thread title not found\")\n }\n\n await editThreadButton.click()\n\n const deleteThreadButton = page.getByTestId(\"delete-thread-button\")\n\n await expect(deleteThreadButton).toBeVisible()\n\n await deleteThreadButton.click()\n\n await wait(1000)\n\n await deleteThreadButton.click()\n\n await wait(3000)\n\n await expect(threadsContainer).toBeVisible()\n\n await expect(page.getByText(newTitle)).not.toBeVisible()\n\n if (createChat) {\n await chat({\n isNewChat: true,\n page,\n isMember,\n instruction: \"Help me write a short story\",\n bookmark,\n prompts: Array.from({ length: 3 }, (_, i) => {\n return {\n text: `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: \"deepSeek\",\n agentMessageTimeout: 30000,\n }\n }),\n })\n\n const menuHomeButton = page.getByTestId(\"menu-home-button\")\n\n await expect(menuHomeButton).toBeVisible()\n\n await menuHomeButton.click()\n\n await wait(3000)\n\n await chat({\n isNewChat: false,\n creditsConsumed: 3,\n bookmark: false,\n page,\n isMember,\n instruction: \"Help me write a short story\",\n prompts: Array.from({ length: 3 }, (_, i) => {\n return {\n text: `Test message ${i + 1} - ${faker.lorem.sentence()}`,\n model: \"deepSeek\",\n agentMessageTimeout: 30000,\n }\n }),\n })\n\n await loadMore.click()\n await wait(1000)\n\n await expect(\n (await getFirstThread()).getByTestId(\"threads-bookmarked\"),\n ).not.toBeVisible()\n\n await (await getFirstThread()).getByTestId(\"threads-not-bookmarked\").click()\n await wait(1000)\n\n await expect(\n (await getSecondThread()).getByTestId(\"threads-bookmarked\"),\n ).toBeVisible()\n\n await expect(\n (await getSecondThread()).getByTestId(\"threads-not-bookmarked\"),\n ).not.toBeVisible()\n\n await thread({\n page,\n isMember,\n createChat: false,\n })\n }\n}\n"]}