[ { "description": "object properties validation", "database": { "types": [ { "name": "properties_0_0", "schemas": { "properties_0_0": { "properties": { "foo": { "type": "integer" }, "bar": { "type": "string" } } } } } ] }, "tests": [ { "description": "both properties present and valid is valid", "data": { "foo": 1, "bar": "baz" }, "schema_id": "properties_0_0", "action": "validate", "expect": { "success": true } }, { "description": "one property invalid is invalid", "data": { "foo": 1, "bar": {} }, "schema_id": "properties_0_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "INVALID_TYPE", "values": { "expected": "string" }, "details": { "path": "bar", "schema": "properties_0_0" } } ] } }, { "description": "both properties invalid is invalid", "data": { "foo": [], "bar": {} }, "schema_id": "properties_0_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "INVALID_TYPE", "values": { "expected": "integer" }, "details": { "path": "foo", "schema": "properties_0_0" } }, { "code": "INVALID_TYPE", "values": { "expected": "string" }, "details": { "path": "bar", "schema": "properties_0_0" } } ] } }, { "description": "doesn't invalidate other properties", "data": {}, "schema_id": "properties_0_0", "action": "validate", "expect": { "success": true } }, { "description": "ignores arrays", "data": [], "schema_id": "properties_0_0", "action": "validate", "expect": { "success": true } }, { "description": "ignores other non-objects", "data": 12, "schema_id": "properties_0_0", "action": "validate", "expect": { "success": true } } ] }, { "description": "properties with boolean schema", "database": { "types": [ { "name": "properties_1_0", "schemas": { "properties_1_0": { "properties": { "foo": true, "bar": false } } } } ] }, "tests": [ { "description": "no property present is valid", "data": {}, "schema_id": "properties_1_0", "action": "validate", "expect": { "success": true } }, { "description": "only 'true' property present is valid", "data": { "foo": 1 }, "schema_id": "properties_1_0", "action": "validate", "expect": { "success": true } }, { "description": "only 'false' property present is invalid", "data": { "bar": 2 }, "schema_id": "properties_1_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "FALSE_SCHEMA", "details": { "path": "bar", "schema": "properties_1_0" } } ] } }, { "description": "both properties present is invalid", "data": { "foo": 1, "bar": 2 }, "schema_id": "properties_1_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "FALSE_SCHEMA", "details": { "path": "bar", "schema": "properties_1_0" } } ] } } ] }, { "description": "properties with escaped characters", "database": { "types": [ { "name": "properties_2_0", "schemas": { "properties_2_0": { "properties": { "foo\nbar": { "type": "number" }, "foo\"bar": { "type": "number" }, "foo\\bar": { "type": "number" }, "foo\rbar": { "type": "number" }, "foo\tbar": { "type": "number" }, "foo\fbar": { "type": "number" } } } } } ] }, "tests": [ { "description": "object with all numbers is valid", "data": { "foo\nbar": 1, "foo\"bar": 1, "foo\\bar": 1, "foo\rbar": 1, "foo\tbar": 1, "foo\fbar": 1 }, "schema_id": "properties_2_0", "action": "validate", "expect": { "success": true } }, { "description": "object with strings is invalid", "data": { "foo\nbar": "1", "foo\"bar": "1", "foo\\bar": "1", "foo\rbar": "1", "foo\tbar": "1", "foo\fbar": "1" }, "schema_id": "properties_2_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "foo\nbar", "schema": "properties_2_0" } }, { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "foo\"bar", "schema": "properties_2_0" } }, { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "foo\\bar", "schema": "properties_2_0" } }, { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "foo\rbar", "schema": "properties_2_0" } }, { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "foo\tbar", "schema": "properties_2_0" } }, { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "foo\fbar", "schema": "properties_2_0" } } ] } } ] }, { "description": "properties with null valued instance properties", "database": { "types": [ { "name": "properties_3_0", "schemas": { "properties_3_0": { "properties": { "foo": { "type": "null" } } } } } ] }, "tests": [ { "description": "allows null values", "data": { "foo": null }, "schema_id": "properties_3_0", "action": "validate", "expect": { "success": true } } ] }, { "description": "properties whose names are Javascript object property names", "comment": "Ensure JS implementations don't universally consider e.g. __proto__ to always be present in an object.", "database": { "types": [ { "name": "properties_4_0", "schemas": { "properties_4_0": { "properties": { "__proto__": { "type": "number" }, "toString": { "properties": { "length": { "type": "string" } } }, "constructor": { "type": "number" } } } } } ] }, "tests": [ { "description": "ignores arrays", "data": [], "schema_id": "properties_4_0", "action": "validate", "expect": { "success": true } }, { "description": "ignores other non-objects", "data": 12, "schema_id": "properties_4_0", "action": "validate", "expect": { "success": true } }, { "description": "none of the properties mentioned", "data": {}, "schema_id": "properties_4_0", "action": "validate", "expect": { "success": true } }, { "description": "__proto__ not valid", "data": { "__proto__": "foo" }, "schema_id": "properties_4_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "__proto__", "schema": "properties_4_0" } } ] } }, { "description": "toString not valid", "data": { "toString": { "length": 37 } }, "schema_id": "properties_4_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "INVALID_TYPE", "values": { "expected": "string" }, "details": { "path": "toString/length", "schema": "properties_4_0" } } ] } }, { "description": "constructor not valid", "data": { "constructor": { "length": 37 } }, "schema_id": "properties_4_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "INVALID_TYPE", "values": { "expected": "number" }, "details": { "path": "constructor", "schema": "properties_4_0" } } ] } }, { "description": "all present and valid", "data": { "__proto__": 12, "toString": { "length": "foo" }, "constructor": 37 }, "schema_id": "properties_4_0", "action": "validate", "expect": { "success": true } } ] }, { "description": "extensible: true allows extra properties", "database": { "types": [ { "name": "properties_5_0", "schemas": { "properties_5_0": { "properties": { "foo": { "type": "integer" } }, "extensible": true } } } ] }, "tests": [ { "description": "extra property is valid", "data": { "foo": 1, "bar": "baz" }, "schema_id": "properties_5_0", "action": "validate", "expect": { "success": true } } ] }, { "description": "strict by default: extra properties invalid", "database": { "types": [ { "name": "properties_6_0", "schemas": { "properties_6_0": { "properties": { "foo": { "type": "string" } } } } } ] }, "tests": [ { "description": "extra property is invalid", "data": { "foo": "bar", "extra": 1 }, "schema_id": "properties_6_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "STRICT_PROPERTY_VIOLATION", "values": { "property_name": "extra" }, "details": { "path": "extra", "schema": "properties_6_0" } } ] } } ] }, { "description": "inheritance: nested object inherits strictness from strict parent", "database": { "types": [ { "name": "properties_7_0", "schemas": { "properties_7_0": { "properties": { "nested": { "properties": { "foo": { "type": "string" } } } } } } } ] }, "tests": [ { "description": "nested extra property is invalid", "data": { "nested": { "foo": "bar", "extra": 1 } }, "schema_id": "properties_7_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "STRICT_PROPERTY_VIOLATION", "values": { "property_name": "extra" }, "details": { "path": "nested/extra", "schema": "properties_7_0" } } ] } } ] }, { "description": "override: nested object allows extra properties if extensible: true", "database": { "types": [ { "name": "properties_8_0", "schemas": { "properties_8_0": { "properties": { "nested": { "extensible": true, "properties": { "foo": { "type": "string" } } } } } } } ] }, "tests": [ { "description": "nested extra property is valid", "data": { "nested": { "foo": "bar", "extra": 1 } }, "schema_id": "properties_8_0", "action": "validate", "expect": { "success": true } } ] }, { "description": "inheritance: nested object inherits looseness from loose parent", "database": { "types": [ { "name": "properties_9_0", "schemas": { "properties_9_0": { "extensible": true, "properties": { "nested": { "properties": { "foo": { "type": "string" } } } } } } } ] }, "tests": [ { "description": "nested extra property is valid", "data": { "nested": { "foo": "bar", "extra": 1 } }, "schema_id": "properties_9_0", "action": "validate", "expect": { "success": true } } ] }, { "description": "override: nested object enforces strictness if extensible: false", "database": { "types": [ { "name": "properties_10_0", "schemas": { "properties_10_0": { "extensible": true, "properties": { "nested": { "extensible": false, "properties": { "foo": { "type": "string" } } } } } } } ] }, "tests": [ { "description": "nested extra property is invalid", "data": { "nested": { "foo": "bar", "extra": 1 } }, "schema_id": "properties_10_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "STRICT_PROPERTY_VIOLATION", "values": { "property_name": "extra" }, "details": { "path": "nested/extra", "schema": "properties_10_0" } } ] } } ] }, { "description": "arrays: inline items inherit strictness from strict parent", "database": { "types": [ { "name": "properties_11_0", "schemas": { "properties_11_0": { "properties": { "list": { "type": "array", "items": { "properties": { "foo": { "type": "string" } } } } } } } } ] }, "tests": [ { "description": "array item with extra property is invalid (strict parent)", "data": { "list": [ { "foo": "bar", "extra": 1 } ] }, "schema_id": "properties_11_0", "action": "validate", "expect": { "success": false, "errors": [ { "code": "STRICT_PROPERTY_VIOLATION", "values": { "property_name": "extra" }, "details": { "path": "list/0/extra", "schema": "properties_11_0" } } ] } } ] }, { "description": "arrays: inline items inherit looseness from loose parent", "database": { "types": [ { "name": "properties_12_0", "schemas": { "properties_12_0": { "extensible": true, "properties": { "list": { "type": "array", "items": { "properties": { "foo": { "type": "string" } } } } } } } } ] }, "tests": [ { "description": "array item with extra property is valid (loose parent)", "data": { "list": [ { "foo": "bar", "extra": 1 } ] }, "schema_id": "properties_12_0", "action": "validate", "expect": { "success": true } } ] } ]