blurts-server/tests/controllers/ses.test.js

140 строки
4.7 KiB
JavaScript

"use strict";
const httpMocks = require("node-mocks-http");
const DB = require("../../db/DB");
const getSha1 = require("../../sha1-utils");
const ses = require("../../controllers/ses");
require("../resetDB");
jest.mock("../../hibp");
const testNotifications = new Map();
testNotifications.set("bounce", require("./ses-bounce-notification.json"));
testNotifications.set("complaint", require("./ses-complaint-notification.json"));
testNotifications.set("invalid", require("./invalid-signature-ses-complaint-notification.json"));
testNotifications.set("fxa-delete", require("./sns-fxa-delete.json"));
const createRequestBody = function(notificationType) {
const notification = testNotifications.get(notificationType);
return JSON.stringify(notification);
};
test("ses notification with Permanent bounce unsubscribes recipient subscriber", async () => {
// TODO: restore tests for ["General", "NoEmail", "Suppressed"] sub types
const testEmail = "bounce@simulator.amazonses.com";
const testHashes = [getSha1(testEmail)];
await DB.addSubscriber(testEmail);
let subscribers = await DB.getSubscribersByHashes(testHashes);
expect(subscribers.length).toEqual(1);
const req = httpMocks.createRequest({
method: "POST",
url: "/ses/notification",
body: createRequestBody("bounce"),
});
const resp = httpMocks.createResponse();
await ses.notification(req, resp);
expect(resp.statusCode).toEqual(200);
subscribers = await DB.getSubscribersByHashes(testHashes);
expect(subscribers.length).toEqual(0);
});
test("ses notification with Complaint unsubscribes recipient subscriber", async () => {
const testEmail = "complaint@simulator.amazonses.com";
await DB.addSubscriber(testEmail);
let subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(1);
const req = httpMocks.createRequest({
method: "POST",
url: "/ses/notification",
body: createRequestBody("complaint"),
});
const resp = httpMocks.createResponse();
await ses.notification(req, resp);
expect(resp.statusCode).toEqual(200);
subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(0);
});
test("ses notification with Complaint unsubscribes recipient from email_addresses", async () => {
const testPrimaryEmail = "secondary-email-complainer@mailinator.com";
const testSignupLanguage = "en";
const testUser = await DB.addSubscriber(testPrimaryEmail, testSignupLanguage);
const testEmail = "complaint@simulator.amazonses.com";
await DB.addSubscriberUnverifiedEmailHash(testUser, testEmail);
const req = httpMocks.createRequest({
method: "POST",
url: "/ses/notification",
body: createRequestBody("complaint"),
});
const resp = httpMocks.createResponse();
await ses.notification(req, resp);
expect(resp.statusCode).toEqual(200);
const noMoreEmailAddressRecord = await DB.getEmailAddressRecordByEmail(testEmail);
expect(noMoreEmailAddressRecord).toBeUndefined();
});
test("ses notification with invalid signature responds with error and doesn't change subscribers", async () => {
const testEmail = "complaint@simulator.amazonses.com";
await DB.addSubscriber(testEmail);
let subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(1);
const req = httpMocks.createRequest({
method: "POST",
url: "/ses/notification",
body: createRequestBody("invalid"),
});
const resp = httpMocks.createResponse();
await expect(ses.notification(req, resp)).rejects.toMatch("invalid");
expect(resp.statusCode).toEqual(401);
subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(1);
});
test("sns notification for FxA account deletes monitor subscriber record", async () => {
const testEmail = "fxa-deleter@mailinator.com";
const testSignupLanguage = "en";
const testFxaAccessToken = "abcdef123456789";
const testFxaRefreshToken = "abcdef123456789";
const testFxaUID = "3b1a9d27f85b4a4c977f3a84838f9116";
const testFxaProfileData = JSON.stringify({uid: testFxaUID});
await DB.addSubscriber(testEmail, testSignupLanguage, testFxaAccessToken, testFxaRefreshToken, testFxaProfileData);
let subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(1);
const req = httpMocks.createRequest({
method: "POST",
url: "/ses/notification",
body: createRequestBody("fxa-delete"),
});
const resp = httpMocks.createResponse();
await ses.notification(req, resp);
expect(resp.statusCode).toEqual(200);
subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(0);
});