Files
Igor Savin 169ef75066 Remove deprecated helpers and fix release script (#2128)
* Remove deprecated helpers
* Use more idiomatic assertions
* Fix release script
2026-03-03 21:52:28 +01:00

165 lines
5.2 KiB
JavaScript

var Exception = Handlebars.Exception;
describe('strict', function () {
describe('strict mode', function () {
it('should error on missing property lookup', function () {
expectTemplate('{{hello}}')
.withCompileOptions({ strict: true })
.toThrow(Exception, /"hello" not defined in/);
});
it('should error on missing child', function () {
expectTemplate('{{hello.bar}}')
.withCompileOptions({ strict: true })
.withInput({ hello: { bar: 'foo' } })
.toCompileTo('foo');
expectTemplate('{{hello.bar}}')
.withCompileOptions({ strict: true })
.withInput({ hello: {} })
.toThrow(Exception, /"bar" not defined in/);
});
it('should handle explicit undefined', function () {
expectTemplate('{{hello.bar}}')
.withCompileOptions({ strict: true })
.withInput({ hello: { bar: undefined } })
.toCompileTo('');
});
it('should error on missing property lookup in known helpers mode', function () {
expectTemplate('{{hello}}')
.withCompileOptions({
strict: true,
knownHelpersOnly: true,
})
.toThrow(Exception, /"hello" not defined in/);
});
it('should error on missing context', function () {
expectTemplate('{{hello}}')
.withCompileOptions({ strict: true })
.toThrow(Error);
});
it('should error on missing data lookup', function () {
var xt = expectTemplate('{{@hello}}').withCompileOptions({
strict: true,
});
xt.toThrow(Error);
xt.withRuntimeOptions({ data: { hello: 'foo' } }).toCompileTo('foo');
});
it('should not run helperMissing for helper calls', function () {
expectTemplate('{{hello foo}}')
.withCompileOptions({ strict: true })
.withInput({ foo: true })
.toThrow(Exception, /"hello" not defined in/);
expectTemplate('{{#hello foo}}{{/hello}}')
.withCompileOptions({ strict: true })
.withInput({ foo: true })
.toThrow(Exception, /"hello" not defined in/);
});
it('should throw on ambiguous blocks', function () {
expectTemplate('{{#hello}}{{/hello}}')
.withCompileOptions({ strict: true })
.toThrow(Exception, /"hello" not defined in/);
expectTemplate('{{^hello}}{{/hello}}')
.withCompileOptions({ strict: true })
.toThrow(Exception, /"hello" not defined in/);
expectTemplate('{{#hello.bar}}{{/hello.bar}}')
.withCompileOptions({ strict: true })
.withInput({ hello: {} })
.toThrow(Exception, /"bar" not defined in/);
});
it('should allow undefined parameters when passed to helpers', function () {
expectTemplate('{{#unless foo}}success{{/unless}}')
.withCompileOptions({ strict: true })
.toCompileTo('success');
});
it('should allow undefined hash when passed to helpers', function () {
expectTemplate('{{helper value=@foo}}')
.withCompileOptions({
strict: true,
})
.withHelpers({
helper: function (options) {
expect(options.hash).toHaveProperty('value');
expect(options.hash.value).toBeUndefined();
return 'success';
},
})
.toCompileTo('success');
});
it('should show error location on missing property lookup', function () {
expectTemplate('\n\n\n {{hello}}')
.withCompileOptions({ strict: true })
.toThrow(Exception, '"hello" not defined in [object Object] - 4:5');
});
it('should error contains correct location properties on missing property lookup', function () {
try {
var template = CompilerContext.compile('\n\n\n {{hello}}', {
strict: true,
});
template({});
} catch (error) {
expect(error.lineNumber).toBe(4);
expect(error.endLineNumber).toBe(4);
expect(error.column).toBe(5);
expect(error.endColumn).toBe(10);
}
});
});
describe('assume objects', function () {
it('should ignore missing property', function () {
expectTemplate('{{hello}}')
.withCompileOptions({ assumeObjects: true })
.toCompileTo('');
});
it('should ignore missing child', function () {
expectTemplate('{{hello.bar}}')
.withCompileOptions({ assumeObjects: true })
.withInput({ hello: {} })
.toCompileTo('');
});
it('should error on missing object', function () {
expectTemplate('{{hello.bar}}')
.withCompileOptions({ assumeObjects: true })
.toThrow(Error);
});
it('should error on missing context', function () {
expectTemplate('{{hello}}')
.withCompileOptions({ assumeObjects: true })
.withInput(undefined)
.toThrow(Error);
});
it('should error on missing data lookup', function () {
expectTemplate('{{@hello.bar}}')
.withCompileOptions({ assumeObjects: true })
.withInput(undefined)
.toThrow(Error);
});
it('should execute blockHelperMissing', function () {
expectTemplate('{{^hello}}foo{{/hello}}')
.withCompileOptions({ assumeObjects: true })
.toCompileTo('foo');
});
});
});