// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.IO; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.DotNet.OpenApi.Tests; using Xunit; using Xunit.Abstractions; namespace Microsoft.DotNet.OpenApi.Add.Tests { public class OpenApiAddURLTests : OpenApiTestBase { public OpenApiAddURLTests(ITestOutputHelper output) : base(output){ } [Fact] public async Task OpenApi_Add_Url_WithContentDisposition() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = "filename.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var jsonFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(jsonFile)); using (var jsonStream = new FileInfo(jsonFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenAPI_Add_Url_NoContentDisposition() { var project = CreateBasicProject(withOpenApi: false); var url = NoDispositionUrl; var app = GetApplication(); var run = app.Execute(new[] { "add", "url", url}); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = "nodisposition.yaml"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var jsonFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(jsonFile)); using (var jsonStream = new FileInfo(jsonFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenAPI_Add_Url_NoExtension_AssumesJson() { var project = CreateBasicProject(withOpenApi: false); var url = NoExtensionUrl; var app = GetApplication(); var run = app.Execute(new[] { "add", "url", url }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = "filename.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var jsonFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(jsonFile)); using (var jsonStream = new FileInfo(jsonFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenApi_Add_Url_NoSegment() { var project = CreateBasicProject(withOpenApi: false); var url = NoSegmentUrl; var app = GetApplication(); var run = app.Execute(new[] { "add", "url", url }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = "contoso.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var jsonFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(jsonFile)); using (var jsonStream = new FileInfo(jsonFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenApi_Add_Url() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = "filename.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var jsonFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(jsonFile)); using (var jsonStream = new FileInfo(jsonFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenApi_Add_Url_SameName_UniqueFile() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var firstExpectedJsonName = "filename.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var firstJsonFile = Path.Combine(_tempDir.Root, firstExpectedJsonName); Assert.True(File.Exists(firstJsonFile)); using (var jsonStream = new FileInfo(firstJsonFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } app = GetApplication(); run = app.Execute(new[] { "add", "url", NoExtensionUrl }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var secondExpectedJsonName = "filename1.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); Assert.Contains( $@"", content); } var secondJsonFile = Path.Combine(_tempDir.Root, secondExpectedJsonName); Assert.True(File.Exists(secondJsonFile)); using (var jsonStream = new FileInfo(secondJsonFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenApi_Add_Url_NSwagCSharp() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl, "--code-generator", "NSwagCSharp" }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = "filename.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var resultFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(resultFile)); using (var jsonStream = new FileInfo(resultFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenApi_Add_Url_NSwagTypeScript() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl, "--code-generator", "NSwagTypeScript" }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = "filename.json"; // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var resultFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(resultFile)); using (var jsonStream = new FileInfo(resultFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenApi_Add_Url_OutputFile() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl, "--output-file", Path.Combine("outputdir", "file.yaml") }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = Path.Combine("outputdir", "file.yaml"); // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var resultFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(resultFile)); using (var jsonStream = new FileInfo(resultFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public async Task OpenApi_Add_URL_FileAlreadyExists_Fail() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var outputFile = Path.Combine("outputdir", "file.yaml"); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl, "--output-file", outputFile }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); var expectedJsonName = Path.Combine("outputdir", "file.yaml"); // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); } var resultFile = Path.Combine(_tempDir.Root, expectedJsonName); Assert.True(File.Exists(resultFile)); using (var jsonStream = new FileInfo(resultFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } // Second reference, same output app = GetApplication(); run = app.Execute(new[] { "add", "url", DifferentUrl, "--output-file", outputFile}); Assert.Equal(1, run); Assert.True(_error.ToString().Contains("Aborting to avoid conflicts."), $"Should have aborted to avoid conflicts"); // csproj contents using (var csprojStream = new FileInfo(project.Project.Path).OpenRead()) using (var reader = new StreamReader(csprojStream)) { var content = await reader.ReadToEndAsync(); Assert.Contains("", content); Assert.DoesNotContain( $@"", content); } using (var jsonStream = new FileInfo(resultFile).OpenRead()) using (var reader = new StreamReader(jsonStream)) { var content = await reader.ReadToEndAsync(); Assert.Equal(Content, content); } } [Fact] public void OpenApi_Add_URL_MultipleTimes_OnlyOneReference() { var project = CreateBasicProject(withOpenApi: false); var app = GetApplication(); var run = app.Execute(new[] { "add", "url", FakeOpenApiUrl }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); app = GetApplication(); run = app.Execute(new[] { "add", "url", "--output-file", "openapi.yaml", FakeOpenApiUrl }); Assert.True(string.IsNullOrEmpty(_error.ToString()), $"Threw error: {_error.ToString()}"); Assert.Equal(0, run); // csproj contents var csproj = new FileInfo(project.Project.Path); using var csprojStream = csproj.OpenRead(); using var reader = new StreamReader(csprojStream); var content = reader.ReadToEnd(); var escapedPkgRef = Regex.Escape("", content); } } }