kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
143 wiersze
3.9 KiB
TypeScript
143 wiersze
3.9 KiB
TypeScript
import test from 'ava'
|
|
|
|
import { TwilioConversationClient } from '@/services/twilio-conversation'
|
|
|
|
import './_utils'
|
|
|
|
test('TwilioConversationClient.createConversation', async (t) => {
|
|
if (!process.env.TWILIO_ACCOUNT_SID || !process.env.TWILIO_AUTH_TOKEN) {
|
|
return t.pass()
|
|
}
|
|
|
|
const client = new TwilioConversationClient()
|
|
|
|
const friendlyName = 'create-conversation-test'
|
|
const conversation = await client.createConversation(friendlyName)
|
|
t.is(conversation.friendly_name, friendlyName)
|
|
|
|
client.deleteConversation(conversation.sid)
|
|
})
|
|
|
|
test('TwilioConversationClient.addParticipant', async (t) => {
|
|
if (
|
|
!process.env.TWILIO_ACCOUNT_SID ||
|
|
!process.env.TWILIO_AUTH_TOKEN ||
|
|
!process.env.TWILIO_TEST_PHONE_NUMBER
|
|
) {
|
|
return t.pass()
|
|
}
|
|
|
|
const client = new TwilioConversationClient()
|
|
|
|
const { sid: conversationSid } = await client.createConversation(
|
|
'add-participant-test'
|
|
)
|
|
const { sid: participantSid } = await client.addParticipant({
|
|
conversationSid,
|
|
recipientPhoneNumber: process.env.TWILIO_TEST_PHONE_NUMBER
|
|
})
|
|
t.is(participantSid.startsWith('MB'), true)
|
|
|
|
await client.deleteConversation(conversationSid)
|
|
})
|
|
|
|
test('TwilioConversationClient.sendMessage', async (t) => {
|
|
if (!process.env.TWILIO_ACCOUNT_SID || !process.env.TWILIO_AUTH_TOKEN) {
|
|
return t.pass()
|
|
}
|
|
|
|
const client = new TwilioConversationClient()
|
|
|
|
const text = 'Hello, world!'
|
|
const { sid: conversationSid } = await client.createConversation(
|
|
'send-message-test'
|
|
)
|
|
const message = await client.sendMessage({ conversationSid, text })
|
|
t.is(message.body, text)
|
|
|
|
await client.deleteConversation(conversationSid)
|
|
})
|
|
|
|
test('TwilioConversationClient.fetchMessages', async (t) => {
|
|
if (!process.env.TWILIO_ACCOUNT_SID || !process.env.TWILIO_AUTH_TOKEN) {
|
|
return t.pass()
|
|
}
|
|
|
|
const client = new TwilioConversationClient()
|
|
|
|
const { sid: conversationSid } = await client.createConversation(
|
|
'fetch-messages-test'
|
|
)
|
|
const { messages, meta } = await client.fetchMessages(conversationSid)
|
|
t.true(Array.isArray(messages))
|
|
t.is(meta.page, 0)
|
|
|
|
await client.deleteConversation(conversationSid)
|
|
})
|
|
|
|
test('TwilioConversationClient.sendAndWaitForReply', async (t) => {
|
|
if (
|
|
!process.env.TWILIO_ACCOUNT_SID ||
|
|
!process.env.TWILIO_AUTH_TOKEN ||
|
|
!process.env.TWILIO_TEST_PHONE_NUMBER
|
|
) {
|
|
return t.pass()
|
|
}
|
|
|
|
t.timeout(2 * 60 * 1000)
|
|
const client = new TwilioConversationClient()
|
|
|
|
await t.throwsAsync(
|
|
async () => {
|
|
await client.sendAndWaitForReply({
|
|
recipientPhoneNumber: process.env.TWILIO_TEST_PHONE_NUMBER as string,
|
|
text: 'Please confirm by replying with "yes" or "no".',
|
|
name: 'wait-for-reply-test',
|
|
validate: (message) =>
|
|
['yes', 'no'].includes(message.body.toLowerCase()),
|
|
timeoutMs: 10000, // 10 seconds
|
|
intervalMs: 5000 // 5 seconds
|
|
})
|
|
},
|
|
{
|
|
instanceOf: Error,
|
|
message: 'Reached timeout waiting for reply'
|
|
}
|
|
)
|
|
})
|
|
|
|
test('TwilioConversationClient.sendAndWaitForReply.stopSignal', async (t) => {
|
|
if (
|
|
!process.env.TWILIO_ACCOUNT_SID ||
|
|
!process.env.TWILIO_AUTH_TOKEN ||
|
|
!process.env.TWILIO_TEST_PHONE_NUMBER
|
|
) {
|
|
return t.pass()
|
|
}
|
|
|
|
t.timeout(2 * 60 * 1000)
|
|
const client = new TwilioConversationClient()
|
|
|
|
await t.throwsAsync(
|
|
async () => {
|
|
const controller = new AbortController()
|
|
const promise = client.sendAndWaitForReply({
|
|
recipientPhoneNumber: process.env.TWILIO_TEST_PHONE_NUMBER as string,
|
|
text: 'Please confirm by replying with "yes" or "no".',
|
|
name: 'wait-for-reply-test',
|
|
validate: (message) =>
|
|
['yes', 'no'].includes(message.body.toLowerCase()),
|
|
timeoutMs: 10000, // 10 seconds
|
|
intervalMs: 5000, // 5 seconds
|
|
stopSignal: controller.signal
|
|
})
|
|
controller.abort('Aborted')
|
|
return promise
|
|
},
|
|
{
|
|
instanceOf: Error,
|
|
message: 'Aborted'
|
|
}
|
|
)
|
|
})
|