chitchatter/src/components/Room/Room.test.tsx
Flaykz 492cfa58ce
feat: [#7] Play a sound on new message (#25)
* feat: [#7] Play a sound on new message

* fix: [#7] Since this mock is a no-op, I think we can omit the argument to mockImplementation

Co-authored-by: Jeremy Kahn <jeremyckahn@gmail.com>

* fix: [#7] lazy initialization of this state

Co-authored-by: Jeremy Kahn <jeremyckahn@gmail.com>

* fix: [#7] More accurate error message

Co-authored-by: Jeremy Kahn <jeremyckahn@gmail.com>

* fix: [#7] Replace then with await

* [closes #24]  Settings UI (#26)

* feat: [#24] wire up settings page
* feat: [#24] stand up settings UI
* feat: [#24] implement storage deletion
* feat: [#24] confirm deletion of settings data

* feat: [#7] Add play sound switch in settings

* feat: [#7] avoid typescript warning

Co-authored-by: Jeremy Kahn <jeremyckahn@gmail.com>

* feat: [#7] more straighforward wording

Co-authored-by: Jeremy Kahn <jeremyckahn@gmail.com>

* feat: [#7] remove useless usestate

* feat: [#7] avoid new settings to be undefined in persisted storage

* feat: [#7] creating a chat section in settings

Co-authored-by: Jeremy Kahn <jeremyckahn@gmail.com>
2022-09-26 08:10:31 -05:00

125 lines
3.1 KiB
TypeScript

import { PropsWithChildren } from 'react'
import { waitFor, render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { MemoryRouter as Router, Route, Routes } from 'react-router-dom'
import { Room } from './'
const mockUserId = 'user-id'
const mockRoomId = 'room-123'
window.AudioContext = jest.fn().mockImplementation()
const mockGetUuid = jest.fn()
const mockMessagedSender = jest
.fn()
.mockImplementation(() => Promise.resolve([]))
jest.mock('trystero', () => ({
joinRoom: () => ({
makeAction: () => [mockMessagedSender, () => {}, () => {}],
ping: () => Promise.resolve(0),
leave: () => {},
getPeers: () => [],
addStream: () => [Promise.resolve()],
removeStream: () => {},
addTrack: () => [Promise.resolve()],
removeTrack: () => {},
replaceTrack: () => [Promise.resolve()],
onPeerJoin: () => {},
onPeerLeave: () => {},
onPeerStream: () => {},
onPeerTrack: () => {},
}),
}))
const RouteStub = ({ children }: PropsWithChildren) => {
return (
<Router initialEntries={['/public/abc123']}>
<Routes>
<Route path="/public/:roomId" element={children}></Route>
</Routes>
</Router>
)
}
jest.useFakeTimers().setSystemTime(100)
describe('Room', () => {
test('is available', () => {
render(
<RouteStub>
<Room userId={mockUserId} roomId={mockRoomId} />
</RouteStub>
)
})
test('send button is disabled', () => {
render(
<RouteStub>
<Room userId={mockUserId} roomId={mockRoomId} />
</RouteStub>
)
const sendButton = screen.getByLabelText('Send')
expect(sendButton).toBeDisabled()
})
test('inputting text enabled send button', () => {
render(
<RouteStub>
<Room userId={mockUserId} roomId={mockRoomId} />
</RouteStub>
)
const sendButton = screen.getByLabelText('Send')
const textInput = screen.getByPlaceholderText('Your message')
userEvent.type(textInput, 'hello')
expect(sendButton).not.toBeDisabled()
})
test('sending a message clears the text input', async () => {
render(
<RouteStub>
<Room userId={mockUserId} roomId={mockRoomId} />
</RouteStub>
)
const sendButton = screen.getByLabelText('Send')
const textInput = screen.getByPlaceholderText('Your message')
userEvent.type(textInput, 'hello')
await waitFor(() => {
userEvent.click(sendButton)
})
expect(textInput).toHaveValue('')
})
test('message is sent to peer', async () => {
render(
<RouteStub>
<Room
getUuid={mockGetUuid.mockImplementation(() => 'abc123')}
userId={mockUserId}
roomId={mockRoomId}
/>
</RouteStub>
)
const sendButton = screen.getByLabelText('Send')
const textInput = screen.getByPlaceholderText('Your message')
userEvent.type(textInput, 'hello')
await waitFor(() => {
userEvent.click(sendButton)
})
expect(mockMessagedSender).toHaveBeenCalledWith({
authorId: mockUserId,
text: 'hello',
timeSent: 100,
id: 'abc123',
})
})
})