diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index bc8cf9ea..3ae1d185 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -1,33 +1,54 @@ -#name: Build and Test Pull Requests +name: Build and Test Pull Requests + +on: + pull_request: + branches: + - main + +jobs: + unittests: + name: "Build and Unit Test" + + env: + ASPNETCORE_ENVIRONMENT: "Production" + + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '10.0.x' + + - name: Restore NuGet packages + run: dotnet restore EstateManagementUI.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} + + - name: Build solution + run: dotnet build EstateManagementUI.sln --configuration Release --no-restore + + - name: Run Blazor Server unit tests + run: dotnet test EstateManagementUI.BlazorServer.Tests/EstateManagementUI.BlazorServer.Tests.csproj --configuration Release --no-build --verbosity normal --logger "trx;LogFileName=blazor-test-results.trx" + + - name: Publish test results + uses: dorny/test-reporter@v1 + if: always() + with: + name: Unit Test Results + path: '**/TestResults/*.trx' + reporter: dotnet-trx + fail-on-error: true + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: test-results + path: '**/TestResults/*.trx' + retention-days: 30 -# on: -# pull_request: -# branches: -# - main - -# jobs: -# unittests: -# name: "Build and Unit Test" - -# env: -# ASPNETCORE_ENVIRONMENT: "Production" - -# runs-on: ubuntu-latest - -# steps: -# - uses: actions/checkout@v2.3.4 - -# - name: Restore Nuget Packages -# run: dotnet restore EstateManagementUI.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} - -# - name: Build Code -# run: | -# dotnet build EstateManagementUI.sln --configuration Release - -# - name: Run Unit Tests -# run: | -# dotnet test "EstateManagementUI.BusinessLogic.Tests\EstateManagementUI.BusinessLogic.Tests.csproj" -# dotnet test "EstateManagementUI.UITests\EstateManagementUI.UITests.csproj" # chrometests: # name: "Build and Test UI - Chrome" diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs index 234176c4..ed6bcf7d 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/Estate/EstateIndexPageTests.cs @@ -32,6 +32,12 @@ public void EstateIndex_RendersCorrectly() _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(estate)); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result>.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result>.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result>.Success(new List())); // Act var cut = RenderComponent(); @@ -74,6 +80,12 @@ public void EstateIndex_HasCorrectPageTitle() // Arrange _mockMediator.Setup(x => x.Send(It.IsAny(), default)) .ReturnsAsync(Result.Success(new EstateModel { EstateId = Guid.NewGuid() })); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result>.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result>.Success(new List())); + _mockMediator.Setup(x => x.Send(It.IsAny(), default)) + .ReturnsAsync(Result>.Success(new List())); // Act var cut = RenderComponent(); diff --git a/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs b/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs index bf7a9691..0e0c1b44 100644 --- a/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs +++ b/EstateManagementUI.BlazorServer.Tests/Pages/PermissionsDebugPageTests.cs @@ -1,11 +1,55 @@ using Bunit; using EstateManagementUI.BlazorServer.Components.Pages; +using EstateManagementUI.BlazorServer.Permissions; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.Extensions.DependencyInjection; +using Moq; using Shouldly; +using System.Security.Claims; namespace EstateManagementUI.BlazorServer.Tests.Pages; public class PermissionsDebugPageTests : TestContext { + private readonly Mock _mockPermissionService; + private readonly Mock _mockAuthStateProvider; + private readonly Mock _mockPermissionStore; + + public PermissionsDebugPageTests() + { + _mockPermissionService = new Mock(); + _mockAuthStateProvider = new Mock(); + _mockPermissionStore = new Mock(); + + // Setup default mock behaviors + var identity = new ClaimsIdentity(new[] + { + new Claim(ClaimTypes.Name, "TestUser"), + new Claim(ClaimTypes.Email, "test@example.com") + }, "TestAuth"); + var principal = new ClaimsPrincipal(identity); + var authState = new AuthenticationState(principal); + + _mockAuthStateProvider.Setup(x => x.GetAuthenticationStateAsync()) + .ReturnsAsync(authState); + + _mockPermissionService.Setup(x => x.GetUserRoleAsync()) + .ReturnsAsync("TestRole"); + + _mockPermissionService.Setup(x => x.GetUserPermissionsAsync()) + .ReturnsAsync(new List()); + + _mockPermissionService.Setup(x => x.HasPermissionAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(false); + + _mockPermissionStore.Setup(x => x.GetAllRolesAsync()) + .ReturnsAsync(new List()); + + Services.AddSingleton(_mockPermissionService.Object); + Services.AddSingleton(_mockAuthStateProvider.Object); + Services.AddSingleton(_mockPermissionStore.Object); + } + [Fact] public void PermissionsDebug_RendersCorrectly() { diff --git a/EstateManagementUI.sln b/EstateManagementUI.sln index 605dfc64..dd971587 100644 --- a/EstateManagementUI.sln +++ b/EstateManagementUI.sln @@ -3,24 +3,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 VisualStudioVersion = 18.1.11312.151 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EstateManagementUI", "EstateManagementUI\EstateManagementUI.csproj", "{2EA6492F-70A7-41EB-B816-A9854C0DB47B}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{E7671C23-F30C-471A-A9EF-AC85DC607B55}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{05420FAB-1C50-4AAD-9E7C-2A86184019B7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EstateManagementUI.BusinessLogic.Tests", "EstateManagementUI.BusinessLogic.Tests\EstateManagementUI.BusinessLogic.Tests.csproj", "{95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EstateManagementUI.Testing", "EstateManagementUI.Testing\EstateManagementUI.Testing.csproj", "{6F4573B4-A5CC-48B6-A96A-E692C612275D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EstateManagementUI.IntegrationTests", "EstateManagementUI.IntegrationTests\EstateManagementUI.IntegrationTests.csproj", "{4E83EBD1-AC2B-43DA-9EDD-420A213FF635}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EstateManagementUI.BusinessLogic", "EstateManagementUI.BusinessLogic\EstateManagementUI.BusinessLogic.csproj", "{661A3E05-A174-4930-8171-5EDC19D1D267}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EstateManagementUI.ViewModels", "EstateManagementUI.ViewModels\EstateManagementUI.ViewModels.csproj", "{245519C4-A8C6-40A4-AE09-9431DC1845EF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EstateManagementUI.UITests", "EstateManagementUI.UITests\EstateManagementUI.UITests.csproj", "{CC0964BD-CDF0-4976-AF28-B28800FDC286}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EstateManagementUI.BlazorServer", "EstateManagementUI.BlazorServer\EstateManagementUI.BlazorServer.csproj", "{C52FE3F3-E999-4A12-A20B-0D5C6DA34AA9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EstateManagementUI.BlazorServer.Tests", "EstateManagementUI.BlazorServer.Tests\EstateManagementUI.BlazorServer.Tests.csproj", "{55431CBE-C879-47B9-9607-A5822DE9B856}" @@ -35,90 +21,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Debug|x64.ActiveCfg = Debug|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Debug|x64.Build.0 = Debug|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Debug|x86.ActiveCfg = Debug|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Debug|x86.Build.0 = Debug|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Release|Any CPU.Build.0 = Release|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Release|x64.ActiveCfg = Release|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Release|x64.Build.0 = Release|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Release|x86.ActiveCfg = Release|Any CPU - {2EA6492F-70A7-41EB-B816-A9854C0DB47B}.Release|x86.Build.0 = Release|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Debug|x64.ActiveCfg = Debug|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Debug|x64.Build.0 = Debug|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Debug|x86.ActiveCfg = Debug|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Debug|x86.Build.0 = Debug|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Release|Any CPU.Build.0 = Release|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Release|x64.ActiveCfg = Release|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Release|x64.Build.0 = Release|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Release|x86.ActiveCfg = Release|Any CPU - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1}.Release|x86.Build.0 = Release|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Debug|x64.ActiveCfg = Debug|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Debug|x64.Build.0 = Debug|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Debug|x86.ActiveCfg = Debug|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Debug|x86.Build.0 = Debug|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Release|Any CPU.Build.0 = Release|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Release|x64.ActiveCfg = Release|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Release|x64.Build.0 = Release|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Release|x86.ActiveCfg = Release|Any CPU - {6F4573B4-A5CC-48B6-A96A-E692C612275D}.Release|x86.Build.0 = Release|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Debug|x64.ActiveCfg = Debug|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Debug|x64.Build.0 = Debug|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Debug|x86.ActiveCfg = Debug|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Debug|x86.Build.0 = Debug|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Release|Any CPU.Build.0 = Release|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Release|x64.ActiveCfg = Release|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Release|x64.Build.0 = Release|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Release|x86.ActiveCfg = Release|Any CPU - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635}.Release|x86.Build.0 = Release|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Debug|Any CPU.Build.0 = Debug|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Debug|x64.ActiveCfg = Debug|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Debug|x64.Build.0 = Debug|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Debug|x86.ActiveCfg = Debug|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Debug|x86.Build.0 = Debug|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Release|Any CPU.ActiveCfg = Release|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Release|Any CPU.Build.0 = Release|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Release|x64.ActiveCfg = Release|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Release|x64.Build.0 = Release|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Release|x86.ActiveCfg = Release|Any CPU - {661A3E05-A174-4930-8171-5EDC19D1D267}.Release|x86.Build.0 = Release|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Debug|x64.ActiveCfg = Debug|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Debug|x64.Build.0 = Debug|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Debug|x86.ActiveCfg = Debug|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Debug|x86.Build.0 = Debug|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Release|Any CPU.Build.0 = Release|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Release|x64.ActiveCfg = Release|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Release|x64.Build.0 = Release|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Release|x86.ActiveCfg = Release|Any CPU - {245519C4-A8C6-40A4-AE09-9431DC1845EF}.Release|x86.Build.0 = Release|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Debug|x64.ActiveCfg = Debug|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Debug|x64.Build.0 = Debug|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Debug|x86.ActiveCfg = Debug|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Debug|x86.Build.0 = Debug|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Release|Any CPU.Build.0 = Release|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Release|x64.ActiveCfg = Release|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Release|x64.Build.0 = Release|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Release|x86.ActiveCfg = Release|Any CPU - {CC0964BD-CDF0-4976-AF28-B28800FDC286}.Release|x86.Build.0 = Release|Any CPU {C52FE3F3-E999-4A12-A20B-0D5C6DA34AA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C52FE3F3-E999-4A12-A20B-0D5C6DA34AA9}.Debug|Any CPU.Build.0 = Debug|Any CPU {C52FE3F3-E999-4A12-A20B-0D5C6DA34AA9}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -148,13 +50,7 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {2EA6492F-70A7-41EB-B816-A9854C0DB47B} = {05420FAB-1C50-4AAD-9E7C-2A86184019B7} - {95D6BC50-E55F-4D9B-B96D-D97EE5456BE1} = {E7671C23-F30C-471A-A9EF-AC85DC607B55} - {6F4573B4-A5CC-48B6-A96A-E692C612275D} = {E7671C23-F30C-471A-A9EF-AC85DC607B55} - {4E83EBD1-AC2B-43DA-9EDD-420A213FF635} = {E7671C23-F30C-471A-A9EF-AC85DC607B55} - {661A3E05-A174-4930-8171-5EDC19D1D267} = {05420FAB-1C50-4AAD-9E7C-2A86184019B7} - {245519C4-A8C6-40A4-AE09-9431DC1845EF} = {05420FAB-1C50-4AAD-9E7C-2A86184019B7} - {CC0964BD-CDF0-4976-AF28-B28800FDC286} = {E7671C23-F30C-471A-A9EF-AC85DC607B55} + {C52FE3F3-E999-4A12-A20B-0D5C6DA34AA9} = {05420FAB-1C50-4AAD-9E7C-2A86184019B7} {55431CBE-C879-47B9-9607-A5822DE9B856} = {E7671C23-F30C-471A-A9EF-AC85DC607B55} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution