diff --git a/services/web/app/coffee/Features/Subscription/RecurlyWrapper.coffee b/services/web/app/coffee/Features/Subscription/RecurlyWrapper.coffee index 2be1fc35c7..1f7c21b02d 100644 --- a/services/web/app/coffee/Features/Subscription/RecurlyWrapper.coffee +++ b/services/web/app/coffee/Features/Subscription/RecurlyWrapper.coffee @@ -418,6 +418,9 @@ module.exports = RecurlyWrapper = url: "subscriptions/#{subscriptionId}/cancel", method: "put" }, (error, response, body) -> + if error? and body?.match(/.*A canceled subscription can't transition to canceled.*/) + logger.log {subscriptionId, error, body}, "subscription already cancelled, not really an error, proceeding" + error = null callback(error) ) diff --git a/services/web/test/UnitTests/coffee/Subscription/RecurlyWrapperTests.coffee b/services/web/test/UnitTests/coffee/Subscription/RecurlyWrapperTests.coffee index eda02ccf72..c55efdb3c5 100644 --- a/services/web/test/UnitTests/coffee/Subscription/RecurlyWrapperTests.coffee +++ b/services/web/test/UnitTests/coffee/Subscription/RecurlyWrapperTests.coffee @@ -314,6 +314,19 @@ describe "RecurlyWrapper", -> it "should send a cancel request to the API", -> @apiRequest.called.should.equal true + describe 'when the subscription is already cancelled', -> + + beforeEach -> + @RecurlyWrapper.apiRequest.restore() + @recurlySubscriptionId = "subscription-id-123" + @apiRequest = sinon.stub @RecurlyWrapper, "apiRequest", (options, callback) => + callback(new Error('woops'), {}, "A canceled subscription can't transition to canceled") + + it 'should not produce an error', (done) -> + @RecurlyWrapper.cancelSubscription @recurlySubscriptionId, (err) => + expect(err).to.equal null + done() + describe "reactivateSubscription", -> beforeEach (done) -> @recurlySubscriptionId = "subscription-id-123"