File: test_validate.py

package info (click to toggle)
cwltool 3.1.20250110105449-3
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 10,516 kB
  • sloc: python: 20,992; javascript: 20,796; sh: 233; makefile: 152
file content (127 lines) | stat: -rw-r--r-- 4,520 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""Tests --validation."""

import io
import logging
import re

from .util import get_data, get_main_output


def test_validate_graph_with_no_default() -> None:
    """Ensure that --validate works on $graph docs that lack a main/#main."""
    exit_code, stdout, stderr = get_main_output(
        ["--validate", get_data("tests/wf/packed_no_main.cwl")]
    )
    assert exit_code == 0
    assert "packed_no_main.cwl#echo is valid CWL" in stdout
    assert "packed_no_main.cwl#cat is valid CWL" in stdout
    assert "packed_no_main.cwl#collision is valid CWL" in stdout
    assert "tests/wf/packed_no_main.cwl is valid CWL" in stdout


def test_validate_with_valid_input_object() -> None:
    """Ensure that --validate with a valid input object."""
    exit_code, stdout, stderr = get_main_output(
        [
            "--validate",
            get_data("tests/wf/1st-workflow.cwl"),
            "--inp",
            get_data("tests/wf/1st-workflow.cwl"),
            "--ex",
            "FOO",
        ]
    )
    assert exit_code == 0
    assert "tests/wf/1st-workflow.cwl is valid CWL. No errors detected in the inputs." in stdout


def test_validate_with_invalid_input_object() -> None:
    """Ensure that --validate with an invalid input object."""
    exit_code, stdout, stderr = get_main_output(
        [
            "--validate",
            get_data("tests/wf/1st-workflow.cwl"),
            get_data("tests/wf/1st-workflow_bad_inputs.yml"),
        ]
    )
    assert exit_code == 1
    stdout = re.sub(r"\s\s+", " ", stdout)
    assert "Invalid job input record" in stdout
    assert (
        "tests/wf/1st-workflow_bad_inputs.yml:2:1: * the 'ex' field is not "
        "valid because the value is not string" in stdout
    )
    assert (
        "tests/wf/1st-workflow_bad_inputs.yml:1:1: * the 'inp' field is not "
        "valid because is not a dict. Expected a File object." in stdout
    )


def test_validate_quiet() -> None:
    """Ensure that --validate --quiet prints the correct amount of information."""
    exit_code, stdout, stderr = get_main_output(
        [
            "--validate",
            "--quiet",
            get_data("tests/CometAdapter.cwl"),
        ]
    )
    assert exit_code == 0
    stdout = re.sub(r"\s\s+", " ", stdout)
    assert "INFO" not in stdout
    assert "INFO" not in stderr
    assert "tests/CometAdapter.cwl:10:3: object id" in stdout
    assert "tests/CometAdapter.cwl#out' previously defined" in stdout


def test_validate_no_warnings() -> None:
    """Ensure that --validate --no-warnings doesn't print any warnings."""
    exit_code, stdout, stderr = get_main_output(
        [
            "--validate",
            "--no-warnings",
            get_data("tests/CometAdapter.cwl"),
        ]
    )
    assert exit_code == 0
    stdout = re.sub(r"\s\s+", " ", stdout)
    stderr = re.sub(r"\s\s+", " ", stderr)
    assert "INFO" not in stdout
    assert "INFO" not in stderr
    assert "WARNING" not in stdout
    assert "WARNING" not in stderr
    assert "tests/CometAdapter.cwl:9:3: object id" not in stdout
    assert "tests/CometAdapter.cwl:9:3: object id" not in stderr
    assert "tests/CometAdapter.cwl#out' previously defined" not in stdout
    assert "tests/CometAdapter.cwl#out' previously defined" not in stderr


def test_validate_custom_logger() -> None:
    """Custom log handling test."""
    custom_log = io.StringIO()
    handler = logging.StreamHandler(custom_log)
    handler.setLevel(logging.DEBUG)
    exit_code, stdout, stderr = get_main_output(
        [
            "--validate",
            get_data("tests/CometAdapter.cwl"),
        ],
        logger_handler=handler,
    )
    custom_log_text = custom_log.getvalue()
    assert exit_code == 0
    custom_log_text = re.sub(r"\s\s+", " ", custom_log_text)
    stdout = re.sub(r"\s\s+", " ", stdout)
    stderr = re.sub(r"\s\s+", " ", stderr)
    assert "INFO" not in stdout
    assert "INFO" not in stderr
    assert "INFO" in custom_log_text
    assert "WARNING" not in stdout
    assert "WARNING" not in stderr
    assert "WARNING" in custom_log_text
    assert "tests/CometAdapter.cwl:10:3: object id" not in stdout
    assert "tests/CometAdapter.cwl:10:3: object id" not in stderr
    assert "tests/CometAdapter.cwl:10:3: object id" in custom_log_text
    assert "tests/CometAdapter.cwl#out' previously defined" not in stdout
    assert "tests/CometAdapter.cwl#out' previously defined" not in stderr
    assert "tests/CometAdapter.cwl#out' previously defined" in custom_log_text