2025-04-24 13:11:28 +08:00

317 lines
12 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { expect } from 'chai'
import { formatCurrency } from '../../../../frontend/js/shared/utils/currency'
/*
Users can select any language we support, regardless of the country where they are located.
Which mean that any combination of "supported language"-"supported currency" can be displayed
on the user's screen.
Users located in the USA visiting https://fr.overleaf.com/user/subscription/plans
should see amounts in USD (because of their IP address),
but with French text, number formatting and currency formats (because of language choice).
(e.g. 1 000,00 $)
Users located in the France visiting https://www.overleaf.com/user/subscription/plans
should see amounts in EUR (because of their IP address),
but with English text, number formatting and currency formats (because of language choice).
(e.g. €1,000.00)
*/
describe('formatCurrency', function () {
describe('en', function () {
const format = currency => priceInCents =>
formatCurrency(priceInCents, currency)
describe('USD', function () {
const formatUSD = format('USD')
it('should format basic amounts', function () {
expect(formatUSD(0)).to.equal('$0.00')
expect(formatUSD(12.34)).to.equal('$12.34')
expect(formatUSD(123)).to.equal('$123.00')
})
it('should format thousand separators', function () {
expect(formatUSD(1_000)).to.equal('$1,000.00')
expect(formatUSD(98_765_432.1)).to.equal('$98,765,432.10')
})
it('should format negative amounts', function () {
expect(formatUSD(-0.01)).to.equal('-$0.01')
expect(formatUSD(-12.34)).to.equal('-$12.34')
expect(formatUSD(-123)).to.equal('-$123.00')
})
})
describe('EUR', function () {
const formatEUR = format('EUR')
it('should format basic amounts', function () {
expect(formatEUR(0)).to.equal('€0.00')
expect(formatEUR(12.34)).to.equal('€12.34')
expect(formatEUR(123)).to.equal('€123.00')
})
it('should format thousand separators', function () {
expect(formatEUR(1_000)).to.equal('€1,000.00')
expect(formatEUR(98_765_432.1)).to.equal('€98,765,432.10')
})
it('should format negative amounts', function () {
expect(formatEUR(-0.01)).to.equal('-€0.01')
expect(formatEUR(-12.34)).to.equal('-€12.34')
expect(formatEUR(-123)).to.equal('-€123.00')
})
})
describe('HUF', function () {
const formatHUF = format('HUF')
it('should format basic amounts', function () {
expect(formatHUF(0)).to.equal('Ft 0.00')
expect(formatHUF(12.34)).to.equal('Ft 12.34')
expect(formatHUF(123)).to.equal('Ft 123.00')
})
it('should format thousand separators', function () {
expect(formatHUF(1_000)).to.equal('Ft 1,000.00')
expect(formatHUF(98_765_432.1)).to.equal('Ft 98,765,432.10')
})
it('should format negative amounts', function () {
expect(formatHUF(-0.01)).to.equal('-Ft 0.01')
expect(formatHUF(-12.34)).to.equal('-Ft 12.34')
expect(formatHUF(-123)).to.equal('-Ft 123.00')
})
})
describe('CLP', function () {
const formatCLP = format('CLP')
it('should format basic amounts', function () {
expect(formatCLP(0)).to.equal('$0')
expect(formatCLP(12.34)).to.equal('$12')
expect(formatCLP(123)).to.equal('$123')
expect(formatCLP(1234)).to.equal('$1,234')
})
it('should format thousand separators', function () {
expect(formatCLP(1_000)).to.equal('$1,000')
expect(formatCLP(98_765_432.1)).to.equal('$98,765,432')
})
it('should format negative amounts', function () {
expect(formatCLP(-1)).to.equal('-$1')
expect(formatCLP(-12.34)).to.equal('-$12')
expect(formatCLP(-1234)).to.equal('-$1,234')
})
})
describe('all currencies', function () {
it('should format 1 "minimal atomic units"', function () {
const amount = 1
// "no cents currencies"
expect(format('CLP')(amount)).to.equal('$1')
expect(format('JPY')(amount)).to.equal('¥1')
expect(format('KRW')(amount)).to.equal('₩1')
expect(format('VND')(amount)).to.equal('₫1')
// other currencies
expect(format('AUD')(amount)).to.equal('$1.00')
expect(format('BRL')(amount)).to.equal('R$1.00')
expect(format('CAD')(amount)).to.equal('$1.00')
expect(format('CHF')(amount)).to.equal('CHF 1.00')
expect(format('CNY')(amount)).to.equal('¥1.00')
expect(format('COP')(amount)).to.equal('$1.00')
expect(format('DKK')(amount)).to.equal('kr 1.00')
expect(format('EUR')(amount)).to.equal('€1.00')
expect(format('GBP')(amount)).to.equal('£1.00')
expect(format('HUF')(amount)).to.equal('Ft 1.00')
expect(format('IDR')(amount)).to.equal('Rp 1.00')
expect(format('INR')(amount)).to.equal('₹1.00')
expect(format('MXN')(amount)).to.equal('$1.00')
expect(format('MYR')(amount)).to.equal('RM 1.00')
expect(format('NOK')(amount)).to.equal('kr 1.00')
expect(format('NZD')(amount)).to.equal('$1.00')
expect(format('PEN')(amount)).to.equal('PEN 1.00')
expect(format('PHP')(amount)).to.equal('₱1.00')
expect(format('SEK')(amount)).to.equal('kr 1.00')
expect(format('SGD')(amount)).to.equal('$1.00')
expect(format('THB')(amount)).to.equal('฿1.00')
expect(format('USD')(amount)).to.equal('$1.00')
})
it('should format 1_234_567.897_654 "minimal atomic units"', function () {
const amount = 1_234_567.897_654
// "no cents currencies"
expect(format('CLP')(amount)).to.equal('$1,234,568')
expect(format('JPY')(amount)).to.equal('¥1,234,568')
expect(format('KRW')(amount)).to.equal('₩1,234,568')
expect(format('VND')(amount)).to.equal('₫1,234,568')
// other currencies
expect(format('AUD')(amount)).to.equal('$1,234,567.90')
expect(format('BRL')(amount)).to.equal('R$1,234,567.90')
expect(format('CAD')(amount)).to.equal('$1,234,567.90')
expect(format('CHF')(amount)).to.equal('CHF 1,234,567.90')
expect(format('CNY')(amount)).to.equal('¥1,234,567.90')
expect(format('COP')(amount)).to.equal('$1,234,567.90')
expect(format('DKK')(amount)).to.equal('kr 1,234,567.90')
expect(format('EUR')(amount)).to.equal('€1,234,567.90')
expect(format('GBP')(amount)).to.equal('£1,234,567.90')
expect(format('HUF')(amount)).to.equal('Ft 1,234,567.90')
expect(format('IDR')(amount)).to.equal('Rp 1,234,567.90')
expect(format('INR')(amount)).to.equal('₹1,234,567.90')
expect(format('MXN')(amount)).to.equal('$1,234,567.90')
expect(format('MYR')(amount)).to.equal('RM 1,234,567.90')
expect(format('NOK')(amount)).to.equal('kr 1,234,567.90')
expect(format('NZD')(amount)).to.equal('$1,234,567.90')
expect(format('PEN')(amount)).to.equal('PEN 1,234,567.90')
expect(format('PHP')(amount)).to.equal('₱1,234,567.90')
expect(format('SEK')(amount)).to.equal('kr 1,234,567.90')
expect(format('SGD')(amount)).to.equal('$1,234,567.90')
expect(format('THB')(amount)).to.equal('฿1,234,567.90')
expect(format('USD')(amount)).to.equal('$1,234,567.90')
})
})
})
describe('fr', function () {
const format = currency => priceInCents =>
formatCurrency(priceInCents, currency, 'fr')
describe('USD', function () {
const formatUSD = format('USD')
it('should format basic amounts', function () {
expect(formatUSD(0)).to.equal('0,00 $')
expect(formatUSD(12.34)).to.equal('12,34 $')
expect(formatUSD(123)).to.equal('123,00 $')
})
it('should format thousand separators', function () {
expect(formatUSD(1_000)).to.equal('1000,00 $')
expect(formatUSD(98_765_432.1)).to.equal('98765432,10 $')
})
it('should format negative amounts', function () {
expect(formatUSD(-0.01)).to.equal('-0,01 $')
expect(formatUSD(-12.34)).to.equal('-12,34 $')
expect(formatUSD(-123)).to.equal('-123,00 $')
})
})
describe('EUR', function () {
const formatEUR = format('EUR')
it('should format basic amounts', function () {
expect(formatEUR(0)).to.equal('0,00 €')
expect(formatEUR(12.34)).to.equal('12,34 €')
expect(formatEUR(123)).to.equal('123,00 €')
})
it('should format thousand separators', function () {
expect(formatEUR(1_000)).to.equal('1000,00 €')
expect(formatEUR(98_765_432.1)).to.equal('98765432,10 €')
})
it('should format negative amounts', function () {
expect(formatEUR(-0.01)).to.equal('-0,01 €')
expect(formatEUR(-12.34)).to.equal('-12,34 €')
expect(formatEUR(-123)).to.equal('-123,00 €')
})
})
describe('HUF', function () {
const formatHUF = format('HUF')
it('should format basic amounts', function () {
expect(formatHUF(0)).to.equal('0,00 Ft')
expect(formatHUF(12.34)).to.equal('12,34 Ft')
expect(formatHUF(123)).to.equal('123,00 Ft')
})
it('should format thousand separators', function () {
expect(formatHUF(1_000)).to.equal('1000,00 Ft')
expect(formatHUF(98_765_432.1)).to.equal('98765432,10 Ft')
})
it('should format negative amounts', function () {
expect(formatHUF(-0.01)).to.equal('-0,01 Ft')
expect(formatHUF(-12.34)).to.equal('-12,34 Ft')
expect(formatHUF(-123)).to.equal('-123,00 Ft')
})
})
describe('CLP', function () {
const formatCLP = format('CLP')
it('should format basic amounts', function () {
expect(formatCLP(0)).to.equal('0 $')
expect(formatCLP(12.34)).to.equal('12 $')
expect(formatCLP(123)).to.equal('123 $')
expect(formatCLP(1234)).to.equal('1234 $')
})
it('should format thousand separators', function () {
expect(formatCLP(100_000)).to.equal('100000 $')
expect(formatCLP(9_876_543_210)).to.equal('9876543210 $')
})
it('should format negative amounts', function () {
expect(formatCLP(-1)).to.equal('-1 $')
expect(formatCLP(-12.34)).to.equal('-12 $')
expect(formatCLP(-1234)).to.equal('-1234 $')
})
})
describe('all currencies', function () {
it('should format 1 "minimal atomic units"', function () {
const amount = 1
// "no cents currencies"
expect(format('CLP')(amount)).to.equal('1 $')
expect(format('JPY')(amount)).to.equal('1 ¥')
expect(format('KRW')(amount)).to.equal('1 ₩')
expect(format('VND')(amount)).to.equal('1 ₫')
// other currencies
expect(format('AUD')(amount)).to.equal('1,00 $')
expect(format('BRL')(amount)).to.equal('1,00 R$')
expect(format('CAD')(amount)).to.equal('1,00 $')
expect(format('CHF')(amount)).to.equal('1,00 CHF')
expect(format('CNY')(amount)).to.equal('1,00 ¥')
expect(format('COP')(amount)).to.equal('1,00 $')
expect(format('EUR')(amount)).to.equal('1,00 €')
expect(format('GBP')(amount)).to.equal('1,00 £')
expect(format('USD')(amount)).to.equal('1,00 $')
})
it('should format 1_234_567.897_654 "minimal atomic units"', function () {
const amount = 1_234_567.897_654
// "no cents currencies"
expect(format('CLP')(amount)).to.equal('1234568 $')
expect(format('JPY')(amount)).to.equal('1234568 ¥')
expect(format('KRW')(amount)).to.equal('1234568 ₩')
expect(format('VND')(amount)).to.equal('1234568 ₫')
// other currencies
expect(format('AUD')(amount)).to.equal('1234567,90 $')
expect(format('BRL')(amount)).to.equal('1234567,90 R$')
expect(format('CAD')(amount)).to.equal('1234567,90 $')
expect(format('CHF')(amount)).to.equal('1234567,90 CHF')
expect(format('CNY')(amount)).to.equal('1234567,90 ¥')
expect(format('COP')(amount)).to.equal('1234567,90 $')
expect(format('EUR')(amount)).to.equal('1234567,90 €')
expect(format('GBP')(amount)).to.equal('1234567,90 £')
expect(format('USD')(amount)).to.equal('1234567,90 $')
})
})
})
})