From 26166deb0c3a9938eeb94725705d49d259aa6e70 Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: Tue, 11 Sep 2012 13:52:10 +0200 Subject: Fix integer validation when boundary value is empty string There was an error in number validation check. If boundary value was an empty string, validation of a number always failed. This patch fixes the problem by not performing the check in these cases. https://fedorahosted.org/freeipa/ticket/3066 --- install/ui/field.js | 4 +- install/ui/ipa.js | 5 ++ install/ui/test/all_tests.html | 1 + install/ui/test/index.html | 1 + install/ui/test/jsl.conf | 3 +- install/ui/test/utils_tests.html | 24 +++++++ install/ui/test/utils_tests.js | 136 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 install/ui/test/utils_tests.html create mode 100644 install/ui/test/utils_tests.js (limited to 'install') diff --git a/install/ui/field.js b/install/ui/field.js index 42da6f92c..c5c999e68 100644 --- a/install/ui/field.js +++ b/install/ui/field.js @@ -448,13 +448,13 @@ IPA.metadata_validator = function(spec) { if (number) { - if (metadata.minvalue !== undefined && Number(value) < Number(metadata.minvalue)) { + if (IPA.defined(metadata.minvalue, true) && Number(value) < Number(metadata.minvalue)) { message = IPA.messages.widget.validation.min_value; message = message.replace('${value}', metadata.minvalue); return that.false_result(message); } - if (metadata.maxvalue !== undefined && Number(value) > Number(metadata.maxvalue)) { + if (IPA.defined(metadata.maxvalue, true) && Number(value) > Number(metadata.maxvalue)) { message = IPA.messages.widget.validation.max_value; message = message.replace('${value}', metadata.maxvalue); return that.false_result(message); diff --git a/install/ui/ipa.js b/install/ui/ipa.js index a2c4c08d6..bd25aeae2 100644 --- a/install/ui/ipa.js +++ b/install/ui/ipa.js @@ -2021,6 +2021,11 @@ IPA.is_empty = function(value) { return empty; }; +IPA.defined = function(value, check_empty_str) { + return value !== null && value !== undefined && + ((check_empty_str && value !== '') || !check_empty_str); +}; + IPA.array_diff = function(a, b) { if (a === b || (!a && !b)) return false; diff --git a/install/ui/test/all_tests.html b/install/ui/test/all_tests.html index 5a5eae54b..e9061b6ca 100644 --- a/install/ui/test/all_tests.html +++ b/install/ui/test/all_tests.html @@ -32,6 +32,7 @@ +

Complete Test Suite

diff --git a/install/ui/test/index.html b/install/ui/test/index.html index 1b623d40f..0a135188e 100644 --- a/install/ui/test/index.html +++ b/install/ui/test/index.html @@ -34,6 +34,7 @@
  • Access Control Interface Test Suite
  • Widget Test Suite
  • IP Addresses Test Suite +
  • Utils Test Suite diff --git a/install/ui/test/jsl.conf b/install/ui/test/jsl.conf index 4654b714f..768a295f1 100644 --- a/install/ui/test/jsl.conf +++ b/install/ui/test/jsl.conf @@ -146,4 +146,5 @@ +process ipa_tests.js +process ordered_map_tests.js +process widget_tests.js -+process ip_tests.js \ No newline at end of file ++process ip_tests.js ++process utils_tests.js \ No newline at end of file diff --git a/install/ui/test/utils_tests.html b/install/ui/test/utils_tests.html new file mode 100644 index 000000000..5b81cc359 --- /dev/null +++ b/install/ui/test/utils_tests.html @@ -0,0 +1,24 @@ + + + + IPA utils test suite + + + + + + + + + + + + +

    IPA utils test suite

    +

    +
    +

    +
      +
      + + \ No newline at end of file diff --git a/install/ui/test/utils_tests.js b/install/ui/test/utils_tests.js new file mode 100644 index 000000000..ff4fd2a3b --- /dev/null +++ b/install/ui/test/utils_tests.js @@ -0,0 +1,136 @@ +/* Authors: + * Petr Vobornik + * + * Copyright (C) 2012 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +var old; + +module('utils',{ + + setup: function() { + old = IPA.messages; + IPA.messages = { + widget: { + validation: { + integer: "", + decimal: "", + min_value: "", + max_value: "", + pattern_errmsg: "" + } + } + }; + }, + teardown: function() { + IPA.messages = old; + } +}); + +test('Testing metadata validator', function() { + + // using strings as values because it is an output of inputs + + var validator = IPA.build({ + factory: IPA.metadata_validator + }); + + var metadata = { + type: 'int', + maxvalue: 300, + minvalue: 30 + }; + + var context = { metadata: metadata }; + + var value; + + value = "50"; + ok(validator.validate(value, context).valid, 'Checking lower maximun, alphabetically higher'); + + value = "200"; + ok(validator.validate(value, context).valid, 'Checking higher minimum, alphabetically lower'); + + value = "29"; + ok(!validator.validate(value, context).valid, 'Checking below minimum'); + + value = "301"; + ok(!validator.validate(value, context).valid, 'Checking above maximum'); + + context.metadata.minvalue = 0; + value = "-1"; + ok(!validator.validate(value, context).valid, 'Checking zero minimum - below'); + value = "0"; + ok(validator.validate(value, context).valid, 'Checking zero minimum - above'); + value = "1"; + ok(validator.validate(value, context).valid, 'Checking zero minimum - same'); + + context.metadata = { + type: 'int', + maxvalue: "", + minvalue: "" + }; + + ok(validator.validate(value, context).valid, 'Checking empty strings as boundaries'); + + context.metadata = { + type: 'int', + maxvalue: null, + minvalue: null + }; + ok(validator.validate(value, context).valid, 'Checking null as boundaries'); + + context.metadata = { + type: 'int', + maxvalue: undefined, + minvalue: undefined + }; + ok(validator.validate(value, context).valid, 'Checking undefined as boundaries'); + + context.metadata = { + type: 'Decimal', + maxvalue: "10.333", + minvalue: "-10.333" + }; + + value = "10.333"; + ok(validator.validate(value, context).valid, 'Decimal: checking maximum'); + value = "10.3331"; + ok(!validator.validate(value, context).valid, 'Decimal: checking maximum - invalid'); + + value = "-10.333"; + ok(validator.validate(value, context).valid, 'Decimal: checking minimum'); + value = "-10.3331"; + ok(!validator.validate(value, context).valid, 'Decimal: checking minimum - invalid'); +}); + +test('Testing IPA.defined', function() { + + // positive + same(IPA.defined({}), true, 'Object'); + same(IPA.defined(0), true, 'Zero number'); + same(IPA.defined(1), true, 'Some number'); + same(IPA.defined(false), true, 'false'); + same(IPA.defined(true), true, 'true'); + same(IPA.defined(function(){}), true, 'function'); + same(IPA.defined(''), true, 'Empty string - not checking'); + + // negative + same(IPA.defined('', true), false, 'Empty string - checking'); + same(IPA.defined(undefined), false, 'undefined'); + same(IPA.defined(null), false, 'null'); +}); \ No newline at end of file -- cgit