Search in sources :

Example 1 with ValidationProblem

use of io.apicurio.datamodels.core.models.ValidationProblem in project apicurio-data-models by Apicurio.

the class Library method validateDocument.

/**
 * Called to validate a data model node.  All validation rules will be evaluated and reported.  The list
 * of validation problems found during validation is returned.  In addition, validation problems will be
 * reported on the individual nodes themselves.  Validation problem severity is determined by checking
 * with the included severity registry.  If the severity registry is null, a default registry is used.
 * Custom validators can be passed to provide additional validation rules beyond what this Library offers out of the box.
 *
 * @param node The document to be validated
 * @param severityRegistry Supply a custom severity registry. If nothing is passed, the default severity registry will be used
 * @param extensions Supply an optional list of validation extensions, enabling the use of 3rd-party validators or custom validation rules
 * @return full list of the validation problems found in the document
 */
public static CompletableFuture<List<ValidationProblem>> validateDocument(Node node, IValidationSeverityRegistry severityRegistry, List<IDocumentValidatorExtension> extensions) {
    List<ValidationProblem> totalValidationProblems = Library.validate(node, severityRegistry);
    if (extensions != null && !extensions.isEmpty()) {
        for (IDocumentValidatorExtension extension : extensions) {
            CompletableFuture<List<ValidationProblem>> extensionValidationProblems = extension.validateDocument(node);
            extensionValidationProblems.thenAccept(problems -> problems.forEach(p -> {
                totalValidationProblems.add(p);
                node.ownerDocument().addValidationProblem(p.errorCode, p.nodePath, p.property, p.message, p.severity);
            }));
        }
    }
    return CompletableFuture.completedFuture(totalValidationProblems);
}
Also used : IDocumentValidatorExtension(io.apicurio.datamodels.core.validation.IDocumentValidatorExtension) IVisitor(io.apicurio.datamodels.core.visitors.IVisitor) Dereferencer(io.apicurio.datamodels.openapi.visitors.dereference.Dereferencer) DefaultSeverityRegistry(io.apicurio.datamodels.core.validation.DefaultSeverityRegistry) IReferenceResolver(io.apicurio.datamodels.core.util.IReferenceResolver) CompletableFuture(java.util.concurrent.CompletableFuture) NodePathUtil(io.apicurio.datamodels.core.util.NodePathUtil) Aai20Document(io.apicurio.datamodels.asyncapi.v2.models.Aai20Document) DocumentType(io.apicurio.datamodels.core.models.DocumentType) Oas30Document(io.apicurio.datamodels.openapi.v3.models.Oas30Document) DataModelReader(io.apicurio.datamodels.core.io.DataModelReader) IDocumentValidatorExtension(io.apicurio.datamodels.core.validation.IDocumentValidatorExtension) TraverserDirection(io.apicurio.datamodels.core.visitors.TraverserDirection) IValidationSeverityRegistry(io.apicurio.datamodels.core.validation.IValidationSeverityRegistry) ValidationProblemsResetVisitor(io.apicurio.datamodels.core.validation.ValidationProblemsResetVisitor) VisitorFactory(io.apicurio.datamodels.core.factories.VisitorFactory) Document(io.apicurio.datamodels.core.models.Document) VisitorUtil(io.apicurio.datamodels.core.util.VisitorUtil) NodePath(io.apicurio.datamodels.core.models.NodePath) DataModelWriter(io.apicurio.datamodels.core.io.DataModelWriter) JsonCompat(io.apicurio.datamodels.compat.JsonCompat) Node(io.apicurio.datamodels.core.models.Node) ValidationProblem(io.apicurio.datamodels.core.models.ValidationProblem) Oas20to30TransformationVisitor(io.apicurio.datamodels.openapi.visitors.transform.Oas20to30TransformationVisitor) List(java.util.List) Oas30Operation(io.apicurio.datamodels.openapi.v3.models.Oas30Operation) ReferenceResolverChain(io.apicurio.datamodels.core.util.ReferenceResolverChain) DataModelReaderDispatcher(io.apicurio.datamodels.core.io.DataModelReaderDispatcher) ValidationVisitor(io.apicurio.datamodels.core.validation.ValidationVisitor) DocumentFactory(io.apicurio.datamodels.core.factories.DocumentFactory) Oas20Document(io.apicurio.datamodels.openapi.v2.models.Oas20Document) Constants(io.apicurio.datamodels.core.Constants) ValidationProblem(io.apicurio.datamodels.core.models.ValidationProblem) List(java.util.List)

Example 2 with ValidationProblem

use of io.apicurio.datamodels.core.models.ValidationProblem in project apicurio-data-models by Apicurio.

the class TestValidationExtension method validateDocument.

@Override
public CompletableFuture<List<ValidationProblem>> validateDocument(Node document) {
    List<ValidationProblem> fakeProblems = new ArrayList<>();
    fakeProblems.add(new ValidationProblem("TEST-001", new NodePath("testpath"), "test", "Test problem", ValidationProblemSeverity.low));
    return CompletableFuture.completedFuture(fakeProblems);
}
Also used : ArrayList(java.util.ArrayList) ValidationProblem(io.apicurio.datamodels.core.models.ValidationProblem) NodePath(io.apicurio.datamodels.core.models.NodePath)

Example 3 with ValidationProblem

use of io.apicurio.datamodels.core.models.ValidationProblem in project apicurio-data-models by Apicurio.

the class TestValidationExtension method testValidate.

@Test
public void testValidate() throws Exception {
    String jsonString = "{\r\n" + "    \"openapi\": \"3.0.9\",\r\n" + "    \"info\": {\r\n" + "        \"title\": \"Very Simple API\",\r\n" + "        \"version\": \"1.0.0\"\r\n" + "    }\r\n" + "}";
    Document doc = Library.readDocumentFromJSONString(jsonString);
    List<ValidationProblem> problems = Library.validateDocument(doc, null, null).get();
    Assert.assertTrue(problems.size() > 0);
}
Also used : ValidationProblem(io.apicurio.datamodels.core.models.ValidationProblem) Oas30Document(io.apicurio.datamodels.openapi.v3.models.Oas30Document) Document(io.apicurio.datamodels.core.models.Document) Test(org.junit.Test)

Example 4 with ValidationProblem

use of io.apicurio.datamodels.core.models.ValidationProblem in project apicurio-data-models by Apicurio.

the class TestValidationExtension method testValidateDocumentWithCustomExtension.

@Test
public void testValidateDocumentWithCustomExtension() {
    String jsonString = "{\r\n" + "    \"openapi\": \"3.0.9\",\r\n" + "    \"info\": {\r\n" + "        \"title\": \"Very Simple API\",\r\n" + "        \"version\": \"1.0.0\"\r\n" + "    }\r\n" + "}";
    Document doc = Library.readDocumentFromJSONString(jsonString);
    List<IDocumentValidatorExtension> extensions = new ArrayList<>();
    extensions.add(new TestValidationExtension());
    CompletableFuture<List<ValidationProblem>> problems = Library.validateDocument(doc, null, extensions);
    problems.whenCompleteAsync((validationProblems, done) -> {
        List<String> expectedErrorCodes = Arrays.asList("R-003", "TEST-001");
        List<String> documentErrorCodes = doc.getValidationProblemCodes();
        Assert.assertEquals(expectedErrorCodes, documentErrorCodes);
        List<String> problemErrorCodes = validationProblems.stream().map(p -> p.errorCode).collect(Collectors.toList());
        Assert.assertEquals(expectedErrorCodes, problemErrorCodes);
    });
}
Also used : IDocumentValidatorExtension(io.apicurio.datamodels.core.validation.IDocumentValidatorExtension) Arrays(java.util.Arrays) NodePath(io.apicurio.datamodels.core.models.NodePath) CompletableFuture(java.util.concurrent.CompletableFuture) Test(org.junit.Test) Node(io.apicurio.datamodels.core.models.Node) DocumentType(io.apicurio.datamodels.core.models.DocumentType) Collectors(java.util.stream.Collectors) Oas30Document(io.apicurio.datamodels.openapi.v3.models.Oas30Document) ArrayList(java.util.ArrayList) ValidationProblem(io.apicurio.datamodels.core.models.ValidationProblem) List(java.util.List) IDocumentValidatorExtension(io.apicurio.datamodels.core.validation.IDocumentValidatorExtension) ValidationProblemSeverity(io.apicurio.datamodels.core.models.ValidationProblemSeverity) Assert(org.junit.Assert) Document(io.apicurio.datamodels.core.models.Document) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) Oas30Document(io.apicurio.datamodels.openapi.v3.models.Oas30Document) Document(io.apicurio.datamodels.core.models.Document) Test(org.junit.Test)

Example 5 with ValidationProblem

use of io.apicurio.datamodels.core.models.ValidationProblem in project apicurio-data-models by Apicurio.

the class ValidationTestRunner method runChild.

/**
 * @see org.junit.runners.ParentRunner#runChild(java.lang.Object, org.junit.runner.notification.RunNotifier)
 */
@Override
protected void runChild(ValidationTestCase child, RunNotifier notifier) {
    Description description = this.describeChild(child);
    Statement statement = new Statement() {

        @Override
        public void evaluate() throws Throwable {
            String testCP = "fixtures/validation/" + child.getTest();
            URL testUrl = Thread.currentThread().getContextClassLoader().getResource(testCP);
            Assert.assertNotNull("Could not load test resource: " + testCP, testUrl);
            // Read the test source
            String original = loadResource(testUrl);
            Assert.assertNotNull(original);
            // Parse into a Json object
            Object originalParsed = mapper.readTree(original);
            // Parse into a data model
            Document doc = Library.readDocument(originalParsed);
            // Validate the document
            IValidationSeverityRegistry severityRegistry = null;
            if (child.getSeverity() != null) {
                final ValidationProblemSeverity severity = ValidationProblemSeverity.valueOf(child.getSeverity());
                severityRegistry = new IValidationSeverityRegistry() {

                    @Override
                    public ValidationProblemSeverity lookupSeverity(ValidationRuleMetaData rule) {
                        return severity;
                    }
                };
            }
            List<ValidationProblem> problems = Library.validateDocument(doc, severityRegistry, Collections.emptyList()).get();
            // Now compare with expected
            String actual = formatProblems(problems);
            String expectedCP = testCP + ".expected";
            URL expectedUrl = Thread.currentThread().getContextClassLoader().getResource(expectedCP);
            Assert.assertNotNull("Could not load test resource: " + expectedCP, expectedUrl);
            String expected = loadResource(expectedUrl);
            Assert.assertEquals(normalize(expected), normalize(actual));
        }
    };
    runLeaf(statement, description, notifier);
}
Also used : Description(org.junit.runner.Description) Statement(org.junit.runners.model.Statement) ValidationProblem(io.apicurio.datamodels.core.models.ValidationProblem) Document(io.apicurio.datamodels.core.models.Document) URL(java.net.URL) ValidationProblemSeverity(io.apicurio.datamodels.core.models.ValidationProblemSeverity)

Aggregations

ValidationProblem (io.apicurio.datamodels.core.models.ValidationProblem)6 Document (io.apicurio.datamodels.core.models.Document)4 NodePath (io.apicurio.datamodels.core.models.NodePath)4 ValidationProblemSeverity (io.apicurio.datamodels.core.models.ValidationProblemSeverity)3 Oas30Document (io.apicurio.datamodels.openapi.v3.models.Oas30Document)3 DocumentType (io.apicurio.datamodels.core.models.DocumentType)2 Node (io.apicurio.datamodels.core.models.Node)2 IDocumentValidatorExtension (io.apicurio.datamodels.core.validation.IDocumentValidatorExtension)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 Test (org.junit.Test)2 Aai20Document (io.apicurio.datamodels.asyncapi.v2.models.Aai20Document)1 JsonCompat (io.apicurio.datamodels.compat.JsonCompat)1 Constants (io.apicurio.datamodels.core.Constants)1 DocumentFactory (io.apicurio.datamodels.core.factories.DocumentFactory)1 VisitorFactory (io.apicurio.datamodels.core.factories.VisitorFactory)1 DataModelReader (io.apicurio.datamodels.core.io.DataModelReader)1 DataModelReaderDispatcher (io.apicurio.datamodels.core.io.DataModelReaderDispatcher)1 DataModelWriter (io.apicurio.datamodels.core.io.DataModelWriter)1