omnivore/packages/api/test/routers/emails.test.ts

182 lines
4.7 KiB
TypeScript
Raw Permalink Normal View History

2023-08-23 04:15:50 +00:00
import { expect } from 'chai'
import * as jwt from 'jsonwebtoken'
import 'mocha'
import sinon from 'sinon'
2023-09-11 14:58:57 +00:00
import { NewsletterEmail } from '../../src/entity/newsletter_email'
2023-08-23 04:15:50 +00:00
import { ReceivedEmail } from '../../src/entity/received_email'
import { User } from '../../src/entity/user'
2023-09-07 04:35:05 +00:00
import { createNewsletterEmail } from '../../src/services/newsletters'
2023-09-07 08:43:24 +00:00
import { saveReceivedEmail } from '../../src/services/received_emails'
2023-09-07 04:35:05 +00:00
import { deleteUser } from '../../src/services/user'
2023-08-23 04:15:50 +00:00
import * as parser from '../../src/utils/parser'
import * as sendEmail from '../../src/utils/sendEmail'
import * as sendNotification from '../../src/utils/sendNotification'
2023-09-07 04:35:05 +00:00
import { createTestUser } from '../db'
2022-07-27 03:55:19 +00:00
import { request } from '../util'
describe('Emails Router', () => {
2023-01-19 01:38:21 +00:00
const from = 'fake from'
const subject = 'fake subject'
const text = 'fake text'
2022-07-27 03:55:19 +00:00
let user: User
let token: string
2023-01-19 01:38:21 +00:00
let receivedEmail: ReceivedEmail
2023-09-11 14:58:57 +00:00
let newsletterEmail: NewsletterEmail
let authToken: string
2022-07-27 03:55:19 +00:00
before(async () => {
// create test user and login
2022-08-10 08:36:31 +00:00
user = await createTestUser('fakeUser')
2022-07-27 03:55:19 +00:00
2023-09-11 14:58:57 +00:00
newsletterEmail = await createNewsletterEmail(user.id)
2024-02-22 04:03:58 +00:00
token = process.env.PUBSUB_VERIFICATION_TOKEN || ''
2023-09-07 08:43:24 +00:00
receivedEmail = await saveReceivedEmail(
2023-01-19 01:38:21 +00:00
from,
2023-09-11 14:58:57 +00:00
newsletterEmail.address,
2023-01-19 01:38:21 +00:00
subject,
text,
2023-09-07 08:43:24 +00:00
'',
user.id,
'non-article'
)
2023-09-11 14:58:57 +00:00
authToken = jwt.sign(user.id, process.env.JWT_SECRET || '')
2022-07-27 03:55:19 +00:00
})
after(async () => {
// clean up
2023-09-07 04:35:05 +00:00
await deleteUser(user.id)
2022-07-27 03:55:19 +00:00
sinon.restore()
})
describe('forward', () => {
const html = '<html>test html</html>'
2022-07-27 03:55:19 +00:00
2024-02-22 04:03:58 +00:00
beforeEach(() => {
2022-07-27 05:11:04 +00:00
sinon.replace(
sendNotification,
'sendMulticastPushNotifications',
sinon.fake.resolves(undefined)
)
sinon.replace(sendEmail, 'sendEmail', sinon.fake.resolves(true))
})
afterEach(() => {
sinon.restore()
})
2022-07-27 03:55:19 +00:00
context('when email is an article', () => {
before(() => {
sinon.replace(parser, 'isProbablyArticle', sinon.fake.resolves(true))
})
it('saves the email as an article', async () => {
const data = {
message: {
data: Buffer.from(
2023-01-19 01:38:21 +00:00
JSON.stringify({
from,
2023-09-11 14:58:57 +00:00
to: newsletterEmail.address,
2023-01-19 01:38:21 +00:00
subject,
html,
text,
receivedEmailId: receivedEmail.id,
})
2022-07-27 03:55:19 +00:00
).toString('base64'),
publishTime: new Date().toISOString(),
},
}
const res = await request
.post(`/svc/pubsub/emails/forward?token=${token}`)
.send(data)
.expect(200)
expect(res.text).to.eql('Article')
})
})
context('when email is a regular email', () => {
before(() => {
sinon.replace(parser, 'isProbablyArticle', sinon.fake.resolves(false))
})
it('forwards the email', async () => {
const data = {
message: {
data: Buffer.from(
2023-01-19 01:38:21 +00:00
JSON.stringify({
from,
2023-09-11 14:58:57 +00:00
to: newsletterEmail.address,
2023-01-19 01:38:21 +00:00
subject,
html,
text,
receivedEmailId: receivedEmail.id,
})
2022-07-27 03:55:19 +00:00
).toString('base64'),
publishTime: new Date().toISOString(),
},
}
const res = await request
.post(`/svc/pubsub/emails/forward?token=${token}`)
.send(data)
.expect(200)
expect(res.text).to.eql('Email forwarded')
})
})
})
2023-01-19 02:44:08 +00:00
describe('create', () => {
2023-02-01 05:44:27 +00:00
const url = '/svc/pubsub/emails/save'
2023-01-19 02:44:08 +00:00
const html = '<html>test html</html>'
const text = 'test text'
const from = 'fake from'
const subject = 'fake subject'
it('saves the email in the database', async () => {
const data = {
html,
text,
from,
2023-09-11 14:58:57 +00:00
to: newsletterEmail.address,
2023-01-19 02:44:08 +00:00
subject,
}
const res = await request
2023-02-01 05:44:27 +00:00
.post(url)
.set('Authorization', `${authToken}`)
.send(data)
.expect(200)
expect(res.body.id).not.to.be.undefined
})
it('saves the email if body is empty', async () => {
const data = {
from,
2023-09-11 14:58:57 +00:00
to: newsletterEmail.address,
2023-02-01 05:44:27 +00:00
subject,
}
const res = await request
.post(url)
2023-01-19 02:44:08 +00:00
.set('Authorization', `${authToken}`)
.send(data)
.expect(200)
expect(res.body.id).not.to.be.undefined
})
2023-02-01 05:53:27 +00:00
it('saves the email if subject is empty', async () => {
const data = {
from,
2023-09-11 14:58:57 +00:00
to: newsletterEmail.address,
2023-02-01 05:53:27 +00:00
html,
}
const res = await request
.post(url)
.set('Authorization', `${authToken}`)
.send(data)
.expect(200)
expect(res.body.id).not.to.be.undefined
})
2023-01-19 02:44:08 +00:00
})
2022-07-27 03:55:19 +00:00
})