1*85d6e4e5SJim Jagielski################################################################ 2*85d6e4e5SJim Jagielski# 3*85d6e4e5SJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 4*85d6e4e5SJim Jagielski# or more contributor license agreements. See the NOTICE file 5*85d6e4e5SJim Jagielski# distributed with this work for additional information 6*85d6e4e5SJim Jagielski# regarding copyright ownership. The ASF licenses this file 7*85d6e4e5SJim Jagielski# to you under the Apache License, Version 2.0 (the 8*85d6e4e5SJim Jagielski# "License"); you may not use this file except in compliance 9*85d6e4e5SJim Jagielski# with the License. You may obtain a copy of the License at 10*85d6e4e5SJim Jagielski# 11*85d6e4e5SJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 12*85d6e4e5SJim Jagielski# 13*85d6e4e5SJim Jagielski# Unless required by applicable law or agreed to in writing, 14*85d6e4e5SJim Jagielski# software distributed under the License is distributed on an 15*85d6e4e5SJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*85d6e4e5SJim Jagielski# KIND, either express or implied. See the License for the 17*85d6e4e5SJim Jagielski# specific language governing permissions and limitations 18*85d6e4e5SJim Jagielski# under the License. 19*85d6e4e5SJim Jagielski 20*85d6e4e5SJim Jagielski"""aootest.kinds: grouping of schema errors into kinds, and what counts as worse than a baseline.""" 21*85d6e4e5SJim Jagielskiimport pytest 22*85d6e4e5SJim Jagielski 23*85d6e4e5SJim Jagielskifrom aootest import kinds 24*85d6e4e5SJim Jagielski 25*85d6e4e5SJim Jagielskipytestmark = pytest.mark.selftest 26*85d6e4e5SJim Jagielski 27*85d6e4e5SJim Jagielski 28*85d6e4e5SJim Jagielskidef entry(package, message, part="content.xml"): 29*85d6e4e5SJim Jagielski return ["%s/%s" % (package, part), 2, 10, message] 30*85d6e4e5SJim Jagielski 31*85d6e4e5SJim Jagielski 32*85d6e4e5SJim JagielskiVAL = {"errors": {"12": [entry("a.odt", 'element "text:bogus" not allowed here; expected element "text:p"'), 33*85d6e4e5SJim Jagielski entry("b.odt", 'element "text:bogus" not allowed here; expected element "text:h"'), 34*85d6e4e5SJim Jagielski entry("b.odt", 'attribute "x:y" not allowed here'), 35*85d6e4e5SJim Jagielski entry("other.odt", 'attribute "x:y" not allowed here')]}} 36*85d6e4e5SJim Jagielski 37*85d6e4e5SJim Jagielski 38*85d6e4e5SJim Jagielskidef test_errors_are_grouped_by_message_without_the_expected_tail_and_limited_to_the_packages(): 39*85d6e4e5SJim Jagielski got = kinds.kinds_of(VAL, "12", {"a.odt", "b.odt"}) 40*85d6e4e5SJim Jagielski assert got == {'element "text:bogus" not allowed here': {"errors": 2, "packages": ["a.odt", "b.odt"]}, 41*85d6e4e5SJim Jagielski 'attribute "x:y" not allowed here': {"errors": 1, "packages": ["b.odt"]}} 42*85d6e4e5SJim Jagielski 43*85d6e4e5SJim Jagielski 44*85d6e4e5SJim Jagielskidef test_jing_failures_that_name_the_work_directory_are_one_kind_whatever_the_directory(): 45*85d6e4e5SJim Jagielski a = {"errors": {"12": [["?", 0, 0, "file not found: /tmp/one/w-validate/12/a.odt/META-INF/Manifest.dtd"]]}} 46*85d6e4e5SJim Jagielski b = {"errors": {"12": [["?", 0, 0, "file not found: /var/x/two/w-validate/12/a.odt/META-INF/Manifest.dtd"]]}} 47*85d6e4e5SJim Jagielski # the package of such an entry is "?", so name it 48*85d6e4e5SJim Jagielski assert kinds.kinds_of(a, "12", {"?"}) == kinds.kinds_of(b, "12", {"?"}) 49*85d6e4e5SJim Jagielski assert list(kinds.kinds_of(a, "12", {"?"})) == ["UNPARSED: file not found: <workdir>/12/a.odt/META-INF/Manifest.dtd"] 50*85d6e4e5SJim Jagielski 51*85d6e4e5SJim Jagielski 52*85d6e4e5SJim JagielskiBASE = {"documents": ["a.odt", "b.odt"], "kinds": {"k1": {"errors": 3, "packages": ["a.odt", "b.odt"]}, "k2": {"errors": 1, "packages": ["b.odt"]}}} 53*85d6e4e5SJim Jagielski 54*85d6e4e5SJim Jagielski 55*85d6e4e5SJim Jagielskidef test_the_same_kinds_are_not_worse(): 56*85d6e4e5SJim Jagielski assert kinds.judge(BASE, ["a.odt", "b.odt"], BASE["kinds"]) == ([], False) 57*85d6e4e5SJim Jagielski 58*85d6e4e5SJim Jagielski 59*85d6e4e5SJim Jagielski@pytest.mark.parametrize("change", [ 60*85d6e4e5SJim Jagielski lambda k: {**k, "k3": {"errors": 1, "packages": ["a.odt"]}}, 61*85d6e4e5SJim Jagielski lambda k: {**k, "k1": {"errors": 4, "packages": ["a.odt", "b.odt"]}}, 62*85d6e4e5SJim Jagielski lambda k: {**k, "k2": {"errors": 1, "packages": ["a.odt", "b.odt"]}}, 63*85d6e4e5SJim Jagielski]) 64*85d6e4e5SJim Jagielskidef test_a_new_kind_or_a_higher_count_or_another_package_is_worse(change): 65*85d6e4e5SJim Jagielski lines, bad = kinds.judge(BASE, ["a.odt", "b.odt"], change(BASE["kinds"])) 66*85d6e4e5SJim Jagielski assert bad and any(l.startswith("WORSE") for l in lines) 67*85d6e4e5SJim Jagielski 68*85d6e4e5SJim Jagielski 69*85d6e4e5SJim Jagielskidef test_fewer_errors_are_reported_but_not_worse(): 70*85d6e4e5SJim Jagielski lines, bad = kinds.judge(BASE, ["a.odt", "b.odt"], {"k1": {"errors": 2, "packages": ["a.odt"]}}) 71*85d6e4e5SJim Jagielski assert not bad and lines and all(l.startswith("better") for l in lines) 72*85d6e4e5SJim Jagielski 73*85d6e4e5SJim Jagielski 74*85d6e4e5SJim Jagielskidef test_a_baseline_document_that_is_no_longer_covered_is_worse(): 75*85d6e4e5SJim Jagielski lines, bad = kinds.judge(BASE, ["a.odt"], BASE["kinds"]) 76*85d6e4e5SJim Jagielski assert bad and lines == ["NOT COVERED b.odt"] 77*85d6e4e5SJim Jagielski 78*85d6e4e5SJim Jagielski 79*85d6e4e5SJim Jagielskidef test_a_written_baseline_reads_back(tmp_path, monkeypatch): 80*85d6e4e5SJim Jagielski monkeypatch.setattr(kinds, "BASELINE", tmp_path / "baseline") 81*85d6e4e5SJim Jagielski kinds.write("ext", "12", {"b.odt", "a.odt"}, BASE["kinds"]) 82*85d6e4e5SJim Jagielski assert kinds.load("ext", "12") == BASE 83*85d6e4e5SJim Jagielski assert kinds.load("ext", "13") is None 84