1+ /*
2+ Copyright 2024 New Vector Ltd.
3+
4+ SPDX-License-Identifier: AGPL-3.0-only
5+ Please see LICENSE in the repository root for full details.
6+ */
7+
8+ import { render } from "@testing-library/react" ;
9+ import { expect , test } from "vitest" ;
10+ import { TooltipProvider } from "@vector-im/compound-web" ;
11+ import { act , ReactNode } from "react" ;
12+
13+ import {
14+ MockRoom ,
15+ MockRTCSession ,
16+ TestReactionsWrapper ,
17+ } from "../utils/testReactions" ;
18+ import {
19+ showReactions ,
20+ } from "../settings/settings" ;
21+ import { ReactionsOverlay } from "./ReactionsOverlay" ;
22+ import { afterEach } from "node:test" ;
23+ import { ReactionSet } from "../reactions" ;
24+
25+ const memberUserIdAlice = "@alice:example.org" ;
26+ const memberUserIdBob = "@bob:example.org" ;
27+ const memberUserIdCharlie = "@charlie:example.org" ;
28+ const memberEventAlice = "$membership-alice:example.org" ;
29+ const memberEventBob = "$membership-bob:example.org" ;
30+ const memberEventCharlie = "$membership-charlie:example.org" ;
31+
32+ const membership : Record < string , string > = {
33+ [ memberEventAlice ] : memberUserIdAlice ,
34+ [ memberEventBob ] : memberUserIdBob ,
35+ [ memberEventCharlie ] : memberUserIdCharlie ,
36+ } ;
37+
38+ function TestComponent ( {
39+ rtcSession,
40+ } : {
41+ rtcSession : MockRTCSession ;
42+ } ) : ReactNode {
43+ return (
44+ < TooltipProvider >
45+ < TestReactionsWrapper rtcSession = { rtcSession } >
46+ < ReactionsOverlay />
47+ </ TestReactionsWrapper >
48+ </ TooltipProvider >
49+ ) ;
50+ }
51+
52+
53+ afterEach ( ( ) => {
54+ showReactions . setValue ( showReactions . defaultValue ) ;
55+ } ) ;
56+
57+ test ( "defaults to showing no reactions" , ( ) => {
58+ showReactions . setValue ( true ) ;
59+ const rtcSession = new MockRTCSession (
60+ new MockRoom ( memberUserIdAlice ) ,
61+ membership ,
62+ ) ;
63+ const { container } = render ( < TestComponent rtcSession = { rtcSession } /> ) ;
64+ expect ( container . getElementsByTagName ( "span" ) ) . toHaveLength (
65+ 0
66+ ) ;
67+ } ) ;
68+
69+ test ( "shows a reaction when sent" , ( ) => {
70+ showReactions . setValue ( true ) ;
71+ const reaction = ReactionSet [ 0 ] ;
72+ const room = new MockRoom ( memberUserIdAlice ) ;
73+ const rtcSession = new MockRTCSession (
74+ room ,
75+ membership ,
76+ ) ;
77+ const { getByRole } = render ( < TestComponent rtcSession = { rtcSession } /> ) ;
78+ act ( ( ) => room . testSendReaction ( memberEventAlice , reaction , membership ) ) ;
79+ const span = getByRole ( 'presentation' ) ;
80+ expect ( getByRole ( 'presentation' ) ) . toBeTruthy ( ) ;
81+ expect ( span . innerHTML ) . toEqual ( reaction . emoji ) ;
82+ } ) ;
83+
84+ test ( "shows two of the same reaction when sent" , ( ) => {
85+ showReactions . setValue ( true ) ;
86+ const room = new MockRoom ( memberUserIdAlice ) ;
87+ const rtcSession = new MockRTCSession (
88+ room ,
89+ membership ,
90+ ) ;
91+ const { getAllByRole } = render ( < TestComponent rtcSession = { rtcSession } /> ) ;
92+ act ( ( ) => room . testSendReaction ( memberEventAlice , ReactionSet [ 0 ] , membership ) ) ;
93+ act ( ( ) => room . testSendReaction ( memberEventBob , ReactionSet [ 0 ] , membership ) ) ;
94+ expect ( getAllByRole ( 'presentation' ) ) . toHaveLength ( 2 ) ;
95+ } ) ;
96+
97+ test ( "shows two different reactions when sent" , ( ) => {
98+ showReactions . setValue ( true ) ;
99+ const room = new MockRoom ( memberUserIdAlice ) ;
100+ const rtcSession = new MockRTCSession (
101+ room ,
102+ membership ,
103+ ) ;
104+ const [ reactionA , reactionB ] = ReactionSet ;
105+ const { getAllByRole } = render ( < TestComponent rtcSession = { rtcSession } /> ) ;
106+ act ( ( ) => room . testSendReaction ( memberEventAlice , reactionA , membership ) ) ;
107+ act ( ( ) => room . testSendReaction ( memberEventBob , reactionB , membership ) ) ;
108+ const [ reactionElementA , reactionElementB ] = getAllByRole ( 'presentation' ) ;
109+ expect ( reactionElementA . innerHTML ) . toEqual ( reactionA . emoji ) ;
110+ expect ( reactionElementB . innerHTML ) . toEqual ( reactionB . emoji ) ;
111+ } ) ;
112+
113+ test ( "hides reactions when reaction animations are disabled" , ( ) => {
114+ showReactions . setValue ( false ) ;
115+ const reaction = ReactionSet [ 0 ] ;
116+ const room = new MockRoom ( memberUserIdAlice ) ;
117+ const rtcSession = new MockRTCSession (
118+ room ,
119+ membership ,
120+ ) ;
121+ act ( ( ) => room . testSendReaction ( memberEventAlice , reaction , membership ) ) ;
122+ const { container } = render ( < TestComponent rtcSession = { rtcSession } /> ) ;
123+ expect ( container . getElementsByTagName ( "span" ) ) . toHaveLength (
124+ 0
125+ ) ;
126+ } ) ;
0 commit comments