// 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);
}
}
}