diff --git a/MadWorld/Directory.Packages.props b/MadWorld/Directory.Packages.props index 3c2f2f2..7f2adef 100644 --- a/MadWorld/Directory.Packages.props +++ b/MadWorld/Directory.Packages.props @@ -36,6 +36,8 @@ + + diff --git a/MadWorld/MadWorld.Architecture.Tests/DependencyTests.cs b/MadWorld/MadWorld.Architecture.Tests/DependencyTests.cs new file mode 100644 index 0000000..7bfcf8d --- /dev/null +++ b/MadWorld/MadWorld.Architecture.Tests/DependencyTests.cs @@ -0,0 +1,61 @@ +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Fluent; +using ArchUnitNET.Loader; +using ArchUnitNET.xUnit; +using MadWorld.Backend.API.Anonymous; +using MadWorld.Backend.API.Authorized; +using MadWorld.Backend.API.Shared; +using MadWorld.Backend.Application; +using MadWorld.Backend.Domain; +using MadWorld.Backend.Infrastructure; + +//add a using directive to ArchUnitNET.Fluent.ArchRuleDefinition to easily define ArchRules +using static ArchUnitNET.Fluent.ArchRuleDefinition; + +namespace MadWorld.Architecture.Tests; + +public class DependencyTests +{ + private static readonly ArchUnitNET.Domain.Architecture Architecture = new ArchLoader().LoadAssemblies( + typeof(DomainMarker).Assembly, + typeof(AnonymousMarker).Assembly, + typeof(AuthorizedMarker).Assembly, + typeof(SharedMarker).Assembly, + typeof(ApplicationMarker).Assembly, + typeof(InfrastructureMarker).Assembly) + .Build(); + + private static readonly string DomainNamespace = typeof(DomainMarker).Namespace!; + private static readonly string AnonymousNamespace = typeof(AnonymousMarker).Namespace!; + private static readonly string AuthorizedNamespace = typeof(AuthorizedMarker).Namespace!; + private static readonly string SharedNamespace = typeof(SharedMarker).Namespace!; + private static readonly string ApplicationNamespace = typeof(ApplicationMarker).Namespace!; + private static readonly string InfrastructureNamespace = typeof(InfrastructureMarker).Namespace!; + + [Fact] + public void ApplicationDependsNotOnInfrastructure() + { + var rule = Types().That().ResideInNamespace($"{ApplicationNamespace}.*", true) + .Should().NotDependOnAny($"{InfrastructureNamespace}.*", true); + + rule.Check(Architecture); + } + + [Fact] + public void DomainDependsNotOnBackendProject() + { + var backendProjects = new List() + { + $"{AnonymousNamespace}.*", + $"{AuthorizedNamespace}.*", + $"{SharedNamespace}.*", + $"{ApplicationNamespace}.*", + $"{InfrastructureNamespace}.*", + }; + + var rule = Types().That().ResideInNamespace($"{DomainNamespace}.*", true) + .Should().NotDependOnAny(backendProjects, true); + + rule.Check(Architecture); + } +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Architecture.Tests/MadWorld.Architecture.Tests.csproj b/MadWorld/MadWorld.Architecture.Tests/MadWorld.Architecture.Tests.csproj new file mode 100644 index 0000000..bdbbbe9 --- /dev/null +++ b/MadWorld/MadWorld.Architecture.Tests/MadWorld.Architecture.Tests.csproj @@ -0,0 +1,34 @@ + + + + net7.0 + enable + enable + + false + true + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + diff --git a/MadWorld/MadWorld.Architecture.Tests/Usings.cs b/MadWorld/MadWorld.Architecture.Tests/Usings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/MadWorld/MadWorld.Architecture.Tests/Usings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/MadWorld/MadWorld.Backend.API.Anonymous/AnonymousMarker.cs b/MadWorld/MadWorld.Backend.API.Anonymous/AnonymousMarker.cs new file mode 100644 index 0000000..88d6015 --- /dev/null +++ b/MadWorld/MadWorld.Backend.API.Anonymous/AnonymousMarker.cs @@ -0,0 +1,6 @@ +namespace MadWorld.Backend.API.Anonymous; + +public interface AnonymousMarker +{ + +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Backend.API.Authorized/AuthorizedMarker.cs b/MadWorld/MadWorld.Backend.API.Authorized/AuthorizedMarker.cs new file mode 100644 index 0000000..efff188 --- /dev/null +++ b/MadWorld/MadWorld.Backend.API.Authorized/AuthorizedMarker.cs @@ -0,0 +1,6 @@ +namespace MadWorld.Backend.API.Authorized; + +public interface AuthorizedMarker +{ + +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Backend.API.Shared/SharedMarker.cs b/MadWorld/MadWorld.Backend.API.Shared/SharedMarker.cs new file mode 100644 index 0000000..8df1ebc --- /dev/null +++ b/MadWorld/MadWorld.Backend.API.Shared/SharedMarker.cs @@ -0,0 +1,6 @@ +namespace MadWorld.Backend.API.Shared; + +public interface SharedMarker +{ + +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Backend.Application/ApplicationMarker.cs b/MadWorld/MadWorld.Backend.Application/ApplicationMarker.cs new file mode 100644 index 0000000..fc8760a --- /dev/null +++ b/MadWorld/MadWorld.Backend.Application/ApplicationMarker.cs @@ -0,0 +1,6 @@ +namespace MadWorld.Backend.Application; + +public interface ApplicationMarker +{ + +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Backend.Domain/DomainMarker.cs b/MadWorld/MadWorld.Backend.Domain/DomainMarker.cs new file mode 100644 index 0000000..7d8e112 --- /dev/null +++ b/MadWorld/MadWorld.Backend.Domain/DomainMarker.cs @@ -0,0 +1,6 @@ +namespace MadWorld.Backend.Domain; + +public interface DomainMarker +{ + +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Backend.Infrastructure/InfrastructureMarker.cs b/MadWorld/MadWorld.Backend.Infrastructure/InfrastructureMarker.cs new file mode 100644 index 0000000..1f6cf80 --- /dev/null +++ b/MadWorld/MadWorld.Backend.Infrastructure/InfrastructureMarker.cs @@ -0,0 +1,6 @@ +namespace MadWorld.Backend.Infrastructure; + +public interface InfrastructureMarker +{ + +} \ No newline at end of file diff --git a/MadWorld/MadWorld.sln b/MadWorld/MadWorld.sln index e18fe5e..06943a3 100644 --- a/MadWorld/MadWorld.sln +++ b/MadWorld/MadWorld.sln @@ -124,6 +124,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MadWorld.Frontend.UI.Admin. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MadWorld.Backend.Domain.Unittests", "MadWorld.Backend.Domain.Unittests\MadWorld.Backend.Domain.Unittests.csproj", "{F28F0DEE-738E-499B-8234-6034C891B155}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ArchitectureTest", "ArchitectureTest", "{67EF329C-BD74-4980-854A-624B3CC41864}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MadWorld.Architecture.Tests", "MadWorld.Architecture.Tests\MadWorld.Architecture.Tests.csproj", "{9F93E72F-BB54-4779-8C70-805704302C46}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -161,6 +165,8 @@ Global {C3BA6B58-C4C3-411C-95A2-A66B1EA682AF} = {8BBC9D54-C485-4FD7-99C4-0747D2837C71} {00E588A9-3052-4DB5-8742-D673D397760C} = {C3BA6B58-C4C3-411C-95A2-A66B1EA682AF} {F28F0DEE-738E-499B-8234-6034C891B155} = {DF837823-254A-44E6-9F46-133C31114CE5} + {67EF329C-BD74-4980-854A-624B3CC41864} = {5470C4F1-9CEA-4F86-8041-64C444941FDA} + {9F93E72F-BB54-4779-8C70-805704302C46} = {67EF329C-BD74-4980-854A-624B3CC41864} EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {ED8A1D3F-49F6-43AF-A8F7-AADAC4D7E84C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -247,5 +253,9 @@ Global {F28F0DEE-738E-499B-8234-6034C891B155}.Debug|Any CPU.Build.0 = Debug|Any CPU {F28F0DEE-738E-499B-8234-6034C891B155}.Release|Any CPU.ActiveCfg = Release|Any CPU {F28F0DEE-738E-499B-8234-6034C891B155}.Release|Any CPU.Build.0 = Release|Any CPU + {9F93E72F-BB54-4779-8C70-805704302C46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F93E72F-BB54-4779-8C70-805704302C46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F93E72F-BB54-4779-8C70-805704302C46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F93E72F-BB54-4779-8C70-805704302C46}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal