public void ProcessMrefWithInvalidCrossReferenceShouldWarn()
        {
            var files = new FileCollection(Directory.GetCurrentDirectory());

            files.Add(DocumentType.Article, new[] { "TestData/mref/System.String.yml" }, "TestData/");
            files.Add(DocumentType.Overwrite, new[] { "TestData/overwrite/mref.overwrite.invalid.ref.md" });

            var listener = TestLoggerListener.CreateLoggerListenerWithPhaseStartFilter(nameof(ProcessMrefWithInvalidCrossReferenceShouldWarn), LogLevel.Info);

            try
            {
                Logger.RegisterListener(listener);

                using (new LoggerPhaseScope(nameof(ProcessMrefWithInvalidCrossReferenceShouldWarn)))
                {
                    BuildDocument(files);
                }

                var warnings = listener.GetItemsByLogLevel(LogLevel.Warning);
                Assert.Equal(1, warnings.Count());
                var warning = warnings.Single();
                Assert.Equal("2 invalid cross reference(s) \"<xref:invalidXref1>\", \"<xref:invalidXref2>\".", warning.Message);
                Assert.Equal("TestData/mref/System.String.yml", warning.File);

                var infos = listener.GetItemsByLogLevel(LogLevel.Info).Where(i => i.Message.Contains("Details for invalid cross reference(s)")).ToList();
                Assert.Equal(1, infos.Count());
                Assert.Equal("Details for invalid cross reference(s): \"<xref:invalidXref1>\" in line 6, \"<xref:invalidXref2>\" in line 8", infos[0].Message);
                Assert.Equal("TestData/overwrite/mref.overwrite.invalid.ref.md", infos[0].File);
                Assert.Null(infos[0].Line);
            }
            finally
            {
                Logger.UnregisterListener(listener);
            }
        }
        public void LoadArticleWithEmptyFileShouldWarnAndReturnNull()
        {
            var fileWithNoContent = "TestData/mref/FileWithNoContent.yml";
            var file      = new FileAndType(Directory.GetCurrentDirectory(), fileWithNoContent, DocumentType.Article);
            var processor = new ManagedReferenceDocumentProcessor();

            var listener = TestLoggerListener.CreateLoggerListenerWithPhaseStartFilter(nameof(LoadArticleWithEmptyFileShouldWarnAndReturnNull), LogLevel.Info);

            try
            {
                Logger.RegisterListener(listener);

                FileModel actualFileModel;
                using (new LoggerPhaseScope(nameof(LoadArticleWithEmptyFileShouldWarnAndReturnNull)))
                {
                    actualFileModel = processor.Load(file, null);
                }

                var warnings = listener.GetItemsByLogLevel(LogLevel.Warning);
                Assert.Single(warnings);
                var warning = warnings.Single();
                Assert.Equal("Please add `YamlMime` as the first line of file, e.g.: `### YamlMime:ManagedReference`, otherwise the file will be not treated as ManagedReference source file in near future.", warning.Message);
                Assert.Equal(fileWithNoContent, warning.File);

                Assert.Null(actualFileModel);
            }
            finally
            {
                Logger.UnregisterListener(listener);
            }
        }
Example #3
0
        public void UrlDecodeHrefInMarkdownToc()
        {
            // Arrange
            var tocContent   = @"# [NAME](a%20b.md)";
            var files        = new FileCollection(_inputFolder);
            var tocFile      = _fileCreator.CreateFile(tocContent, FileType.MarkdownToc);
            var markdownFile = _fileCreator.CreateFile(string.Empty, FileType.MarkdownContent, fileNameWithoutExtension: "a b");

            files.Add(DocumentType.Article, new[] { tocFile, markdownFile });

            // Act
            var listener = TestLoggerListener.CreateLoggerListenerWithCodesFilter(
                new List <string> {
                WarningCodes.Build.InvalidFileLink
            });

            Logger.RegisterListener(listener);
            using (new LoggerPhaseScope(nameof(TocDocumentProcessorTest)))
            {
                BuildDocument(files);
            }
            Logger.UnregisterListener(listener);

            // Assert
            Assert.NotNull(listener.Items);
            Assert.Empty(listener.Items);
        }
