diff --git a/packages/api/test/routers/emails.test.ts b/packages/api/test/routers/emails.test.ts new file mode 100644 index 000000000..3b39f14f4 --- /dev/null +++ b/packages/api/test/routers/emails.test.ts @@ -0,0 +1,134 @@ +import { + createTestNewsletterEmail, + createTestUser, + deleteTestUser, +} from '../db' +import { User } from '../../src/entity/user' +import 'mocha' +import sinon from 'sinon' +import { expect } from 'chai' +import { request } from '../util' +import * as parser from '../../src/utils/parser' +import * as sendNotification from '../../src/utils/sendNotification' + +describe('Emails Router', () => { + const username = 'fakeUser' + const newsletterEmail = 'fakeUser@omnivore.app' + + let user: User + let token: string + + before(async () => { + // create test user and login + user = await createTestUser(username) + + await createTestNewsletterEmail(user, newsletterEmail) + token = process.env.PUBSUB_VERIFICATION_TOKEN! + sinon.replace( + sendNotification, + 'sendMulticastPushNotifications', + sinon.fake.resolves(undefined) + ) + }) + + after(async () => { + // clean up + await deleteTestUser(username) + sinon.restore() + }) + + describe('forward', () => { + const from = 'from@omnivore.app' + const to = newsletterEmail + const subject = 'test subject' + const html = 'test html' + + context('when email is a newsletter', () => { + before(() => { + sinon.replace(parser, 'isProbablyNewsletter', sinon.fake.resolves(true)) + }) + + after(() => { + sinon.restore() + }) + + it('saves the email as a newsletter', async () => { + const data = { + message: { + data: Buffer.from( + JSON.stringify({ from, to, subject, html }) + ).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('Newsletter') + }) + }) + + context('when email is an article', () => { + before(() => { + sinon.replace( + parser, + 'isProbablyNewsletter', + sinon.fake.resolves(false) + ) + sinon.replace(parser, 'isProbablyArticle', sinon.fake.resolves(true)) + }) + + after(() => { + sinon.restore() + }) + + it('saves the email as an article', async () => { + const data = { + message: { + data: Buffer.from( + JSON.stringify({ from, to, subject, html }) + ).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, + 'isProbablyNewsletter', + sinon.fake.resolves(false) + ) + sinon.replace(parser, 'isProbablyArticle', sinon.fake.resolves(false)) + }) + + after(() => { + sinon.restore() + }) + + it('forwards the email', async () => { + const data = { + message: { + data: Buffer.from( + JSON.stringify({ from, to, subject, html }) + ).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') + }) + }) + }) +})