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); } }
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); }
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); }
private void CleanUp() { Logger.UnregisterListener(Listener); Listener = null; }
private void Init(string phaseName) { Listener = new TestLoggerListener(phaseName); Logger.RegisterListener(Listener); }