1+ import { SimpleChange } from '@angular/core' ;
12import { ComponentFixture , TestBed } from '@angular/core/testing' ;
2- import { ChatClientService } from '../chat-client.service' ;
3+ import { Subject } from 'rxjs' ;
4+ import { ChatClientService , ClientEvent } from '../chat-client.service' ;
35import { generateMockChannels } from '../mocks' ;
46import { AvatarComponent } from './avatar.component' ;
57
@@ -10,10 +12,21 @@ describe('AvatarComponent', () => {
1012 const imageUrl = 'https://picsum.photos/200/300' ;
1113 let queryImg : ( ) => HTMLImageElement | null ;
1214 let queryFallbackImg : ( ) => HTMLImageElement | null ;
13- let chatClientServiceMock : { chatClient : { user : { id : string } } } ;
15+ let queryOnlineIndicator : ( ) => HTMLElement | null ;
16+ let queryUsersMock : jasmine . Spy ;
17+ let events$ : Subject < ClientEvent > ;
18+ let chatClientServiceMock : {
19+ chatClient : { user : { id : string } ; queryUsers : jasmine . Spy } ;
20+ events$ : Subject < ClientEvent > ;
21+ } ;
1422
1523 beforeEach ( ( ) => {
16- chatClientServiceMock = { chatClient : { user : { id : 'current-user' } } } ;
24+ queryUsersMock = jasmine . createSpy ( ) ;
25+ events$ = new Subject ( ) ;
26+ chatClientServiceMock = {
27+ chatClient : { user : { id : 'current-user' } , queryUsers : queryUsersMock } ,
28+ events$,
29+ } ;
1730 TestBed . configureTestingModule ( {
1831 declarations : [ AvatarComponent ] ,
1932 providers : [
@@ -26,6 +39,8 @@ describe('AvatarComponent', () => {
2639 queryFallbackImg = ( ) =>
2740 nativeElement . querySelector ( '[data-testid=fallback-img]' ) ;
2841 queryImg = ( ) => nativeElement . querySelector ( '[data-testid=avatar-img]' ) ;
42+ queryOnlineIndicator = ( ) =>
43+ nativeElement . querySelector ( '[data-testid=online-indicator]' ) ;
2944 } ) ;
3045
3146 const waitForImgComplete = ( ) => {
@@ -208,4 +223,150 @@ describe('AvatarComponent', () => {
208223
209224 expect ( queryImg ( ) ) . toBeNull ( ) ;
210225 } ) ;
226+
227+ it ( 'should display online indicator in 1:1 channels' , async ( ) => {
228+ const channel = generateMockChannels ( ) [ 0 ] ;
229+ channel . state . members = {
230+ otheruser : {
231+ user_id : 'otheruser' ,
232+ user : { id : 'otheruser' , name : 'Jack' , image : 'url/to/img' } ,
233+ } ,
234+ [ chatClientServiceMock . chatClient . user . id ] : {
235+ user_id : chatClientServiceMock . chatClient . user . id ,
236+ user : { id : chatClientServiceMock . chatClient . user . id , name : 'Sara' } ,
237+ } ,
238+ } ;
239+ queryUsersMock . and . resolveTo ( { users : [ { online : true } ] } ) ;
240+ component . channel = channel ;
241+ void component . ngOnChanges ( { channel : { } as SimpleChange } ) ;
242+ await fixture . whenStable ( ) ;
243+ fixture . detectChanges ( ) ;
244+
245+ expect ( queryOnlineIndicator ( ) ) . not . toBeNull ( ) ;
246+ } ) ;
247+
248+ it ( 'should only display online indicator if user is online' , async ( ) => {
249+ const channel = generateMockChannels ( ) [ 0 ] ;
250+ channel . state . members = {
251+ otheruser : {
252+ user_id : 'otheruser' ,
253+ user : { id : 'otheruser' , name : 'Jack' , image : 'url/to/img' } ,
254+ } ,
255+ [ chatClientServiceMock . chatClient . user . id ] : {
256+ user_id : chatClientServiceMock . chatClient . user . id ,
257+ user : { id : chatClientServiceMock . chatClient . user . id , name : 'Sara' } ,
258+ } ,
259+ } ;
260+ queryUsersMock . and . resolveTo ( { users : [ { online : false } ] } ) ;
261+ component . channel = channel ;
262+ void component . ngOnChanges ( { channel : { } as SimpleChange } ) ;
263+ await fixture . whenStable ( ) ;
264+ fixture . detectChanges ( ) ;
265+
266+ expect ( queryOnlineIndicator ( ) ) . toBeNull ( ) ;
267+ } ) ;
268+
269+ it ( `should update online indicator if user's presence changed` , async ( ) => {
270+ const channel = generateMockChannels ( ) [ 0 ] ;
271+ channel . state . members = {
272+ otheruser : {
273+ user_id : 'otheruser' ,
274+ user : { id : 'otheruser' , name : 'Jack' , image : 'url/to/img' } ,
275+ } ,
276+ [ chatClientServiceMock . chatClient . user . id ] : {
277+ user_id : chatClientServiceMock . chatClient . user . id ,
278+ user : { id : chatClientServiceMock . chatClient . user . id , name : 'Sara' } ,
279+ } ,
280+ } ;
281+ queryUsersMock . and . resolveTo ( { users : [ { online : false } ] } ) ;
282+ component . channel = channel ;
283+ void component . ngOnChanges ( { channel : { } as SimpleChange } ) ;
284+ await fixture . whenStable ( ) ;
285+ fixture . detectChanges ( ) ;
286+
287+ expect ( queryOnlineIndicator ( ) ) . toBeNull ( ) ;
288+
289+ events$ . next ( {
290+ eventType : 'user.presence.changed' ,
291+ event : {
292+ type : 'user.presence.changed' ,
293+ user : { id : 'otheruser' , online : true } ,
294+ } ,
295+ } ) ;
296+ fixture . detectChanges ( ) ;
297+
298+ expect ( queryOnlineIndicator ( ) ) . not . toBeNull ( ) ;
299+ } ) ;
300+
301+ it ( `should handle query users error when displaying the online indicator` , async ( ) => {
302+ const channel = generateMockChannels ( ) [ 0 ] ;
303+ channel . state . members = {
304+ otheruser : {
305+ user_id : 'otheruser' ,
306+ user : {
307+ id : 'otheruser' ,
308+ name : 'Jack' ,
309+ image : 'url/to/img' ,
310+ online : true ,
311+ } ,
312+ } ,
313+ [ chatClientServiceMock . chatClient . user . id ] : {
314+ user_id : chatClientServiceMock . chatClient . user . id ,
315+ user : { id : chatClientServiceMock . chatClient . user . id , name : 'Sara' } ,
316+ } ,
317+ } ;
318+ queryUsersMock . and . rejectWith ( new Error ( 'Permission denied' ) ) ;
319+ component . channel = channel ;
320+ void component . ngOnChanges ( { channel : { } as SimpleChange } ) ;
321+ await fixture . whenStable ( ) ;
322+ fixture . detectChanges ( ) ;
323+
324+ expect ( queryOnlineIndicator ( ) ) . not . toBeNull ( ) ;
325+ } ) ;
326+
327+ it ( `shouldn't display online indicator in not 1:1 channels` , async ( ) => {
328+ const channel = generateMockChannels ( ) [ 0 ] ;
329+ channel . state . members = {
330+ otheruser : {
331+ user_id : 'otheruser' ,
332+ user : { id : 'otheruser' , name : 'Jack' , image : 'url/to/img' } ,
333+ } ,
334+ thirduser : {
335+ user_id : 'thirduser' ,
336+ user : { id : 'thirduser' , name : 'John' , image : 'url/to/img' } ,
337+ } ,
338+ [ chatClientServiceMock . chatClient . user . id ] : {
339+ user_id : chatClientServiceMock . chatClient . user . id ,
340+ user : { id : chatClientServiceMock . chatClient . user . id , name : 'Sara' } ,
341+ } ,
342+ } ;
343+ queryUsersMock . and . resolveTo ( { users : [ { online : true } ] } ) ;
344+ component . channel = channel ;
345+ void component . ngOnChanges ( { channel : { } as SimpleChange } ) ;
346+ await fixture . whenStable ( ) ;
347+ fixture . detectChanges ( ) ;
348+
349+ expect ( queryOnlineIndicator ( ) ) . toBeNull ( ) ;
350+ } ) ;
351+
352+ it ( `shouldn't display online indicator if #showOnlineIndicator is false` , async ( ) => {
353+ const channel = generateMockChannels ( ) [ 0 ] ;
354+ channel . state . members = {
355+ otheruser : {
356+ user_id : 'otheruser' ,
357+ user : { id : 'otheruser' , name : 'Jack' , image : 'url/to/img' } ,
358+ } ,
359+ [ chatClientServiceMock . chatClient . user . id ] : {
360+ user_id : chatClientServiceMock . chatClient . user . id ,
361+ user : { id : chatClientServiceMock . chatClient . user . id , name : 'Sara' } ,
362+ } ,
363+ } ;
364+ queryUsersMock . and . resolveTo ( { users : [ { online : true } ] } ) ;
365+ component . channel = channel ;
366+ void component . ngOnChanges ( { channel : { } as SimpleChange } ) ;
367+ await fixture . whenStable ( ) ;
368+ fixture . detectChanges ( ) ;
369+
370+ expect ( queryOnlineIndicator ( ) ) . not . toBeNull ( ) ;
371+ } ) ;
211372} ) ;
0 commit comments