Merge pull request #4248 from overleaf/tm-ta-new-subscription-currency-fixes

Fix getCurrencyCode behavior and add fallback in frontend for invalid currencies

GitOrigin-RevId: 5cc40b524148f88c0f110d2cf4bb4d3b69844f1b
This commit is contained in:
Thomas 2021-06-23 15:14:16 +02:00 committed by Copybot
parent a1f66a5252
commit be73463e35
5 changed files with 72 additions and 38 deletions

View file

@ -26,7 +26,9 @@ const SUBSCRIPTION_PAGE_SPLIT_TEST = 'subscription-page'
async function plansPage(req, res) {
const plans = SubscriptionViewModelBuilder.buildPlansList()
const recommendedCurrency = await GeoIpLookup.promises.getCurrencyCode(
const {
currencyCode: recommendedCurrency,
} = await GeoIpLookup.promises.getCurrencyCode(
(req.query ? req.query.ip : undefined) || req.ip
)
@ -66,7 +68,7 @@ async function paymentPage(req, res) {
? req.query.currency.toUpperCase()
: undefined
const {
recomendedCurrency: recommendedCurrency,
currencyCode: recommendedCurrency,
countryCode,
} = await GeoIpLookup.promises.getCurrencyCode(
(req.query ? req.query.ip : undefined) || req.ip

View file

@ -3,7 +3,7 @@ const settings = require('settings-sharelatex')
const _ = require('underscore')
const logger = require('logger-sharelatex')
const URL = require('url')
const { promisify } = require('../util/promises')
const { promisify, promisifyMultiResult } = require('../util/promises')
const currencyMappings = {
GB: 'GBP',
@ -91,6 +91,9 @@ module.exports = {
getCurrencyCode,
promises: {
getDetails: promisify(getDetails),
getCurrencyCode: promisify(getCurrencyCode),
getCurrencyCode: promisifyMultiResult(getCurrencyCode, [
'currencyCode',
'countryCode',
]),
},
}

View file

@ -103,15 +103,29 @@ export default App.controller(
const pricing = recurly.Pricing()
window.pricing = pricing
pricing
.plan(window.plan_code, { quantity: 1 })
.address({
country: $scope.data.country,
})
.tax({ tax_code: 'digital', vat_number: '' })
.currency($scope.currencyCode)
.coupon($scope.data.coupon)
.done()
function setupPricing() {
pricing
.plan(window.plan_code, { quantity: 1 })
.address({
country: $scope.data.country,
})
.tax({ tax_code: 'digital', vat_number: '' })
.currency($scope.currencyCode)
.coupon($scope.data.coupon)
.catch(function (err) {
if (
$scope.currencyCode !== 'USD' &&
err.name === 'invalid-currency'
) {
$scope.currencyCode = 'USD'
setupPricing()
} else {
throw err
}
})
.done()
}
setupPricing()
pricing.on('change', () => {
$scope.planName = pricing.items.plan.name

View file

@ -161,9 +161,9 @@ describe('SubscriptionController', function () {
describe('plansPage', function () {
beforeEach(function () {
this.req.ip = '1234.3123.3131.333 313.133.445.666 653.5345.5345.534'
return this.GeoIpLookup.promises.getCurrencyCode.resolves(
this.stubbedCurrencyCode
)
return this.GeoIpLookup.promises.getCurrencyCode.resolves({
currencyCode: this.stubbedCurrencyCode,
})
})
})
@ -174,7 +174,7 @@ describe('SubscriptionController', function () {
.stub()
.resolves(true)
return this.GeoIpLookup.promises.getCurrencyCode.resolves({
recomendedCurrency: this.stubbedCurrencyCode,
currencyCode: this.stubbedCurrencyCode,
})
})

View file

@ -2,6 +2,7 @@ const SandboxedModule = require('sandboxed-module')
const assert = require('assert')
const path = require('path')
const sinon = require('sinon')
const { expect } = require('chai')
const modulePath = path.join(
__dirname,
'../../../../app/src/infrastructure/GeoIpLookup'
@ -204,62 +205,76 @@ describe('GeoIpLookup', function () {
describe('async', function () {
it('should return GBP for GB country', async function () {
this.request.get.callsArgWith(1, null, null, this.stubbedResponse)
const currencyCode = await this.GeoIpLookup.promises.getCurrencyCode(
this.ipAddress
)
const {
currencyCode,
countryCode,
} = await this.GeoIpLookup.promises.getCurrencyCode(this.ipAddress)
currencyCode.should.equal('GBP')
countryCode.should.equal('GB')
})
it('should return GBP for gb country', async function () {
this.stubbedResponse.country_code = 'gb'
this.request.get.callsArgWith(1, null, null, this.stubbedResponse)
const currencyCode = await this.GeoIpLookup.promises.getCurrencyCode(
this.ipAddress
)
const {
currencyCode,
countryCode,
} = await this.GeoIpLookup.promises.getCurrencyCode(this.ipAddress)
currencyCode.should.equal('GBP')
countryCode.should.equal('GB')
})
it('should return USD for US', async function () {
this.stubbedResponse.country_code = 'US'
this.request.get.callsArgWith(1, null, null, this.stubbedResponse)
const currencyCode = await this.GeoIpLookup.promises.getCurrencyCode(
this.ipAddress
)
const {
currencyCode,
countryCode,
} = await this.GeoIpLookup.promises.getCurrencyCode(this.ipAddress)
currencyCode.should.equal('USD')
countryCode.should.equal('US')
})
it('should return EUR for DE', async function () {
this.stubbedResponse.country_code = 'DE'
this.request.get.callsArgWith(1, null, null, this.stubbedResponse)
const currencyCode = await this.GeoIpLookup.promises.getCurrencyCode(
this.ipAddress
)
const {
currencyCode,
countryCode,
} = await this.GeoIpLookup.promises.getCurrencyCode(this.ipAddress)
currencyCode.should.equal('EUR')
countryCode.should.equal('DE')
})
it('should default to USD if there is an error', async function () {
this.request.get.callsArgWith(1, null, null, { error: true })
const currencyCode = await this.GeoIpLookup.promises.getCurrencyCode(
this.ipAddress
)
const {
currencyCode,
countryCode,
} = await this.GeoIpLookup.promises.getCurrencyCode(this.ipAddress)
currencyCode.should.equal('USD')
expect(countryCode).to.be.undefined
})
it('should default to USD if there are no details', async function () {
this.request.get.callsArgWith(1, null, null, {})
const currencyCode = await this.GeoIpLookup.promises.getCurrencyCode(
this.ipAddress
)
const {
currencyCode,
countryCode,
} = await this.GeoIpLookup.promises.getCurrencyCode(this.ipAddress)
currencyCode.should.equal('USD')
expect(countryCode).to.be.undefined
})
it('should default to USD if there is no match for their country', async function () {
this.stubbedResponse.country_code = 'Non existant'
this.request.get.callsArgWith(1, null, null, this.stubbedResponse)
const currencyCode = await this.GeoIpLookup.promises.getCurrencyCode(
this.ipAddress
)
const {
currencyCode,
countryCode,
} = await this.GeoIpLookup.promises.getCurrencyCode(this.ipAddress)
currencyCode.should.equal('USD')
countryCode.should.equal('NON EXISTANT')
})
})
})