From 735c78d3ecb695dd16cb37879880f522c4b29c72 Mon Sep 17 00:00:00 2001 From: Johan Fleury Date: Mon, 8 Oct 2018 12:58:12 -0400 Subject: Import upstream version 1.7.0 --- tests/files/fail/test_anchor.yaml | 95 +++++++++++++ tests/files/fail/test_assert.yaml | 34 +++++ tests/files/fail/test_default.yaml | 21 +++ tests/files/fail/test_desc.yaml | 1 + tests/files/fail/test_enum.yaml | 16 +++ tests/files/fail/test_example.yaml | 1 + tests/files/fail/test_extensions.yaml | 0 tests/files/fail/test_func.yaml | 0 tests/files/fail/test_ident.yaml | 23 ++++ tests/files/fail/test_include.yaml | 0 tests/files/fail/test_length.yaml | 113 +++++++++++++++ tests/files/fail/test_mapping.yaml | 186 +++++++++++++++++++++++++ tests/files/fail/test_matching.yaml | 0 tests/files/fail/test_merge.yaml | 37 +++++ tests/files/fail/test_name.yaml | 0 tests/files/fail/test_nullable.yaml | 19 +++ tests/files/fail/test_pattern.yaml | 26 ++++ tests/files/fail/test_range.yaml | 219 ++++++++++++++++++++++++++++++ tests/files/fail/test_required.yaml | 19 +++ tests/files/fail/test_schema.yaml | 0 tests/files/fail/test_sequence.yaml | 71 ++++++++++ tests/files/fail/test_sequence_multi.yaml | 31 +++++ tests/files/fail/test_type_any.yaml | 1 + tests/files/fail/test_type_bool.yaml | 52 +++++++ tests/files/fail/test_type_date.yaml | 83 +++++++++++ tests/files/fail/test_type_float.yaml | 56 ++++++++ tests/files/fail/test_type_int.yaml | 45 ++++++ tests/files/fail/test_type_map.yaml | 46 +++++++ tests/files/fail/test_type_none.yaml | 54 ++++++++ tests/files/fail/test_type_number.yaml | 83 +++++++++++ tests/files/fail/test_type_scalar.yaml | 0 tests/files/fail/test_type_seq.yaml | 47 +++++++ tests/files/fail/test_type_str.yaml | 73 ++++++++++ tests/files/fail/test_type_symbol.yaml | 0 tests/files/fail/test_type_text.yaml | 70 ++++++++++ tests/files/fail/test_type_timestamp.yaml | 15 ++ tests/files/fail/test_unique.yaml | 109 +++++++++++++++ tests/files/fail/test_version.yaml | 0 38 files changed, 1646 insertions(+) create mode 100644 tests/files/fail/test_anchor.yaml create mode 100644 tests/files/fail/test_assert.yaml create mode 100644 tests/files/fail/test_default.yaml create mode 100644 tests/files/fail/test_desc.yaml create mode 100644 tests/files/fail/test_enum.yaml create mode 100644 tests/files/fail/test_example.yaml create mode 100644 tests/files/fail/test_extensions.yaml create mode 100644 tests/files/fail/test_func.yaml create mode 100644 tests/files/fail/test_ident.yaml create mode 100644 tests/files/fail/test_include.yaml create mode 100644 tests/files/fail/test_length.yaml create mode 100644 tests/files/fail/test_mapping.yaml create mode 100644 tests/files/fail/test_matching.yaml create mode 100644 tests/files/fail/test_merge.yaml create mode 100644 tests/files/fail/test_name.yaml create mode 100644 tests/files/fail/test_nullable.yaml create mode 100644 tests/files/fail/test_pattern.yaml create mode 100644 tests/files/fail/test_range.yaml create mode 100644 tests/files/fail/test_required.yaml create mode 100644 tests/files/fail/test_schema.yaml create mode 100644 tests/files/fail/test_sequence.yaml create mode 100644 tests/files/fail/test_sequence_multi.yaml create mode 100644 tests/files/fail/test_type_any.yaml create mode 100644 tests/files/fail/test_type_bool.yaml create mode 100644 tests/files/fail/test_type_date.yaml create mode 100644 tests/files/fail/test_type_float.yaml create mode 100644 tests/files/fail/test_type_int.yaml create mode 100644 tests/files/fail/test_type_map.yaml create mode 100644 tests/files/fail/test_type_none.yaml create mode 100644 tests/files/fail/test_type_number.yaml create mode 100644 tests/files/fail/test_type_scalar.yaml create mode 100644 tests/files/fail/test_type_seq.yaml create mode 100644 tests/files/fail/test_type_str.yaml create mode 100644 tests/files/fail/test_type_symbol.yaml create mode 100644 tests/files/fail/test_type_text.yaml create mode 100644 tests/files/fail/test_type_timestamp.yaml create mode 100644 tests/files/fail/test_unique.yaml create mode 100644 tests/files/fail/test_version.yaml (limited to 'tests/files/fail') diff --git a/tests/files/fail/test_anchor.yaml b/tests/files/fail/test_anchor.yaml new file mode 100644 index 0000000..dca97f5 --- /dev/null +++ b/tests/files/fail/test_anchor.yaml @@ -0,0 +1,95 @@ +--- +name: fail-anchor-1 +desc: schema with anchor +schema: + type: seq + required: true + sequence: + - type: map + required: true + mapping: + first-name: &name + type: str + required: true + family-name: *name +data: + - first-name: foo + last-name: Foo + - first-name: bar + family-name: 100 +errors: + - "Cannot find required key 'family-name'. Path: '/0'" + - "Key 'last-name' was not defined. Path: '/0'" + - "Value '100' is not of type 'str'. Path: '/1/family-name'" + ## Kwalify errors + # :required_nokey : 1:3:[/0] key 'family-name:' is required. + # :key_undefined : 2:3:[/0/last-name] key 'last-name:' is undefined. + # :type_unmatch : 4:3:[/1/family-name] '100': not a string. +--- +name: fail-anchor-2 +desc: schema with anchor 2 +schema: + type: map + required: true + mapping: + title: &name + type: str + required: true + address-book: + type: seq + required: true + sequence: + - type: map + mapping: + name: *name + email: + type: str + required: true +data: + title: my friends + address-book: + - name: 100 + email: foo@mail.com + - first-name: bar + email: bar@mail.com +errors: + - "Cannot find required key 'name'. Path: '/address-book/1'" + - "Key 'first-name' was not defined. Path: '/address-book/1'" + - "Value '100' is not of type 'str'. Path: '/address-book/0/name'" + ## Kwalify errors + # :type_unmatch : 3:5:[/address-book/0/name] '100': not a string. + # :required_nokey : 5:5:[/address-book/1] key 'name:' is required. + # :key_undefined : 5:5:[/address-book/1/first-name] key 'first-name:' is undefined. +# TODO: THIS TEST IS BROKEN BECUASE IT CAUSE INFINITE RECURSION IN PYTHON +# --- +# name: fail-anchor-3 +# desc: document with anchor +# schema: +# type: seq +# sequence: +# - &employee +# type: map +# mapping: +# name: +# type: str +# post: +# type: str +# enum: +# - exective +# - manager +# - clerk +# supervisor: *employee +# data: +# - &foo +# name: 100 +# post: exective +# supervisor: *foo +# - &bar +# name: foo +# post: worker +# supervisor: *foo +# errors: +# - '' +# ## Kwalify errors +# # :type_unmatch : 2:3:[/0/name] '100': not a string. +# # :enum_notexist : 7:3:[/1/post] 'worker': invalid post value. diff --git a/tests/files/fail/test_assert.yaml b/tests/files/fail/test_assert.yaml new file mode 100644 index 0000000..9073cdf --- /dev/null +++ b/tests/files/fail/test_assert.yaml @@ -0,0 +1,34 @@ +--- +name: fail-assert-1 +desc: assert test +schema: + type: seq + sequence: + - type: map + mapping: + "less-than": + type: number + assert: val < 8 + "more-than": + type: number + assert: 3 < val + "between": + type: number + assert: 3 < val and val < 8 + "except": + type: number + assert: val < 3 or 8 < val +data: + - less-than: 8 + - more-than: 3 + - between: 2.9 + - except: 3.1 +errors: + - "Value: '2.9' assertion expression failed (3 < val and val < 8)" + - "Value: '3' assertion expression failed (3 < val)" + - "Value: '3.1' assertion expression failed (val < 3 or 8 < val)" + - "Value: '8' assertion expression failed (val < 8)" + # :assert_failed : 1:3:[/0/less-than] '8': assertion expression failed (val < 8). + # :assert_failed : 2:3:[/1/more-than] '3': assertion expression failed (3 < val). + # :assert_failed : 3:3:[/2/between] '2.9': assertion expression failed (3 < val and val < 8). + # :assert_failed : 4:3:[/3/except] '3.1': assertion expression failed (val < 3 or 8 < val). diff --git a/tests/files/fail/test_default.yaml b/tests/files/fail/test_default.yaml new file mode 100644 index 0000000..ab0a0a5 --- /dev/null +++ b/tests/files/fail/test_default.yaml @@ -0,0 +1,21 @@ +--- +name: fail-default-1 +desc: default value of map +schema: + type: map + mapping: + =: + type: number + range: + min: -10 + max: 10 +data: + value1: 0 + value2: 20 + value3: -20 +errors: + - "Type 'scalar' has size of '-20', less than min limit '-10'. Path: '/value3'" + - "Type 'scalar' has size of '20', greater than max limit '10'. Path: '/value2'" + ## Kwalify errors + # :range_toolarge : 2:1:[/value2] '20': too large (> max 10). + # :range_toosmall : 3:1:[/value3] '-20': too small (< min -10). diff --git a/tests/files/fail/test_desc.yaml b/tests/files/fail/test_desc.yaml new file mode 100644 index 0000000..401dde3 --- /dev/null +++ b/tests/files/fail/test_desc.yaml @@ -0,0 +1 @@ +# Becuase desc has no validation done on the value there is no failure case for this keyword diff --git a/tests/files/fail/test_enum.yaml b/tests/files/fail/test_enum.yaml new file mode 100644 index 0000000..9f619dc --- /dev/null +++ b/tests/files/fail/test_enum.yaml @@ -0,0 +1,16 @@ +--- +name: fail-enum-1 +desc: Test simple enum +data: + - A + - B + - O +schema: + type: seq + sequence: + - type: str + enum: [E, F, G, H] +errors: + - "Enum 'A' does not exist. Path: '/0'" + - "Enum 'B' does not exist. Path: '/1'" + - "Enum 'O' does not exist. Path: '/2'" diff --git a/tests/files/fail/test_example.yaml b/tests/files/fail/test_example.yaml new file mode 100644 index 0000000..baa8caf --- /dev/null +++ b/tests/files/fail/test_example.yaml @@ -0,0 +1 @@ +# Becuase example has no validation done on the value there is no failure case for this keyword \ No newline at end of file diff --git a/tests/files/fail/test_extensions.yaml b/tests/files/fail/test_extensions.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_func.yaml b/tests/files/fail/test_func.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_ident.yaml b/tests/files/fail/test_ident.yaml new file mode 100644 index 0000000..2531dfe --- /dev/null +++ b/tests/files/fail/test_ident.yaml @@ -0,0 +1,23 @@ +--- +name: fail-ident-1 +desc: ident constraint test +schema: + type: seq + sequence: + - type: map + mapping: + "name": + ident: true + "age": + type: int +data: + - name: foo + age: 10 + - name: bar + age: 10 + - name: bar + age: 10 +errors: + - "Value 'bar' is not unique. Previous path: '/1/name'. Path: '/2/name'" + ## Kwalify errors + # :value_notunique : 5:3:[/2/name] 'bar': is already used at '/1/name'. diff --git a/tests/files/fail/test_include.yaml b/tests/files/fail/test_include.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_length.yaml b/tests/files/fail/test_length.yaml new file mode 100644 index 0000000..8264987 --- /dev/null +++ b/tests/files/fail/test_length.yaml @@ -0,0 +1,113 @@ +--- +name: fail-length-1 +desc: length test +schema: + type: map + mapping: + "max-only": + type: seq + sequence: + - type: str + length: {max: 8} + "min-only": + type: seq + sequence: + - type: str + length: {min: 4} + "max-and-min": + type: seq + sequence: + - type: str + length: {max: 8, min: 4} +data: + max-only: + - hogehoge! + min-only: + - foo + - + max-and-min: + - foobarbaz + - foo +errors: + - "Value: 'foo' has length of '3', greater than min limit '4'. Path: '/max-and-min/1'" + - "Value: 'foo' has length of '3', greater than min limit '4'. Path: '/min-only/0'" + - "Value: 'foobarbaz' has length of '9', greater than max limit '8'. Path: '/max-and-min/0'" + - "Value: 'hogehoge!' has length of '9', greater than max limit '8'. Path: '/max-only/0'" + ## Kwalify errors + # :length_toolong : 2:3:[/max-only/0] 'hogehoge!': too long (length 9 > max 8). + # :length_tooshort : 4:3:[/min-only/0] 'foo': too short (length 3 < min 4). + # :length_toolong : 7:3:[/max-and-min/0] 'foobarbaz': too long (length 9 > max 8). + # :length_tooshort : 8:3:[/max-and-min/1] 'foo': too short (length 3 < min 4). +--- +name: fail-length-2 +desc: length test (with max-ex and min-ex) +schema: + type: map + mapping: + "max-ex-only": + type: seq + sequence: + - type: str + length: {max-ex: 8} + "min-ex-only": + type: seq + sequence: + - type: str + length: {min-ex: 4} + "max-ex-and-min-ex": + type: seq + sequence: + - type: str + length: {max-ex: 8, min-ex: 4} +data: + max-ex-only: + - hogehoge + min-ex-only: + - foo! + - + max-ex-and-min-ex: + - foobarba + - foo! +errors: + - "Value: 'foo!' has length of '4', greater than min_ex limit '4'. Path: '/max-ex-and-min-ex/1'" + - "Value: 'foo!' has length of '4', greater than min_ex limit '4'. Path: '/min-ex-only/0'" + - "Value: 'foobarba' has length of '8', greater than max_ex limit '8'. Path: '/max-ex-and-min-ex/0'" + - "Value: 'hogehoge' has length of '8', greater than max_ex limit '8'. Path: '/max-ex-only/0'" + ## Kwalify errors + # :length_toolongex : 2:3:[/max-ex-only/0] 'hogehoge': too long (length 8 >= max 8). + # :length_tooshortex : 4:3:[/min-ex-only/0] 'foo!': too short (length 4 <= min 4). + # :length_toolongex : 7:3:[/max-ex-and-min-ex/0] 'foobarba': too long (length 8 >= max 8). + # :length_tooshortex : 8:3:[/max-ex-and-min-ex/1] 'foo!': too short (length 4 <= min 4). +--- +name: fail-length-3 +desc: length test (with min, max, max-ex and min-ex) +schema: + type: map + mapping: + "A": + type: seq + sequence: + - type: str + length: {max: 8, min-ex: 4} + "B": + type: seq + sequence: + - type: str + length: {max-ex: 8, min: 4} +data: + A: + - hogehoge! + - hoge + B: + - hogehoge + - hog +errors: + - "Value: 'hog' has length of '3', greater than min limit '4'. Path: '/B/1'" + - "Value: 'hoge' has length of '4', greater than min_ex limit '4'. Path: '/A/1'" + - "Value: 'hogehoge!' has length of '9', greater than max limit '8'. Path: '/A/0'" + - "Value: 'hogehoge' has length of '8', greater than max_ex limit '8'. Path: '/B/0'" + ## Kwalify errors + # :length_toolong : 2:3:[/A/0] 'hogehoge!': too long (length 9 > max 8). + # :length_tooshortex : 3:3:[/A/1] 'hoge': too short (length 4 <= min 4). + # :length_toolongex : 5:3:[/B/0] 'hogehoge': too long (length 8 >= max 8). + # :length_tooshort : 6:3:[/B/1] 'hog': too short (length 3 < min 4). diff --git a/tests/files/fail/test_mapping.yaml b/tests/files/fail/test_mapping.yaml new file mode 100644 index 0000000..0561ea4 --- /dev/null +++ b/tests/files/fail/test_mapping.yaml @@ -0,0 +1,186 @@ +--- +name: fail-mapping-1 +desc: This test that typechecking works when value in map is None +data: + streams: + - name: ~ + sampleRateMultiple: 1 + - name: media + sampleRateMultiple: 2 +schema: + type: map + mapping: + streams: + type: seq + required: True + sequence: + - type: map + mapping: + name: + type: str + range: + min: 1 + required: True + sampleRateMultiple: + type: int + required: True +errors: + - "required.novalue : '/streams/0/name'" +--- +name: fail-mapping-2 +desc: Test keyword regex using default matching-rule 'any' +data: + foobar1: 1 + foobar2: 2 + foobar3: 3 +schema: + type: map + mapping: + regex;(^foobar[1-2]$): + type: int +errors: + - "Key 'foobar3' does not match any regex '^foobar[1-2]$'. Path: ''" +--- +name: fail-mapping-3 +desc: Test keyword regex using declared matching-rule 'any' +data: + foobar1: 1 + foobar2: 2 + bar3: 3 +schema: + type: map + matching-rule: 'any' + mapping: + regex;(^foobar): + type: int + regex;([1-2]$): + type: int +errors: + - "Key 'bar3' does not match any regex '[1-2]$' or '^foobar'. Path: ''" +--- +name: fail-mapping-4 +desc: Test keyword regex using declared matching-rule 'all' +data: + foobar1: 1 + foobar2: 2 + foobar3: 3 +schema: + type: map + matching-rule: 'all' + mapping: + regex;(^foobar.*$): + type: int + regex;(^.*[1-2]$): + type: int +errors: + - "Key 'foobar3' does not match all regex '^.*[1-2]$' and '^foobar.*$'. Path: ''" +--- +name: fail-mapping-5 +desc: Test that sequence of mappings check the correct type and raises correct error when value is not a dict +data: + - foo: whatever + - "sgdf" + - 2 + - ~ +schema: + type: seq + required: True + matching: all + seq: + - type: map + required: True + map: + foo: + type: str +errors: + - "Value '2' is not a dict. Value path: '/2'" + - "Value 'sgdf' is not a dict. Value path: '/1'" + - "required.novalue : '/3'" +--- +name: fail-mapping-6 +desc: Test that type checking of mapping is done even if the mapping keyword is not specefied in the schema +data: + - not + - a + - map +schema: + type: map + allowempty: True +errors: + - "Value '['not', 'a', 'map']' is not a dict. Value path: ''" +--- +name: fail-mapping-7 +desc: Test that default mode fails out in a similar way to regular mode and that a key that is not defined when default is set uses the default impl +data: + OWNERSHIP: abc + WHT: def +schema: + type: map + mapping: + WHT: + type: int + =: + type: int +errors: + - "Value 'abc' is not of type 'int'. Path: '/OWNERSHIP'" + - "Value 'def' is not of type 'int'. Path: '/WHT'" +--- +name: fail-mapping-8 +desc: mapping test +schema: + type: map + required: true + mapping: + name: + type: str + required: true + email: + type: str + # This pattern value was modified from /@/ to .+@.+ to make it copmatible with python + pattern: .+@.+ + required: True + age: + type: int + blood: + type: str + enum: + - A + - B + - O + - AB + birth: + type: date +data: + nam: foo + email: foo(at)mail.com + age: twenty + blood: ab + birth: Jul 01, 1985 +errors: + - "Cannot find required key 'name'. Path: ''" + - "Enum 'ab' does not exist. Path: '/blood'" + - "Key 'nam' was not defined. Path: ''" + - "Value 'foo(at)mail.com' does not match pattern '.+@.+'. Path: '/email'" + - "Value 'twenty' is not of type 'int'. Path: '/age'" + ## Kwalify errors + # :required_nokey : 1:1:[/] key 'name:' is required. + # :key_undefined : 1:1:[/nam] key 'nam:' is undefined. + # :pattern_unmatch : 2:1:[/email] 'foo(at)mail.com': not matched to pattern /@/. + # :type_unmatch : 3:1:[/age] 'twenty': not a integer. + # :enum_notexist : 4:1:[/blood] 'ab': invalid blood value. + # :type_unmatch : 5:1:[/birth] 'Jul 01, 1985': not a date. +--- +name: fail-mapping-9 +desc: Test that regexes can be 'required' +data: + hello: Hi + person: Fred +schema: + type: map + mapping: + regex;(person[1-9]): + required: True +errors: + - "Cannot find required key 'regex;(person[1-9])'. Path: ''" + - "Key 'hello' does not match any regex 'person[1-9]'. Path: ''" + - "Key 'person' does not match any regex 'person[1-9]'. Path: ''" \ No newline at end of file diff --git a/tests/files/fail/test_matching.yaml b/tests/files/fail/test_matching.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_merge.yaml b/tests/files/fail/test_merge.yaml new file mode 100644 index 0000000..3b7eac8 --- /dev/null +++ b/tests/files/fail/test_merge.yaml @@ -0,0 +1,37 @@ +--- +name: fail-merge-1 +desc: merge maps +schema: + type: map + mapping: + "group": + type: map + mapping: + "name": &name + type: str + required: true + "email": &email + type: str + pattern: .+@.+ + required: False + "user": + type: map + mapping: + "name": + <<: *name # merge + length: {max: 16} # add + "email": + <<: *email # merge + required: true # override +data: + group: + name: foo + email: foo@mail.com + user: + name: toooooo-looooong-naaaame +errors: + - "Cannot find required key 'email'. Path: '/user'" + - "Value: 'toooooo-looooong-naaaame' has length of '24', greater than max limit '16'. Path: '/user/name'" + ## Kwalify errors + # :required_nokey : 5:3:[/user] key 'email:' is required. + # :length_toolong : 5:3:[/user/name] 'toooooo-looooong-naaaame': too long (length 24 > max 16). diff --git a/tests/files/fail/test_name.yaml b/tests/files/fail/test_name.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_nullable.yaml b/tests/files/fail/test_nullable.yaml new file mode 100644 index 0000000..8ce8259 --- /dev/null +++ b/tests/files/fail/test_nullable.yaml @@ -0,0 +1,19 @@ +--- +name: fail-nullable-1 +desc: +data: + - name: + email: foo@mail.com + - email: bar@mail.net +schema: + type: seq + sequence: + - type: map + mapping: + name: + type: str + nullable: False + email: + type: str +errors: + - "nullable.novalue : '/0/name'" diff --git a/tests/files/fail/test_pattern.yaml b/tests/files/fail/test_pattern.yaml new file mode 100644 index 0000000..4531d55 --- /dev/null +++ b/tests/files/fail/test_pattern.yaml @@ -0,0 +1,26 @@ +--- +name: fail-pattern-1 +desc: +data: + email: foo(at)mail.com +schema: + type: map + mapping: + email: + type: str + pattern: .+@.+ +errors: + - "Value 'foo(at)mail.com' does not match pattern '.+@.+'. Path: '/email'" +--- +name: fail-pattern-2 +desc: +data: + d: 'a' +schema: + type: map + mapping: + d: + type: str + pattern: '[0-9]+' +errors: + - "Value 'a' does not match pattern '[0-9]+'. Path: '/d'" diff --git a/tests/files/fail/test_range.yaml b/tests/files/fail/test_range.yaml new file mode 100644 index 0000000..22bd801 --- /dev/null +++ b/tests/files/fail/test_range.yaml @@ -0,0 +1,219 @@ +--- +name: fail-range-1 +desc: +data: + - foo + - bar + - foobar +schema: + type: seq + sequence: + - type: str + range: + max: 5 + min: 1 +errors: + - "Type 'scalar' has size of '6', greater than max limit '5'. Path: '/2'" +--- +name: fail-range-2 +desc: Test that range validates on 'map' raise correct error +data: + streams: + sampleRateMultiple: 1 +schema: + type: map + mapping: + streams: + type: map + range: + min: 2 + max: 3 + mapping: + sampleRateMultiple: + type: int + required: True +errors: + - "Type 'map' has size of '1', less than min limit '2'. Path: '/streams'" +--- +name: fail-range-3 +desc: Test that range validates on 'seq' raise correct error +data: + - foobar + - barfoo + - opa +schema: + type: seq + range: + min: 1 + max: 2 + sequence: + - type: str +errors: + - "Type 'seq' has size of '3', greater than max limit '2'. Path: ''" +--- +name: fail-range-4 +desc: Test float range value out of range +data: + the_float: 1.2 + the_float_ex: 2.1 +schema: + type: map + mapping: + the_float: + type: float + required: True + range: + min: 2.1 + max: 3.2 + the_float_ex: + type: float + required: True + range: + min-ex: 2.1 + max-ex: 3.2 +errors: + - "Type 'scalar' has size of '1.2', less than min limit '2.1'. Path: '/the_float'" + - "Type 'scalar' has size of '2.1', less than or equals to min limit(exclusive) '2.1'. Path: '/the_float_ex'" +--- +name: fail-range-1 +desc: range test && bug#????? +schema: + type: map + mapping: + "max-only": + type: seq + sequence: + - type: number + required: true + range: {max: 100} + "min-only": + type: seq + sequence: + - type: number + required: true + range: {min: 10.0} + "max-and-min": + type: seq + sequence: + - type: number + required: true + range: {max: 100.0, min: 10.0} +data: + max-only: + - 101 + - 100.1 + min-only: + - 9 + - 9.99 + max-and-min: + - 101 + - 100.1 + - 9 + - 9.99 +errors: + - "Type 'scalar' has size of '100.1', greater than max limit '100'. Path: '/max-only/1'" + - "Type 'scalar' has size of '100.1', greater than max limit '100.0'. Path: '/max-and-min/1'" + - "Type 'scalar' has size of '101', greater than max limit '100'. Path: '/max-only/0'" + - "Type 'scalar' has size of '101', greater than max limit '100.0'. Path: '/max-and-min/0'" + - "Type 'scalar' has size of '9', less than min limit '10.0'. Path: '/max-and-min/2'" + - "Type 'scalar' has size of '9', less than min limit '10.0'. Path: '/min-only/0'" + - "Type 'scalar' has size of '9.99', less than min limit '10.0'. Path: '/max-and-min/3'" + - "Type 'scalar' has size of '9.99', less than min limit '10.0'. Path: '/min-only/1'" + ## Kwalify errors + # :range_toolarge : 2:3:[/max-only/0] '101': too large (> max 100). + # :range_toolarge : 3:3:[/max-only/1] '100.1': too large (> max 100). + # :range_toosmall : 5:3:[/min-only/0] '9': too small (< min 10.0). + # :range_toosmall : 6:3:[/min-only/1] '9.99': too small (< min 10.0). + # :range_toolarge : 8:3:[/max-and-min/0] '101': too large (> max 100.0). + # :range_toolarge : 9:3:[/max-and-min/1] '100.1': too large (> max 100.0). + # :range_toosmall : 10:3:[/max-and-min/2] '9': too small (< min 10.0). + # :range_toosmall : 11:3:[/max-and-min/3] '9.99': too small (< min 10.0). +--- +name: fail-range-2 +desc: range test (with max-ex and min-ex) +schema: + type: map + mapping: + "max-ex-only": + type: seq + sequence: + - type: number + required: true + range: {max-ex: 100} + "min-ex-only": + type: seq + sequence: + - type: number + required: true + range: {min-ex: 10.0} + "max-ex-and-min-ex": + type: seq + sequence: + - type: number + required: true + range: {max-ex: 100.0, min-ex: 10.0} +data: + max-ex-only: + - 100 + - 100.0 + min-ex-only: + - 10 + - 10.0 + max-ex-and-min-ex: + - 100 + - 100.0 + - 10 + - 10.0 +errors: + - "Type 'scalar' has size of '10', less than or equals to min limit(exclusive) '10.0'. Path: '/max-ex-and-min-ex/2'" + - "Type 'scalar' has size of '10', less than or equals to min limit(exclusive) '10.0'. Path: '/min-ex-only/0'" + - "Type 'scalar' has size of '10.0', less than or equals to min limit(exclusive) '10.0'. Path: '/max-ex-and-min-ex/3'" + - "Type 'scalar' has size of '10.0', less than or equals to min limit(exclusive) '10.0'. Path: '/min-ex-only/1'" + - "Type 'scalar' has size of '100', greater than or equals to max limit(exclusive) '100'. Path: '/max-ex-only/0'" + - "Type 'scalar' has size of '100', greater than or equals to max limit(exclusive) '100.0'. Path: '/max-ex-and-min-ex/0'" + - "Type 'scalar' has size of '100.0', greater than or equals to max limit(exclusive) '100'. Path: '/max-ex-only/1'" + - "Type 'scalar' has size of '100.0', greater than or equals to max limit(exclusive) '100.0'. Path: '/max-ex-and-min-ex/1'" + ## Kwalify errors + # :range_toolargeex : 2:3:[/max-ex-only/0] '100': too large (>= max 100). + # :range_toolargeex : 3:3:[/max-ex-only/1] '100.0': too large (>= max 100). + # :range_toosmallex : 5:3:[/min-ex-only/0] '10': too small (<= min 10.0). + # :range_toosmallex : 6:3:[/min-ex-only/1] '10.0': too small (<= min 10.0). + # :range_toolargeex : 8:3:[/max-ex-and-min-ex/0] '100': too large (>= max 100.0). + # :range_toolargeex : 9:3:[/max-ex-and-min-ex/1] '100.0': too large (>= max 100.0). + # :range_toosmallex : 10:3:[/max-ex-and-min-ex/2] '10': too small (<= min 10.0). + # :range_toosmallex : 11:3:[/max-ex-and-min-ex/3] '10.0': too small (<= min 10.0). +--- +name: fail-range-3 +desc: range test (with max, min, max-ex and min-ex) +schema: + type: map + mapping: + "A": + type: seq + sequence: + - type: number + required: true + range: {max: 100, min-ex: 10.0} + "B": + type: seq + sequence: + - type: number + required: true + range: {min: 10, max-ex: 100.0} +data: + A: + - 100.00001 + - 10.0 + B: + - 9.99999 + - 100.0 +errors: + - "Type 'scalar' has size of '10.0', less than or equals to min limit(exclusive) '10.0'. Path: '/A/1'" + - "Type 'scalar' has size of '100.0', greater than or equals to max limit(exclusive) '100.0'. Path: '/B/1'" + - "Type 'scalar' has size of '100.00001', greater than max limit '100'. Path: '/A/0'" + - "Type 'scalar' has size of '9.99999', less than min limit '10'. Path: '/B/0'" + ## Kwalify errors + # :range_toolarge : 2:3:[/A/0] '100.00001': too large (> max 100)" + # :range_toosmallex : 3:3:[/A/1] '10.0': too small (<= min 10.0). + # :range_toosmall : 5:3:[/B/0] '9.99999': too small (< min 10). + # :range_toolargeex : 6:3:[/B/1] '100.0': too large (>= max 100.0). diff --git a/tests/files/fail/test_required.yaml b/tests/files/fail/test_required.yaml new file mode 100644 index 0000000..6038544 --- /dev/null +++ b/tests/files/fail/test_required.yaml @@ -0,0 +1,19 @@ +--- +name: fail-required-1 +desc: +data: + - name: foo + email: foo@mail.com + - email: bar@mail.net +schema: + type: seq + sequence: + - type: map + mapping: + name: + type: str + required: True + email: + type: str +errors: + - "Cannot find required key 'name'. Path: '/1'" diff --git a/tests/files/fail/test_schema.yaml b/tests/files/fail/test_schema.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_sequence.yaml b/tests/files/fail/test_sequence.yaml new file mode 100644 index 0000000..e26c4a2 --- /dev/null +++ b/tests/files/fail/test_sequence.yaml @@ -0,0 +1,71 @@ +--- +name: fail-sequence-1 +desc: +data: + - 1 + - 2 + - 3 + - True + - False +schema: + type: seq + sequence: + - type: str +errors: + - "Value '1' is not of type 'str'. Path: '/0'" + - "Value '2' is not of type 'str'. Path: '/1'" + - "Value '3' is not of type 'str'. Path: '/2'" + - "Value 'True' is not of type 'str'. Path: '/3'" + - "Value 'False' is not of type 'str'. Path: '/4'" +--- +name: fail-sequence-2 +desc: +data: + - True + - False + - 1 +schema: + type: seq + sequence: + - type: bool +errors: + - "Value '1' is not of type 'bool'. Path: '/2'" +--- +name: fail-sequence-3 +desc: sequence test +schema: + type: seq + required: true + sequence: + - type: str + required: true +data: + - foo + - bar + - + - baz + - 100 +errors: + - "Value '100' is not of type 'str'. Path: '/4'" + - "required.novalue : '/2'" + ## Kwalify errors + # - "Value 'None' is not of type 'str'. Path: '/2'" + # :required_novalue : (line 3)[/2] value required but none. + # :type_unmatch : (line 5)[/4] '100': not a string. +--- +name: fail-sequence-4 +desc: Test that very deep nested sequences fail when schema expected sequence but value was something else +schema: + type: seq + sequence: + - type: seq + sequence: + - type: seq + sequence: + - type: seq + sequence: + - type: str +data: + - - - 1 +errors: + - "Value '1' is not a list. Value path: '/0/0/0'" diff --git a/tests/files/fail/test_sequence_multi.yaml b/tests/files/fail/test_sequence_multi.yaml new file mode 100644 index 0000000..a5007a0 --- /dev/null +++ b/tests/files/fail/test_sequence_multi.yaml @@ -0,0 +1,31 @@ +--- +name: fail-sequence-multi-1 +desc: Test multiple sequence values with wrong sub type and 'all' matching rule +data: + - "foo" +schema: + type: seq + matching: "all" + seq: + - type: str + - type: int +errors: + - "Value 'foo' is not of type 'int'. Path: '/0'" +--- +name: fail-sequence-multi-2 +desc: Test multiple nested sequence values with error in level 2 with 'any' matching rule +data: + - - 123 + - "foobar" +schema: + type: seq + matching: "any" + seq: + - type: str + - type: seq + matching: "any" + sequence: + - type: str +errors: + - "Value '123' is not of type 'str'. Path: '/0/0'" + - "Value '[123]' is not of type 'str'. Path: '/0'" diff --git a/tests/files/fail/test_type_any.yaml b/tests/files/fail/test_type_any.yaml new file mode 100644 index 0000000..5c8e7fa --- /dev/null +++ b/tests/files/fail/test_type_any.yaml @@ -0,0 +1 @@ +# Becuase type 'any' validates for any kind of data there is no failure case for this type. diff --git a/tests/files/fail/test_type_bool.yaml b/tests/files/fail/test_type_bool.yaml new file mode 100644 index 0000000..1007348 --- /dev/null +++ b/tests/files/fail/test_type_bool.yaml @@ -0,0 +1,52 @@ +--- +name: fail-type-bool-1 +desc: Test wrong type as value in list +data: + - "foo" +schema: + type: seq + matching: "any" + seq: + - type: bool +errors: + - "Value 'foo' is not of type 'bool'. Path: '/0'" +--- +name: fail-type-bool-2 +desc: Test bool value inside list +data: + - 'abc' + - 123 +schema: + type: seq + sequence: + - type: bool +errors: + - "Value '123' is not of type 'bool'. Path: '/1'" + - "Value 'abc' is not of type 'bool'. Path: '/0'" +--- +name: fail-type-bool-3 +desc: Test bool value in mapping +data: + foo: 'abc' +schema: + type: map + mapping: + foo: + type: bool +errors: + - "Value 'abc' is not of type 'bool'. Path: '/foo'" +--- +name: fail-type-bool-4 +desc: Test bool inside nested map & seq +data: + foo: + - 'abc' +schema: + type: map + mapping: + foo: + type: seq + sequence: + - type: bool +errors: + - "Value 'abc' is not of type 'bool'. Path: '/foo/0'" diff --git a/tests/files/fail/test_type_date.yaml b/tests/files/fail/test_type_date.yaml new file mode 100644 index 0000000..5a1b39a --- /dev/null +++ b/tests/files/fail/test_type_date.yaml @@ -0,0 +1,83 @@ +--- +name: fail-type-date-1 +desc: basic test for date type with default formats +data: "abc" +schema: + type: date +errors: + - "Not a valid date: abc Path: ''" +--- +name: fail-type-date-2 +desc: Basic test for date type with defined date-formats +data: "31-01-2017" +schema: + type: date + format: "%Y-%m-%d" +errors: + - "Not a valid date: 31-01-2017 format: %Y-%m-%d. Path: ''" +--- +name: fail-type-date-3 +desc: Basic test for date type with defined date-formats +data: + - "2017" + - "31" +schema: + type: seq + sequence: + - type: date + format: + - "%d-%m-%Y" + - "%Y-%m-%d" +errors: + - "Not a valid date: 2017 format: %Y-%m-%d. Path: '/0'" + - "Not a valid date: 31 format: %Y-%m-%d. Path: '/1'" +--- +name: fail-type-data-4 +desc: Test date type as values in a list +data: + - 'abc-1997' + - 'abc-1997-07' + - 'abc-1997-07-16' + - 'abc-1997-07-16T19:20+01:00' + - 'abc-1997-07-16T19:20:30+01:00' + - 'abc-1997-07-16T19:20:30.45+01:00' +schema: + type: seq + sequence: + - type: date +errors: + - "Not a valid date: abc-1997 Path: '/0'" + - "Not a valid date: abc-1997-07 Path: '/1'" + - "Not a valid date: abc-1997-07-16 Path: '/2'" + - "Not a valid date: abc-1997-07-16T19:20+01:00 Path: '/3'" + - "Not a valid date: abc-1997-07-16T19:20:30+01:00 Path: '/4'" + - "Not a valid date: abc-1997-07-16T19:20:30.45+01:00 Path: '/5'" +--- +name: fail-type-date-5 +desc: Test that wrong value types do not validate +data: + - 123 + - True +schema: + type: seq + sequence: + - type: date +errors: + - "Value '123' is not of type 'date'. Path: '/0'" + - "Value 'True' is not of type 'date'. Path: '/1'" +--- +name: fail-type-date-6 +desc: Test that wrong value types in map do not validate +data: + foo: 123 + bar: True +schema: + type: map + mapping: + foo: + type: date + bar: + type: date +errors: + - "Value '123' is not of type 'date'. Path: '/foo'" + - "Value 'True' is not of type 'date'. Path: '/bar'" diff --git a/tests/files/fail/test_type_float.yaml b/tests/files/fail/test_type_float.yaml new file mode 100644 index 0000000..bef14b8 --- /dev/null +++ b/tests/files/fail/test_type_float.yaml @@ -0,0 +1,56 @@ +--- +name: fail-type-float-1 +desc: Test simples float value +data: "abc" +schema: + type: float +errors: + - "Value 'abc' is not of type 'float'. Path: ''" +--- +name: fail-type-float-2 +desc: Test wrong type as value in list +data: + - "foo" + - True +schema: + type: seq + seq: + - type: float +errors: + - "Value 'foo' is not of type 'float'. Path: '/0'" +errors: + - "Value 'True' is not of type 'float'. Path: '/1'" + - "Value 'foo' is not of type 'float'. Path: '/0'" +--- +name: fail-type-float-3 +desc: Test float value in mapping +data: + foo: "abc" + bar: True +schema: + type: map + mapping: + foo: + type: float + bar: + type: float +errors: + - "Value 'True' is not of type 'float'. Path: '/bar'" + - "Value 'abc' is not of type 'float'. Path: '/foo'" +--- +name: fail-type-float-4 +desc: Test float inside nested map & seq +data: + foo: + - True + - "abc" +schema: + type: map + mapping: + foo: + type: seq + sequence: + - type: float +errors: + - "Value 'True' is not of type 'float'. Path: '/foo/0'" + - "Value 'abc' is not of type 'float'. Path: '/foo/1'" diff --git a/tests/files/fail/test_type_int.yaml b/tests/files/fail/test_type_int.yaml new file mode 100644 index 0000000..62d8fe1 --- /dev/null +++ b/tests/files/fail/test_type_int.yaml @@ -0,0 +1,45 @@ +--- +name: fail-type-int-1 +desc: +data: + A101 +schema: + type: int +errors: + - "Value 'A101' is not of type 'int'. Path: ''" +--- +name: fail-type-int-2 +desc: Test wrong type as value in list +data: + - "foo" +schema: + type: seq + matching: "any" + seq: + - type: int +errors: + - "Value 'foo' is not of type 'int'. Path: '/0'" +--- +name: fail-type-int-3 +desc: Test that True/False is not valid integers +data: + - 1 + - True + - False +schema: + type: seq + sequence: + - type: int +errors: + - "Value 'False' is not of type 'int'. Path: '/2'" + - "Value 'True' is not of type 'int'. Path: '/1'" +--- +name: fail-type-int-4 +desc: Test that hexadecimal characters fails with pattern +data: + 0x12345678 +schema: + type: text + pattern: ^0x[0-9A-F]{1,8}$ +errors: + - "Value '305419896' does not match pattern '^0x[0-9A-F]{1,8}$'. Path: ''" diff --git a/tests/files/fail/test_type_map.yaml b/tests/files/fail/test_type_map.yaml new file mode 100644 index 0000000..a46086b --- /dev/null +++ b/tests/files/fail/test_type_map.yaml @@ -0,0 +1,46 @@ +--- +name: fail-type-map-1 +desc: Test the most basic case for map +data: + - 'foo' +schema: + type: map + mapping: + foo: + type: str +errors: + - "Value '['foo']' is not a dict. Value path: ''" +--- +name: type-map-2 +desc: +data: + - - 'foo' + - - 'foo' +schema: + type: seq + sequence: + - type: map + mapping: + foo: + type: str +errors: + - "Value '['foo']' is not a dict. Value path: '/0'" + - "Value '['foo']' is not a dict. Value path: '/1'" +--- +name: type-map-3 +desc: Test bool inside nested map & seq +data: + foo: + - - 'foo' +schema: + type: map + mapping: + foo: + type: seq + sequence: + - type: map + mapping: + bar: + type: str +errors: + - "Value '['foo']' is not a dict. Value path: '/foo/0'" diff --git a/tests/files/fail/test_type_none.yaml b/tests/files/fail/test_type_none.yaml new file mode 100644 index 0000000..cc7c7df --- /dev/null +++ b/tests/files/fail/test_type_none.yaml @@ -0,0 +1,54 @@ +# +# NOTE: This case is not allowed becuase Core class do NOT allow +# there is no data to validate. This happens if None is at top level +# of the data structure. +# +# --- +# name: type-none-1 +# desc: Most basic test for type None +# data: ~ +# schema: +# type: none +--- +name: fail-type-none-2 +desc: Test that none type works with none type as value in map +data: + name: 'abc' +schema: + type: map + mapping: + name: + type: none +errors: + - "Value 'abc' is not of type 'none'. Path: '/name'" +--- +name: fail-type-none-3 +desc: Test that none type works as value in sequence +data: + - 'abc' + - 123 +schema: + type: seq + sequence: + - type: none +errors: + - "Value '123' is not of type 'none'. Path: '/1'" + - "Value 'abc' is not of type 'none'. Path: '/0'" +--- +name: fail-type-none-4 +desc: Test that none type works inside nested map, seq, map +data: + foo: + - bar: 'abc' +schema: + type: map + mapping: + foo: + type: seq + sequence: + - type: map + mapping: + bar: + type: none +errors: + - "Value 'abc' is not of type 'none'. Path: '/foo/0/bar'" diff --git a/tests/files/fail/test_type_number.yaml b/tests/files/fail/test_type_number.yaml new file mode 100644 index 0000000..003b0a6 --- /dev/null +++ b/tests/files/fail/test_type_number.yaml @@ -0,0 +1,83 @@ +--- +name: fail-type-number-1 +desc: This tests number validation rule with wrong data types +data: True +schema: + type: number +errors: + - "Value 'True' is not of type 'number'. Path: ''" +--- +name: fail-type-number-2 +desc: Test that number type works with as value in map +data: + foo: True + bar: 'abc' + qwe: [] + rty: {} +schema: + type: map + mapping: + foo: + type: number + bar: + type: number + qwe: + type: number + rty: + type: number +errors: + - "Value 'True' is not of type 'number'. Path: '/foo'" + - "Value '[]' is not of type 'number'. Path: '/qwe'" + - "Value 'abc' is not of type 'number'. Path: '/bar'" + - "Value '{}' is not of type 'number'. Path: '/rty'" +--- +name: fail-type-number-3 +desc: Test that different number values works as values in seq +data: + - True + - 'abc' + - {} + - [] +schema: + type: seq + sequence: + - type: number +errors: + - "Value 'True' is not of type 'number'. Path: '/0'" + - "Value '[]' is not of type 'number'. Path: '/3'" + - "Value 'abc' is not of type 'number'. Path: '/1'" + - "Value '{}' is not of type 'number'. Path: '/2'" +--- +name: fail-type-number-4 +desc: Test that number type works inside nested map, seq, map +data: + foobar: + - foo: True + bar: 'abc' + qwe: {} + rty: [] +schema: + type: map + mapping: + foobar: + type: seq + sequence: + - type: map + mapping: + foo: + type: number + bar: + type: number + qwe: + type: number + rty: + type: number + ewq: + type: number + dsa: + type: number +errors: + - "Value 'True' is not of type 'number'. Path: '/foobar/0/foo'" + - "Value '[]' is not of type 'number'. Path: '/foobar/0/rty'" + - "Value 'abc' is not of type 'number'. Path: '/foobar/0/bar'" + - "Value '{}' is not of type 'number'. Path: '/foobar/0/qwe'" diff --git a/tests/files/fail/test_type_scalar.yaml b/tests/files/fail/test_type_scalar.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_type_seq.yaml b/tests/files/fail/test_type_seq.yaml new file mode 100644 index 0000000..a5baacd --- /dev/null +++ b/tests/files/fail/test_type_seq.yaml @@ -0,0 +1,47 @@ +# +# TODO: All of these failure tests currently raises a strange error that might not be the correct one and might require some redesign of the implementation. +# pykwalify.errors.NotSequenceError: +# + +# --- +# name: fail-type-seq-1 +# desc: Test the most basic case for seq +# data: +# {} +# schema: +# type: seq +# sequence: +# - type: str +# errors: +# - '' +# --- +# name: fail-type-seq-2 +# desc: Test that seq in seq works +# data: +# - {} +# - {} +# schema: +# type: seq +# sequence: +# - type: seq +# sequence: +# - type: bool +# errors: +# - '' +# --- +# name: fail-type-seq-3 +# desc: Test bool inside nested map & seq +# data: +# - foo: +# {} +# schema: +# type: seq +# sequence: +# - type: map +# mapping: +# foo: +# type: seq +# sequence: +# - type: bool +# errors: +# - '' diff --git a/tests/files/fail/test_type_str.yaml b/tests/files/fail/test_type_str.yaml new file mode 100644 index 0000000..13cdbb6 --- /dev/null +++ b/tests/files/fail/test_type_str.yaml @@ -0,0 +1,73 @@ +--- +name: fail-type-str-1 +desc: Test simples str value +data: 1 +schema: + type: str +errors: + - "Value '1' is not of type 'str'. Path: ''" +--- +name: fail-type-str-2 +desc: Test str value inside list +data: + - 1 + - True +schema: + type: seq + sequence: + - type: str +errors: + - "Value '1' is not of type 'str'. Path: '/0'" + - "Value 'True' is not of type 'str'. Path: '/1'" +--- +name: fail-type-str-3 +desc: Test str value in mapping +data: + foo: 1 +schema: + type: map + mapping: + foo: + type: str +errors: + - "Value '1' is not of type 'str'. Path: '/foo'" +--- +name: fail-type-str-4 +desc: Test str inside nested map & seq +data: + foo: + - 1 +schema: + type: map + mapping: + foo: + type: seq + sequence: + - type: str +errors: + - "Value '1' is not of type 'str'. Path: '/foo/0'" +--- +name: fail-deftype-1 +desc: default type test +schema: + type: seq + sequence: + - type: map + mapping: + "name": + "email": +data: + - name: 123 + email: true + - name: 3.14 + - email: 2004-01-01 +errors: + - "Value '123' is not of type 'str'. Path: '/0/name'" + - "Value '2004-01-01' is not of type 'str'. Path: '/2/email'" + - "Value '3.14' is not of type 'str'. Path: '/1/name'" + - "Value 'True' is not of type 'str'. Path: '/0/email'" + ## Kwalify errors + # :type_unmatch : 1:3:[/0/name] '123': not a string. + # :type_unmatch : 2:3:[/0/email] 'true': not a string. + # :type_unmatch : 3:3:[/1/name] '3.14': not a string. + # :type_unmatch : 4:3:[/2/email] '2004-01-01': not a string. diff --git a/tests/files/fail/test_type_symbol.yaml b/tests/files/fail/test_type_symbol.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/fail/test_type_text.yaml b/tests/files/fail/test_type_text.yaml new file mode 100644 index 0000000..f4e6d2e --- /dev/null +++ b/tests/files/fail/test_type_text.yaml @@ -0,0 +1,70 @@ +--- +name: fail-type-text-1 +desc: Test simples text type +data: True +schema: + type: text +errors: + - "Value 'True' is not of type 'text'. Path: ''" +--- +name: fail-type-text-2 +desc: Test possible values as values in seq +data: + - abc + - 123 + - 3.14159 + - True +schema: + type: seq + sequence: + - type: text +errors: + - "Value 'True' is not of type 'text'. Path: '/3'" +--- +name: fail-type-text-3 +desc: Test possible values as values in map +data: + foo: abc + bar: 123 + qwe: 3.14159 + rty: True +schema: + type: map + mapping: + foo: + type: text + bar: + type: text + qwe: + type: text + rty: + type: text +errors: + - "Value 'True' is not of type 'text'. Path: '/rty'" +--- +name: fail-type-text-4 +desc: Test that text type works inside nested map, seq, map +data: + foobar: + - foo: abc + bar: 123 + qwe: 3.14159 + rty: True +schema: + type: map + mapping: + foobar: + type: seq + sequence: + - type: map + mapping: + foo: + type: text + bar: + type: text + qwe: + type: text + rty: + type: text +errors: + - "Value 'True' is not of type 'text'. Path: '/foobar/0/rty'" diff --git a/tests/files/fail/test_type_timestamp.yaml b/tests/files/fail/test_type_timestamp.yaml new file mode 100644 index 0000000..1a5e120 --- /dev/null +++ b/tests/files/fail/test_type_timestamp.yaml @@ -0,0 +1,15 @@ +--- +name: fail-type-timestamp-1 +desc: Test timestamps that should throw errors +data: + d1: "" + d2: "1427650980" +schema: + type: map + mapping: + d1: + type: timestamp + d2: + type: timestamp +errors: + - "Timestamp value is empty. Path: '/d1'" diff --git a/tests/files/fail/test_unique.yaml b/tests/files/fail/test_unique.yaml new file mode 100644 index 0000000..0af5d7c --- /dev/null +++ b/tests/files/fail/test_unique.yaml @@ -0,0 +1,109 @@ +--- +name: fail-unique-1 +desc: "NOTE: The reverse unique do not currently work proper # This will test the unique constraint but should fail" +data: + - name: foo + email: admin@mail.com + groups: + - foo + - users + - admin + - foo + - name: bar + email: admin@mail.com + groups: + - admin + - users + - name: bar + email: baz@mail.com + groups: + - users +schema: + type: seq + sequence: + - type: map + required: True + mapping: + name: + type: str + required: True + unique: True + email: + type: str + groups: + type: seq + sequence: + - type: str + unique: True +errors: + - "Value 'bar' is not unique. Previous path: '/1/name'. Path: '/2/name'" + - "Value 'foo' is not unique. Previous path: '/0/groups/0'. Path: '/0/groups/3'" +--- +name: fail-unique-2 +desc: unique constraint test with map +schema: + type: seq + sequence: + - type: map + mapping: + "name": + unique: true + "age": + type: int +data: + - name: foo + age: 10 + - name: bar + age: 10 + - age: 10 + name: bar +errors: + - "Value 'bar' is not unique. Previous path: '/1/name'. Path: '/2/name'" + ## Kwalify errors + # :value_notunique : 6:3:[/2/name] 'bar': is already used at '/1/name'. +--- +name: fail-unique-3 +desc: unique constraint test with seq +schema: + type: seq + sequence: + - type: str + unique: true +data: + - foo + - ~ + - bar + - ~ + - bar +errors: + - "Value 'bar' is not unique. Previous path: '/2'. Path: '/4'" + ## Kwalify errors + # :value_notunique : 5:1:[/4] 'bar': is already used at '/2'. +--- +name: fail-unique-4 +desc: unique constraint and '<<' (merge) +schema: + type: seq + sequence: + - type: map + mapping: + "name": + type: str + required: true + unique: true + "value": + type: any + required: true +data: + - &a1 + name: x1 + value: 10 + - <<: *a1 + - <<: *a1 # wrong validation error + name: x3 +errors: + - "Value 'x1' is not unique. Previous path: '/0/name'. Path: '/1/name'" + # TODO: Possibly missing one error here... + ## Kwalify errors + # :value_notunique : 4:3:[/1/name] 'x1': is already used at '/0/name'. + # :value_notunique : 5:3:[/2/name] 'x1': is already used at '/0/name'. diff --git a/tests/files/fail/test_version.yaml b/tests/files/fail/test_version.yaml new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3