82 lines
3.1 KiB
TypeScript
82 lines
3.1 KiB
TypeScript
import { expect, test } from 'vitest'
|
|
import _ from 'lodash'
|
|
import * as utils from './utils'
|
|
import * as config from './config'
|
|
import * as chat from '../src'
|
|
|
|
const apiUrl = config.get('API_URL')
|
|
|
|
test('api prevents creating conversation with an invalid fid', async () => {
|
|
const client = await chat.Client.connect({ apiUrl })
|
|
|
|
const convFid = utils.getConversationFid()
|
|
const invalidUserIds = [
|
|
`invalid+${convFid}`, // invalid character
|
|
`invalid_${convFid}_${convFid}_${convFid}`, // too long
|
|
]
|
|
|
|
for (const id of invalidUserIds) {
|
|
const promise = client.createConversation({ id })
|
|
await expect(promise).rejects.toThrow(chat.InvalidPayloadError)
|
|
}
|
|
|
|
for (const id of invalidUserIds) {
|
|
const promise = client.getOrCreateConversation({ id })
|
|
await expect(promise).rejects.toThrow(chat.InvalidPayloadError)
|
|
}
|
|
})
|
|
|
|
test('api prevents creating multiple conversations with the same foreign id', async () => {
|
|
const client = await chat.Client.connect({ apiUrl })
|
|
|
|
const conversationFid = utils.getConversationFid()
|
|
|
|
const createConversation = () => client.createConversation({ id: conversationFid })
|
|
|
|
await createConversation()
|
|
await expect(createConversation).rejects.toThrow(chat.AlreadyExistsError)
|
|
})
|
|
|
|
test('get or create a conversation always returns the same conversation', async () => {
|
|
const client = await chat.Client.connect({ apiUrl })
|
|
|
|
const {
|
|
conversation: { id: conversationId },
|
|
} = await client.createConversation({})
|
|
|
|
const getOrCreate = () => client.getConversation({ id: conversationId }).then((r) => r.conversation.id)
|
|
|
|
expect(await getOrCreate()).toBe(conversationId)
|
|
expect(await getOrCreate()).toBe(conversationId) // operation is idempotent
|
|
})
|
|
|
|
test('get or create a conversation with a fid always returns the same conversation', async () => {
|
|
const client = await chat.Client.connect({ apiUrl })
|
|
|
|
const conversationFid = utils.getConversationFid()
|
|
await client.createConversation({ id: conversationFid })
|
|
|
|
const getOrCreate = () => client.getConversation({ id: conversationFid }).then((r) => r.conversation.id)
|
|
|
|
expect(await getOrCreate()).toBe(conversationFid)
|
|
expect(await getOrCreate()).toBe(conversationFid) // operation is idempotent
|
|
})
|
|
|
|
test('get conversation is only allowed for participants', async () => {
|
|
const client = new chat.Client({ apiUrl })
|
|
|
|
const user1 = await client.createUser({})
|
|
const user2 = await client.createUser({})
|
|
const user3 = await client.createUser({})
|
|
|
|
const { conversation } = await client.createConversation({ 'x-user-key': user1.key })
|
|
await client.addParticipant({ conversationId: conversation.id, 'x-user-key': user1.key, userId: user2.user.id })
|
|
|
|
const promise1 = client.getConversation({ id: conversation.id, 'x-user-key': user1.key })
|
|
await expect(promise1).resolves.toBeTruthy()
|
|
const promise2 = client.getConversation({ id: conversation.id, 'x-user-key': user2.key })
|
|
await expect(promise2).resolves.toBeTruthy()
|
|
const promise3 = client.getConversation({ id: conversation.id, 'x-user-key': user3.key })
|
|
await expect(promise3).rejects.toThrow(chat.ForbiddenError)
|
|
})
|