package p.studio.architecture; import org.junit.jupiter.api.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; class CommonBackendPbsPrefixScanTest { private static final String COMPILER_SOURCE_ROOT = "prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler"; private static final List GUARDED_RELATIVE_ROOTS = List.of( "backend", "lifecycle", "workspaces/stages"); private static final String FORBIDDEN_PBS_PREFIX = "__pbs."; @Test void commonLifecycleAndBackendMustNotDiscoverRolesFromPbsNamePrefixes() throws IOException { final var violations = new ArrayList(); final var repoRoot = locateRepoRoot(); final var compilerRoot = repoRoot.resolve(COMPILER_SOURCE_ROOT); for (final var relativeRoot : GUARDED_RELATIVE_ROOTS) { final var root = compilerRoot.resolve(relativeRoot); if (!Files.exists(root)) { fail("guarded source root is missing: " + root); } try (final var paths = Files.walk(root)) { paths.filter(path -> path.toString().endsWith(".java")).forEach(path -> { try { if (Files.readString(path).contains(FORBIDDEN_PBS_PREFIX)) { violations.add(repoRoot.relativize(path).toString()); } } catch (IOException e) { throw new IllegalStateException("failed to read source file: " + path, e); } }); } } assertTrue( violations.isEmpty(), "common lifecycle/backend code must not inspect __pbs. prefixes: " + violations); } private static Path locateRepoRoot() { var cursor = Path.of(System.getProperty("user.dir")).toAbsolutePath().normalize(); while (cursor != null) { final var hasDocs = Files.isDirectory(cursor.resolve("docs/specs/compiler")); final var hasCompiler = Files.isDirectory(cursor.resolve("prometeu-compiler")); if (hasDocs && hasCompiler) { return cursor; } cursor = cursor.getParent(); } fail("could not locate repository root from working directory"); throw new IllegalStateException("unreachable"); } }