Skip to content

Commit 7344f44

Browse files
committed
updating validation
1 parent 9bba768 commit 7344f44

File tree

5 files changed

+50
-30
lines changed

5 files changed

+50
-30
lines changed

src/checkField.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import predicate from "predicate";
22
import { isObject } from "./utils";
33

4-
export const OR = "or";
5-
export const AND = "and";
6-
export const NOT = "not";
4+
import { OR, AND, NOT } from './constants';
75

86
const POSITIVE_PREDICATE = predicate;
97
const NEGATIVE_PREDICATE = predicate.not;

src/conditionsMeet.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { isObject, toError } from "./utils";
2-
import checkField, { OR, AND, NOT} from "./checkField";
2+
import checkField from "./checkField";
3+
import { OR, AND, NOT } from './constants';
34
import selectn from "selectn";
45

56
export default function conditionsMeet(conditions, formData) {

src/constants.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const OR = "or";
2+
export const AND = "and";
3+
export const NOT = "not";

src/validation.js

+18-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import predicate from "predicate";
22
import { flatMap, isObject, toError } from "./utils";
3-
4-
import { NOT, AND, OR } from './checkField';
3+
import { OR, AND, NOT } from './constants';
54

65
export function predicatesFromRule(rule) {
76
if (isObject(rule)) {
@@ -33,6 +32,8 @@ export function predicatesFromCondition(condition) {
3332
return flatMap(Object.keys(condition), ref => {
3433
if (ref === OR || ref === AND) {
3534
return flatMap(condition[ref], w => predicatesFromRule(w));
35+
} else if (ref === NOT) {
36+
return predicatesFromCondition(condition[ref]);
3637
} else {
3738
return predicatesFromRule(condition[ref]);
3839
}
@@ -43,15 +44,23 @@ export function listAllPredicates(conditions) {
4344
let allPredicates = flatMap(conditions, condition =>
4445
predicatesFromCondition(condition)
4546
);
46-
return new Set(allPredicates);
47+
return allPredicates.filter((v, i, a) => allPredicates.indexOf(v) === i);
48+
}
49+
50+
export function listInvalidPredicates(conditions) {
51+
let refPredicates = listAllPredicates(conditions);
52+
return refPredicates.filter((p) => predicate[p] === undefined);
4753
}
4854

49-
export function listInvalidPredicates(rules) {
50-
let rulePredicates = listAllPredicates(rules);
51-
Object.keys(predicate).forEach(p => rulePredicates.delete(p));
52-
return Array.from(rulePredicates);
55+
export function validatePredicates(conditions) {
56+
let invalidPredicates = listInvalidPredicates(conditions);
57+
if (invalidPredicates.length !== 0) {
58+
toError(`Rule contains invalid predicates ${invalidPredicates}`);
59+
}
5360
}
5461

62+
63+
5564
export function fieldsFromCondition(condition) {
5665
return flatMap(Object.keys(condition), ref => {
5766
if (ref === OR || ref === AND) {
@@ -66,13 +75,12 @@ export function listAllFields(conditions) {
6675
let allFields = flatMap(conditions, condition =>
6776
fieldsFromCondition(condition)
6877
);
69-
return new Set(allFields);
78+
return allFields.filter((v, i, a) => allFields.indexOf(v) === i);
7079
}
7180

7281
export function listInvalidFields(conditions, schema) {
7382
let ruleFields = listAllFields(conditions);
74-
Object.keys(schema.properties).forEach(f => ruleFields.delete(f));
75-
return Array.from(ruleFields);
83+
return ruleFields.filter(field => schema.properties[field] === undefined);
7684
}
7785

7886
export function validateConditionFields(conditions, schema) {
@@ -82,9 +90,3 @@ export function validateConditionFields(conditions, schema) {
8290
}
8391
}
8492

85-
export function validatePredicates(conditions) {
86-
let invalidPredicates = listInvalidPredicates(conditions);
87-
if (invalidPredicates.length !== 0) {
88-
toError(`Rule contains invalid predicates ${invalidPredicates}`);
89-
}
90-
}

test/validation.test.js

+26-10
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ test("Two field rule ", () => {
4242
]);
4343

4444
let predicates = listAllPredicates(conditions);
45-
expect(predicates).toEqual(new Set(["empty", "greater", "less"]));
45+
expect(predicates).toEqual(["empty", "greater", "less"]);
4646

4747
let fields = listAllFields(conditions);
48-
expect(fields).toEqual(new Set(["firstName", "age"]));
48+
expect(fields).toEqual(["firstName", "age"]);
4949
});
5050

5151
test("3 field rule ", () => {
@@ -66,19 +66,19 @@ test("3 field rule ", () => {
6666
]);
6767

6868
let predicates = listAllPredicates(conditions);
69-
expect(predicates).toEqual(new Set(["empty", "greater", "less"]));
69+
expect(predicates).toEqual(["empty", "greater", "less"]);
7070

7171
let fields = listAllFields(conditions);
72-
expect(fields).toEqual(new Set(["firstName", "age"]));
72+
expect(fields).toEqual(["firstName", "age"]);
7373
});
7474

75-
test("list all predicates", () => {
75+
test("invalidate predicates", () => {
7676
let invalidConditions = conditionsFrom([
7777
{
7878
event: { type: "remove" },
7979
conditions: {
8080
age: {
81-
some: {
81+
wtf: {
8282
greater: 5,
8383
less: 70,
8484
},
@@ -87,9 +87,10 @@ test("list all predicates", () => {
8787
},
8888
]);
8989

90-
expect(listAllPredicates(invalidConditions)).toEqual(
91-
new Set(["greater", "less", "some"])
92-
);
90+
expect(listAllPredicates(invalidConditions)).toEqual(["greater", "less", "wtf"]);
91+
expect(listInvalidPredicates(invalidConditions)).toEqual(["wtf"]);
92+
expect(() => validatePredicates(invalidConditions)).toThrow();
93+
expect(() => testInProd(validatePredicates(invalidConditions))).not.toBeUndefined();
9394
});
9495

9596
let schema = {
@@ -114,7 +115,7 @@ test("invalid field", () => {
114115
},
115116
]);
116117

117-
expect(listAllFields(invalidFieldConditions)).toEqual(new Set(["lastName", "firstName"]));
118+
expect(listAllFields(invalidFieldConditions)).toEqual(["lastName", "firstName"]);
118119
expect(listInvalidFields(invalidFieldConditions, schema)).toEqual([ "lastName",]);
119120
expect(() => validateConditionFields(invalidFieldConditions, schema)).toThrow();
120121
});
@@ -152,6 +153,21 @@ test("invalid field or", () => {
152153
expect(() => validate(invalidFieldOr, schema)).toThrow();
153154
});
154155

156+
test("invalid field NOT or", () => {
157+
let invalidFieldNotWithOr = conditionsFrom([
158+
{
159+
conditions: {
160+
not: {
161+
firstName: "or"
162+
}
163+
},
164+
event: { type: "remove" },
165+
},
166+
]);
167+
168+
expect(() => validate(invalidFieldNotWithOr, schema)).toThrow();
169+
});
170+
155171
test("valid field or", () => {
156172
let validFieldOr = conditionsFrom([
157173
{

0 commit comments

Comments
 (0)