diff --git a/MSBuild.Sdk.SqlProj.sln b/MSBuild.Sdk.SqlProj.sln index 064a988e..1d792d65 100644 --- a/MSBuild.Sdk.SqlProj.sln +++ b/MSBuild.Sdk.SqlProj.sln @@ -22,6 +22,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAspireHost", "test\Test EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSBuild.Sdk.SqlProj.Aspire", "src\MSBuild.Sdk.SqlProj.Aspire\MSBuild.Sdk.SqlProj.Aspire.csproj", "{78924A88-997D-4D20-BDED-7315745C7C5F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSBuild.Sdk.SqlProj.Aspire.Tests", "test\MSBuild.Sdk.SqlProj.Aspire.Tests\MSBuild.Sdk.SqlProj.Aspire.Tests.csproj", "{2E345E22-0E53-429A-8450-437ABE3A45FA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -92,6 +94,18 @@ Global {78924A88-997D-4D20-BDED-7315745C7C5F}.Release|x64.Build.0 = Release|Any CPU {78924A88-997D-4D20-BDED-7315745C7C5F}.Release|x86.ActiveCfg = Release|Any CPU {78924A88-997D-4D20-BDED-7315745C7C5F}.Release|x86.Build.0 = Release|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Debug|x64.Build.0 = Debug|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Debug|x86.Build.0 = Debug|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Release|Any CPU.Build.0 = Release|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Release|x64.ActiveCfg = Release|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Release|x64.Build.0 = Release|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Release|x86.ActiveCfg = Release|Any CPU + {2E345E22-0E53-429A-8450-437ABE3A45FA}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -102,6 +116,7 @@ Global {2EC1BB4C-C8A1-4C7E-AAE9-24E22EB0A8C4} = {A3A4D55B-4484-4501-894F-0B07708A9A1D} {6691FBBD-479C-4590-8964-DD08909287EB} = {A3A4D55B-4484-4501-894F-0B07708A9A1D} {78924A88-997D-4D20-BDED-7315745C7C5F} = {B0420F9B-A902-4E9D-8B29-55B4F626483B} + {2E345E22-0E53-429A-8450-437ABE3A45FA} = {A3A4D55B-4484-4501-894F-0B07708A9A1D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {832DCF12-9633-4AEB-A9D8-444EDF649047} diff --git a/test/MSBuild.Sdk.SqlProj.Aspire.Tests/AddSqlProjectTests.cs b/test/MSBuild.Sdk.SqlProj.Aspire.Tests/AddSqlProjectTests.cs new file mode 100644 index 00000000..3b880656 --- /dev/null +++ b/test/MSBuild.Sdk.SqlProj.Aspire.Tests/AddSqlProjectTests.cs @@ -0,0 +1,91 @@ +using Aspire.Hosting; +using Aspire.Hosting.Lifecycle; + +namespace MSBuild.Sdk.SqlProj.Aspire.Tests; + +public class AddSqlProjectTests +{ + [Fact] + public void AddSqlProject_WithProjectMetadata() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + appBuilder.AddSqlProject("MySqlProject"); + + // Act + using var app = appBuilder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Assert + var sqlProjectResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("MySqlProject", sqlProjectResource.Name); + + var dacpacPath = sqlProjectResource.GetDacpacPath(); + Assert.NotNull(dacpacPath); + Assert.True(File.Exists(dacpacPath)); + } + + [Fact] + public void AddSqlProject_WithExplicitPath() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + appBuilder.AddSqlProject("MySqlProject").FromDacpac("../../../../TestProject/TestProject.csproj"); + + // Act + using var app = appBuilder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Assert + var sqlProjectResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("MySqlProject", sqlProjectResource.Name); + + var annotation = Assert.Single(sqlProjectResource.Annotations.OfType()); + Assert.Equal(Path.Combine(appBuilder.AppHostDirectory, "../../../../TestProject/TestProject.csproj"), annotation.DacpacPath); + + var dacpacPath = sqlProjectResource.GetDacpacPath(); + Assert.NotNull(dacpacPath); + Assert.True(File.Exists(dacpacPath)); + } + + [Fact] + public void PublishTo_AddsAnnotation() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + var targetDatabase = appBuilder.AddSqlServer("sql").AddDatabase("test"); + appBuilder.AddSqlProject("MySqlProject") + .PublishTo(targetDatabase); + + // Act + using var app = appBuilder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Assert + var sqlProjectResource = Assert.Single(appModel.Resources.OfType()); + var annotation = Assert.Single(sqlProjectResource.Annotations.OfType()); + Assert.Equal("test", annotation.TargetDatabaseResourceName); + } + + [Fact] + public void PublishTo_AddsLifecycleHook() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + var targetDatabase = appBuilder.AddSqlServer("sql").AddDatabase("test"); + appBuilder.AddSqlProject("MySqlProject") + .PublishTo(targetDatabase); + + // Act + using var app = appBuilder.Build(); + + // Assert + var lifecycleHooks = app.Services.GetServices(); + Assert.Single(lifecycleHooks.OfType()); + } + + private class TestProject : IProjectMetadata + { + public string ProjectPath { get; } = "../../../../TestProject/TestProject.csproj"; + } +} diff --git a/test/MSBuild.Sdk.SqlProj.Aspire.Tests/MSBuild.Sdk.SqlProj.Aspire.Tests.csproj b/test/MSBuild.Sdk.SqlProj.Aspire.Tests/MSBuild.Sdk.SqlProj.Aspire.Tests.csproj new file mode 100644 index 00000000..6c35e658 --- /dev/null +++ b/test/MSBuild.Sdk.SqlProj.Aspire.Tests/MSBuild.Sdk.SqlProj.Aspire.Tests.csproj @@ -0,0 +1,31 @@ + + + + net8.0 + enable + enable + false + true + + + + + + + + + + + + + + + + + + + + + + +