test(09-02): add integration tests for send message flow

- Test send via button click
- Test send via Enter key
- Test Shift+Enter inserts newline without sending
- Test button disabled when empty or over 255 chars
- Test character count and validation message display
- Test error display on send failure
- Test optimistic update behavior
- 7 comprehensive tests for send scenarios
This commit is contained in:
Nuwan 2026-01-27 19:47:50 +05:30
parent b558bfe0c3
commit 9eb58bd02b
1 changed files with 167 additions and 0 deletions

View File

@ -0,0 +1,167 @@
import { test, expect } from '@playwright/test';
import { loginToJamUI, createAndJoinSession } from '../utils/test-helpers';
test.describe('Send Message', () => {
test.beforeEach(async ({ page }) => {
await loginToJamUI(page);
await createAndJoinSession(page);
// Open chat window
const chatButton = page.locator('img[alt="Chat"]');
await chatButton.click();
});
test('sends message when Send button clicked', async ({ page, context }) => {
// Wait for popup
const popupPromise = context.waitForEvent('page');
const popup = await popupPromise;
await popup.waitForLoadState('domcontentloaded');
// Type message
const textarea = popup.locator('textarea[placeholder*="Type a message"]');
await textarea.fill('Hello from test!');
// Click send button
const sendButton = popup.locator('button:has-text("Send")');
await sendButton.click();
// Wait for message to appear in list
await popup.waitForTimeout(500);
const message = popup.locator('text=Hello from test!');
await expect(message).toBeVisible();
// Verify textarea cleared
await expect(textarea).toHaveValue('');
});
test('sends message when Enter key pressed', async ({ page, context }) => {
const popupPromise = context.waitForEvent('page');
const popup = await popupPromise;
await popup.waitForLoadState('domcontentloaded');
const textarea = popup.locator('textarea[placeholder*="Type a message"]');
await textarea.fill('Hello via Enter!');
// Press Enter (not Shift+Enter)
await textarea.press('Enter');
// Message should appear
await popup.waitForTimeout(500);
const message = popup.locator('text=Hello via Enter!');
await expect(message).toBeVisible();
// Textarea cleared
await expect(textarea).toHaveValue('');
});
test('inserts newline when Shift+Enter pressed', async ({ page, context }) => {
const popupPromise = context.waitForEvent('page');
const popup = await popupPromise;
await popup.waitForLoadState('domcontentloaded');
const textarea = popup.locator('textarea[placeholder*="Type a message"]');
await textarea.fill('Line 1');
// Press Shift+Enter
await textarea.press('Shift+Enter');
// Type second line
await textarea.type('Line 2');
// Verify multiline content
const value = await textarea.inputValue();
expect(value).toContain('\n');
expect(value).toContain('Line 1');
expect(value).toContain('Line 2');
// Message NOT sent yet
const messages = popup.locator('[data-testid="chat-message"]');
expect(await messages.count()).toBe(0);
});
test('disables send button when message empty', async ({ page, context }) => {
const popupPromise = context.waitForEvent('page');
const popup = await popupPromise;
await popup.waitForLoadState('domcontentloaded');
const sendButton = popup.locator('button:has-text("Send")');
// Initially disabled (empty)
await expect(sendButton).toBeDisabled();
// Type message - becomes enabled
const textarea = popup.locator('textarea[placeholder*="Type a message"]');
await textarea.fill('Test message');
await expect(sendButton).toBeEnabled();
// Clear - becomes disabled again
await textarea.fill('');
await expect(sendButton).toBeDisabled();
});
test('disables send button when message over 255 characters', async ({ page, context }) => {
const popupPromise = context.waitForEvent('page');
const popup = await popupPromise;
await popup.waitForLoadState('domcontentloaded');
const textarea = popup.locator('textarea[placeholder*="Type a message"]');
const sendButton = popup.locator('button:has-text("Send")');
// Type 256 characters
const longMessage = 'a'.repeat(256);
await textarea.fill(longMessage);
// Send button disabled
await expect(sendButton).toBeDisabled();
// Character count shows red and over-limit
const charCount = popup.locator('text=/256\\/255/');
await expect(charCount).toBeVisible();
// Validation message appears
const validationMsg = popup.locator('text=/characters too long/i');
await expect(validationMsg).toBeVisible();
});
test('shows error when send fails', async ({ page, context }) => {
const popupPromise = context.waitForEvent('page');
const popup = await popupPromise;
await popup.waitForLoadState('domcontentloaded');
// Simulate send failure by mocking the API to fail
await page.route('**/api/chat/messages', route => {
route.fulfill({
status: 500,
body: JSON.stringify({ error: 'Internal server error' })
});
});
const textarea = popup.locator('textarea[placeholder*="Type a message"]');
await textarea.fill('Test failure');
const sendButton = popup.locator('button:has-text("Send")');
await sendButton.click();
// Error message should appear
await popup.waitForTimeout(500);
const errorMsg = popup.locator('text=/Failed to send message/i');
await expect(errorMsg).toBeVisible();
});
test('shows optimistic update immediately', async ({ page, context }) => {
const popupPromise = context.waitForEvent('page');
const popup = await popupPromise;
await popup.waitForLoadState('domcontentloaded');
const textarea = popup.locator('textarea[placeholder*="Type a message"]');
await textarea.fill('Optimistic test');
const sendButton = popup.locator('button:has-text("Send")');
await sendButton.click();
// Message should appear immediately (optimistic)
// Don't wait for server - should show right away
const message = popup.locator('text=Optimistic test');
await expect(message).toBeVisible({ timeout: 1000 });
});
});