forked from StateVoicesNational/Spoke
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'scalingport-tests' into stage-main
- Loading branch information
Showing
11 changed files
with
499 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
/* eslint-disable no-unused-expressions, consistent-return */ | ||
import { r } from '../../src/server/models/' | ||
import { | ||
runGql, | ||
setupTest, | ||
cleanupTest, | ||
getGql, | ||
createUser, | ||
createInvite, | ||
createOrganization, | ||
createCampaign, | ||
createContact, | ||
createTexter, | ||
assignTexter, | ||
createScript, | ||
startCampaign, | ||
getCampaignContact | ||
} from '../test_helpers' | ||
import waitForExpect from 'wait-for-expect' | ||
|
||
let testAdminUser | ||
let testInvite | ||
let testOrganization | ||
let testCampaign | ||
let testTexterUser | ||
let testContact | ||
let assignmentId | ||
|
||
beforeEach(async () => { | ||
// Set up an entire working campaign | ||
await setupTest() | ||
testAdminUser = await createUser() | ||
testInvite = await createInvite() | ||
testOrganization = await createOrganization(testAdminUser, testInvite) | ||
testCampaign = await createCampaign(testAdminUser, testOrganization) | ||
testContact = await createContact(testCampaign) | ||
testTexterUser = await createTexter(testOrganization) | ||
await assignTexter(testAdminUser, testTexterUser, testCampaign) | ||
const dbCampaignContact = await getCampaignContact(testContact.id) | ||
assignmentId = dbCampaignContact.assignment_id | ||
await createScript(testAdminUser, testCampaign) | ||
await startCampaign(testAdminUser, testCampaign) | ||
}, global.DATABASE_SETUP_TEARDOWN_TIMEOUT) | ||
|
||
afterEach(async () => { | ||
await cleanupTest() | ||
if (r.redis) r.redis.flushdb() | ||
}, global.DATABASE_SETUP_TEARDOWN_TIMEOUT) | ||
|
||
it('should send an inital message to test contacts', async () => { | ||
const { | ||
query: [getContacts, getContactsVars], | ||
mutations | ||
} = getGql('../src/containers/TexterTodo', { | ||
messageStatus: 'needsMessage', | ||
params: { assignmentId } | ||
}) | ||
|
||
const contactsResult = await runGql(getContacts, getContactsVars, testTexterUser) | ||
|
||
const [getAssignmentContacts, assignVars] = mutations.getAssignmentContacts( | ||
contactsResult.data.assignment.contacts.map(e => e.id), | ||
false | ||
) | ||
|
||
const ret2 = await runGql(getAssignmentContacts, assignVars, testTexterUser) | ||
const contact = ret2.data.getAssignmentContacts[0] | ||
|
||
const message = { | ||
contactNumber: contact.cell, | ||
userId: testTexterUser.id, | ||
text: 'test text', | ||
assignmentId | ||
} | ||
|
||
const [messageMutation, messageVars] = mutations.sendMessage(message, contact.id) | ||
|
||
const messageResult = await runGql(messageMutation, messageVars, testTexterUser) | ||
const campaignContact = messageResult.data.sendMessage | ||
|
||
// These things are expected to be returned from the sendMessage mutation | ||
console.log('CAMPAIGNCONTACT', messageResult.data, campaignContact) | ||
expect(campaignContact.messageStatus).toBe('messaged') | ||
expect(campaignContact.messages.length).toBe(1) | ||
expect(campaignContact.messages[0].text).toBe(message.text) | ||
|
||
const expectedDbMessage = { | ||
// user_id: testTexterUser.id, //FUTURE | ||
contact_number: testContact.cell, | ||
text: message.text, | ||
assignment_id: assignmentId, | ||
// campaign_contact_id: testContact.id //FUTURE | ||
} | ||
|
||
// wait for fakeservice to mark the message as sent | ||
await waitForExpect(async () => { | ||
const dbMessage = await r.knex('message') | ||
expect(dbMessage.length).toEqual(1) | ||
expect(dbMessage[0]).toEqual( | ||
expect.objectContaining({ | ||
send_status: 'SENT', | ||
...expectedDbMessage | ||
}) | ||
) | ||
const dbCampaignContact = await getCampaignContact(testContact.id) | ||
expect(dbCampaignContact.message_status).toBe('messaged') | ||
}) | ||
|
||
// Refetch the contacts via gql to check the caching | ||
const ret3 = await runGql(getAssignmentContacts, assignVars, testTexterUser) | ||
expect(ret3.data.getAssignmentContacts[0].messageStatus).toEqual('messaged') | ||
}) | ||
|
||
it('should be able to receive a response and reply (using fakeService)', async () => { | ||
const { | ||
query: [getContacts, getContactsVars], | ||
mutations | ||
} = getGql('../src/containers/TexterTodo', { | ||
messageStatus: 'needsMessage', | ||
params: { assignmentId } | ||
}) | ||
|
||
const contactsResult = await runGql(getContacts, getContactsVars, testTexterUser) | ||
|
||
const [getAssignmentContacts, assignVars] = mutations.getAssignmentContacts( | ||
contactsResult.data.assignment.contacts.map(e => e.id), | ||
false | ||
) | ||
|
||
const ret2 = await runGql(getAssignmentContacts, assignVars, testTexterUser) | ||
const contact = ret2.data.getAssignmentContacts[0] | ||
|
||
const message = { | ||
contactNumber: contact.cell, | ||
userId: testTexterUser.id, | ||
text: 'test text autorespond', | ||
assignmentId | ||
} | ||
|
||
const [messageMutation, messageVars] = mutations.sendMessage(message, contact.id) | ||
|
||
await runGql(messageMutation, messageVars, testTexterUser) | ||
|
||
// wait for fakeservice to autorespond | ||
await waitForExpect(async () => { | ||
const dbMessage = await r.knex('message') | ||
console.log('DBMESSAGE', dbMessage) | ||
expect(dbMessage.length).toEqual(2) | ||
expect(dbMessage[1]).toEqual( | ||
expect.objectContaining({ | ||
send_status: 'DELIVERED', | ||
text: `responding to ${message.text}`, | ||
// user_id: testTexterUser.id, //FUTURE | ||
contact_number: testContact.cell, | ||
assignment_id: assignmentId, | ||
// campaign_contact_id: testContact.id //FUTURE | ||
}) | ||
) | ||
}) | ||
|
||
await waitForExpect(async () => { | ||
const dbCampaignContact = await getCampaignContact(testContact.id) | ||
expect(dbCampaignContact.message_status).toBe('needsResponse') | ||
}) | ||
|
||
// Refetch the contacts via gql to check the caching | ||
const ret3 = await runGql(getAssignmentContacts, assignVars, testTexterUser) | ||
expect(ret3.data.getAssignmentContacts[0].messageStatus).toEqual('needsResponse') | ||
|
||
// Then we reply | ||
const message2 = { | ||
contactNumber: contact.cell, | ||
userId: testTexterUser.id, | ||
text: 'reply', | ||
assignmentId | ||
} | ||
|
||
const [replyMutation, replyVars] = mutations.sendMessage(message2, contact.id) | ||
|
||
await runGql(replyMutation, replyVars, testTexterUser) | ||
|
||
// wait for fakeservice to mark the message as sent | ||
await waitForExpect(async () => { | ||
const dbMessage = await r.knex('message') | ||
expect(dbMessage.length).toEqual(3) | ||
expect(dbMessage[2]).toEqual( | ||
expect.objectContaining({ | ||
send_status: 'SENT' | ||
}) | ||
) | ||
const dbCampaignContact = await getCampaignContact(testContact.id) | ||
expect(dbCampaignContact.message_status).toBe('convo') | ||
}) | ||
|
||
// Refetch the contacts via gql to check the caching | ||
const ret4 = await runGql(getAssignmentContacts, assignVars, testTexterUser) | ||
expect(ret4.data.getAssignmentContacts[0].messageStatus).toEqual('convo') | ||
}) |
Oops, something went wrong.