163 lines
		
	
	
	
		
			5.4 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
	
		
			5.4 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2021 Signal Messenger, LLC
							 | 
						||
| 
								 | 
							
								// SPDX-License-Identifier: AGPL-3.0-only
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { assert } from 'chai';
							 | 
						||
| 
								 | 
							
								import { v4 as uuid } from 'uuid';
							 | 
						||
| 
								 | 
							
								import { RowType } from '../../../components/ConversationList';
							 | 
						||
| 
								 | 
							
								import { FindDirection } from '../../../components/leftPane/LeftPaneHelper';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { LeftPaneArchiveHelper } from '../../../components/leftPane/LeftPaneArchiveHelper';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('LeftPaneArchiveHelper', () => {
							 | 
						||
| 
								 | 
							
								  const fakeConversation = () => ({
							 | 
						||
| 
								 | 
							
								    id: uuid(),
							 | 
						||
| 
								 | 
							
								    title: uuid(),
							 | 
						||
| 
								 | 
							
								    type: 'direct' as const,
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('getRowCount', () => {
							 | 
						||
| 
								 | 
							
								    it('returns the number of archived conversations', () => {
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        new LeftPaneArchiveHelper({ archivedConversations: [] }).getRowCount(),
							 | 
						||
| 
								 | 
							
								        0
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        new LeftPaneArchiveHelper({
							 | 
						||
| 
								 | 
							
								          archivedConversations: [fakeConversation(), fakeConversation()],
							 | 
						||
| 
								 | 
							
								        }).getRowCount(),
							 | 
						||
| 
								 | 
							
								        2
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('getRowIndexToScrollTo', () => {
							 | 
						||
| 
								 | 
							
								    it('returns undefined if no conversation is selected', () => {
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({
							 | 
						||
| 
								 | 
							
								        archivedConversations: [fakeConversation(), fakeConversation()],
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.isUndefined(helper.getRowIndexToScrollTo(undefined));
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it('returns undefined if the selected conversation is not pinned or non-pinned', () => {
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({
							 | 
						||
| 
								 | 
							
								        archivedConversations: [fakeConversation(), fakeConversation()],
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.isUndefined(helper.getRowIndexToScrollTo(uuid()));
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it("returns the archived conversation's index", () => {
							 | 
						||
| 
								 | 
							
								      const archivedConversations = [fakeConversation(), fakeConversation()];
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({ archivedConversations });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        helper.getRowIndexToScrollTo(archivedConversations[0].id),
							 | 
						||
| 
								 | 
							
								        0
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        helper.getRowIndexToScrollTo(archivedConversations[1].id),
							 | 
						||
| 
								 | 
							
								        1
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('getRow', () => {
							 | 
						||
| 
								 | 
							
								    it('returns each conversation as a row', () => {
							 | 
						||
| 
								 | 
							
								      const archivedConversations = [fakeConversation(), fakeConversation()];
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({ archivedConversations });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.deepEqual(helper.getRow(0), {
							 | 
						||
| 
								 | 
							
								        type: RowType.Conversation,
							 | 
						||
| 
								 | 
							
								        conversation: archivedConversations[0],
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      assert.deepEqual(helper.getRow(1), {
							 | 
						||
| 
								 | 
							
								        type: RowType.Conversation,
							 | 
						||
| 
								 | 
							
								        conversation: archivedConversations[1],
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('getConversationAndMessageAtIndex', () => {
							 | 
						||
| 
								 | 
							
								    it('returns the conversation at the given index when it exists', () => {
							 | 
						||
| 
								 | 
							
								      const archivedConversations = [fakeConversation(), fakeConversation()];
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({ archivedConversations });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        helper.getConversationAndMessageAtIndex(0)?.conversationId,
							 | 
						||
| 
								 | 
							
								        archivedConversations[0].id
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        helper.getConversationAndMessageAtIndex(1)?.conversationId,
							 | 
						||
| 
								 | 
							
								        archivedConversations[1].id
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it('when requesting an index out of bounds, returns the last conversation', () => {
							 | 
						||
| 
								 | 
							
								      const archivedConversations = [fakeConversation(), fakeConversation()];
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({ archivedConversations });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        helper.getConversationAndMessageAtIndex(2)?.conversationId,
							 | 
						||
| 
								 | 
							
								        archivedConversations[1].id
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        helper.getConversationAndMessageAtIndex(99)?.conversationId,
							 | 
						||
| 
								 | 
							
								        archivedConversations[1].id
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // This is mostly a resilience measure in case we're ever called with an invalid
							 | 
						||
| 
								 | 
							
								      //   index.
							 | 
						||
| 
								 | 
							
								      assert.strictEqual(
							 | 
						||
| 
								 | 
							
								        helper.getConversationAndMessageAtIndex(-1)?.conversationId,
							 | 
						||
| 
								 | 
							
								        archivedConversations[1].id
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    it('returns undefined if there are no archived conversations', () => {
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({ archivedConversations: [] });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.isUndefined(helper.getConversationAndMessageAtIndex(0));
							 | 
						||
| 
								 | 
							
								      assert.isUndefined(helper.getConversationAndMessageAtIndex(1));
							 | 
						||
| 
								 | 
							
								      assert.isUndefined(helper.getConversationAndMessageAtIndex(-1));
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('getConversationAndMessageInDirection', () => {
							 | 
						||
| 
								 | 
							
								    it('returns the next conversation when searching downward', () => {
							 | 
						||
| 
								 | 
							
								      const archivedConversations = [fakeConversation(), fakeConversation()];
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({ archivedConversations });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.deepEqual(
							 | 
						||
| 
								 | 
							
								        helper.getConversationAndMessageInDirection(
							 | 
						||
| 
								 | 
							
								          { direction: FindDirection.Down, unreadOnly: false },
							 | 
						||
| 
								 | 
							
								          archivedConversations[0].id,
							 | 
						||
| 
								 | 
							
								          undefined
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        { conversationId: archivedConversations[1].id }
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Additional tests are found with `getConversationInDirection`.
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('shouldRecomputeRowHeights', () => {
							 | 
						||
| 
								 | 
							
								    it('always returns false because row heights are constant', () => {
							 | 
						||
| 
								 | 
							
								      const helper = new LeftPaneArchiveHelper({
							 | 
						||
| 
								 | 
							
								        archivedConversations: [fakeConversation(), fakeConversation()],
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assert.isFalse(
							 | 
						||
| 
								 | 
							
								        helper.shouldRecomputeRowHeights({
							 | 
						||
| 
								 | 
							
								          archivedConversations: [fakeConversation()],
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								      assert.isFalse(
							 | 
						||
| 
								 | 
							
								        helper.shouldRecomputeRowHeights({
							 | 
						||
| 
								 | 
							
								          archivedConversations: [fakeConversation(), fakeConversation()],
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |