Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add test to confirm allow_infos and allow_warnings validate() API
This test demonstrates the current implementation state fails. A follow-on patch will correct the issue. References: * #126 * The general style of this test was adapted from `/test/issues/test_96.py`. Signed-off-by: Alex Nelson <alexander.nelson@nist.gov>
- Loading branch information
1 parent
72abfe4
commit 1d8686f
Showing
1 changed file
with
114 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
# -*- coding: utf-8 -*- | ||
# | ||
|
||
# This software was developed at the National Institute of Standards | ||
# and Technology by employees of the Federal Government in the course | ||
# of their official duties. Pursuant to title 17 Section 105 of the | ||
# United States Code this software is not subject to copyright | ||
# protection and is in the public domain. NIST assumes no | ||
# responsibility whatsoever for its use by other parties, and makes | ||
# no guarantees, expressed or implied, about its quality, | ||
# reliability, or any other characteristic. | ||
# | ||
# We would appreciate acknowledgement if the software is used. | ||
|
||
""" | ||
https://github.com/RDFLib/pySHACL/issues/126 | ||
""" | ||
|
||
from typing import Optional | ||
|
||
from pyshacl import validate | ||
from rdflib import Namespace, SH, URIRef | ||
|
||
NS_EX = Namespace("http://example.org/ns#") | ||
|
||
mixed_file_text = """ | ||
@prefix ex: <http://example.org/ns#> . | ||
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . | ||
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . | ||
@prefix sh: <http://www.w3.org/ns/shacl#> . | ||
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . | ||
ex:myProperty-datatype | ||
a sh:PropertyShape ; | ||
rdfs:comment "Violations of sh:datatype are produced as warnings"@en ; | ||
sh:datatype xsd:string ; | ||
sh:path ex:myProperty ; | ||
sh:severity sh:Warning ; | ||
. | ||
ex:myProperty-maxLength | ||
a sh:PropertyShape ; | ||
rdfs:comment "The default severity here is sh:Info"@en ; | ||
sh:maxLength 10 ; | ||
sh:message "Too many characters"@en ; | ||
sh:path ex:myProperty ; | ||
sh:severity sh:Info ; | ||
. | ||
ex:MyShape | ||
a sh:NodeShape ; | ||
rdfs:comment "This example was adapted from the example shapes and validation graph in the Severity section of the SHACL specification."@en ; | ||
rdfs:seeAlso "https://www.w3.org/TR/shacl/#severity" ; | ||
sh:property | ||
ex:myProperty-datatype , | ||
ex:myProperty-maxLength | ||
; | ||
sh:targetNode ex:MyInstance ; | ||
. | ||
ex:MyInstance | ||
rdfs:comment "This instance triggers one Info-level and one Warning-level violation."@en ; | ||
ex:myProperty "http://toomanycharacters"^^xsd:anyURI ; | ||
. | ||
""" | ||
|
||
|
||
def _test_126_template(expected_conformance: bool, allow_level: Optional[URIRef] = None) -> None: | ||
validate_kwargs: Dict[Any] = {"data_graph_format": "turtle", "shacl_graph_format": "turtle", "debug": True} | ||
if allow_level is None: | ||
pass | ||
elif allow_level == SH.Info: | ||
validate_kwargs["allow_infos"] = True | ||
elif allow_level == SH.Warning: | ||
validate_kwargs["allow_warnings"] = True | ||
else: | ||
raise NotImplementedError("allow_level=%r" % allow_level) | ||
|
||
res1 = validate(mixed_file_text, **validate_kwargs) | ||
conforms, graph, string = res1 | ||
assert conforms == expected_conformance | ||
|
||
datatype_shape_reported = False | ||
maxlength_shape_reported = False | ||
|
||
# Confirm the report graph emits ValidationResults pertaining to each expected triggering property shape. | ||
for triple in graph.triples((None, SH.sourceShape, NS_EX["myProperty-datatype"])): | ||
datatype_shape_reported = True | ||
for triple in graph.triples((None, SH.sourceShape, NS_EX["myProperty-maxLength"])): | ||
maxlength_shape_reported = True | ||
|
||
assert datatype_shape_reported | ||
assert maxlength_shape_reported | ||
|
||
|
||
def test_126_1() -> None: | ||
""" | ||
With no severities allowed, expect non-conformance. | ||
""" | ||
_test_126_template(False) | ||
|
||
|
||
def test_126_2() -> None: | ||
""" | ||
With Infos allowed, expect non-conformance. | ||
""" | ||
_test_126_template(False, SH.Info) | ||
|
||
|
||
def test_126_3() -> None: | ||
""" | ||
With Warnings allowed, expect conformance. | ||
""" | ||
_test_126_template(True, SH.Warning) |