using Xunit; namespace TeamUp.ArchitectureTests; /// /// Encodes the non-negotiable "no cross-module table access" discipline as build-time rules. /// The internal-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. /// 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); } }