Example #4
0
        public void ProcessYamlTocWithNonExistentReferencedTocShouldLogError()
        {
            var pathToReferencedToc = "non-existent/TOC.md";
            var toc   = _fileCreator.CreateFile($@"
- name: Topic
  href: {pathToReferencedToc}
", FileType.YamlToc);
            var files = new FileCollection(_inputFolder);

            files.Add(DocumentType.Article, new[] { toc });

            var listener = TestLoggerListener.CreateLoggerListenerWithCodesFilter(new List <string> {
                WarningCodes.Build.InvalidTocInclude
            });

            Logger.RegisterListener(listener);
            using (new LoggerPhaseScope(nameof(TocDocumentProcessorTest)))
            {
                BuildDocument(files);
            }
            Logger.UnregisterListener(listener);

            Assert.Single(listener.Items);

            Assert.Equal(WarningCodes.Build.InvalidTocInclude, listener.Items[0].Code);
            Assert.Equal($"Referenced TOC file {StringExtension.ToDisplayPath(Path.GetFullPath(Path.Combine(_inputFolder, pathToReferencedToc)))} does not exist.", listener.Items[0].Message, true);
            Assert.Equal(LogLevel.Error, listener.Items[0].LogLevel);
        }
        public void ProcessSwaggerWithInvalidLinksOverwriteShouldSucceedWithWarning()
        {
            const string phaseName = "ProcessSwaggerWithInvalidLinksOverwriteShouldSucceedWithWarning";
            var          listener  = TestLoggerListener.CreateLoggerListenerWithPhaseStartFilter(phaseName);

            Logger.RegisterListener(listener);

            using (new LoggerPhaseScope(phaseName))
            {
                var files = new FileCollection(_defaultFiles);
                files.Add(DocumentType.Article, new[] { "TestData/swagger/tag_swagger2.json" }, "TestData/");
                files.Add(DocumentType.Overwrite, new[] { "TestData/overwrite/rest.overwrite.invalid.links.first.md" });
                files.Add(DocumentType.Overwrite, new[] { "TestData/overwrite/rest.overwrite.invalid.links.second.md" });
                BuildDocument(files);

                Assert.Equal(6, listener.Items.Count); // Additional warning for "There is no template processing document type(s): RestApi"

                var outputRawModelPath = GetRawModelFilePath("contacts.json");
                Assert.True(File.Exists(outputRawModelPath));
                var model = JsonUtility.Deserialize <RestApiRootItemViewModel>(outputRawModelPath);

                var warningsForLinkA = listener.Items.Where(i => i.Message == "Invalid file link:(~/TestData/overwrite/a.md).").ToList();
                Assert.Equal(
                    "<p sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.first.md\" sourcestartlinenumber=\"13\" sourceendlinenumber=\"13\">Remarks content <a href=\"b.md\" data-raw-source=\"[remarks](b.md)\" sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.first.md\" sourcestartlinenumber=\"13\" sourceendlinenumber=\"13\">remarks</a></p>\n",
                    model.Remarks);
                Assert.Equal("6", warningsForLinkA.Single(i => i.File == "TestData/overwrite/rest.overwrite.invalid.links.first.md").Line);

                Assert.Equal(
                    "<p sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.first.md\" sourcestartlinenumber=\"6\" sourceendlinenumber=\"6\">Summary content <a href=\"a.md\" data-raw-source=\"[summary](a.md)\" sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.first.md\" sourcestartlinenumber=\"6\" sourceendlinenumber=\"6\">summary</a></p>\n",
                    model.Summary);
                var summaryLink = listener.Items.Single(i => i.Message == "Invalid file link:(~/TestData/overwrite/b.md).");
                Assert.Equal("TestData/overwrite/rest.overwrite.invalid.links.first.md", summaryLink.File);

                var warningsForLinkAForSecond = warningsForLinkA.Where(i => i.File == "TestData/overwrite/rest.overwrite.invalid.links.second.md").ToList();
                Assert.Equal(
                    "<p sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.second.md\" sourcestartlinenumber=\"5\" sourceendlinenumber=\"5\">Conceptual content <a href=\"a.md\" data-raw-source=\"[Conceptual](a.md)\" sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.second.md\" sourcestartlinenumber=\"5\" sourceendlinenumber=\"5\">Conceptual</a></p>\n<p sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.second.md\" sourcestartlinenumber=\"7\" sourceendlinenumber=\"7\"><a href=\"a.md\" data-raw-source=\"[Conceptual](a.md)\" sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.second.md\" sourcestartlinenumber=\"7\" sourceendlinenumber=\"7\">Conceptual</a></p>\n",
                    model.Conceptual);
                Assert.Equal(1, warningsForLinkAForSecond.Count(i => i.Line == "5"));
                Assert.Equal(1, warningsForLinkAForSecond.Count(i => i.Line == "7"));

                var outputTagRawModelPath = GetRawModelFilePath("tag.json");
                Assert.True(File.Exists(outputTagRawModelPath));
                var tagModel = JsonUtility.Deserialize <RestApiRootItemViewModel>(outputTagRawModelPath);

                Assert.Equal(
                    "<p sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.second.md\" sourcestartlinenumber=\"13\" sourceendlinenumber=\"13\">Another uid content <a href=\"a.md\" data-raw-source=\"[Another](a.md)\" sourcefile=\"TestData/overwrite/rest.overwrite.invalid.links.second.md\" sourcestartlinenumber=\"13\" sourceendlinenumber=\"13\">Another</a></p>\n",
                    tagModel.Conceptual);
                Assert.Equal(1, warningsForLinkAForSecond.Count(i => i.Line == "13"));
            }

            Logger.UnregisterListener(listener);
        }
        public void OverwriteUneditableTest()
        {
            _outputFolder          = GetRandomFolder();
            _inputFolder           = GetRandomFolder();
            _templateFolder        = GetRandomFolder();
            _defaultFiles          = new FileCollection(Directory.GetCurrentDirectory());
            _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder)
            {
                RawModelExportSettings = { Export = true }, TransformDocument = true,
            };

            _templateManager = new TemplateManager(null, null, new List <string> {
                "template"
            }, null, _templateFolder);

            _listener         = TestLoggerListener.CreateLoggerListenerWithPhaseEqualFilter(null);
            _rawModelFilePath = GetRawModelFilePath("FragmentsValidation.yml");

            var schemaFile = CreateFile("template/schemas/fragments.validation.schema.json", File.ReadAllText("TestData/schemas/fragments.validation.schema.json"), _templateFolder);
            var yamlFile   = CreateFile("FragmentsValidation.yml", File.ReadAllText("TestData/inputs/FragmentsValidation.yml"), _inputFolder);
            var mdFile     = CreateFile("FragmentsValidation.yml.md", File.ReadAllText("TestData/inputs/FragmentsValidation.yml.md"), _inputFolder);

            _files = new FileCollection(_defaultFiles);
            _files.Add(DocumentType.Article, new[] { yamlFile }, _inputFolder);

            // Act
            Logger.RegisterListener(_listener);
            try
            {
                BuildDocument(_files);
            }
            finally
            {
                Logger.UnregisterListener(_listener);
            }

            var logs        = _listener.Items;
            var warningLogs = logs.Where(l => l.Code == WarningCodes.Overwrite.InvalidMarkdownFragments).ToList();

            Assert.True(File.Exists(_rawModelFilePath));
            Assert.Equal(5, warningLogs.Count());
            Assert.Equal(
                @"Markdown property `depot_name` is not allowed inside a YAML code block
You cannot overwrite a readonly property: `site_name`, please add an `editable` tag on this property or mark its contentType as `markdown` in schema if you want to overwrite this property
There is an invalid H2: `name`: the contentType of this property in schema must be `markdown`
There is an invalid H2: `operations[id=""management.azure.com.advisor.fragmentsValidation.create""]/summary`: the contentType of this property in schema must be `markdown`
""/operations/1"" in overwrite object fails to overwrite ""/operations"" for ""management.azure.com.advisor.fragmentsValidation"" because it does not match any existing item.",
                String.Join(Environment.NewLine, warningLogs.Select(x => x.Message)));
            Assert.Equal("14", warningLogs[2].Line);
            Assert.Equal("17", warningLogs[3].Line);
        }
        public void ProcessSwaggerWithExternalReferenceHasRefInsideShouldFail()
        {
            var files = new FileCollection(Directory.GetCurrentDirectory());

            files.Add(DocumentType.Article, new[] { "TestData/swagger/externalRefWithRefInside.json" }, "TestData/");
            var listener = TestLoggerListener.CreateLoggerListenerWithCodeFilter("InvalidInputFile");

            Logger.RegisterListener(listener);

            using (new LoggerPhaseScope(nameof(RestApiDocumentProcessorTest)))
            {
                BuildDocument(files);
            }

            Assert.NotNull(listener.Items);
            Assert.Single(listener.Items);
            Assert.Contains("$ref in refWithRefInside.json is not supported in external reference currently.", listener.Items[0].Message);
        }
        public void WarningShouldBeFromIncludedToc()
        {
            // Arrange
            var masterContent   = @"
- name: TOC2
  href: ../included/toc.yml";
            var includedContent = @"
- name: Article2
  href: not-existing2.md
- name: Article3ByUid
  uid: not-existing-uid";
            var files           = new FileCollection(_inputFolder);
            var masterFile      = _fileCreator.CreateFile(masterContent, FileType.YamlToc, "master");
            var includedFile    = _fileCreator.CreateFile(includedContent, FileType.YamlToc, "included");

            files.Add(DocumentType.Article, new[] { masterFile });

            // Act
            var listener = TestLoggerListener.CreateLoggerListenerWithCodesFilter(
                new List <string> {
                WarningCodes.Build.InvalidFileLink, WarningCodes.Build.UidNotFound
            });

            Logger.RegisterListener(listener);
            using (new LoggerPhaseScope(nameof(TocDocumentProcessorTest)))
            {
                BuildDocument(files);
            }
            Logger.UnregisterListener(listener);

            // Assert
            Assert.NotNull(listener.Items);
            Assert.Equal(2, listener.Items.Count);
            Assert.Equal(WarningCodes.Build.InvalidFileLink, listener.Items[0].Code);
            Assert.Equal("~/included/toc.yml", listener.Items[0].File);
            Assert.Equal(WarningCodes.Build.UidNotFound, listener.Items[1].Code);
            Assert.Equal("~/included/toc.yml", listener.Items[1].File);
        }
        public MergeMarkdownFragmentsTest()
        {
            _outputFolder          = GetRandomFolder();
            _inputFolder           = GetRandomFolder();
            _templateFolder        = GetRandomFolder();
            _defaultFiles          = new FileCollection(Directory.GetCurrentDirectory());
            _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder)
            {
                RawModelExportSettings = { Export = true }, TransformDocument = true,
            };

            _templateManager = new TemplateManager(null, null, new List <string> {
                "template"
            }, null, _templateFolder);

            _listener         = TestLoggerListener.CreateLoggerListenerWithPhaseEqualFilter(null);
            _rawModelFilePath = GetRawModelFilePath("Suppressions.yml");

            var schemaFile = CreateFile("template/schemas/rest.mixed.schema.json", File.ReadAllText("TestData/schemas/rest.mixed.schema.json"), _templateFolder);
            var yamlFile   = CreateFile("Suppressions.yml", File.ReadAllText("TestData/inputs/Suppressions.yml"), _inputFolder);

            _files = new FileCollection(_defaultFiles);
            _files.Add(DocumentType.Article, new[] { yamlFile }, _inputFolder);
        }
Example #10
0
 private void CleanUp()
 {
     Logger.UnregisterListener(Listener);
     Listener = null;
 }
Example #11
0
 private void Init(string phaseName)
 {
     Listener = new TestLoggerListener(phaseName);
     Logger.RegisterListener(Listener);
 }