File: OpenApiAddFileTests.cs
Web Access
Project: src\src\Tools\Microsoft.dotnet-openapi\test\dotnet-microsoft.openapi.Tests.csproj (Microsoft.DotNet.Open.Api.Tools.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.RegularExpressions;
using System.Xml;
using Microsoft.DotNet.OpenApi.Tests;
using Xunit.Abstractions;
 
namespace Microsoft.DotNet.OpenApi.Add.Tests;
 
public class OpenApiAddFileTests : OpenApiTestBase
{
    public OpenApiAddFileTests(ITestOutputHelper output) : base(output) { }
 
    [Fact]
    public void OpenApi_Empty_ShowsHelp()
    {
        var app = GetApplication();
        var run = app.Execute(Array.Empty<string>());
 
        AssertNoErrors(run);
 
        Assert.Contains("Usage: openapi ", _output.ToString());
    }
 
    [Fact]
    public void OpenApi_NoProjectExists()
    {
        var app = GetApplication();
        _tempDir.Create();
        var run = app.Execute(new string[] { "add", "file", "randomfile.json" });
 
        Assert.Contains("No project files were found in the current directory", _error.ToString());
        Assert.Equal(1, run);
    }
 
    [Fact]
    public void OpenApi_ExplicitProject_Missing()
    {
        var app = GetApplication();
        _tempDir.Create();
        var csproj = "fake.csproj";
        var run = app.Execute(new string[] { "add", "file", "--updateProject", csproj, "randomfile.json" });
 
        Assert.Contains($"The project '{Path.Combine(_tempDir.Root, csproj)}' does not exist.", _error.ToString());
        Assert.Equal(1, run);
    }
 
    [Fact]
    public void OpenApi_Add_Empty_ShowsHelp()
    {
        var app = GetApplication();
        var appExitCode = app.Execute(new string[] { "add" });
 
        AssertNoErrors(appExitCode);
 
        Assert.Contains("Usage: openapi add", _output.ToString());
    }
 
    [Fact]
    public void OpenApi_Add_File_Empty_ShowsHelp()
    {
        var app = GetApplication();
        var run = app.Execute(new string[] { "add", "file", "--help" });
 
        AssertNoErrors(run);
 
        Assert.Contains("Usage: openapi ", _output.ToString());
    }
 
    [Fact]
    public async Task OpenApi_Add_ReuseItemGroup()
    {
        var project = CreateBasicProject(withOpenApi: true);
 
        var app = GetApplication();
        var run = app.Execute(new[] { "add", "file", project.NSwagJsonFile });
 
        AssertNoErrors(run);
 
        var secondRun = app.Execute(new[] { "add", "url", FakeOpenApiUrl });
        AssertNoErrors(secondRun);
 
        var csproj = new FileInfo(project.Project.Path);
        string content;
        using (var csprojStream = csproj.OpenRead())
        using (var reader = new StreamReader(csprojStream))
        {
            content = await reader.ReadToEndAsync();
            Assert.Contains("<PackageReference Include=\"NSwag.ApiDescription.Client\" Version=\"", content);
            Assert.Contains($"<OpenApiReference Include=\"{project.NSwagJsonFile}\"", content);
        }
        var projXml = new XmlDocument();
        projXml.Load(csproj.FullName);
 
        var openApiRefs = projXml.GetElementsByTagName(Commands.BaseCommand.OpenApiReference);
        Assert.Same(openApiRefs[0].ParentNode, openApiRefs[1].ParentNode);
    }
 
    [Fact]
    public void OpenApi_Add_File_EquivilentPaths()
    {
        var project = CreateBasicProject(withOpenApi: true);
        var nswagJsonFile = project.NSwagJsonFile;
 
        var app = GetApplication();
        var run = app.Execute(new[] { "add", "file", nswagJsonFile });
 
        AssertNoErrors(run);
 
        app = GetApplication();
        var absolute = Path.GetFullPath(nswagJsonFile, project.Project.Dir().Root);
        run = app.Execute(new[] { "add", "file", absolute });
 
        AssertNoErrors(run);
 
        var csproj = new FileInfo(project.Project.Path);
        var projXml = new XmlDocument();
        projXml.Load(csproj.FullName);
 
        var openApiRefs = projXml.GetElementsByTagName(Commands.BaseCommand.OpenApiReference);
        Assert.Single(openApiRefs);
    }
 
    [Fact]
    public async Task OpenApi_Add_NSwagTypeScript()
    {
        var project = CreateBasicProject(withOpenApi: true);
        var nswagJsonFile = project.NSwagJsonFile;
 
        var app = GetApplication();
        var run = app.Execute(new[] { "add", "file", nswagJsonFile, "--code-generator", "NSwagTypeScript" });
 
        AssertNoErrors(run);
 
        // csproj contents
        var csproj = new FileInfo(project.Project.Path);
        using var csprojStream = csproj.OpenRead();
        using var reader = new StreamReader(csprojStream);
        var content = await reader.ReadToEndAsync();
        Assert.Contains("<PackageReference Include=\"NSwag.ApiDescription.Client\" Version=\"", content);
        Assert.Contains($"<OpenApiReference Include=\"{nswagJsonFile}\" CodeGenerator=\"NSwagTypeScript\" />", content);
    }
 
    [Fact]
    public async Task OpenApi_Add_FromJson()
    {
        var project = CreateBasicProject(withOpenApi: true);
        var nswagJsonFile = project.NSwagJsonFile;
 
        var app = GetApplication();
        var run = app.Execute(new[] { "add", "file", nswagJsonFile });
 
        AssertNoErrors(run);
 
        // csproj contents
        var csproj = new FileInfo(project.Project.Path);
        using var csprojStream = csproj.OpenRead();
        using var reader = new StreamReader(csprojStream);
        var content = await reader.ReadToEndAsync();
        Assert.Contains("<PackageReference Include=\"NSwag.ApiDescription.Client\" Version=\"", content);
        Assert.Contains($"<OpenApiReference Include=\"{nswagJsonFile}\"", content);
    }
 
    [Fact]
    public async Task OpenApi_Add_File_UseProjectOption()
    {
        var project = CreateBasicProject(withOpenApi: true);
        var nswagJsonFIle = project.NSwagJsonFile;
 
        var app = GetApplication();
        var run = app.Execute(new[] { "add", "file", "--updateProject", project.Project.Path, nswagJsonFIle });
 
        AssertNoErrors(run);
 
        // csproj contents
        var csproj = new FileInfo(project.Project.Path);
        using var csprojStream = csproj.OpenRead();
        using var reader = new StreamReader(csprojStream);
        var content = await reader.ReadToEndAsync();
        Assert.Contains("<PackageReference Include=\"NSwag.ApiDescription.Client\" Version=\"", content);
        Assert.Contains($"<OpenApiReference Include=\"{nswagJsonFIle}\"", content);
    }
 
    [Fact]
    public async Task OpenApi_Add_MultipleTimes_OnlyOneReference()
    {
        var project = CreateBasicProject(withOpenApi: true);
        var nswagJsonFile = project.NSwagJsonFile;
 
        var app = GetApplication();
        var run = app.Execute(new[] { "add", "file", nswagJsonFile });
 
        AssertNoErrors(run);
 
        app = GetApplication();
        run = app.Execute(new[] { "add", "file", nswagJsonFile });
 
        AssertNoErrors(run);
 
        // csproj contents
        var csproj = new FileInfo(project.Project.Path);
        using var csprojStream = csproj.OpenRead();
        using var reader = new StreamReader(csprojStream);
        var content = await reader.ReadToEndAsync();
        var escapedPkgRef = Regex.Escape("<PackageReference Include=\"NSwag.ApiDescription.Client\" Version=\"");
        Assert.Single(Regex.Matches(content, escapedPkgRef));
        var escapedApiRef = Regex.Escape($"<OpenApiReference Include=\"{nswagJsonFile}\"");
        Assert.Single(Regex.Matches(content, escapedApiRef));
    }
}