UNPKG

@amityco/ts-sdk-react-native

Version:

Amity Social Cloud Typescript SDK

128 lines (99 loc) 4.19 kB
import { ASCApiError } from '~/core/errors'; import { disableCache, enableCache, pullFromCache, pushToCache } from '~/cache/api'; import { client, generateRawMessage } from '~/utils/tests'; import { softDeleteMessage } from '../softDeleteMessage'; import { onMessageDeleted } from '../../events'; import { convertFromRaw } from '../../utils'; const rawMessageToDelete = generateRawMessage(); const messageToDelete = convertFromRaw(rawMessageToDelete); const { messageId: deleteId } = messageToDelete; const rawDeletedMessage = { ...rawMessageToDelete, isDeleted: true }; const deletedMessage = convertFromRaw(rawDeletedMessage); const getResolvedMessageValue = () => ({ data: { messages: [rawDeletedMessage], users: [], files: [], }, }); describe('softDeleteMessage', () => { // integration_test_id: 16106137-0e4a-4d2f-b8cf-1a6c571bf0c7 test('should return deleted message', async () => { client.http.delete = jest.fn(); client.http.get = jest.fn().mockResolvedValueOnce(getResolvedMessageValue()); await expect(softDeleteMessage(deleteId)).resolves.toEqual(deletedMessage); }); // integration_test_id: 27d393d9-480e-4eec-bfdb-f04738801b04 test('should return 400400 if message not found', async () => { client.http.delete = jest .fn() .mockRejectedValueOnce( new ASCApiError('not found', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR), ); await expect(softDeleteMessage(deleteId)).rejects.toThrow('400400'); }); test('should update cache after deleted messages', async () => { enableCache(); client.http.delete = jest.fn(); client.http.get = jest.fn().mockResolvedValueOnce(getResolvedMessageValue()); pushToCache(['message', 'get', deleteId], messageToDelete); await softDeleteMessage(deleteId); const recieved = pullFromCache<Amity.Message>(['message', 'get', deleteId])?.data; expect(recieved).toEqual(deletedMessage); disableCache(); }); test('should fire event `onMessageDeleted`', async () => { let dispose; client.http.delete = jest.fn(); client.http.get = jest.fn().mockResolvedValueOnce(getResolvedMessageValue()); const callbackPromise = new Promise(resolve => { dispose = onMessageDeleted(resolve); }).finally(dispose); await softDeleteMessage(deleteId); await expect(callbackPromise).resolves.toEqual(deletedMessage); }); }); describe('softDeleteMessage.optimistically', () => { beforeEach(() => enableCache()); afterEach(() => disableCache()); test('should update `isDeleted` in cache after deleted message', () => { pushToCache(['message', 'get', deleteId], messageToDelete); softDeleteMessage.optimistically(deleteId); const recieved = pullFromCache<Amity.Message>(['message', 'get', deleteId])?.data; expect(recieved).toEqual({ ...deletedMessage, updatedAt: expect.anything(), }); }); /* TODO: re-enable this after fixed channel message count calculation */ test.skip('should decrease message count after deleted message', () => { const { channelId } = messageToDelete; pushToCache(['channel', 'get', channelId], { channelId, messageCount: 2 }); pushToCache(['message', 'get', deleteId], { ...messageToDelete, channelId }); softDeleteMessage.optimistically(deleteId); const recieved = pullFromCache<Amity.StaticInternalChannel>([ 'channel', 'get', channelId, ])?.data; expect(recieved?.messageCount).toBe(1); }); test('should fire event `onMessageDeleted`', async () => { pushToCache(['message', 'get', deleteId], messageToDelete); let dispose; const callbackPromise = new Promise(resolve => { dispose = onMessageDeleted(data => { resolve(data); }); }).finally(dispose); softDeleteMessage.optimistically(deleteId); await expect(callbackPromise).resolves.toEqual({ ...deletedMessage, updatedAt: expect.anything(), }); }); test('should define object as unsynced object', () => { pushToCache(['message', 'get', deleteId], messageToDelete); expect(softDeleteMessage.optimistically(deleteId)?.cachedAt).toBe(-1); }); });