@@ -4,38 +4,40 @@ import { beforeEach, describe, expect, it, vi } from "vitest"
44import type { ChatMessage as ServerMessage } from "../../shared/events.ts"
55import App from "./App.tsx"
66
7- const { socket, resetSocket, receiveMessage, receiveHistory } = vi . hoisted ( ( ) => {
8- const handlers = new Map < string , Set < ( ...args : unknown [ ] ) => void > > ( )
9- const socket = {
10- connected : true ,
11- id : "abcdefghijklmnop" ,
12- on ( event : string , handler : ( ...args : unknown [ ] ) => void ) {
13- const current = handlers . get ( event ) ?? new Set ( )
14- current . add ( handler )
15- handlers . set ( event , current )
16- return socket
17- } ,
18- off ( event : string , handler : ( ...args : unknown [ ] ) => void ) {
19- handlers . get ( event ) ?. delete ( handler )
20- return socket
21- } ,
22- emit : vi . fn ( ) ,
23- }
24-
25- return {
26- socket,
27- resetSocket ( ) {
28- handlers . clear ( )
29- socket . emit . mockClear ( )
30- } ,
31- receiveMessage ( message : ServerMessage ) {
32- handlers . get ( "message" ) ?. forEach ( ( handler ) => handler ( message ) )
33- } ,
34- receiveHistory ( messages : ServerMessage [ ] ) {
35- handlers . get ( "history" ) ?. forEach ( ( handler ) => handler ( messages ) )
36- } ,
37- }
38- } )
7+ const { socket, resetSocket, receiveMessage, receiveHistory } = vi . hoisted (
8+ ( ) => {
9+ const handlers = new Map < string , Set < ( ...args : unknown [ ] ) => void > > ( )
10+ const socket = {
11+ connected : true ,
12+ id : "abcdefghijklmnop" ,
13+ on ( event : string , handler : ( ...args : unknown [ ] ) => void ) {
14+ const current = handlers . get ( event ) ?? new Set ( )
15+ current . add ( handler )
16+ handlers . set ( event , current )
17+ return socket
18+ } ,
19+ off ( event : string , handler : ( ...args : unknown [ ] ) => void ) {
20+ handlers . get ( event ) ?. delete ( handler )
21+ return socket
22+ } ,
23+ emit : vi . fn ( ) ,
24+ }
25+
26+ return {
27+ socket,
28+ resetSocket ( ) {
29+ handlers . clear ( )
30+ socket . emit . mockClear ( )
31+ } ,
32+ receiveMessage ( message : ServerMessage ) {
33+ handlers . get ( "message" ) ?. forEach ( ( handler ) => handler ( message ) )
34+ } ,
35+ receiveHistory ( messages : ServerMessage [ ] ) {
36+ handlers . get ( "history" ) ?. forEach ( ( handler ) => handler ( messages ) )
37+ } ,
38+ }
39+ } ,
40+ )
3941
4042vi . mock ( "socket.io-client" , ( ) => ( {
4143 io : ( ) => socket ,
@@ -51,8 +53,14 @@ describe("chat app", () => {
5153 render ( < App /> )
5254
5355 expect ( await screen . findByRole ( "status" ) ) . toHaveTextContent ( "Connected" )
54- expect ( screen . getByRole ( "textbox" , { name : "Your name" } ) ) . toBeInTheDocument ( )
56+ expect (
57+ screen . getByRole ( "textbox" , { name : "Your name" } ) ,
58+ ) . toBeInTheDocument ( )
5559 expect ( screen . getByText ( "No messages yet. Say hello." ) ) . toBeInTheDocument ( )
60+ expect ( screen . getByRole ( "log" , { name : "Messages" } ) ) . toHaveAttribute (
61+ "aria-live" ,
62+ "polite" ,
63+ )
5664 expect ( screen . getByRole ( "button" , { name : "Send" } ) ) . toBeDisabled ( )
5765 } )
5866
@@ -64,7 +72,9 @@ describe("chat app", () => {
6472 await user . click ( screen . getByRole ( "button" , { name : "Save" } ) )
6573
6674 expect ( screen . getByText ( "Ada" ) ) . toBeInTheDocument ( )
67- expect ( screen . queryByRole ( "textbox" , { name : "Your name" } ) ) . not . toBeInTheDocument ( )
75+ expect (
76+ screen . queryByRole ( "textbox" , { name : "Your name" } ) ,
77+ ) . not . toBeInTheDocument ( )
6878 expect ( socket . emit ) . toHaveBeenCalledWith ( "name" , "Ada" )
6979 expect ( screen . getByText ( "Ada" ) . previousElementSibling ) . toHaveStyle ( {
7080 backgroundColor : expect . any ( String ) ,
@@ -93,10 +103,9 @@ describe("chat app", () => {
93103 } )
94104
95105 expect ( screen . getByText ( "Hello" ) ) . toBeInTheDocument ( )
96- expect ( screen . getByText ( "Hello" ) . closest ( "li" ) ?. querySelector ( "time" ) ) . toHaveAttribute (
97- "dateTime" ,
98- new Date ( sentAt ) . toISOString ( ) ,
99- )
106+ expect (
107+ screen . getByText ( "Hello" ) . closest ( "li" ) ?. querySelector ( "time" ) ,
108+ ) . toHaveAttribute ( "dateTime" , new Date ( sentAt ) . toISOString ( ) )
100109 } )
101110
102111 it ( "shows another person's message with a different color" , async ( ) => {
@@ -130,7 +139,9 @@ describe("chat app", () => {
130139 const graceDot = messages . getByText ( "Grace" ) . querySelector ( "[aria-hidden]" )
131140 expect ( adaDot ?. getAttribute ( "style" ) ) . toContain ( "background-color" )
132141 expect ( graceDot ?. getAttribute ( "style" ) ) . toContain ( "background-color" )
133- expect ( graceDot ?. getAttribute ( "style" ) ) . not . toBe ( adaDot ?. getAttribute ( "style" ) )
142+ expect ( graceDot ?. getAttribute ( "style" ) ) . not . toBe (
143+ adaDot ?. getAttribute ( "style" ) ,
144+ )
134145 } )
135146
136147 it ( "shows recent messages from the server when joining" , async ( ) => {
@@ -151,7 +162,9 @@ describe("chat app", () => {
151162 } )
152163
153164 expect ( screen . getByText ( "Already here" ) ) . toBeInTheDocument ( )
154- expect ( screen . queryByText ( "No messages yet. Say hello." ) ) . not . toBeInTheDocument ( )
165+ expect (
166+ screen . queryByText ( "No messages yet. Say hello." ) ,
167+ ) . not . toBeInTheDocument ( )
155168 expect ( socket . emit ) . toHaveBeenCalledWith ( "history" )
156169 } )
157170} )
0 commit comments