Skip to content

Commit 9716083

Browse files
authored
Merge pull request #18870 from mozilla/email_tests
chore(auth): Add stripe and stripe-webhooks tests for SubscriptionReplacedEmail
2 parents 8d6c57a + 1c5c4ee commit 9716083

2 files changed

Lines changed: 81 additions & 0 deletions

File tree

packages/fxa-auth-server/test/local/payments/stripe.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6007,6 +6007,38 @@ describe('#integration - StripeHelper', () => {
60076007
);
60086008
});
60096009

6010+
describe('extractSubscriptionDeletedEventDetailsForEmail', () => {
6011+
it('returns subscription invoice details', async () => {
6012+
const mockSubscription = deepCopy(subscription1);
6013+
const mockInvoice = deepCopy(invoicePaidSubscriptionCreate);
6014+
stripeHelper.extractInvoiceDetailsForEmail = sandbox
6015+
.stub()
6016+
.resolves(mockInvoice);
6017+
6018+
const result =
6019+
await stripeHelper.extractSubscriptionDeletedEventDetailsForEmail(
6020+
mockSubscription
6021+
);
6022+
assert.equal(result, mockInvoice);
6023+
sinon.assert.calledOnce(stripeHelper.extractInvoiceDetailsForEmail);
6024+
});
6025+
6026+
it('throws internalValidationError if latest_invoice is not present', async () => {
6027+
const mockSubscription = deepCopy(subscription1);
6028+
mockSubscription.latest_invoice = null;
6029+
let thrownError = null;
6030+
try {
6031+
await stripeHelper.extractSubscriptionDeletedEventDetailsForEmail(
6032+
mockSubscription
6033+
);
6034+
} catch (err) {
6035+
thrownError = err;
6036+
}
6037+
assert.isNotNull(thrownError);
6038+
assert.equal(thrownError.errno, error.ERRNO.INTERNAL_VALIDATION_ERROR);
6039+
});
6040+
});
6041+
60106042
describe('extractSubscriptionUpdateEventDetailsForEmail', () => {
60116043
const mockReactivationDetails = 'mockReactivationDetails';
60126044
const mockCancellationDetails = 'mockCancellationDetails';

packages/fxa-auth-server/test/local/routes/subscriptions/stripe-webhooks.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const invoiceFixture = require('../../payments/fixtures/stripe/invoice_paid.json
2828
const subscriptionCreated = require('../../payments/fixtures/stripe/subscription_created.json');
2929
const subscriptionCreatedIncomplete = require('../../payments/fixtures/stripe/subscription_created_incomplete.json');
3030
const subscriptionDeleted = require('../../payments/fixtures/stripe/subscription_deleted.json');
31+
const subscriptionReplaced = require('../../payments/fixtures/stripe/subscription_replaced.json');
3132
const subscriptionUpdated = require('../../payments/fixtures/stripe/subscription_updated.json');
3233
const subscriptionUpdatedFromIncomplete = require('../../payments/fixtures/stripe/subscription_updated_from_incomplete.json');
3334
const eventInvoiceCreated = require('../../payments/fixtures/stripe/event_invoice_created.json');
@@ -1120,6 +1121,54 @@ describe('StripeWebhookHandler', () => {
11201121
);
11211122
});
11221123

1124+
it('sends subscriptionReplaced email if metadata includes redundantCancellation', async () => {
1125+
const mockCustomer = deepCopy(customerFixture);
1126+
StripeWebhookHandlerInstance.stripeHelper.expandResource.resolves(
1127+
mockCustomer
1128+
);
1129+
const deletedEvent = deepCopy(subscriptionReplaced);
1130+
const account = {
1131+
email: customerFixture.email,
1132+
emails: customerFixture.email,
1133+
locale: 'en',
1134+
};
1135+
sandbox.stub(authDbModule.Account, 'findByUid').resolves(account);
1136+
const mockInvoice = deepCopy(invoiceFixture);
1137+
StripeWebhookHandlerInstance.stripeHelper.extractSubscriptionDeletedEventDetailsForEmail.resolves(
1138+
mockInvoice
1139+
);
1140+
StripeWebhookHandlerInstance.mailer.sendSubscriptionReplacedEmail =
1141+
sandbox.stub();
1142+
await StripeWebhookHandlerInstance.handleSubscriptionDeletedEvent(
1143+
{},
1144+
deletedEvent
1145+
);
1146+
assert.calledWith(mockCapabilityService.stripeUpdate, {
1147+
sub: deletedEvent.data.object,
1148+
uid: customerFixture.metadata.userid,
1149+
});
1150+
assert.notCalled(authDbModule.getUidAndEmailByStripeCustomerId);
1151+
assert.calledOnceWithExactly(
1152+
StripeWebhookHandlerInstance.paypalHelper
1153+
.conditionallyRemoveBillingAgreement,
1154+
customerFixture
1155+
);
1156+
assert.calledOnceWithExactly(
1157+
StripeWebhookHandlerInstance.stripeHelper
1158+
.extractSubscriptionDeletedEventDetailsForEmail,
1159+
deletedEvent.data.object
1160+
);
1161+
assert.calledWith(
1162+
StripeWebhookHandlerInstance.mailer.sendSubscriptionReplacedEmail,
1163+
account.emails,
1164+
account,
1165+
{
1166+
acceptLanguage: account.locale,
1167+
...mockInvoice,
1168+
}
1169+
);
1170+
});
1171+
11231172
it('does not conditionally delete without customer record', async () => {
11241173
const deletedEvent = deepCopy(subscriptionDeleted);
11251174
StripeWebhookHandlerInstance.stripeHelper.expandResource.resolves();

0 commit comments

Comments
 (0)