package sola.documentation; import io.quarkus.test.junit.*; import org.junit.jupiter.api.*; import java.nio.file.*; import java.util.Map; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; import static sola.documentation.Requirement.Rn.*; @QuarkusTest @TestProfile(DocumentationTest.Config.class) class DocumentationTest { public static class Config implements QuarkusTestProfile { public Map getConfigOverrides() { return Map.of("sola.documentation.root", "target/documentation-fixture", "sola.sqlite.file", "target/documentation-test.db"); } } @BeforeAll static void publishFixture() throws Exception { var root = Path.of("target/documentation-fixture"); Files.createDirectories(root); Files.writeString(root.resolve("index.html"), "

Scriptor

"); Files.writeString(root.resolve("contracts.md"), "# Synthetic contracts"); Files.writeString(root.resolve("manifest.json"), "{\"name\":\"Scriptor\",\"formalProof\":false}"); Files.writeString(root.resolve("unpublished.env"), "synthetic fixture"); Files.deleteIfExists(root.resolve("escape.md")); Files.createSymbolicLink(root.resolve("escape.md"), Path.of("pom.xml").toAbsolutePath()); } @Test @Requirement(R1_1) void publicHomepage() { given().get("/").then().statusCode(200).contentType("text/html").body(containsString("Scriptor")); } @Test @Requirement(R1_2) void publicArtifact() { given().get("/docs/contracts.md").then().statusCode(200).contentType("text/plain").body(containsString("Synthetic contracts")); } @Test @Requirement(R2_1) void refusesUnpublishedAndEscapes() { for (String path : new String[]{"missing.md", "unpublished.env", "escape.md", "..%2F..%2Fpom.xml", "%2Fetc%2Fpasswd"}) given().urlEncodingEnabled(false).get("/docs/" + path).then().statusCode(404); } @Test @Requirement(R3_1) void publicEvidence() { given().get("/api/docs/manifest").then().statusCode(200).body("name", equalTo("Scriptor")).body("formalProof", equalTo(false)); } }