125 lines
4.5 KiB
TypeScript
125 lines
4.5 KiB
TypeScript
import { ResendAllMessages } from './ResendAllMessages'
|
|
import { Result } from '@standardnotes/domain-core'
|
|
import { PkcKeyPair } from '@standardnotes/sncrypto-common'
|
|
import { AsymmetricMessagePayloadType } from '@standardnotes/models'
|
|
|
|
describe('ResendAllMessages', () => {
|
|
let mockDecryptOwnMessage: any
|
|
let mockMessageServer: any
|
|
let mockResendMessage: any
|
|
let mockFindContact: any
|
|
|
|
let useCase: ResendAllMessages
|
|
let params: {
|
|
keys: { encryption: PkcKeyPair; signing: PkcKeyPair }
|
|
previousKeys?: { encryption: PkcKeyPair; signing: PkcKeyPair }
|
|
}
|
|
|
|
beforeEach(() => {
|
|
jest.clearAllMocks()
|
|
|
|
mockDecryptOwnMessage = {
|
|
execute: jest.fn(),
|
|
}
|
|
|
|
mockMessageServer = {
|
|
getOutboundUserMessages: jest.fn(),
|
|
deleteMessage: jest.fn(),
|
|
}
|
|
|
|
mockResendMessage = {
|
|
execute: jest.fn(),
|
|
}
|
|
|
|
mockFindContact = {
|
|
execute: jest.fn(),
|
|
}
|
|
|
|
useCase = new ResendAllMessages(mockResendMessage, mockDecryptOwnMessage, mockMessageServer, mockFindContact)
|
|
params = {
|
|
keys: {
|
|
encryption: { publicKey: 'new_public_key', privateKey: 'new_private_key' },
|
|
signing: { publicKey: 'new_public_key', privateKey: 'new_private_key' },
|
|
},
|
|
}
|
|
})
|
|
|
|
it('should successfully resend all messages', async () => {
|
|
const messages = {
|
|
data: { messages: [{ recipient_uuid: 'uuid', uuid: 'uuid', encrypted_message: 'encrypted_message' }] },
|
|
}
|
|
const recipient = { publicKeySet: { encryption: 'public_key' } }
|
|
const decryptedMessage = { type: AsymmetricMessagePayloadType.ContactShare }
|
|
|
|
mockMessageServer.getOutboundUserMessages.mockReturnValue(messages)
|
|
mockFindContact.execute.mockReturnValue(Result.ok(recipient))
|
|
mockDecryptOwnMessage.execute.mockReturnValue(Result.ok(decryptedMessage))
|
|
|
|
const result = await useCase.execute(params)
|
|
|
|
expect(result).toEqual(Result.ok())
|
|
expect(mockMessageServer.getOutboundUserMessages).toHaveBeenCalled()
|
|
expect(mockFindContact.execute).toHaveBeenCalled()
|
|
expect(mockDecryptOwnMessage.execute).toHaveBeenCalled()
|
|
expect(mockResendMessage.execute).toHaveBeenCalled()
|
|
expect(mockMessageServer.deleteMessage).toHaveBeenCalled()
|
|
})
|
|
|
|
it('should handle errors while getting outbound user messages', async () => {
|
|
mockMessageServer.getOutboundUserMessages.mockReturnValue({ data: { error: 'Error' } })
|
|
|
|
const result = await useCase.execute(params)
|
|
|
|
expect(result.isFailed()).toBeTruthy()
|
|
expect(result.getError()).toBe('Failed to get outbound user messages')
|
|
})
|
|
|
|
it('should handle errors while finding contact', async () => {
|
|
const messages = {
|
|
data: { messages: [{ recipient_uuid: 'uuid', uuid: 'uuid', encrypted_message: 'encrypted_message' }] },
|
|
}
|
|
|
|
mockMessageServer.getOutboundUserMessages.mockReturnValue(messages)
|
|
mockFindContact.execute.mockReturnValue(Result.fail('Contact not found'))
|
|
|
|
const result = await useCase.execute(params)
|
|
|
|
expect(result.isFailed()).toBeTruthy()
|
|
expect(result.getError()).toContain('Contact not found')
|
|
})
|
|
|
|
it('should skip messages of excluded types', async () => {
|
|
const messages = {
|
|
data: {
|
|
messages: [
|
|
{ recipient_uuid: 'uuid', uuid: 'uuid', encrypted_message: 'encrypted_message' },
|
|
{ recipient_uuid: 'uuid2', uuid: 'uuid2', encrypted_message: 'encrypted_message2' },
|
|
],
|
|
},
|
|
}
|
|
const recipient = { publicKeySet: { encryption: 'public_key' } }
|
|
const decryptedMessage1 = { type: AsymmetricMessagePayloadType.SenderKeypairChanged }
|
|
const decryptedMessage2 = { type: AsymmetricMessagePayloadType.ContactShare }
|
|
|
|
mockMessageServer.getOutboundUserMessages.mockReturnValue(messages)
|
|
mockFindContact.execute.mockReturnValue(Result.ok(recipient))
|
|
|
|
mockDecryptOwnMessage.execute
|
|
.mockReturnValueOnce(Result.ok(decryptedMessage1))
|
|
.mockReturnValueOnce(Result.ok(decryptedMessage2))
|
|
|
|
const result = await useCase.execute(params)
|
|
|
|
expect(result).toEqual(Result.ok())
|
|
expect(mockMessageServer.getOutboundUserMessages).toHaveBeenCalled()
|
|
expect(mockFindContact.execute).toHaveBeenCalledTimes(2)
|
|
expect(mockDecryptOwnMessage.execute).toHaveBeenCalledTimes(2)
|
|
expect(mockResendMessage.execute).toHaveBeenCalledTimes(1)
|
|
expect(mockMessageServer.deleteMessage).toHaveBeenCalledTimes(1)
|
|
expect(mockResendMessage.execute).toHaveBeenCalledWith(
|
|
expect.objectContaining({ rawMessage: messages.data.messages[1] }),
|
|
)
|
|
expect(mockMessageServer.deleteMessage).toHaveBeenCalledWith({ messageUuid: messages.data.messages[1].uuid })
|
|
})
|
|
})
|