1import pytest
2from frictionless import validate
3
4
5# General
6
7
8def test_validate_inquiry():
9    report = validate({"tasks": [{"source": "data/table.csv"}]})
10    assert report.valid
11
12
13def test_validate_inquiry_multiple():
14    report = validate(
15        {"tasks": [{"source": "data/table.csv"}, {"source": "data/matrix.csv"}]},
16    )
17    assert report.valid
18
19
20def test_validate_inquiry_multiple_invalid():
21    report = validate(
22        {"tasks": [{"source": "data/table.csv"}, {"source": "data/invalid.csv"}]},
23    )
24    assert report.flatten(["taskPosition", "rowPosition", "fieldPosition", "code"]) == [
25        [2, None, 3, "blank-label"],
26        [2, None, 4, "duplicate-label"],
27        [2, 2, 3, "missing-cell"],
28        [2, 2, 4, "missing-cell"],
29        [2, 3, 3, "missing-cell"],
30        [2, 3, 4, "missing-cell"],
31        [2, 4, None, "blank-row"],
32        [2, 5, 5, "extra-cell"],
33    ]
34
35
36def test_validate_inquiry_multiple_invalid_limit_errors():
37    report = validate(
38        {
39            "tasks": [
40                {"source": "data/table.csv"},
41                {"source": "data/invalid.csv", "limitErrors": 1},
42            ]
43        },
44    )
45    assert report.flatten(["taskPosition", "code", "note"]) == [
46        [2, "blank-label", ""],
47    ]
48    assert report.tasks[0].flatten(["rowPosition", "fieldPosition", "code"]) == []
49    assert report.tasks[1].flatten(["rowPosition", "fieldPosition", "code"]) == [
50        [None, 3, "blank-label"],
51    ]
52
53
54def test_validate_inquiry_multiple_invalid_with_schema():
55    report = validate(
56        {
57            "tasks": [
58                {
59                    "source": "data/table.csv",
60                    "schema": {"fields": [{"name": "bad"}, {"name": "name"}]},
61                },
62                {"source": "data/invalid.csv"},
63            ],
64        },
65    )
66    assert report.flatten(["taskPosition", "rowPosition", "fieldPosition", "code"]) == [
67        [1, None, 1, "incorrect-label"],
68        [2, None, 3, "blank-label"],
69        [2, None, 4, "duplicate-label"],
70        [2, 2, 3, "missing-cell"],
71        [2, 2, 4, "missing-cell"],
72        [2, 3, 3, "missing-cell"],
73        [2, 3, 4, "missing-cell"],
74        [2, 4, None, "blank-row"],
75        [2, 5, 5, "extra-cell"],
76    ]
77
78
79def test_validate_inquiry_with_one_package():
80    report = validate(
81        {"tasks": [{"source": "data/package/datapackage.json"}]},
82    )
83    assert report.valid
84
85
86def test_validate_inquiry_with_multiple_packages():
87    report = validate(
88        {
89            "tasks": [
90                {"source": "data/package/datapackage.json"},
91                {"source": "data/invalid/datapackage.json"},
92            ]
93        },
94    )
95    assert report.flatten(["taskPosition", "rowPosition", "fieldPosition", "code"]) == [
96        [3, 3, None, "blank-row"],
97        [3, 3, None, "primary-key-error"],
98        [4, 4, None, "blank-row"],
99    ]
100
101
102# Parallel
103
104
105@pytest.mark.ci
106def test_validate_inquiry_parallel_multiple():
107    report = validate(
108        {"tasks": [{"source": "data/table.csv"}, {"source": "data/matrix.csv"}]},
109        parallel=True,
110    )
111    assert report.valid
112
113
114@pytest.mark.ci
115def test_validate_inquiry_parallel_multiple_invalid():
116    report = validate(
117        {"tasks": [{"source": "data/table.csv"}, {"source": "data/invalid.csv"}]},
118        parallel=True,
119    )
120    assert report.flatten(["taskPosition", "rowPosition", "fieldPosition", "code"]) == [
121        [2, None, 3, "blank-label"],
122        [2, None, 4, "duplicate-label"],
123        [2, 2, 3, "missing-cell"],
124        [2, 2, 4, "missing-cell"],
125        [2, 3, 3, "missing-cell"],
126        [2, 3, 4, "missing-cell"],
127        [2, 4, None, "blank-row"],
128        [2, 5, 5, "extra-cell"],
129    ]
130
131
132@pytest.mark.ci
133def test_validate_inquiry_with_multiple_packages_with_parallel():
134    report = validate(
135        {
136            "tasks": [
137                {"source": "data/package/datapackage.json"},
138                {"source": "data/invalid/datapackage.json"},
139            ]
140        },
141        parallel=True,
142    )
143    assert report.flatten(["taskPosition", "rowPosition", "fieldPosition", "code"]) == [
144        [3, 3, None, "blank-row"],
145        [3, 3, None, "primary-key-error"],
146        [4, 4, None, "blank-row"],
147    ]
148