@cdevhub/ngx-chat 1.0.6
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/README.md +382 -0
- package/fesm2022/cdevhub-ngx-chat-testing.mjs +950 -0
- package/fesm2022/cdevhub-ngx-chat-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-chat.mjs +11973 -0
- package/fesm2022/cdevhub-ngx-chat.mjs.map +1 -0
- package/package.json +55 -0
- package/types/cdevhub-ngx-chat-testing.d.ts +362 -0
- package/types/cdevhub-ngx-chat.d.ts +6973 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-chat-testing.mjs","sources":["../../../projects/ngx-chat/testing/src/chat.harness.ts","../../../projects/ngx-chat/testing/src/mock-data.ts","../../../projects/ngx-chat/testing/src/index.ts","../../../projects/ngx-chat/testing/public-api.ts","../../../projects/ngx-chat/testing/cdevhub-ngx-chat-testing.ts"],"sourcesContent":["/**\n * @fileoverview Test harness for ChatComponent.\n * Provides ergonomic methods for testing chat interactions.\n * @module ngx-chat/testing\n */\n\nimport {\n ComponentHarness,\n HarnessPredicate,\n BaseHarnessFilters,\n} from '@angular/cdk/testing';\n\n/**\n * Filter criteria for ChatHarness.\n */\nexport interface ChatHarnessFilters extends BaseHarnessFilters {\n /** Filters by disabled state. */\n disabled?: boolean;\n}\n\n/**\n * Message data returned from getMessages().\n */\nexport interface ChatMessageData {\n /** Message text content. */\n content: string;\n /** Sender type: 'self', 'other', or 'system'. */\n sender: 'self' | 'other' | 'system';\n /** Sender name if available. */\n senderName?: string;\n}\n\n/**\n * Test harness for ChatComponent.\n *\n * Provides methods for:\n * - Sending messages\n * - Typing in the input\n * - Querying message state\n * - Checking component state\n *\n * @example\n * ```typescript\n * const harness = await loader.getHarness(ChatHarness);\n * await harness.typeMessage('Hello');\n * await harness.sendMessage('Hello');\n * const count = await harness.getMessageCount();\n * ```\n */\nexport class ChatHarness extends ComponentHarness {\n static hostSelector = 'ngx-chat';\n\n // ===========================================================================\n // Element Locators\n // ===========================================================================\n\n private readonly _textarea = this.locatorFor('.ngx-chat-sender__textarea');\n private readonly _sendButton = this.locatorFor('.ngx-chat-sender__send-btn');\n private readonly _messagesList = this.locatorForOptional('.ngx-chat__messages-list');\n private readonly _messages = this.locatorForAll('.ngx-chat__message-placeholder');\n private readonly _messageTexts = this.locatorForAll('.ngx-chat__message-text');\n private readonly _typingIndicator = this.locatorForOptional('.ngx-chat__typing');\n private readonly _loadingIndicator = this.locatorForOptional('.ngx-chat__loading');\n private readonly _emptyState = this.locatorForOptional('.ngx-chat__empty');\n\n // ===========================================================================\n // Static Methods\n // ===========================================================================\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a chat harness\n * that meets certain criteria.\n * @param options Options for filtering which chat instances are considered a match.\n * @returns A predicate for finding matching chat harnesses.\n */\n static with(options: ChatHarnessFilters = {}): HarnessPredicate<ChatHarness> {\n return new HarnessPredicate(ChatHarness, options)\n .addOption('disabled', options.disabled, async (harness, disabled) => {\n return (await harness.isDisabled()) === disabled;\n });\n }\n\n // ===========================================================================\n // Action Methods\n // ===========================================================================\n\n /**\n * Types a message and sends it.\n * Combines typeMessage and clicking send button.\n * @param content The message content to send.\n */\n async sendMessage(content: string): Promise<void> {\n await this.typeMessage(content);\n const sendButton = await this._sendButton();\n await sendButton.click();\n }\n\n /**\n * Types content into the message input.\n * Clears existing content first.\n * @param content The content to type.\n */\n async typeMessage(content: string): Promise<void> {\n const textarea = await this._textarea();\n await textarea.clear();\n await textarea.sendKeys(content);\n }\n\n /**\n * Clears the message input.\n */\n async clearInput(): Promise<void> {\n const textarea = await this._textarea();\n await textarea.clear();\n }\n\n /**\n * Focuses the message input.\n */\n async focusInput(): Promise<void> {\n const textarea = await this._textarea();\n await textarea.focus();\n }\n\n /**\n * Blurs the message input.\n */\n async blurInput(): Promise<void> {\n const textarea = await this._textarea();\n await textarea.blur();\n }\n\n // ===========================================================================\n // Query Methods\n // ===========================================================================\n\n /**\n * Gets the number of messages displayed.\n * @returns The message count.\n */\n async getMessageCount(): Promise<number> {\n const messages = await this._messages();\n return messages.length;\n }\n\n /**\n * Gets all messages with their content and sender info.\n * @returns Array of message data.\n */\n async getMessages(): Promise<ChatMessageData[]> {\n const messages = await this._messages();\n const messageTexts = await this._messageTexts();\n const result: ChatMessageData[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n const classes = await message.getAttribute('class');\n let sender: 'self' | 'other' | 'system' = 'other';\n if (classes?.includes('--self')) {\n sender = 'self';\n } else if (classes?.includes('--system')) {\n sender = 'system';\n }\n\n // Get content from corresponding text element\n const content = i < messageTexts.length ? await messageTexts[i].text() : '';\n\n // Get sender name from full text if present (appears before message content for 'other')\n // The sender name element is separate, so we extract from full message text\n const fullText = await message.text();\n let senderName: string | undefined;\n if (sender === 'other' && fullText !== content && fullText.includes(content)) {\n // Extract sender name (text before content)\n const idx = fullText.indexOf(content);\n if (idx > 0) {\n senderName = fullText.substring(0, idx).trim();\n }\n }\n\n result.push({ content, sender, senderName });\n }\n\n return result;\n }\n\n /**\n * Gets the content of the last message.\n * @returns The last message content, or null if no messages.\n */\n async getLastMessageContent(): Promise<string | null> {\n const messageTexts = await this._messageTexts();\n if (messageTexts.length === 0) {\n return null;\n }\n\n const lastText = messageTexts[messageTexts.length - 1];\n return await lastText.text();\n }\n\n /**\n * Gets the current value of the message input.\n * @returns The input value.\n */\n async getInputValue(): Promise<string> {\n const textarea = await this._textarea();\n return await textarea.getProperty<string>('value');\n }\n\n /**\n * Checks if the chat is disabled.\n * @returns True if disabled.\n */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return (await host.hasClass('ngx-chat--disabled'));\n }\n\n /**\n * Checks if the send button is enabled (can send a message).\n * @returns True if can send.\n */\n async canSend(): Promise<boolean> {\n const sendButton = await this._sendButton();\n const disabled = await sendButton.getProperty<boolean>('disabled');\n return !disabled;\n }\n\n /**\n * Checks if the typing indicator is visible.\n * @returns True if typing indicator is shown.\n */\n async isTypingIndicatorVisible(): Promise<boolean> {\n const typing = await this._typingIndicator();\n return typing !== null;\n }\n\n /**\n * Checks if the loading indicator is visible.\n * @returns True if loading.\n */\n async isLoading(): Promise<boolean> {\n const loading = await this._loadingIndicator();\n return loading !== null;\n }\n\n /**\n * Checks if the empty state is visible.\n * @returns True if showing empty state.\n */\n async isEmpty(): Promise<boolean> {\n const empty = await this._emptyState();\n return empty !== null;\n }\n\n /**\n * Checks if any messages are displayed.\n * @returns True if messages are visible.\n */\n async hasMessages(): Promise<boolean> {\n const list = await this._messagesList();\n return list !== null;\n }\n\n /**\n * Gets the placeholder text of the input.\n * @returns The placeholder text.\n */\n async getPlaceholder(): Promise<string> {\n const textarea = await this._textarea();\n return await textarea.getProperty<string>('placeholder');\n }\n\n /**\n * Checks if the input has focus.\n * @returns True if input is focused.\n */\n async isInputFocused(): Promise<boolean> {\n const textarea = await this._textarea();\n return await textarea.isFocused();\n }\n}\n","/**\n * @fileoverview Mock data and test scenarios for ngx-chat testing.\n * Provides pre-built scenarios and generator functions for comprehensive testing.\n * @module ngx-chat/testing\n */\n\nimport type {\n ChatMessage,\n ChatMessageError,\n MessageAction,\n ConfirmAction,\n SelectAction,\n MultiSelectAction,\n ButtonsAction,\n MessageAttachment,\n} from '@cdevhub/ngx-chat';\nimport type { ChatHarness } from './chat.harness';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Creates a unique ID with optional prefix.\n */\nfunction createId(prefix: string = 'msg'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Creates a timestamp offset from now by the given milliseconds.\n */\nfunction createTimestamp(offsetMs: number = 0): Date {\n return new Date(Date.now() - offsetMs);\n}\n\n// ============================================================================\n// Sample Actions\n// ============================================================================\n\n/**\n * Sample confirm action for testing.\n */\nexport const SAMPLE_CONFIRM_ACTION: ConfirmAction = {\n type: 'confirm',\n id: 'confirm-1',\n confirmText: 'Yes',\n cancelText: 'No',\n confirmVariant: 'primary',\n cancelVariant: 'ghost',\n};\n\n/**\n * Sample select action for testing.\n */\nexport const SAMPLE_SELECT_ACTION: SelectAction = {\n type: 'select',\n id: 'select-1',\n label: 'Choose an option:',\n placeholder: 'Select...',\n options: [\n { id: 'opt-1', label: 'Option One' },\n { id: 'opt-2', label: 'Option Two' },\n { id: 'opt-3', label: 'Option Three' },\n ],\n searchable: true,\n};\n\n/**\n * Sample multi-select action for testing.\n */\nexport const SAMPLE_MULTI_SELECT_ACTION: MultiSelectAction = {\n type: 'multi-select',\n id: 'multi-select-1',\n label: 'Select multiple:',\n options: [\n { id: 'feature-1', label: 'Feature A' },\n { id: 'feature-2', label: 'Feature B' },\n { id: 'feature-3', label: 'Feature C' },\n { id: 'feature-4', label: 'Feature D' },\n ],\n minSelect: 1,\n maxSelect: 3,\n submitText: 'Apply',\n};\n\n/**\n * Sample buttons action for testing.\n */\nexport const SAMPLE_BUTTONS_ACTION: ButtonsAction = {\n type: 'buttons',\n id: 'buttons-1',\n layout: 'horizontal',\n buttons: [\n { id: 'btn-yes', label: 'Yes', variant: 'primary' },\n { id: 'btn-no', label: 'No', variant: 'secondary' },\n { id: 'btn-maybe', label: 'Maybe', variant: 'ghost' },\n ],\n};\n\n// ============================================================================\n// Sample Attachments\n// ============================================================================\n\n/**\n * Sample image attachment.\n */\nexport const SAMPLE_IMAGE_ATTACHMENT: MessageAttachment = {\n id: 'att-img-1',\n type: 'image',\n url: 'https://example.com/image.jpg',\n name: 'photo.jpg',\n size: 102400,\n mimeType: 'image/jpeg',\n thumbnail: 'https://example.com/thumb.jpg',\n dimensions: { width: 1920, height: 1080 },\n};\n\n/**\n * Sample file attachment.\n */\nexport const SAMPLE_FILE_ATTACHMENT: MessageAttachment = {\n id: 'att-file-1',\n type: 'file',\n url: 'https://example.com/document.pdf',\n name: 'document.pdf',\n size: 2048000,\n mimeType: 'application/pdf',\n};\n\n/**\n * Sample video attachment.\n */\nexport const SAMPLE_VIDEO_ATTACHMENT: MessageAttachment = {\n id: 'att-video-1',\n type: 'video',\n url: 'https://example.com/video.mp4',\n name: 'recording.mp4',\n size: 10485760,\n mimeType: 'video/mp4',\n thumbnail: 'https://example.com/video-thumb.jpg',\n dimensions: { width: 1280, height: 720 },\n duration: 120,\n};\n\n/**\n * Sample audio attachment.\n */\nexport const SAMPLE_AUDIO_ATTACHMENT: MessageAttachment = {\n id: 'att-audio-1',\n type: 'audio',\n url: 'https://example.com/audio.mp3',\n name: 'voice-note.mp3',\n size: 1024000,\n mimeType: 'audio/mpeg',\n duration: 45,\n};\n\n// ============================================================================\n// Sample Errors\n// ============================================================================\n\n/**\n * Sample network error.\n */\nexport const SAMPLE_NETWORK_ERROR: ChatMessageError = {\n code: 'NETWORK_ERROR',\n message: 'Network connection failed',\n retryable: true,\n retryCount: 0,\n};\n\n/**\n * Sample timeout error.\n */\nexport const SAMPLE_TIMEOUT_ERROR: ChatMessageError = {\n code: 'TIMEOUT',\n message: 'Request timed out',\n retryable: true,\n retryCount: 1,\n lastRetryAt: new Date(),\n};\n\n/**\n * Sample rate limit error.\n */\nexport const SAMPLE_RATE_LIMIT_ERROR: ChatMessageError = {\n code: 'RATE_LIMITED',\n message: 'Too many requests. Please wait.',\n retryable: true,\n retryCount: 0,\n};\n\n// ============================================================================\n// Mock Scenarios\n// ============================================================================\n\n/**\n * Pre-built test scenarios for common testing needs.\n * Each scenario provides a complete, valid ChatMessage[] array.\n *\n * @example\n * ```typescript\n * // In a test\n * const messages = MOCK_SCENARIOS.simpleConversation;\n * fixture.componentRef.setInput('messages', messages);\n * ```\n */\nexport const MOCK_SCENARIOS = {\n /**\n * Empty message list for testing empty states.\n */\n empty: [] as readonly ChatMessage[],\n\n /**\n * Single message from self.\n */\n singleMessage: [\n {\n id: 'msg-single-1',\n sender: 'self',\n content: 'Hello, world!',\n timestamp: createTimestamp(0),\n status: 'sent',\n },\n ] as readonly ChatMessage[],\n\n /**\n * Simple back-and-forth conversation.\n */\n simpleConversation: [\n {\n id: 'msg-conv-1',\n sender: 'self',\n content: 'Hi there!',\n timestamp: createTimestamp(300000),\n status: 'read',\n },\n {\n id: 'msg-conv-2',\n sender: 'other',\n content: 'Hello! How can I help you today?',\n timestamp: createTimestamp(240000),\n senderName: 'Assistant',\n avatar: 'https://example.com/bot-avatar.png',\n },\n {\n id: 'msg-conv-3',\n sender: 'self',\n content: 'I have a question about my order.',\n timestamp: createTimestamp(180000),\n status: 'read',\n },\n {\n id: 'msg-conv-4',\n sender: 'other',\n content: 'Of course! Please provide your order number and I\\'ll look it up for you.',\n timestamp: createTimestamp(120000),\n senderName: 'Assistant',\n },\n {\n id: 'msg-conv-5',\n sender: 'self',\n content: 'It\\'s #12345',\n timestamp: createTimestamp(60000),\n status: 'delivered',\n },\n ] as readonly ChatMessage[],\n\n /**\n * Messages with various actions attached.\n */\n withActions: [\n {\n id: 'msg-action-1',\n sender: 'other',\n content: 'Would you like to proceed with the order?',\n timestamp: createTimestamp(180000),\n senderName: 'Assistant',\n actions: [SAMPLE_CONFIRM_ACTION],\n },\n {\n id: 'msg-action-2',\n sender: 'other',\n content: 'Please select your preferred shipping method:',\n timestamp: createTimestamp(120000),\n senderName: 'Assistant',\n actions: [SAMPLE_SELECT_ACTION],\n },\n ] as readonly ChatMessage[],\n\n /**\n * Message with multi-select action.\n */\n withMultiSelect: [\n {\n id: 'msg-multi-1',\n sender: 'other',\n content: 'Which features would you like to enable?',\n timestamp: createTimestamp(60000),\n senderName: 'Assistant',\n actions: [SAMPLE_MULTI_SELECT_ACTION],\n },\n ] as readonly ChatMessage[],\n\n /**\n * Message with buttons action.\n */\n withButtons: [\n {\n id: 'msg-btn-1',\n sender: 'other',\n content: 'How would you rate your experience?',\n timestamp: createTimestamp(60000),\n senderName: 'Assistant',\n actions: [SAMPLE_BUTTONS_ACTION],\n },\n ] as readonly ChatMessage[],\n\n /**\n * Messages with error states.\n */\n withErrors: [\n {\n id: 'msg-err-1',\n sender: 'self',\n content: 'This message failed to send',\n timestamp: createTimestamp(120000),\n status: 'error',\n error: SAMPLE_NETWORK_ERROR,\n },\n {\n id: 'msg-err-2',\n sender: 'self',\n content: 'This one timed out',\n timestamp: createTimestamp(60000),\n status: 'error',\n error: SAMPLE_TIMEOUT_ERROR,\n },\n {\n id: 'msg-err-3',\n sender: 'self',\n content: 'Rate limited',\n timestamp: createTimestamp(0),\n status: 'error',\n error: SAMPLE_RATE_LIMIT_ERROR,\n },\n ] as readonly ChatMessage[],\n\n /**\n * Messages with file attachments.\n */\n withAttachments: [\n {\n id: 'msg-att-1',\n sender: 'self',\n content: 'Here is the photo you requested',\n timestamp: createTimestamp(180000),\n status: 'sent',\n attachments: [SAMPLE_IMAGE_ATTACHMENT],\n },\n {\n id: 'msg-att-2',\n sender: 'other',\n content: 'Thanks! Here is the document.',\n timestamp: createTimestamp(120000),\n senderName: 'Assistant',\n attachments: [SAMPLE_FILE_ATTACHMENT],\n },\n {\n id: 'msg-att-3',\n sender: 'self',\n content: 'Check out this video and audio',\n timestamp: createTimestamp(60000),\n status: 'delivered',\n attachments: [SAMPLE_VIDEO_ATTACHMENT, SAMPLE_AUDIO_ATTACHMENT],\n },\n ] as readonly ChatMessage[],\n\n /**\n * Long conversation with 100 messages for scroll testing.\n */\n longConversation: generateConversation(100),\n\n /**\n * Large dataset with 1000 messages for performance testing.\n */\n performanceTest: generateConversation(1000),\n\n /**\n * RTL content for internationalization testing.\n */\n rtlContent: [\n {\n id: 'msg-rtl-1',\n sender: 'self',\n content: 'مرحبا، كيف حالك؟',\n timestamp: createTimestamp(120000),\n status: 'sent',\n },\n {\n id: 'msg-rtl-2',\n sender: 'other',\n content: 'أنا بخير، شكرا لك! كيف يمكنني مساعدتك اليوم؟',\n timestamp: createTimestamp(60000),\n senderName: 'المساعد',\n },\n {\n id: 'msg-rtl-3',\n sender: 'self',\n content: 'שלום! מה נשמע?',\n timestamp: createTimestamp(0),\n status: 'delivered',\n },\n ] as readonly ChatMessage[],\n\n /**\n * Mixed content with markdown, code, and special characters.\n */\n mixedContent: [\n {\n id: 'msg-mix-1',\n sender: 'self',\n content: 'Can you show me a code example?',\n timestamp: createTimestamp(180000),\n status: 'read',\n },\n {\n id: 'msg-mix-2',\n sender: 'other',\n content: `Here's a TypeScript example:\n\n\\`\\`\\`typescript\nfunction greet(name: string): string {\n return \\`Hello, \\${name}!\\`;\n}\n\\`\\`\\`\n\nYou can also use **bold** and *italic* text.`,\n timestamp: createTimestamp(120000),\n senderName: 'Assistant',\n },\n {\n id: 'msg-mix-3',\n sender: 'other',\n content: 'Special characters: <>&\"\\' and emoji: 😀🎉',\n timestamp: createTimestamp(60000),\n senderName: 'Assistant',\n },\n ] as readonly ChatMessage[],\n\n /**\n * System messages for notifications and status updates.\n */\n systemMessages: [\n {\n id: 'msg-sys-1',\n sender: 'system',\n content: 'Chat session started',\n timestamp: createTimestamp(300000),\n },\n {\n id: 'msg-sys-2',\n sender: 'self',\n content: 'Hello!',\n timestamp: createTimestamp(240000),\n status: 'sent',\n },\n {\n id: 'msg-sys-3',\n sender: 'system',\n content: 'Assistant joined the conversation',\n timestamp: createTimestamp(180000),\n },\n {\n id: 'msg-sys-4',\n sender: 'other',\n content: 'Hi there! How can I help?',\n timestamp: createTimestamp(120000),\n senderName: 'Assistant',\n },\n {\n id: 'msg-sys-5',\n sender: 'system',\n content: 'This conversation will end in 5 minutes',\n timestamp: createTimestamp(60000),\n },\n ] as readonly ChatMessage[],\n} as const;\n\n// ============================================================================\n// Generator Functions\n// ============================================================================\n\n/**\n * Generates a conversation with alternating self/other messages.\n *\n * @param count - Number of messages to generate\n * @returns Array of ChatMessage objects\n *\n * @example\n * ```typescript\n * const messages = generateConversation(50);\n * expect(messages.length).toBe(50);\n * ```\n */\nexport function generateConversation(count: number): readonly ChatMessage[] {\n if (count < 0) {\n throw new Error('Count must be non-negative');\n }\n\n const messages: ChatMessage[] = [];\n const baseTime = Date.now();\n\n for (let i = 0; i < count; i++) {\n const isUser = i % 2 === 0;\n const message: ChatMessage = {\n id: `msg-gen-${i}`,\n sender: isUser ? 'self' : 'other',\n content: isUser\n ? `User message ${Math.floor(i / 2) + 1}`\n : `Assistant response ${Math.floor(i / 2) + 1}`,\n timestamp: new Date(baseTime - (count - i) * 60000),\n ...(isUser\n ? { status: 'read' as const }\n : { senderName: 'Assistant' }),\n };\n messages.push(message);\n }\n\n return messages;\n}\n\n/**\n * Generates messages with various action types attached.\n *\n * @param count - Number of messages to generate (each will have an action)\n * @returns Array of ChatMessage objects with actions\n *\n * @example\n * ```typescript\n * const messages = generateWithActions(10);\n * expect(messages.every(m => m.actions?.length)).toBe(true);\n * ```\n */\nexport function generateWithActions(count: number): readonly ChatMessage[] {\n if (count < 0) {\n throw new Error('Count must be non-negative');\n }\n\n const actions: MessageAction[] = [\n SAMPLE_CONFIRM_ACTION,\n SAMPLE_SELECT_ACTION,\n SAMPLE_MULTI_SELECT_ACTION,\n SAMPLE_BUTTONS_ACTION,\n ];\n\n const messages: ChatMessage[] = [];\n const baseTime = Date.now();\n\n for (let i = 0; i < count; i++) {\n const action = actions[i % actions.length];\n const message: ChatMessage = {\n id: `msg-action-gen-${i}`,\n sender: 'other',\n content: `Message with ${action.type} action (#${i + 1})`,\n timestamp: new Date(baseTime - (count - i) * 60000),\n senderName: 'Assistant',\n actions: [{ ...action, id: `${action.id}-${i}` }],\n };\n messages.push(message);\n }\n\n return messages;\n}\n\n/**\n * Generates messages with various attachment types.\n *\n * @param count - Number of messages to generate\n * @returns Array of ChatMessage objects with attachments\n */\nexport function generateWithAttachments(count: number): readonly ChatMessage[] {\n if (count < 0) {\n throw new Error('Count must be non-negative');\n }\n\n const attachments: MessageAttachment[] = [\n SAMPLE_IMAGE_ATTACHMENT,\n SAMPLE_FILE_ATTACHMENT,\n SAMPLE_VIDEO_ATTACHMENT,\n SAMPLE_AUDIO_ATTACHMENT,\n ];\n\n const messages: ChatMessage[] = [];\n const baseTime = Date.now();\n\n for (let i = 0; i < count; i++) {\n const attachment = attachments[i % attachments.length];\n const isUser = i % 2 === 0;\n const message: ChatMessage = {\n id: `msg-att-gen-${i}`,\n sender: isUser ? 'self' : 'other',\n content: `Message with ${attachment.type} attachment`,\n timestamp: new Date(baseTime - (count - i) * 60000),\n ...(isUser\n ? { status: 'sent' as const }\n : { senderName: 'Assistant' }),\n attachments: [{ ...attachment, id: `${attachment.id}-${i}` }],\n };\n messages.push(message);\n }\n\n return messages;\n}\n\n// ============================================================================\n// Wait Utilities\n// ============================================================================\n\n/**\n * Default timeout for wait operations in milliseconds.\n */\nexport const DEFAULT_WAIT_TIMEOUT = 5000;\n\n/**\n * Default polling interval for wait operations in milliseconds.\n */\nexport const DEFAULT_POLL_INTERVAL = 50;\n\n/**\n * Waits for the chat harness to display a specific number of messages.\n *\n * @param harness - The ChatHarness instance\n * @param count - Expected number of messages\n * @param timeout - Maximum wait time in milliseconds (default: 5000)\n * @returns Promise that resolves when count is reached or rejects on timeout\n *\n * @example\n * ```typescript\n * const harness = await loader.getHarness(ChatHarness);\n * fixture.componentRef.setInput('messages', generateConversation(5));\n * await waitForMessages(harness, 5);\n * ```\n */\nexport async function waitForMessages(\n harness: ChatHarness,\n count: number,\n timeout: number = DEFAULT_WAIT_TIMEOUT\n): Promise<void> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const currentCount = await harness.getMessageCount();\n if (currentCount >= count) {\n return;\n }\n await sleep(DEFAULT_POLL_INTERVAL);\n }\n\n const finalCount = await harness.getMessageCount();\n throw new Error(\n `Timeout waiting for ${count} messages. Current count: ${finalCount}`\n );\n}\n\n/**\n * Waits for the typing indicator to reach a specific visibility state.\n *\n * @param harness - The ChatHarness instance\n * @param visible - Expected visibility state (true = visible, false = hidden)\n * @param timeout - Maximum wait time in milliseconds (default: 5000)\n * @returns Promise that resolves when state is reached or rejects on timeout\n *\n * @example\n * ```typescript\n * const harness = await loader.getHarness(ChatHarness);\n * fixture.componentRef.setInput('isTyping', true);\n * await waitForTypingIndicator(harness, true);\n * ```\n */\nexport async function waitForTypingIndicator(\n harness: ChatHarness,\n visible: boolean,\n timeout: number = DEFAULT_WAIT_TIMEOUT\n): Promise<void> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const isVisible = await harness.isTypingIndicatorVisible();\n if (isVisible === visible) {\n return;\n }\n await sleep(DEFAULT_POLL_INTERVAL);\n }\n\n const finalState = await harness.isTypingIndicatorVisible();\n throw new Error(\n `Timeout waiting for typing indicator to be ${visible ? 'visible' : 'hidden'}. Current: ${finalState ? 'visible' : 'hidden'}`\n );\n}\n\n/**\n * Waits for the loading indicator to reach a specific visibility state.\n *\n * @param harness - The ChatHarness instance\n * @param visible - Expected visibility state\n * @param timeout - Maximum wait time in milliseconds (default: 5000)\n */\nexport async function waitForLoading(\n harness: ChatHarness,\n visible: boolean,\n timeout: number = DEFAULT_WAIT_TIMEOUT\n): Promise<void> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const isLoading = await harness.isLoading();\n if (isLoading === visible) {\n return;\n }\n await sleep(DEFAULT_POLL_INTERVAL);\n }\n\n const finalState = await harness.isLoading();\n throw new Error(\n `Timeout waiting for loading to be ${visible ? 'visible' : 'hidden'}. Current: ${finalState ? 'visible' : 'hidden'}`\n );\n}\n\n/**\n * Waits for the empty state to reach a specific visibility state.\n *\n * @param harness - The ChatHarness instance\n * @param visible - Expected visibility state\n * @param timeout - Maximum wait time in milliseconds (default: 5000)\n */\nexport async function waitForEmpty(\n harness: ChatHarness,\n visible: boolean,\n timeout: number = DEFAULT_WAIT_TIMEOUT\n): Promise<void> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const isEmpty = await harness.isEmpty();\n if (isEmpty === visible) {\n return;\n }\n await sleep(DEFAULT_POLL_INTERVAL);\n }\n\n const finalState = await harness.isEmpty();\n throw new Error(\n `Timeout waiting for empty state to be ${visible ? 'visible' : 'hidden'}. Current: ${finalState ? 'visible' : 'hidden'}`\n );\n}\n\n/**\n * Waits for the send button to become enabled or disabled.\n *\n * @param harness - The ChatHarness instance\n * @param enabled - Expected enabled state\n * @param timeout - Maximum wait time in milliseconds (default: 5000)\n */\nexport async function waitForSendEnabled(\n harness: ChatHarness,\n enabled: boolean,\n timeout: number = DEFAULT_WAIT_TIMEOUT\n): Promise<void> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const canSend = await harness.canSend();\n if (canSend === enabled) {\n return;\n }\n await sleep(DEFAULT_POLL_INTERVAL);\n }\n\n const finalState = await harness.canSend();\n throw new Error(\n `Timeout waiting for send button to be ${enabled ? 'enabled' : 'disabled'}. Current: ${finalState ? 'enabled' : 'disabled'}`\n );\n}\n\n// ============================================================================\n// Internal Utilities\n// ============================================================================\n\n/**\n * Simple sleep utility for polling.\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","/**\n * @fileoverview Internal testing module exports.\n * @module ngx-chat/testing\n */\n\n// Harnesses\nexport { ChatHarness } from './chat.harness';\nexport type { ChatHarnessFilters, ChatMessageData } from './chat.harness';\n\n// Mock data and scenarios\nexport {\n // Scenarios\n MOCK_SCENARIOS,\n // Sample actions\n SAMPLE_CONFIRM_ACTION,\n SAMPLE_SELECT_ACTION,\n SAMPLE_MULTI_SELECT_ACTION,\n SAMPLE_BUTTONS_ACTION,\n // Sample attachments\n SAMPLE_IMAGE_ATTACHMENT,\n SAMPLE_FILE_ATTACHMENT,\n SAMPLE_VIDEO_ATTACHMENT,\n SAMPLE_AUDIO_ATTACHMENT,\n // Sample errors\n SAMPLE_NETWORK_ERROR,\n SAMPLE_TIMEOUT_ERROR,\n SAMPLE_RATE_LIMIT_ERROR,\n // Generator functions\n generateConversation,\n generateWithActions,\n generateWithAttachments,\n // Wait utilities\n waitForMessages,\n waitForTypingIndicator,\n waitForLoading,\n waitForEmpty,\n waitForSendEnabled,\n // Constants\n DEFAULT_WAIT_TIMEOUT,\n DEFAULT_POLL_INTERVAL,\n} from './mock-data';\n","/**\n * @fileoverview Public API for ngx-chat/testing secondary entry point.\n *\n * This entry point provides testing utilities for consumers of the ngx-chat library.\n * Import from 'ngx-chat/testing' to access harnesses, mock data, and test utilities.\n *\n * @example\n * ```typescript\n * import { ChatHarness, MOCK_SCENARIOS, waitForMessages } from 'ngx-chat/testing';\n *\n * // In your tests\n * const harness = await loader.getHarness(ChatHarness);\n * fixture.componentRef.setInput('messages', MOCK_SCENARIOS.simpleConversation);\n * await waitForMessages(harness, 5);\n * ```\n *\n * @module ngx-chat/testing\n */\n\n// Re-export all testing utilities\nexport * from './src/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|