Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/cd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
global-json-file: global.json

- name: Restore dependencies
run: dotnet restore TheOfficeAPI.sln
Expand Down Expand Up @@ -174,7 +174,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
global-json-file: global.json

- name: Restore dependencies
run: dotnet restore TheOfficeAPI.sln
Expand Down
67 changes: 44 additions & 23 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
global-json-file: global.json

- name: Restore dependencies
run: dotnet restore TheOfficeAPI.sln
Expand All @@ -44,11 +44,11 @@ jobs:

- name: Run unit tests
run: |
dotnet test tests/TheOfficeAPI.Common.Tests.Unit/TheOfficeAPI.Common.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level0.Tests.Unit/TheOfficeAPI.Level0.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level1.Tests.Unit/TheOfficeAPI.Level1.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level2.Tests.Unit/TheOfficeAPI.Level2.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level3.Tests.Unit/TheOfficeAPI.Level3.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --no-build --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Common.Tests.Unit/TheOfficeAPI.Common.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level0.Tests.Unit/TheOfficeAPI.Level0.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level1.Tests.Unit/TheOfficeAPI.Level1.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level2.Tests.Unit/TheOfficeAPI.Level2.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --verbosity normal --logger trx --collect:"XPlat Code Coverage"
dotnet test tests/TheOfficeAPI.Level3.Tests.Unit/TheOfficeAPI.Level3.Tests.Unit.csproj --configuration ${{ env.BUILD_CONFIGURATION }} --verbosity normal --logger trx --collect:"XPlat Code Coverage"
env:
ALLURE_CONFIG: ${{ github.workspace }}/allureConfig.json

Expand Down Expand Up @@ -159,7 +159,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
global-json-file: global.json

- name: Restore dependencies
run: dotnet restore TheOfficeAPI.sln
Expand Down Expand Up @@ -270,7 +270,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
global-json-file: global.json

- name: Restore dotnet tools
run: dotnet tool restore
Expand Down Expand Up @@ -537,7 +537,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
global-json-file: global.json

- name: Restore dependencies
run: dotnet restore TheOfficeAPI.sln
Expand All @@ -562,17 +562,34 @@ jobs:
fi
continue-on-error: true

- name: Check SonarCloud token availability
id: sonar-token-check
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: |
if [ -z "${SONAR_TOKEN}" ]; then
echo "SONAR_TOKEN is not set - SonarCloud analysis will be skipped."
echo "has_token=false" >> $GITHUB_OUTPUT
else
echo "SONAR_TOKEN is available - SonarCloud analysis will run."
echo "has_token=true" >> $GITHUB_OUTPUT
fi

- name: Cache SonarCloud packages
if: steps.sonar-token-check.outputs.has_token == 'true'
uses: actions/cache@v4
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar

- name: Install SonarCloud scanner
if: steps.sonar-token-check.outputs.has_token == 'true'
run: dotnet tool install --global dotnet-sonarscanner

- name: Build and analyze with SonarCloud
if: steps.sonar-token-check.outputs.has_token == 'true'
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
Expand All @@ -582,32 +599,36 @@ jobs:
BRANCH_NAME: ${{ github.ref_name }}
EVENT_NAME: ${{ github.event_name }}
run: |
# Build SonarScanner command with PR-specific parameters
SONAR_PARAMS="/k:\"fszymaniak_TheOfficeAPI\" \
/o:\"fszymaniak\" \
/n:\"The Office API\" \
/v:\"1.0\" \
/d:sonar.token=\"${SONAR_TOKEN}\" \
/d:sonar.host.url=\"https://sonarcloud.io\""
# Build SonarScanner argument array (safer than eval + quoted string)
SONAR_ARGS=(
"/k:fszymaniak_TheOfficeAPI"
"/o:fszymaniak"
"/n:The Office API"
"/v:1.0"
"/d:sonar.token=${SONAR_TOKEN}"
"/d:sonar.host.url=https://sonarcloud.io"
)

# Add PR-specific parameters for pull requests
if [ "$EVENT_NAME" == "pull_request" ]; then
SONAR_PARAMS="$SONAR_PARAMS \
/d:sonar.pullrequest.key=\"${PR_NUMBER}\" \
/d:sonar.pullrequest.branch=\"${PR_HEAD_REF}\" \
/d:sonar.pullrequest.base=\"${PR_BASE_REF}\""
SONAR_ARGS+=(
"/d:sonar.pullrequest.key=${PR_NUMBER}"
"/d:sonar.pullrequest.branch=${PR_HEAD_REF}"
"/d:sonar.pullrequest.base=${PR_BASE_REF}"
)
echo "Running SonarCloud analysis for PR #${PR_NUMBER}"
else
SONAR_PARAMS="$SONAR_PARAMS /d:sonar.branch.name=\"${BRANCH_NAME}\""
SONAR_ARGS+=("/d:sonar.branch.name=${BRANCH_NAME}")
echo "Running SonarCloud analysis for branch ${BRANCH_NAME}"
fi

