import { act, render, screen } from '@testing-library/react'
import React, { useEffect } from 'react'
import { Channel as StreamChannel, StreamChat } from 'stream-chat'
import { Channel, Chat } from 'stream-chat-react'
import { describe, expect, it, vi } from 'vitest'
import { ChannelView } from './ChannelView'
const message = {
id: 'message-1',
cid: 'messaging:channel-1',
type: 'regular',
text: 'July class details',
status: 'received',
user: { id: 'linker-1', name: 'Linker' },
metadata: {
outbound_id: 'outbound-1',
},
attachments: [],
latest_reactions: [],
own_reactions: [],
reaction_counts: {},
reaction_scores: {},
reply_count: 0,
mentioned_users: [],
created_at: new Date(),
updated_at: new Date(),
}
const createChannel = () => {
const client = new StreamChat('mock-api-key', {
allowServerSideConnect: true,
})
client.userID = 'linker-1'
client.user = { id: 'linker-1', name: 'Linker' }
const channel = client.channel('messaging', 'channel-1')
channel.initialized = true
channel.state.messages = [message] as never
channel.state.members = {
'linker-1': {
user: { id: 'linker-1', name: 'Linker' },
user_id: 'linker-1',
role: 'owner',
},
'visitor-1': {
user: { id: 'visitor-1', name: 'Visitor' },
user_id: 'visitor-1',
role: 'member',
},
} as never
return { channel, client }
}
describe('ChannelView outbound resolution', () => {
it('updates an existing Stream message row when its outbound record lookup resolves', async () => {
const { channel, client } = createChannel()
const firstResolver = () => undefined
const secondResolver = () => ({
id: 'automation-1',
name: 'July 9th Class absentee',
})
const mounts = vi.fn()
const unmounts = vi.fn()
const RowProbe = ({ children }: { children: React.ReactNode }) => {
useEffect(() => {
mounts()
return unmounts
}, [])
return <>{children}>
}
const renderMessage = (messageNode: React.ReactElement) => (
{messageNode}
)
let rerender!: ReturnType['rerender']
await act(async () => {
rerender = render(
).rerender
})
expect(
screen.queryByTestId('sent-message-outbound-status')
).not.toBeInTheDocument()
expect(mounts).toHaveBeenCalledOnce()
act(() => {
rerender(
)
})
expect(
screen.getByTestId('sent-message-outbound-status')
).toHaveTextContent('July 9th Class absentee')
expect(mounts).toHaveBeenCalledOnce()
expect(unmounts).not.toHaveBeenCalled()
})
})