Study
Rocket

Testing dengan Client Lokal

Penjelasan

Rocket menyediakan `rocket::local::blocking::Client` (untuk test sinkron) dan versi `asynchronous::Client` (untuk test async) yang memungkinkan kamu menguji route TANPA membuka port jaringan sungguhan — mirip tujuan `tower::ServiceExt::oneshot` di Axum, meskipun API-nya berbeda. Alurnya: buat instance Rocket lewat fungsi yang sama dipakai `#[launch]` (biasanya dipisah jadi fungsi `fn rocket() -> Rocket<Build>` yang bisa dipanggil ulang), lalu bungkus dengan `Client::tracked(rocket_instance).expect(...)`. Dari client ini kamu bisa memanggil `.get(path)`, `.post(path).body(...)`, dan seterusnya, lalu memanggil `.dispatch()` untuk mendapatkan response yang bisa diperiksa status dan body-nya. Versi `blocking::Client` cocok untuk kebanyakan test karena API-nya sinkron (tidak perlu `.await` di setiap baris), meskipun Rocket sendiri berjalan di atas runtime async di baliknya — Rocket menangani jembatan blocking-ke-async ini secara otomatis khusus untuk keperluan testing.

Contoh Konsep

#[macro_use] extern crate rocket;

#[get("/")]
fn hello() -> &'static str {
    "Hello, Rocket!"
}

fn build_rocket() -> rocket::Rocket<rocket::Build> {
    rocket::build().mount("/", routes![hello])
}

#[launch]
fn rocket() -> _ {
    build_rocket()
}

#[cfg(test)]
mod tests {
    use super::*;
    use rocket::local::blocking::Client;
    use rocket::http::Status;

    #[test]
    fn hello_mengembalikan_200() {
        let client = Client::tracked(build_rocket()).expect("client valid");
        let response = client.get("/").dispatch();
        assert_eq!(response.status(), Status::Ok);
        assert_eq!(response.into_string().unwrap(), "Hello, Rocket!");
    }
}

Praktikum

Lengkapi test di bawah supaya memverifikasi path "/notfound" (yang tidak didaftarkan) mengembalikan status 404.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

`Client::tracked(...)` (dibanding `Client::untracked(...)`) menyimpan cookie antar request dalam client yang sama — berguna kalau kamu menguji alur yang butuh session/cookie, misalnya login lalu mengakses endpoint yang butuh autentikasi, dalam rangkaian test yang sama.