blob: de41c3111f3622333a5ae9b528cd3d857e31f695 [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
Sean McCullough07b3e392025-04-21 22:51:14 +0000143test("resizes when user enters more text than will fit", async ({
144 mount,
145}) => {
146 const testContent = "Test message\n\n\n\n\n\n\n\n\n\n\n\n\nends here.";
147 const component = await mount(SketchChatInput, {
148 props: {
149 content: '',
150 },
151 });
152 const origHeight = await component.evaluate((el: SketchChatInput) => el.chatInput.style.height);
153
154 // Enter very tall text in the textarea
155 await component.locator("#chatInput").fill(testContent);
156
157 // Check that textarea resized
158 const newHeight = await component.evaluate((el: SketchChatInput) => el.chatInput.style.height);
159 expect(Number.parseInt(newHeight)).toBeGreaterThan(Number.parseInt(origHeight));
160});
161
Sean McCulloughb29f8912025-04-20 15:39:11 -0700162test("updates content when receiving update-content event", async ({
163 mount,
164}) => {
165 const component = await mount(SketchChatInput, {});
166 const newContent = "Updated content";
167
168 // Dispatch the update-content event
169 await component.evaluate((el, newContent) => {
Sean McCullough86b56862025-04-18 13:04:03 -0700170 const updateEvent = new CustomEvent("update-content", {
171 detail: { content: newContent },
Sean McCullough71941bd2025-04-18 13:31:48 -0700172 bubbles: true,
Sean McCullough86b56862025-04-18 13:04:03 -0700173 });
174 el.dispatchEvent(updateEvent);
Sean McCulloughb29f8912025-04-20 15:39:11 -0700175 }, newContent);
Sean McCullough71941bd2025-04-18 13:31:48 -0700176
Sean McCulloughb29f8912025-04-20 15:39:11 -0700177 // Wait for the component to update and check values
178 await expect(component.locator("#chatInput")).toHaveValue(newContent);
Sean McCullough71941bd2025-04-18 13:31:48 -0700179
Sean McCulloughb29f8912025-04-20 15:39:11 -0700180 // Check the content property
181 const content = await component.evaluate((el: SketchChatInput) => el.content);
182 expect(content).toBe(newContent);
Sean McCullough86b56862025-04-18 13:04:03 -0700183});