# Run analysis
eval dotnet sonarscanner begin $SONAR_PARAMS
dotnet sonarscanner begin "${SONAR_ARGS[@]}"
dotnet build TheOfficeAPI.sln --configuration ${{ env.BUILD_CONFIGURATION }} --no-restore
dotnet sonarscanner end /d:sonar.token="${SONAR_TOKEN}"
dotnet sonarscanner end "/d:sonar.token=${SONAR_TOKEN}"

- name: SonarCloud Quality Gate check
if: steps.sonar-token-check.outputs.has_token == 'true'
uses: sonarsource/sonarqube-quality-gate-action@master
timeout-minutes: 5
with:
Expand Down
18 changes: 9 additions & 9 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@

<ItemGroup>
<!-- Main application packages -->
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.6" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="9.0.3" />
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="9.0.3" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.5" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="10.1.7" />
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="10.1.7" />

<!-- Test framework packages -->
<PackageVersion Include="Allure.Xunit" Version="2.14.1" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageVersion Include="Moq" Version="4.20.72" />
<PackageVersion Include="xunit" Version="2.9.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />

<!-- ASP.NET Core test packages -->
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.11" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.11" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.11" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.5" />
</ItemGroup>
</Project>
32 changes: 25 additions & 7 deletions TheOfficeAPI.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level1.Tests.I
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level2.Tests.Unit", "tests/TheOfficeAPI.Level2.Tests.Unit/TheOfficeAPI.Level2.Tests.Unit.csproj", "{E3FA0913-3456-7890-1234-D362FE48FE0D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level2.Tests.Integration", "tests/TheOfficeAPI.Level2.Tests.Integration/TheOfficeAPI.Level2.Tests.Integration.csproj", "{00000000-0000-0000-0000-000000000000}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level2.Tests.Integration", "tests/TheOfficeAPI.Level2.Tests.Integration/TheOfficeAPI.Level2.Tests.Integration.csproj", "{FFE2325B-3FC1-4A3D-8A97-EA763B34A882}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level3.Tests.Unit", "tests/TheOfficeAPI.Level3.Tests.Unit/TheOfficeAPI.Level3.Tests.Unit.csproj", "{00000000-0000-0000-0000-000000000000}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level3.Tests.Unit", "tests/TheOfficeAPI.Level3.Tests.Unit/TheOfficeAPI.Level3.Tests.Unit.csproj", "{1D4ED33D-6586-4BE5-9A4C-9C004063B609}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level3.Tests.Integration", "tests/TheOfficeAPI.Level3.Tests.Integration/TheOfficeAPI.Level3.Tests.Integration.csproj", "{00000000-0000-0000-0000-000000000000}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Level3.Tests.Integration", "tests/TheOfficeAPI.Level3.Tests.Integration/TheOfficeAPI.Level3.Tests.Integration.csproj", "{D5C4D8DA-0B2F-432A-84D3-88D6F770E55A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Tests.E2E", "tests/TheOfficeAPI.Tests.E2E/TheOfficeAPI.Tests.E2E.csproj", "{00000000-0000-0000-0000-000000000000}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Tests.E2E", "tests/TheOfficeAPI.Tests.E2E/TheOfficeAPI.Tests.E2E.csproj", "{9D3738D5-76A2-4AB3-9374-A7772063E015}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Common.Tests.Unit", "tests/TheOfficeAPI.Common.Tests.Unit/TheOfficeAPI.Common.Tests.Unit.csproj", "{00000000-0000-0000-0000-000000000000}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheOfficeAPI.Common.Tests.Unit", "tests/TheOfficeAPI.Common.Tests.Unit/TheOfficeAPI.Common.Tests.Unit.csproj", "{4A55CC08-CB9A-48A4-BA00-A99A0E236CA8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -53,7 +53,25 @@ Global
{E3FA0913-3456-7890-1234-D362FE48FE0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E3FA0913-3456-7890-1234-D362FE48FE0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E3FA0913-3456-7890-1234-D362FE48FE0D}.Release|Any CPU.Build.0 = Release|Any CPU
{00000000-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{00000000-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FFE2325B-3FC1-4A3D-8A97-EA763B34A882}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FFE2325B-3FC1-4A3D-8A97-EA763B34A882}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FFE2325B-3FC1-4A3D-8A97-EA763B34A882}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FFE2325B-3FC1-4A3D-8A97-EA763B34A882}.Release|Any CPU.Build.0 = Release|Any CPU
{1D4ED33D-6586-4BE5-9A4C-9C004063B609}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1D4ED33D-6586-4BE5-9A4C-9C004063B609}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1D4ED33D-6586-4BE5-9A4C-9C004063B609}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1D4ED33D-6586-4BE5-9A4C-9C004063B609}.Release|Any CPU.Build.0 = Release|Any CPU
{D5C4D8DA-0B2F-432A-84D3-88D6F770E55A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D5C4D8DA-0B2F-432A-84D3-88D6F770E55A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5C4D8DA-0B2F-432A-84D3-88D6F770E55A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D5C4D8DA-0B2F-432A-84D3-88D6F770E55A}.Release|Any CPU.Build.0 = Release|Any CPU
{9D3738D5-76A2-4AB3-9374-A7772063E015}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D3738D5-76A2-4AB3-9374-A7772063E015}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D3738D5-76A2-4AB3-9374-A7772063E015}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D3738D5-76A2-4AB3-9374-A7772063E015}.Release|Any CPU.Build.0 = Release|Any CPU
{4A55CC08-CB9A-48A4-BA00-A99A0E236CA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A55CC08-CB9A-48A4-BA00-A99A0E236CA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A55CC08-CB9A-48A4-BA00-A99A0E236CA8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A55CC08-CB9A-48A4-BA00-A99A0E236CA8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
7 changes: 7 additions & 0 deletions global.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"sdk": {
"version": "10.0.103",
"rollForward": "latestPatch",
"allowPrerelease": false
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.Reflection;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;

namespace TheOfficeAPI.Level0.Extensions
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.Reflection;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;

namespace TheOfficeAPI.Level1.Extensions
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.Reflection;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;

namespace TheOfficeAPI.Level2.Extensions
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.Reflection;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;

namespace TheOfficeAPI.Level3.Extensions
{
Expand Down
8 changes: 4 additions & 4 deletions src/TheOfficeAPI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,28 +66,28 @@ public static WebApplication CreateWebApplication(string[] args)
builder.Services.AddSwaggerGen(c =>
{
// Register all API versions
c.SwaggerDoc("v0", new Microsoft.OpenApi.Models.OpenApiInfo
c.SwaggerDoc("v0", new Microsoft.OpenApi.OpenApiInfo
{
Title = "The Office API - Level 0",
Version = "v0",
Description = "Richardson Maturity Model Level 0 implementation"
});

c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
c.SwaggerDoc("v1", new Microsoft.OpenApi.OpenApiInfo
{
Title = "The Office API - Level 1",
Version = "v1",
Description = "Richardson Maturity Model Level 1 implementation - Introduces resource-based URIs"
});

c.SwaggerDoc("v2", new Microsoft.OpenApi.Models.OpenApiInfo
c.SwaggerDoc("v2", new Microsoft.OpenApi.OpenApiInfo
{
Title = "The Office API - Level 2",
Version = "v2",
Description = "Richardson Maturity Model Level 2 implementation - Introduces HTTP verbs and proper status codes"
});

c.SwaggerDoc("v3", new Microsoft.OpenApi.Models.OpenApiInfo
c.SwaggerDoc("v3", new Microsoft.OpenApi.OpenApiInfo
{
Title = "The Office API - Level 3",
Version = "v3",
Expand Down
66 changes: 33 additions & 33 deletions stryker-config.ci.json
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
{
"$schema": "https://raw.githubusercontent.com/stryker-mutator/stryker-net/master/src/Stryker.CLI/Stryker.CLI/schema.json",
"project": "src/TheOfficeAPI/TheOfficeAPI.csproj",
"test-projects": [
"tests/TheOfficeAPI.Common.Tests.Unit/TheOfficeAPI.Common.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level0.Tests.Unit/TheOfficeAPI.Level0.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level1.Tests.Unit/TheOfficeAPI.Level1.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level2.Tests.Unit/TheOfficeAPI.Level2.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level3.Tests.Unit/TheOfficeAPI.Level3.Tests.Unit.csproj"
],
"reporters": [
"html",
"json",
"progress",
"cleartext"
],
"thresholds": {
"high": 80,
"low": 60,
"break": 0
},
"mutation-level": "Standard",
"concurrency": 2,
"output-path": "StrykerOutput",
"exclude-mutations": [],
"ignore-methods": [
"*ToString*",
"*GetHashCode*",
"*Equals*"
],
"dashboard": {
"enabled": false
},
"since": {
"enabled": false
"stryker-config": {
"project": "src/TheOfficeAPI/TheOfficeAPI.csproj",
"solution": "TheOfficeAPI.sln",
"target-framework": "net10.0",
"test-projects": [
"tests/TheOfficeAPI.Common.Tests.Unit/TheOfficeAPI.Common.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level0.Tests.Unit/TheOfficeAPI.Level0.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level1.Tests.Unit/TheOfficeAPI.Level1.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level2.Tests.Unit/TheOfficeAPI.Level2.Tests.Unit.csproj",
"tests/TheOfficeAPI.Level3.Tests.Unit/TheOfficeAPI.Level3.Tests.Unit.csproj"
],
"reporters": [
"html",
"json",
"progress",
"cleartext"
],
"thresholds": {
"high": 80,
"low": 60,
"break": 0
},
"mutation-level": "Standard",
"concurrency": 2,
"coverage-analysis": "perTest",
"ignore-methods": [
"*ToString*",
"*GetHashCode*",
"*Equals*"
],
"since": {
"enabled": false
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace TheOfficeAPI.Common.Tests.Unit;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
Expand Down
Loading
Loading