Files

83 lines
2.8 KiB
C#
Raw Permalink Normal View History

2026-06-09 06:41:28 +03:30
using Xunit;
namespace TeamUp.ArchitectureTests;
/// <summary>
/// Encodes the non-negotiable "no cross-module table access" discipline as build-time rules.
/// The <c>internal</c>-per-assembly design is the hard wall (another module's entities/DbContext
/// aren't even visible); these reference checks guard the gate the compiler can't: a module
/// adding a project reference to another module, or to shared Infrastructure/Bootstrap/hosts.
/// </summary>
public sealed class ModuleBoundaryTests
{
[Fact]
public void Modules_do_not_reference_each_other()
{
foreach (var module in ArchitectureFixture.ModuleAssemblies)
{
var references = module.ReferencedAssemblyNames();
foreach (var other in ArchitectureFixture.ModuleAssemblies)
{
if (ReferenceEquals(module, other))
{
continue;
}
var otherName = other.GetName().Name!;
Assert.False(
references.Contains(otherName),
$"{module.GetName().Name} must not reference module {otherName} — collaborate via abstractions in DI.");
}
}
}
[Fact]
public void Modules_do_not_reference_infrastructure_bootstrap_or_hosts()
{
string[] forbidden = ["TeamUp.Infrastructure", "TeamUp.Bootstrap", "TeamUp.Web", "TeamUp.Worker"];
foreach (var module in ArchitectureFixture.ModuleAssemblies)
{
var references = module.ReferencedAssemblyNames();
foreach (var name in forbidden)
{
Assert.False(
references.Contains(name),
$"{module.GetName().Name} must not reference {name} — only SharedKernel is allowed.");
}
}
}
[Fact]
public void Every_module_references_sharedkernel()
{
// Sanity: each module genuinely sits on the kernel (uses IModule / ModulePing).
foreach (var module in ArchitectureFixture.ModuleAssemblies)
{
Assert.Contains("TeamUp.SharedKernel", module.ReferencedAssemblyNames());
}
}
[Fact]
public void SharedKernel_references_no_teamup_projects()
{
var teamUpReferences = ArchitectureFixture.SharedKernel.ReferencedAssemblyNames()
.Where(name => name.StartsWith("TeamUp.", StringComparison.Ordinal));
Assert.Empty(teamUpReferences);
}
[Fact]
public void Infrastructure_references_only_sharedkernel_among_teamup_projects()
{
var teamUpReferences = ArchitectureFixture.Infrastructure.ReferencedAssemblyNames()
.Where(name => name.StartsWith("TeamUp.", StringComparison.Ordinal))
.OrderBy(name => name, StringComparer.Ordinal)
.ToArray();
Assert.Equal(["TeamUp.SharedKernel"], teamUpReferences);
}
}