public void Document(DatabaseDefinition dd)
        {
            Log(LogSeverity.Information, "Starting on {DatabaseName}.", "SchemaCheckerDocumenter", DatabaseName);

            WriteLine("Checks", "Severity", "Type", "Target", "Schema", "Table", "Case", "Description");

            var schemaChecker = new SchemaChecker(Context);

            var results = schemaChecker.Check(dd);

            foreach (var schemaCheck in results.OrderBy(sc => sc.Schema).ThenBy(sc => sc.ElementName).ThenByDescending(sc => sc.Severity))
            {
                WriteLine("Checks", schemaCheck.Severity, schemaCheck.Type, schemaCheck.TargetType, schemaCheck.Schema, schemaCheck.ElementName, schemaCheck.DisplayName, schemaCheck.DisplayInfo);
            }

            Log(LogSeverity.Information, "Generating Document content.", "SchemaCheckerDocumenter");
            var content = DocumenterWriter.GetContent();

            var fileName = FileName ?? (DatabaseName?.Length == 0 ? "Database_checks.xlsx" : DatabaseName + "_checks.xlsx");

            var path = Context.DocumenterSettings?.WorkingDirectory;

            Log(LogSeverity.Information, "Writing Document file {FileName} to folder {Folder}", "SchemaCheckerDocumenter", fileName, path);

            if (!string.IsNullOrEmpty(path))
            {
                fileName = Path.Combine(path, fileName);
            }

            File.WriteAllBytes(fileName, content);
        }
        public void ShouldPassWithSubclass()
        {
            var schema            = this.GetGeneratedSchemaWithOneSubclassProperty();
            var schemaDefinitions = GenerateTestSchemaDefinitions(schema, typeof(ExampleMessageThatShouldPassWithSubClass));
            var schemaResults     = new SchemaChecker().CheckSchemas(new DefineSchemaDefinitions(schemaDefinitions), new[] { typeof(ExampleMessageThatShouldPassWithSubClass) });

            var hasErrors = schemaResults.HasErrors();

            Assert.IsFalse(hasErrors);
        }
        public void ShouldFailBecauseSubclassIsMissing()
        {
            var schema            = this.GetGeneratedSchemaWithOneSubclassProperty();
            var schemaDefinitions = GenerateTestSchemaDefinitions(schema, typeof(ExampleMessageThatShouldFailBecauseOfSubClass));
            var schemaResults     = new SchemaChecker().CheckSchemas(new DefineSchemaDefinitions(schemaDefinitions), new[] { typeof(ExampleMessageThatShouldFailBecauseOfSubClass) });

            var hasErrors = schemaResults.HasErrors();

            Assert.IsTrue(hasErrors);
            var errors = schemaResults.GetErrors();

            Assert.AreEqual(errors.First(), "Class Name: ExampleMessageThatShouldFailBecauseOfSubClass. Consumer: Test. Errors: Required properties are missing from object: PropertyOne. Path ''.");
        }
        public void ShouldFailBecauseOfPropertyType()
        {
            var generatedSchema = this.GetGeneratedSchemaWithOneStringProperty();

            var schemaDefinitions = GenerateTestSchemaDefinitions(generatedSchema, typeof(ExampleMessageThatShouldFailBecauseOfPropertyType));
            var schemaResults     = new SchemaChecker().CheckSchemas(new DefineSchemaDefinitions(schemaDefinitions), new[] { typeof(ExampleMessageThatShouldFailBecauseOfPropertyType) });

            var hasErrors = schemaResults.HasErrors();

            Assert.IsTrue(hasErrors);
            var errors     = schemaResults.GetErrors();
            var regexMatch = new Regex("Invalid type. Expected String, Null but got Integer. Path 'PropertyOne'.");
            var result     = regexMatch.Match(errors.First());

            Assert.AreEqual(result.Success, true);
        }
        public void ShouldPass()
        {
            var generatedSchema = this.GetGeneratedSchemaWithOneStringProperty();

            var schemaDefinitions = new List <SchemaDefinition>()
            {
                new SchemaDefinition()
                {
                    Schema       = JSchema.Parse(generatedSchema),
                    ConsumerName = "Test",
                    SchemaName   = "ExampleMessageThatShouldPass"
                }
            };
            var schemaResults = new SchemaChecker().CheckSchemas(new DefineSchemaDefinitions(schemaDefinitions), new [] { typeof(ExampleMessageThatShouldPass) });

            var hasErrors = schemaResults.HasErrors();

            Assert.IsFalse(hasErrors, $"Schema mismatches! {schemaResults.GetErrors()}");
        }
        public void ShouldFailBecauseOfPropertyName()
        {
            var generatedSchema = this.GetGeneratedSchemaWithOneStringProperty();

            var schemaDefinitions = new List <SchemaDefinition>()
            {
                new SchemaDefinition()
                {
                    Schema       = JSchema.Parse(generatedSchema),
                    ConsumerName = "Test",
                    SchemaName   = typeof(ExampleMessageThatShouldFailBecauseOfPropertyName).Name
                }
            };
            var schemaResults = new SchemaChecker().CheckSchemas(new DefineSchemaDefinitions(schemaDefinitions), new[] { typeof(ExampleMessageThatShouldFailBecauseOfPropertyName) });

            var hasErrors = schemaResults.HasErrors();

            Assert.IsTrue(hasErrors);
            var errors = schemaResults.GetErrors();

            Assert.AreEqual(errors.First(), "Class Name: ExampleMessageThatShouldFailBecauseOfPropertyName. Consumer: Test. Errors: Required properties are missing from object: PropertyOne. Path ''.");
        }