DRVDOC-1255: Fix issue with recent docs timestamp
[ProtonMail-WebClient.git] / packages / docs-core / lib / Services / RecentDocuments / RecentDocumentsService.spec.ts
blob9f7b0a5fd56f47a0cf7ee24c5ef921efa3a1360f
1 import { InternalEventBus, ServerTime } from '@proton/docs-shared'
2 import { RecentDocumentsService } from './RecentDocumentsService'
3 import type { DecryptedNode, DriveCompat } from '@proton/drive-store/lib'
4 import { type RecentDocumentsSnapshotData } from './types'
5 import type { DocsApi } from '../../Api/DocsApi'
6 import type { LoggerInterface } from '@proton/utils/logs'
7 import type { RecentDocumentAPIItem } from '../../Api/Types/GetRecentsResponse'
9 describe('RecentDocumentsService', () => {
10   const mockData: RecentDocumentAPIItem[] = [
11     { LinkID: 'link1', ContextShareID: 'share1', LastOpenTime: 1 } as RecentDocumentAPIItem,
12   ]
13   const mockDecryptedNodes: DecryptedNode[] = [
14     {
15       volumeId: 'volume1',
16       nodeId: 'link1',
17       name: 'name1',
18       hash: 'hash',
19       createTime: 1,
20       mimeType: '',
21       parentNodeId: 'parentLink1',
22       signatureAddress: 'me@proton.ch',
23     },
24   ]
26   let service: RecentDocumentsService
27   let driveCompat: DriveCompat
28   let docsApi: DocsApi
30   beforeEach(() => {
31     const eventBus = new InternalEventBus()
32     driveCompat = {
33       getNodes: jest.fn().mockResolvedValue(mockDecryptedNodes),
34       getNodePaths: jest.fn().mockResolvedValue([['location', 'link1']]),
35       getNodesAreShared: jest.fn().mockResolvedValue([false]),
36     } as unknown as DriveCompat
38     docsApi = {
39       fetchRecentDocuments: jest.fn().mockResolvedValue({
40         isFailed: () => false,
41         getValue: () => ({ RecentDocuments: mockData }),
42       }),
43     } as unknown as DocsApi
45     const logger = {
46       error: console.error,
47     } as unknown as LoggerInterface
49     service = new RecentDocumentsService(eventBus, driveCompat, docsApi, logger)
50   })
52   describe('fetch', () => {
53     test('Load recent documents from local storage', async () => {
54       await service.fetch()
55     })
57     test('Load links from driveCompat for every id returned from local storage', async () => {
58       await service.fetch()
60       expect(driveCompat.getNodes).toHaveBeenCalled()
61       expect(driveCompat.getNodePaths).toHaveBeenCalled()
62     })
64     test('service state will be "fetching until fetch resolves"', async () => {
65       const promise = service.fetch()
67       expect(service.state).toBe('fetching')
69       await promise
71       expect(service.state).toBe('done')
72     })
74     test('service state will be "fetching until fetch resolves"', async () => {
75       const promise = service.fetch()
77       expect(service.state).toBe('fetching')
79       await promise
81       expect(service.state).toBe('done')
82     })
83   })
85   describe('getSnapshot', () => {
86     test('Will return populated recent document data when fetch completes', async () => {
87       const mockSnapshotData: RecentDocumentsSnapshotData = {
88         name: 'name1',
89         volumeId: 'volume1',
90         linkId: 'link1',
91         lastViewed: new ServerTime(1),
92         parentLinkId: 'parentLink1',
93         createdBy: 'me@proton.ch',
94       }
96       const promise = service.fetch()
98       expect(service.getSnapshot().data).toEqual([])
100       await promise
102       expect(service.getSnapshot().data?.[0]).toMatchObject(mockSnapshotData)
103     })
104   })