jsgrid
Version:
Lightweight data grid jQuery plugin. It supports basic grid operations like inserting, filtering, editing, deleting, paging, sorting, and validation. jsGrid is tunable and allows to customize appearance and components.
280 lines (228 loc) • 8.01 kB
JavaScript
$(function() {
var validators = jsGrid.validators;
module("validation.validate", {
setup: function() {
this.validation = new jsGrid.Validation();
}
});
test("as function", function() {
var validateFunction = function(value) {
return value === "test";
};
deepEqual(this.validation.validate({
value: "not_test",
rules: validateFunction
}), [undefined]);
deepEqual(this.validation.validate({
value: "test",
rules: validateFunction
}), []);
});
test("as rule config", function() {
var validateRule = {
validator: function(value) {
return value === "test";
},
message: "Error"
};
deepEqual(this.validation.validate({
value: "not_test",
rules: validateRule
}), ["Error"]);
deepEqual(this.validation.validate({
value: "test",
rules: validateRule
}), []);
});
test("as rule config with param", function() {
var validateRule = {
validator: function(value, item, param) {
return value === param;
},
param: "test",
message: "Error"
};
deepEqual(this.validation.validate({
value: "not_test",
rules: validateRule
}), ["Error"]);
deepEqual(this.validation.validate({
value: "test",
rules: validateRule
}), []);
});
test("as array of rules", function() {
var validateRules = [{
message: "Error",
validator: function(value) {
return value !== "";
}
}, {
validator: function(value) {
return value === "test";
}
}];
deepEqual(this.validation.validate({
value: "",
rules: validateRules
}), ["Error", undefined]);
deepEqual(this.validation.validate({
value: "test",
rules: validateRules
}), []);
});
test("as string", function() {
validators.test_validator = function(value) {
return value === "test";
};
deepEqual(this.validation.validate({
value: "not_test",
rules: "test_validator"
}), [undefined]);
deepEqual(this.validation.validate({
value: "test",
rules: "test_validator"
}), []);
delete validators.test_validator;
});
test("as rule config with validator as string", function() {
validators.test_validator = function(value) {
return value === "test";
};
var validateRule = {
validator: "test_validator",
message: "Error"
};
deepEqual(this.validation.validate({
value: "not_test",
rules: validateRule
}), ["Error"]);
deepEqual(this.validation.validate({
value: "test",
rules: validateRule
}), []);
delete validators.test_validator;
});
test("as array of mixed rules", function() {
validators.test_validator = function(value) {
return value === "test";
};
var validationRules = [
"test_validator",
function(value) {
return value !== "";
}, {
validator: function(value) {
return value === "test";
},
message: "Error"
}
];
deepEqual(this.validation.validate({
value: "",
rules: validationRules
}), [undefined, undefined, "Error"]);
deepEqual(this.validation.validate({
value: "not_test",
rules: validationRules
}), [undefined, "Error"]);
deepEqual(this.validation.validate({
value: "test",
rules: validationRules
}), []);
delete validators.test_validator;
});
test("as string validator with default error message", function() {
validators.test_validator = {
message: function(value) {
return "Error: " + value;
},
validator: function(value) {
return value === "test";
}
};
var validateRule = {
validator: "test_validator"
};
deepEqual(this.validation.validate({
value: "not_test",
rules: validateRule
}), ["Error: not_test"]);
deepEqual(this.validation.validate({
value: "test",
rules: validateRule
}), []);
delete validators.test_validator;
});
test("throws exception for unknown validator", function() {
var validateRule = {
validator: "unknown_validator"
};
var validation = this.validation;
throws(function() {
validation.validate({
value: "test",
rules: validateRule
});
}, /unknown validator "unknown_validator"/, "exception for unknown validator");
});
module("validators", {
setup: function() {
var validation = new jsGrid.Validation();
this.testValidator = function(validator, value, param) {
var result = validation.validate({
value: value,
rules: { validator: validator, param: param }
});
return !result.length;
}
}
});
test("required", function() {
equal(this.testValidator("required", ""), false);
equal(this.testValidator("required", undefined), false);
equal(this.testValidator("required", null), false);
equal(this.testValidator("required", 0), true);
equal(this.testValidator("required", "test"), true);
});
test("rangeLength", function() {
equal(this.testValidator("rangeLength", "123456", [0, 5]), false);
equal(this.testValidator("rangeLength", "", [1, 5]), false);
equal(this.testValidator("rangeLength", "123", [0, 5]), true);
equal(this.testValidator("rangeLength", "", [0, 5]), true);
equal(this.testValidator("rangeLength", "12345", [0, 5]), true);
});
test("minLength", function() {
equal(this.testValidator("minLength", "123", 5), false);
equal(this.testValidator("minLength", "12345", 5), true);
equal(this.testValidator("minLength", "123456", 5), true);
});
test("maxLength", function() {
equal(this.testValidator("maxLength", "123456", 5), false);
equal(this.testValidator("maxLength", "12345", 5), true);
equal(this.testValidator("maxLength", "123", 5), true);
});
test("pattern", function() {
equal(this.testValidator("pattern", "_13_", "1?3"), false);
equal(this.testValidator("pattern", "13", "1?3"), true);
equal(this.testValidator("pattern", "3", "1?3"), true);
equal(this.testValidator("pattern", "_13_", /1?3/), true);
});
test("range", function() {
equal(this.testValidator("range", 6, [0, 5]), false);
equal(this.testValidator("range", 0, [1, 5]), false);
equal(this.testValidator("range", 3, [0, 5]), true);
equal(this.testValidator("range", 0, [0, 5]), true);
equal(this.testValidator("range", 5, [0, 5]), true);
});
test("min", function() {
equal(this.testValidator("min", 3, 5), false);
equal(this.testValidator("min", 5, 5), true);
equal(this.testValidator("min", 6, 5), true);
});
test("max", function() {
equal(this.testValidator("max", 6, 5), false);
equal(this.testValidator("max", 5, 5), true);
equal(this.testValidator("max", 3, 5), true);
});
});