mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-22 10:21:36 +03:00
67bf3a77c1
refs https://github.com/TryGhost/Team/issues/472 The current `{{price}}` helper only works with `amount` to convert it into right value but doesn't allow any formatting with currency etc, leaving most of the work to theme. We want to be able to output well formatted prices. E.g. the API returns 5000 for 5 EUR but we want to output €5. The updated {{price}} helper can take a plan object or plan amount currency and use them to output a well formatted price. It works with JS's built in Intl.NumberFormat behaviour to return output in different formats, also allowing theme devs to override formatting with options. Examples: With Plan object => `{{price plan}} → "€5"` With Plan object and custom number format => `{{price plan numberFormat="long"}} → "€5.00"` Output only currency symbol => `{{price currency='EUR'}} → "€"`
105 lines
3.4 KiB
JavaScript
105 lines
3.4 KiB
JavaScript
const should = require('should');
|
|
const helpers = require('../../../core/frontend/helpers');
|
|
const handlebars = require('../../../core/frontend/services/themes/engine').handlebars;
|
|
|
|
function compile(templateString) {
|
|
const template = handlebars.compile(templateString);
|
|
template.with = (locals = {}, globals) => {
|
|
return template(locals, globals);
|
|
};
|
|
|
|
return template;
|
|
}
|
|
|
|
describe('{{price}} helper', function () {
|
|
before(function () {
|
|
handlebars.registerHelper('price', helpers.price);
|
|
});
|
|
|
|
it('throws an error for no provided parameters', function () {
|
|
(function compileWith() {
|
|
compile('{{price}}')
|
|
.with({});
|
|
}).should.throw();
|
|
});
|
|
|
|
it('throws an error for undefined parameter', function () {
|
|
(function compileWith() {
|
|
compile('{{price @dont.exist}}')
|
|
.with({});
|
|
}).should.throw();
|
|
});
|
|
|
|
it('throws if argument is not a number', function () {
|
|
(function compileWith() {
|
|
compile('{{price "not_a_number"}}')
|
|
.with({});
|
|
}).should.throw();
|
|
});
|
|
|
|
it('will format decimal adjusted amount', function () {
|
|
compile('{{price 2000}}')
|
|
.with({})
|
|
.should.equal('20');
|
|
});
|
|
|
|
it('will format with plan object', function () {
|
|
const plan = {
|
|
nickname: 'Monthly',
|
|
amount: 500,
|
|
interval: 'month',
|
|
currency: 'USD',
|
|
currency_symbol: '$'
|
|
};
|
|
const rendered = helpers.price.call({}, plan, {});
|
|
rendered.should.be.equal('$5');
|
|
});
|
|
|
|
it('will format with plan object with number format', function () {
|
|
const plan = {
|
|
nickname: 'Monthly',
|
|
amount: 500,
|
|
interval: 'month',
|
|
currency: 'USD',
|
|
currency_symbol: '$'
|
|
};
|
|
const rendered = helpers.price.call({}, plan, {hash: {numberFormat: 'long'}});
|
|
rendered.should.be.equal('$5.00');
|
|
});
|
|
|
|
it('will format symbol if only currency - USD', function () {
|
|
const rendered = helpers.price.call({}, {hash: {currency: 'USD'}});
|
|
rendered.should.be.equal('$');
|
|
});
|
|
|
|
it('will format symbol if only currency - EUR', function () {
|
|
const rendered = helpers.price.call({}, {hash: {currency: 'EUR'}});
|
|
rendered.should.be.equal('€');
|
|
});
|
|
|
|
it('will format with amount and currency', function () {
|
|
const rendered = helpers.price.call({}, 500, {hash: {currency: 'USD'}});
|
|
rendered.should.be.equal('$5');
|
|
});
|
|
|
|
it('will format with long number format', function () {
|
|
const rendered = helpers.price.call({}, 500, {hash: {currency: 'USD', numberFormat: 'long'}});
|
|
rendered.should.be.equal('$5.00');
|
|
});
|
|
|
|
it('will format with short number format with decimal value', function () {
|
|
const rendered = helpers.price.call({}, 505, {hash: {currency: 'EUR', numberFormat: 'short'}});
|
|
rendered.should.be.equal('€5.05');
|
|
});
|
|
|
|
it('will format with short number format without decimal value', function () {
|
|
const rendered = helpers.price.call({}, 500, {hash: {currency: 'EUR', numberFormat: 'short'}});
|
|
rendered.should.be.equal('€5');
|
|
});
|
|
|
|
it('will format with name currency format', function () {
|
|
const rendered = helpers.price.call({}, 500, {hash: {currency: 'USD', currencyFormat: 'name'}});
|
|
rendered.should.be.equal('5 US dollars');
|
|
});
|
|
});
|