Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.prism.byescaleira.com/llms.txt

Use this file to discover all available pages before exploring further.

Request Builder

PrismRequestBuilder provides a chainable API for constructing test requests. Instead of manually creating PrismHTTPRequest instances with method, path, headers, and body, chain methods together for readable test code.

Basic Usage

Building Requests
let request = PrismRequestBuilder
    .get("/users")
    .header("Accept", "application/json")
    .build()

let response = try await client.send(request)

HTTP Methods

Method Factories
PrismRequestBuilder.get("/users")
PrismRequestBuilder.post("/users")
PrismRequestBuilder.put("/users/1")
PrismRequestBuilder.patch("/users/1")
PrismRequestBuilder.delete("/users/1")

Adding Headers

Chain Headers
let request = PrismRequestBuilder
    .get("/protected")
    .header("Authorization", "Bearer token-123")
    .header("Accept", "application/json")
    .header("X-Custom", "value")
    .build()

Setting the Body

Raw Data

Raw Body
let csvData = Data("name,email\nAlice,alice@test.com\n".utf8)

let request = PrismRequestBuilder
    .post("/import")
    .header("Content-Type", "text/csv")
    .body(csvData)
    .build()

JSON Body

JSON Body
struct CreateTodo: Encodable {
    let title: String
    let completed: Bool
}

let request = PrismRequestBuilder
    .post("/todos")
    .jsonBody(CreateTodo(title: "Write tests", completed: false))
    .build()

// Automatically sets:
// Content-Type: application/json
// Content-Length: <calculated>

Complete Examples

Test with Request Builder
@Suite("Todo API")
struct TodoTests {
    let client: PrismTestClient

    @Test func createTodo() async throws {
        let request = PrismRequestBuilder
            .post("/todos")
            .jsonBody(CreateTodo(title: "Test", completed: false))
            .header("Authorization", "Bearer test-token")
            .build()

        let response = try await client.send(request)
        #expect(response.status == .created)
    }

    @Test func searchTodos() async throws {
        let request = PrismRequestBuilder
            .get("/todos?q=test&completed=false")
            .header("Accept", "application/json")
            .build()

        let response = try await client.send(request)
        #expect(response.status == .ok)
    }

    @Test func updateTodo() async throws {
        let request = PrismRequestBuilder
            .patch("/todos/1")
            .jsonBody(["completed": true])
            .build()

        let response = try await client.send(request)
        #expect(response.status == .ok)
    }
}

Why Use Request Builder?

Compare the manual approach vs the builder:
Without Builder
var headers = PrismHTTPHeaders()
headers.set(name: "Content-Type", value: "application/json")
headers.set(name: "Authorization", value: "Bearer token")
let body = try JSONEncoder().encode(input)
headers.set(name: "Content-Length", value: "\(body.count)")
let request = PrismHTTPRequest(method: .POST, uri: "/users", headers: headers, body: body)
With Builder
let request = PrismRequestBuilder
    .post("/users")
    .jsonBody(input)
    .header("Authorization", "Bearer token")
    .build()
PrismRequestBuilder is immutable — each chained method returns a new copy. You can create a base builder and branch from it for variations:
let base = PrismRequestBuilder.get("/api").header("Authorization", "Bearer token")
let r1 = base.header("Accept", "application/json").build()
let r2 = base.header("Accept", "text/csv").build()