summaryrefslogtreecommitdiffstats
path: root/test/schemas/negative_test/playbooks/tasks
diff options
context:
space:
mode:
Diffstat (limited to 'test/schemas/negative_test/playbooks/tasks')
-rw-r--r--test/schemas/negative_test/playbooks/tasks/args_integer.yml2
-rw-r--r--test/schemas/negative_test/playbooks/tasks/args_integer.yml.md99
-rw-r--r--test/schemas/negative_test/playbooks/tasks/args_string.yml2
-rw-r--r--test/schemas/negative_test/playbooks/tasks/args_string.yml.md90
-rw-r--r--test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml4
-rw-r--r--test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml.md203
-rw-r--r--test/schemas/negative_test/playbooks/tasks/become_method_untemplated.yml.md181
-rw-r--r--test/schemas/negative_test/playbooks/tasks/ignore_errors.yml4
-rw-r--r--test/schemas/negative_test/playbooks/tasks/ignore_errors.yml.md129
-rw-r--r--test/schemas/negative_test/playbooks/tasks/invalid_block.yml2
-rw-r--r--test/schemas/negative_test/playbooks/tasks/invalid_block.yml.md62
-rw-r--r--test/schemas/negative_test/playbooks/tasks/local_action.yml1
-rw-r--r--test/schemas/negative_test/playbooks/tasks/local_action.yml.md67
-rw-r--r--test/schemas/negative_test/playbooks/tasks/loop.yml3
-rw-r--r--test/schemas/negative_test/playbooks/tasks/loop.yml.md67
-rw-r--r--test/schemas/negative_test/playbooks/tasks/loop2.yml3
-rw-r--r--test/schemas/negative_test/playbooks/tasks/loop2.yml.md67
-rw-r--r--test/schemas/negative_test/playbooks/tasks/no_log_number.yml3
-rw-r--r--test/schemas/negative_test/playbooks/tasks/no_log_number.yml.md147
-rw-r--r--test/schemas/negative_test/playbooks/tasks/no_log_string.yml5
-rw-r--r--test/schemas/negative_test/playbooks/tasks/no_log_string.yml.md129
-rw-r--r--test/schemas/negative_test/playbooks/tasks/tags-mapping.yml3
-rw-r--r--test/schemas/negative_test/playbooks/tasks/tags-mapping.yml.md125
-rw-r--r--test/schemas/negative_test/playbooks/tasks/tags-string.yml3
-rw-r--r--test/schemas/negative_test/playbooks/tasks/tags-string.yml.md125
-rw-r--r--test/schemas/negative_test/playbooks/tasks/when_integer.yml2
-rw-r--r--test/schemas/negative_test/playbooks/tasks/when_integer.yml.md155
-rw-r--r--test/schemas/negative_test/playbooks/tasks/when_object.yml2
-rw-r--r--test/schemas/negative_test/playbooks/tasks/when_object.yml.md155
-rw-r--r--test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml2
-rw-r--r--test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml.md88
-rw-r--r--test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml2
-rw-r--r--test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml.md88
33 files changed, 2020 insertions, 0 deletions
diff --git a/test/schemas/negative_test/playbooks/tasks/args_integer.yml b/test/schemas/negative_test/playbooks/tasks/args_integer.yml
new file mode 100644
index 0000000..b831039
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/args_integer.yml
@@ -0,0 +1,2 @@
+- action: foo
+ args: 123 # invalid
diff --git a/test/schemas/negative_test/playbooks/tasks/args_integer.yml.md b/test/schemas/negative_test/playbooks/tasks/args_integer.yml.md
new file mode 100644
index 0000000..8820251
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/args_integer.yml.md
@@ -0,0 +1,99 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/args",
+ "keyword": "type",
+ "message": "must be object",
+ "params": {
+ "type": "object"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/args",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/oneOf/1/type"
+ },
+ {
+ "instancePath": "/0/args",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/full-jinja/type"
+ },
+ {
+ "instancePath": "/0/args",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/args_integer.yml",
+ "path": "$[0]",
+ "message": "{'action': 'foo', 'args': 123} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].args",
+ "message": "123 is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].args",
+ "message": "123 is not of type 'object'"
+ },
+ {
+ "path": "$[0].args",
+ "message": "123 is not of type 'string'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/args_string.yml b/test/schemas/negative_test/playbooks/tasks/args_string.yml
new file mode 100644
index 0000000..121da6d
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/args_string.yml
@@ -0,0 +1,2 @@
+- action: foo
+ args: "{{ }}123" # invalid as only full jinja2 expressions are allowed
diff --git a/test/schemas/negative_test/playbooks/tasks/args_string.yml.md b/test/schemas/negative_test/playbooks/tasks/args_string.yml.md
new file mode 100644
index 0000000..6359a14
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/args_string.yml.md
@@ -0,0 +1,90 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/args",
+ "keyword": "type",
+ "message": "must be object",
+ "params": {
+ "type": "object"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/args",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/args",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/args_string.yml",
+ "path": "$[0]",
+ "message": "{'action': 'foo', 'args': '{{ }}123'} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].args",
+ "message": "'{{ }}123' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].args",
+ "message": "'{{ }}123' is not of type 'object'"
+ },
+ {
+ "path": "$[0].args",
+ "message": "'{{ }}123' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml b/test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml
new file mode 100644
index 0000000..9a6bc99
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml
@@ -0,0 +1,4 @@
+- command: echo 123
+ vars:
+ sudo_var: doo
+ become_method: true
diff --git a/test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml.md b/test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml.md
new file mode 100644
index 0000000..fc1e692
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/become_method_invalid.yml.md
@@ -0,0 +1,203 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/anyOf/0/type"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "enum",
+ "message": "must be equal to one of the allowed values",
+ "params": {
+ "allowedValues": [
+ "ansible.builtin.sudo",
+ "ansible.builtin.su",
+ "community.general.pbrun",
+ "community.general.pfexec",
+ "ansible.builtin.runas",
+ "community.general.dzdo",
+ "community.general.ksu",
+ "community.general.doas",
+ "community.general.machinectl",
+ "community.general.pmrun",
+ "community.general.sesu",
+ "community.general.sudosu"
+ ]
+ },
+ "schemaPath": "#/anyOf/0/enum"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/full-jinja/type"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/anyOf/2/type"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/anyOf"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/anyOf/0/type"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "enum",
+ "message": "must be equal to one of the allowed values",
+ "params": {
+ "allowedValues": [
+ "ansible.builtin.sudo",
+ "ansible.builtin.su",
+ "community.general.pbrun",
+ "community.general.pfexec",
+ "ansible.builtin.runas",
+ "community.general.dzdo",
+ "community.general.ksu",
+ "community.general.doas",
+ "community.general.machinectl",
+ "community.general.pmrun",
+ "community.general.sesu",
+ "community.general.sudosu"
+ ]
+ },
+ "schemaPath": "#/anyOf/0/enum"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/full-jinja/type"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/anyOf/2/type"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/anyOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/become_method_invalid.yml",
+ "path": "$[0]",
+ "message": "{'command': 'echo 123', 'vars': {'sudo_var': 'doo'}, 'become_method': True} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].become_method",
+ "message": "True is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not one of ['ansible.builtin.sudo', 'ansible.builtin.su', 'community.general.pbrun', 'community.general.pfexec', 'ansible.builtin.runas', 'community.general.dzdo', 'community.general.ksu', 'community.general.doas', 'community.general.machinectl', 'community.general.pmrun', 'community.general.sesu', 'community.general.sudosu']"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not of type 'string'"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not of type 'string'"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not of type 'string'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not one of ['ansible.builtin.sudo', 'ansible.builtin.su', 'community.general.pbrun', 'community.general.pfexec', 'ansible.builtin.runas', 'community.general.dzdo', 'community.general.ksu', 'community.general.doas', 'community.general.machinectl', 'community.general.pmrun', 'community.general.sesu', 'community.general.sudosu']"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not of type 'string'"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not of type 'string'"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "True is not of type 'string'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/become_method_untemplated.yml.md b/test/schemas/negative_test/playbooks/tasks/become_method_untemplated.yml.md
new file mode 100644
index 0000000..47a6554
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/become_method_untemplated.yml.md
@@ -0,0 +1,181 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "enum",
+ "message": "must be equal to one of the allowed values",
+ "params": {
+ "allowedValues": [
+ "sudo",
+ "su",
+ "pbrun",
+ "pfexec",
+ "runas",
+ "dzdo",
+ "ksu",
+ "doas",
+ "machinectl",
+ "pmrun",
+ "sesu",
+ "sudosu"
+ ]
+ },
+ "schemaPath": "#/oneOf/0/enum"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "pattern",
+ "message": "must match pattern \"^[A-Z][a-z][0-9]._$\"",
+ "params": {
+ "pattern": "^[A-Z][a-z][0-9]._$"
+ },
+ "schemaPath": "#/oneOf/2/pattern"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "enum",
+ "message": "must be equal to one of the allowed values",
+ "params": {
+ "allowedValues": [
+ "sudo",
+ "su",
+ "pbrun",
+ "pfexec",
+ "runas",
+ "dzdo",
+ "ksu",
+ "doas",
+ "machinectl",
+ "pmrun",
+ "sesu",
+ "sudosu"
+ ]
+ },
+ "schemaPath": "#/oneOf/0/enum"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "pattern",
+ "message": "must match pattern \"^[A-Z][a-z][0-9]._$\"",
+ "params": {
+ "pattern": "^[A-Z][a-z][0-9]._$"
+ },
+ "schemaPath": "#/oneOf/2/pattern"
+ },
+ {
+ "instancePath": "/0/become_method",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/become_method_untemplated.yml",
+ "path": "$[0]",
+ "message": "{'command': 'echo 123', 'vars': {'sudo_var': 'doo'}, 'become_method': 'sudo_var'} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' is not one of ['sudo', 'su', 'pbrun', 'pfexec', 'runas', 'dzdo', 'ksu', 'doas', 'machinectl', 'pmrun', 'sesu', 'sudosu']"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' does not match '^[A-Z][a-z][0-9]._$'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' is not one of ['sudo', 'su', 'pbrun', 'pfexec', 'runas', 'dzdo', 'ksu', 'doas', 'machinectl', 'pmrun', 'sesu', 'sudosu']"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ },
+ {
+ "path": "$[0].become_method",
+ "message": "'sudo_var' does not match '^[A-Z][a-z][0-9]._$'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/ignore_errors.yml b/test/schemas/negative_test/playbooks/tasks/ignore_errors.yml
new file mode 100644
index 0000000..4f8cbb3
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/ignore_errors.yml
@@ -0,0 +1,4 @@
+- command: echo 123
+ vars:
+ should_ignore_errors: true
+ ignore_errors: should_ignore_errors # invalid due to missing {{ }}
diff --git a/test/schemas/negative_test/playbooks/tasks/ignore_errors.yml.md b/test/schemas/negative_test/playbooks/tasks/ignore_errors.yml.md
new file mode 100644
index 0000000..559a200
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/ignore_errors.yml.md
@@ -0,0 +1,129 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/ignore_errors",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/ignore_errors",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/ignore_errors",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0/ignore_errors",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/ignore_errors",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/ignore_errors",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/ignore_errors.yml",
+ "path": "$[0]",
+ "message": "{'command': 'echo 123', 'vars': {'should_ignore_errors': True}, 'ignore_errors': 'should_ignore_errors'} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].ignore_errors",
+ "message": "'should_ignore_errors' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].ignore_errors",
+ "message": "'should_ignore_errors' is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].ignore_errors",
+ "message": "'should_ignore_errors' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].ignore_errors",
+ "message": "'should_ignore_errors' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].ignore_errors",
+ "message": "'should_ignore_errors' is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].ignore_errors",
+ "message": "'should_ignore_errors' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/invalid_block.yml b/test/schemas/negative_test/playbooks/tasks/invalid_block.yml
new file mode 100644
index 0000000..6fef6d1
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/invalid_block.yml
@@ -0,0 +1,2 @@
+---
+- block: {} # <-- invalid, should be array
diff --git a/test/schemas/negative_test/playbooks/tasks/invalid_block.yml.md b/test/schemas/negative_test/playbooks/tasks/invalid_block.yml.md
new file mode 100644
index 0000000..bf4b30e
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/invalid_block.yml.md
@@ -0,0 +1,62 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0/block",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/properties/block/type"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "not",
+ "message": "must NOT be valid",
+ "params": {},
+ "schemaPath": "#/allOf/3/not"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/invalid_block.yml",
+ "path": "$[0]",
+ "message": "{'block': {}} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "{'block': {}} should not be valid under {'required': ['block']}"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].block",
+ "message": "{} is not of type 'array'"
+ },
+ {
+ "path": "$[0]",
+ "message": "{'block': {}} should not be valid under {'required': ['block']}"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/local_action.yml b/test/schemas/negative_test/playbooks/tasks/local_action.yml
new file mode 100644
index 0000000..d601ff5
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/local_action.yml
@@ -0,0 +1 @@
+- local_action: [] # <-- only string or dict is allowed
diff --git a/test/schemas/negative_test/playbooks/tasks/local_action.yml.md b/test/schemas/negative_test/playbooks/tasks/local_action.yml.md
new file mode 100644
index 0000000..cf67e7b
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/local_action.yml.md
@@ -0,0 +1,67 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/local_action",
+ "keyword": "type",
+ "message": "must be string,object",
+ "params": {
+ "type": [
+ "string",
+ "object"
+ ]
+ },
+ "schemaPath": "#/properties/local_action/type"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/local_action.yml",
+ "path": "$[0]",
+ "message": "{'local_action': []} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].local_action",
+ "message": "[] is not of type 'string', 'object'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/loop.yml b/test/schemas/negative_test/playbooks/tasks/loop.yml
new file mode 100644
index 0000000..651d262
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/loop.yml
@@ -0,0 +1,3 @@
+- ansible.builtin.debug:
+ var: item
+ loop: {} # <-- map is not valid
diff --git a/test/schemas/negative_test/playbooks/tasks/loop.yml.md b/test/schemas/negative_test/playbooks/tasks/loop.yml.md
new file mode 100644
index 0000000..de8277f
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/loop.yml.md
@@ -0,0 +1,67 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/loop",
+ "keyword": "type",
+ "message": "must be string,array",
+ "params": {
+ "type": [
+ "string",
+ "array"
+ ]
+ },
+ "schemaPath": "#/properties/loop/type"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/loop.yml",
+ "path": "$[0]",
+ "message": "{'ansible.builtin.debug': {'var': 'item'}, 'loop': {}} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].loop",
+ "message": "{} is not of type 'string', 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/loop2.yml b/test/schemas/negative_test/playbooks/tasks/loop2.yml
new file mode 100644
index 0000000..ec2642f
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/loop2.yml
@@ -0,0 +1,3 @@
+- ansible.builtin.debug:
+ var: item
+ loop: 123 # <-- number is not valid
diff --git a/test/schemas/negative_test/playbooks/tasks/loop2.yml.md b/test/schemas/negative_test/playbooks/tasks/loop2.yml.md
new file mode 100644
index 0000000..c36d7c9
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/loop2.yml.md
@@ -0,0 +1,67 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/loop",
+ "keyword": "type",
+ "message": "must be string,array",
+ "params": {
+ "type": [
+ "string",
+ "array"
+ ]
+ },
+ "schemaPath": "#/properties/loop/type"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/loop2.yml",
+ "path": "$[0]",
+ "message": "{'ansible.builtin.debug': {'var': 'item'}, 'loop': 123} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].loop",
+ "message": "123 is not of type 'string', 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/no_log_number.yml b/test/schemas/negative_test/playbooks/tasks/no_log_number.yml
new file mode 100644
index 0000000..4fa8da2
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/no_log_number.yml
@@ -0,0 +1,3 @@
+- ansible.builtin.debug:
+ msg: foo
+ no_log: 123 # <-- bad
diff --git a/test/schemas/negative_test/playbooks/tasks/no_log_number.yml.md b/test/schemas/negative_test/playbooks/tasks/no_log_number.yml.md
new file mode 100644
index 0000000..4b9516c
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/no_log_number.yml.md
@@ -0,0 +1,147 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/oneOf/1/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/full-jinja/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/oneOf/1/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/full-jinja/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/no_log_number.yml",
+ "path": "$[0]",
+ "message": "{'ansible.builtin.debug': {'msg': 'foo'}, 'no_log': 123} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].no_log",
+ "message": "123 is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "123 is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "123 is not of type 'string'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "123 is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "123 is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "123 is not of type 'string'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/no_log_string.yml b/test/schemas/negative_test/playbooks/tasks/no_log_string.yml
new file mode 100644
index 0000000..0e0b71a
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/no_log_string.yml
@@ -0,0 +1,5 @@
+- ansible.builtin.debug:
+ msg: foo
+ vars:
+ some_var: true
+ no_log: some_var # <-- bad, jinja use must be explicit
diff --git a/test/schemas/negative_test/playbooks/tasks/no_log_string.yml.md b/test/schemas/negative_test/playbooks/tasks/no_log_string.yml.md
new file mode 100644
index 0000000..6742175
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/no_log_string.yml.md
@@ -0,0 +1,129 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/no_log",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/no_log_string.yml",
+ "path": "$[0]",
+ "message": "{'ansible.builtin.debug': {'msg': 'foo'}, 'vars': {'some_var': True}, 'no_log': 'some_var'} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].no_log",
+ "message": "'some_var' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "'some_var' is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "'some_var' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "'some_var' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "'some_var' is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].no_log",
+ "message": "'some_var' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/tags-mapping.yml b/test/schemas/negative_test/playbooks/tasks/tags-mapping.yml
new file mode 100644
index 0000000..39fe8c7
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/tags-mapping.yml
@@ -0,0 +1,3 @@
+- ansible.builtin.debug:
+ msg: foo
+ tags: {} # <-- not allowed
diff --git a/test/schemas/negative_test/playbooks/tasks/tags-mapping.yml.md b/test/schemas/negative_test/playbooks/tasks/tags-mapping.yml.md
new file mode 100644
index 0000000..d860605
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/tags-mapping.yml.md
@@ -0,0 +1,125 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/0/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/1/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/$defs/tags/anyOf"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/0/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/1/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/$defs/tags/anyOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/tags-mapping.yml",
+ "path": "$[0]",
+ "message": "{'ansible.builtin.debug': {'msg': 'foo'}, 'tags': {}} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].tags",
+ "message": "{} is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "{} is not of type 'string'"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "{} is not of type 'array'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "{} is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "{} is not of type 'string'"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "{} is not of type 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/tags-string.yml b/test/schemas/negative_test/playbooks/tasks/tags-string.yml
new file mode 100644
index 0000000..6512fb5
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/tags-string.yml
@@ -0,0 +1,3 @@
+- ansible.builtin.debug:
+ msg: foo
+ tags: 123 # <-- not allowed
diff --git a/test/schemas/negative_test/playbooks/tasks/tags-string.yml.md b/test/schemas/negative_test/playbooks/tasks/tags-string.yml.md
new file mode 100644
index 0000000..0bb7ed0
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/tags-string.yml.md
@@ -0,0 +1,125 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/0/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/1/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/$defs/tags/anyOf"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/0/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/tags/anyOf/1/type"
+ },
+ {
+ "instancePath": "/0/tags",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/$defs/tags/anyOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/tags-string.yml",
+ "path": "$[0]",
+ "message": "{'ansible.builtin.debug': {'msg': 'foo'}, 'tags': 123} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].tags",
+ "message": "123 is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "123 is not of type 'string'"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "123 is not of type 'array'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "123 is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "123 is not of type 'string'"
+ },
+ {
+ "path": "$[0].tags",
+ "message": "123 is not of type 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/when_integer.yml b/test/schemas/negative_test/playbooks/tasks/when_integer.yml
new file mode 100644
index 0000000..7758503
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/when_integer.yml
@@ -0,0 +1,2 @@
+- action: foo
+ when: 123 # invalid, number is not accepted
diff --git a/test/schemas/negative_test/playbooks/tasks/when_integer.yml.md b/test/schemas/negative_test/playbooks/tasks/when_integer.yml.md
new file mode 100644
index 0000000..bc59cc4
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/when_integer.yml.md
@@ -0,0 +1,155 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/1/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/2/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/1/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/2/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/when_integer.yml",
+ "path": "$[0]",
+ "message": "{'action': 'foo', 'when': 123} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].when",
+ "message": "123 is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].when",
+ "message": "123 is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "123 is not of type 'string'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "123 is not of type 'array'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].when",
+ "message": "123 is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].when",
+ "message": "123 is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "123 is not of type 'string'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "123 is not of type 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/when_object.yml b/test/schemas/negative_test/playbooks/tasks/when_object.yml
new file mode 100644
index 0000000..430605d
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/when_object.yml
@@ -0,0 +1,2 @@
+- action: foo
+ when: {} # invalid, object is not accepted
diff --git a/test/schemas/negative_test/playbooks/tasks/when_object.yml.md b/test/schemas/negative_test/playbooks/tasks/when_object.yml.md
new file mode 100644
index 0000000..6c28d0c
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/when_object.yml.md
@@ -0,0 +1,155 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/1/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/2/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be boolean",
+ "params": {
+ "type": "boolean"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/0/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/1/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf/2/type"
+ },
+ {
+ "instancePath": "/0/when",
+ "keyword": "oneOf",
+ "message": "must match exactly one schema in oneOf",
+ "params": {
+ "passingSchemas": null
+ },
+ "schemaPath": "#/$defs/complex_conditional/oneOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/when_object.yml",
+ "path": "$[0]",
+ "message": "{'action': 'foo', 'when': {}} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0].when",
+ "message": "{} is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].when",
+ "message": "{} is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "{} is not of type 'string'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "{} is not of type 'array'"
+ },
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].when",
+ "message": "{} is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].when",
+ "message": "{} is not of type 'boolean'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "{} is not of type 'string'"
+ },
+ {
+ "path": "$[0].when",
+ "message": "{} is not of type 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml b/test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml
new file mode 100644
index 0000000..eff6ea0
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml
@@ -0,0 +1,2 @@
+- command: echo 123
+ with_items: true # invalid, must be a list or templated string
diff --git a/test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml.md b/test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml.md
new file mode 100644
index 0000000..ffc8ef8
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/with_items_boolean.yml.md
@@ -0,0 +1,88 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/with_items",
+ "keyword": "type",
+ "message": "must be string",
+ "params": {
+ "type": "string"
+ },
+ "schemaPath": "#/$defs/full-jinja/type"
+ },
+ {
+ "instancePath": "/0/with_items",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/properties/with_items/anyOf/1/type"
+ },
+ {
+ "instancePath": "/0/with_items",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/properties/with_items/anyOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/with_items_boolean.yml",
+ "path": "$[0]",
+ "message": "{'command': 'echo 123', 'with_items': True} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].with_items",
+ "message": "True is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].with_items",
+ "message": "True is not of type 'string'"
+ },
+ {
+ "path": "$[0].with_items",
+ "message": "True is not of type 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```
diff --git a/test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml b/test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml
new file mode 100644
index 0000000..257ffe2
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml
@@ -0,0 +1,2 @@
+- command: echo 123
+ with_items: foobar # invalid, probably user wanted "{{ foobar }}"?
diff --git a/test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml.md b/test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml.md
new file mode 100644
index 0000000..158b0ee
--- /dev/null
+++ b/test/schemas/negative_test/playbooks/tasks/with_items_untemplated_string.yml.md
@@ -0,0 +1,88 @@
+# ajv errors
+
+```json
+[
+ {
+ "instancePath": "/0",
+ "keyword": "required",
+ "message": "must have required property 'block'",
+ "params": {
+ "missingProperty": "block"
+ },
+ "schemaPath": "#/required"
+ },
+ {
+ "instancePath": "/0/with_items",
+ "keyword": "pattern",
+ "message": "must match pattern \"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$\"",
+ "params": {
+ "pattern": "^\\{[\\{%](.|[\r\n])*[\\}%]\\}$"
+ },
+ "schemaPath": "#/$defs/full-jinja/pattern"
+ },
+ {
+ "instancePath": "/0/with_items",
+ "keyword": "type",
+ "message": "must be array",
+ "params": {
+ "type": "array"
+ },
+ "schemaPath": "#/properties/with_items/anyOf/1/type"
+ },
+ {
+ "instancePath": "/0/with_items",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/properties/with_items/anyOf"
+ },
+ {
+ "instancePath": "/0",
+ "keyword": "anyOf",
+ "message": "must match a schema in anyOf",
+ "params": {},
+ "schemaPath": "#/items/anyOf"
+ }
+]
+```
+
+# check-jsonschema
+
+stdout:
+
+```json
+{
+ "status": "fail",
+ "errors": [
+ {
+ "filename": "negative_test/playbooks/tasks/with_items_untemplated_string.yml",
+ "path": "$[0]",
+ "message": "{'command': 'echo 123', 'with_items': 'foobar'} is not valid under any of the given schemas",
+ "has_sub_errors": true,
+ "best_match": {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ "sub_errors": [
+ {
+ "path": "$[0]",
+ "message": "'block' is a required property"
+ },
+ {
+ "path": "$[0].with_items",
+ "message": "'foobar' is not valid under any of the given schemas"
+ },
+ {
+ "path": "$[0].with_items",
+ "message": "'foobar' does not match '^\\\\{[\\\\{%](.|[\\r\\n])*[\\\\}%]\\\\}$'"
+ },
+ {
+ "path": "$[0].with_items",
+ "message": "'foobar' is not of type 'array'"
+ }
+ ]
+ }
+ ],
+ "parse_errors": []
+}
+```