Skip to content

Commit b14693f

Browse files
committed
Fix boolean strings parsing. Fixes #1065.
1 parent 9e111c9 commit b14693f

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

lib/boolean.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,18 @@ internals.Boolean = class extends Any {
2929
value
3030
};
3131

32-
result.value = (this._inner.truthySet.has(value, null, null, this._flags.insensitive) ? true
33-
: (this._inner.falsySet.has(value, null, null, this._flags.insensitive) ? false : value));
32+
if (typeof value === 'string' &&
33+
options.convert) {
34+
35+
const normalized = this._flags.insensitive ? value.toLowerCase() : value;
36+
result.value = (normalized === 'true' ? true
37+
: (normalized === 'false' ? false : value));
38+
}
39+
40+
if (typeof result.value !== 'boolean') {
41+
result.value = (this._inner.truthySet.has(value, null, null, this._flags.insensitive) ? true
42+
: (this._inner.falsySet.has(value, null, null, this._flags.insensitive) ? false : value));
43+
}
3444

3545
result.errors = (typeof result.value === 'boolean') ? null : this.createError('boolean.base', null, state, options);
3646
return result;

test/boolean.js

+26-9
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,24 @@ describe('boolean', () => {
3232
done();
3333
});
3434

35-
it('does not convert a string to a boolean', (done) => {
35+
it('converts boolean string to a boolean', (done) => {
3636

37-
Joi.boolean().validate('true', (err, value) => {
37+
Helper.validate(Joi.boolean(), [
38+
['true', true, null, true],
39+
['false', true, null, false],
40+
['TrUe', true, null, true],
41+
['FalSe', true, null, false]
42+
], done);
43+
});
3844

39-
expect(err).to.exist();
40-
expect(value).to.not.equal(true);
41-
done();
42-
});
45+
it('does not convert boolean string to a boolean in strict mode', (done) => {
46+
47+
Helper.validate(Joi.boolean().strict(), [
48+
['true', false, null, '"value" must be a boolean'],
49+
['false', false, null, '"value" must be a boolean'],
50+
['TrUe', false, null, '"value" must be a boolean'],
51+
['FalSe', false, null, '"value" must be a boolean']
52+
], done);
4353
});
4454

4555
it('errors on a number', (done) => {
@@ -87,6 +97,16 @@ describe('boolean', () => {
8797
done();
8898
});
8999

100+
it('converts boolean string to a boolean with a sensitive case', (done) => {
101+
102+
Helper.validate(Joi.boolean().insensitive(false), [
103+
['true', true, null, true],
104+
['false', true, null, false],
105+
['TrUe', false, null, '"value" must be a boolean'],
106+
['FalSe', false, null, '"value" must be a boolean']
107+
], done);
108+
});
109+
90110
});
91111

92112
describe('validate()', () => {
@@ -101,8 +121,6 @@ describe('boolean', () => {
101121
[null, false, null, '"value" must be a boolean'],
102122
['on', false, null, '"value" must be a boolean'],
103123
['off', false, null, '"value" must be a boolean'],
104-
['true', false, null, '"value" must be a boolean'],
105-
['false', false, null, '"value" must be a boolean'],
106124
['yes', false, null, '"value" must be a boolean'],
107125
['no', false, null, '"value" must be a boolean'],
108126
['1', false, null, '"value" must be a boolean'],
@@ -115,7 +133,6 @@ describe('boolean', () => {
115133
const rule = Joi.boolean().required();
116134
Helper.validate(rule, [
117135
['1234', false, null, '"value" must be a boolean'],
118-
['true', false, null, '"value" must be a boolean'],
119136
[false, true],
120137
[true, true],
121138
[null, false, null, '"value" must be a boolean']

0 commit comments

Comments
 (0)