blob: e361ecd26585d172325d5a9ccb9741330dbc1936 [file] [log] [blame]
Sean McCulloughb29f8912025-04-20 15:39:11 -07001import { test, expect } from "@sand4rt/experimental-ct-web";
Sean McCullough86b56862025-04-18 13:04:03 -07002import { SketchChatInput } from "./sketch-chat-input";
3
Sean McCulloughb29f8912025-04-20 15:39:11 -07004test("initializes with empty content by default", async ({ mount }) => {
5 const component = await mount(SketchChatInput, {});
6
7 // Check public property via component's evaluate method
8 const content = await component.evaluate((el: SketchChatInput) => el.content);
9 expect(content).toBe("");
10
11 // Check textarea value
12 await expect(component.locator("#chatInput")).toHaveValue("");
13});
14
15test("initializes with provided content", async ({ mount }) => {
16 const testContent = "Hello, world!";
17 const component = await mount(SketchChatInput, {
18 props: {
19 content: testContent,
20 },
Sean McCullough86b56862025-04-18 13:04:03 -070021 });
22
Sean McCulloughb29f8912025-04-20 15:39:11 -070023 // Check public property via component's evaluate method
24 const content = await component.evaluate((el: SketchChatInput) => el.content);
25 expect(content).toBe(testContent);
Sean McCullough86b56862025-04-18 13:04:03 -070026
Sean McCulloughb29f8912025-04-20 15:39:11 -070027 // Check textarea value
28 await expect(component.locator("#chatInput")).toHaveValue(testContent);
29});
30
31test("updates content when typing in the textarea", async ({ mount }) => {
32 const component = await mount(SketchChatInput, {});
33 const newValue = "New message";
34
35 // Fill the textarea with new content
36 await component.locator("#chatInput").fill(newValue);
37
38 // Check that the content property was updated
39 const content = await component.evaluate((el: SketchChatInput) => el.content);
40 expect(content).toBe(newValue);
41});
42
43test("sends message when clicking the send button", async ({ mount }) => {
44 const testContent = "Test message";
45 const component = await mount(SketchChatInput, {
46 props: {
47 content: testContent,
48 },
Sean McCullough86b56862025-04-18 13:04:03 -070049 });
50
Sean McCulloughb29f8912025-04-20 15:39:11 -070051 // Set up promise to wait for the event
52 const eventPromise = component.evaluate((el) => {
53 return new Promise((resolve) => {
54 el.addEventListener(
55 "send-chat",
56 (event) => {
57 resolve((event as CustomEvent).detail);
58 },
59 { once: true },
60 );
Sean McCullough86b56862025-04-18 13:04:03 -070061 });
Sean McCullough86b56862025-04-18 13:04:03 -070062 });
63
Sean McCulloughb29f8912025-04-20 15:39:11 -070064 // Click the send button
65 await component.locator("#sendChatButton").click();
Sean McCullough86b56862025-04-18 13:04:03 -070066
Sean McCulloughb29f8912025-04-20 15:39:11 -070067 // Wait for the event and check its details
68 const detail: any = await eventPromise;
69 expect(detail.message).toBe(testContent);
Sean McCullough71941bd2025-04-18 13:31:48 -070070
Sean McCulloughb29f8912025-04-20 15:39:11 -070071 // Check that content was cleared
72 const content = await component.evaluate((el: SketchChatInput) => el.content);
73 expect(content).toBe("");
74});
75
76test.skip("sends message when pressing Enter (without shift)", async ({
77 mount,
78}) => {
79 const testContent = "Test message";
80 const component = await mount(SketchChatInput, {
81 props: {
82 content: testContent,
83 },
84 });
85
86 // Set up promise to wait for the event
87 const eventPromise = component.evaluate((el) => {
88 return new Promise((resolve) => {
89 el.addEventListener(
90 "send-chat",
91 (event) => {
92 resolve((event as CustomEvent).detail);
93 },
94 { once: true },
95 );
96 });
97 });
98
99 // Press Enter in the textarea
100 await component.locator("#chatInput").press("Enter");
101
102 // Wait for the event and check its details
103 const detail: any = await eventPromise;
104 expect(detail.message).toBe(testContent);
105
106 // Check that content was cleared
107 const content = await component.evaluate((el: SketchChatInput) => el.content);
108 expect(content).toBe("");
109});
110
111test.skip("does not send message when pressing Shift+Enter", async ({
112 mount,
113}) => {
114 const testContent = "Test message";
115 const component = await mount(SketchChatInput, {
116 props: {
117 content: testContent,
118 },
119 });
120
121 // Set up to track if event fires
122 let eventFired = false;
123 await component.evaluate((el) => {
Sean McCullough86b56862025-04-18 13:04:03 -0700124 el.addEventListener("send-chat", () => {
Sean McCulloughb29f8912025-04-20 15:39:11 -0700125 (window as any).__eventFired = true;
Sean McCullough86b56862025-04-18 13:04:03 -0700126 });
Sean McCulloughb29f8912025-04-20 15:39:11 -0700127 (window as any).__eventFired = false;
Sean McCullough86b56862025-04-18 13:04:03 -0700128 });
129
Sean McCulloughb29f8912025-04-20 15:39:11 -0700130 // Press Shift+Enter in the textarea
131 await component.locator("#chatInput").press("Shift+Enter");
Sean McCullough86b56862025-04-18 13:04:03 -0700132
Sean McCulloughb29f8912025-04-20 15:39:11 -0700133 // Wait a short time and check if event fired
134 await new Promise((resolve) => setTimeout(resolve, 50));
135 eventFired = await component.evaluate(() => (window as any).__eventFired);
136 expect(eventFired).toBe(false);
Sean McCullough71941bd2025-04-18 13:31:48 -0700137
Sean McCulloughb29f8912025-04-20 15:39:11 -0700138 // Check that content was not cleared
139 const content = await component.evaluate((el: SketchChatInput) => el.content);
140 expect(content).toBe(testContent);
141});
142
143test("updates content when receiving update-content event", async ({
144 mount,
145}) => {
146 const component = await mount(SketchChatInput, {});
147 const newContent = "Updated content";
148
149 // Dispatch the update-content event
150 await component.evaluate((el, newContent) => {
Sean McCullough86b56862025-04-18 13:04:03 -0700151 const updateEvent = new CustomEvent("update-content", {
152 detail: { content: newContent },
Sean McCullough71941bd2025-04-18 13:31:48 -0700153 bubbles: true,
Sean McCullough86b56862025-04-18 13:04:03 -0700154 });
155 el.dispatchEvent(updateEvent);
Sean McCulloughb29f8912025-04-20 15:39:11 -0700156 }, newContent);
Sean McCullough71941bd2025-04-18 13:31:48 -0700157
Sean McCulloughb29f8912025-04-20 15:39:11 -0700158 // Wait for the component to update and check values
159 await expect(component.locator("#chatInput")).toHaveValue(newContent);
Sean McCullough71941bd2025-04-18 13:31:48 -0700160
Sean McCulloughb29f8912025-04-20 15:39:11 -0700161 // Check the content property
162 const content = await component.evaluate((el: SketchChatInput) => el.content);
163 expect(content).toBe(newContent);
Sean McCullough86b56862025-04-18 13:04:03 -0700164});