use goose::prelude::*;
use serde::Deserialize;
use std::time::Duration;
struct Session {
jwt_token: String,
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct AuthenticationResponse {
jwt_token: String,
}
#[tokio::main]
async fn main() -> Result<(), GooseError> {
GooseAttack::initialize()?
.register_taskset(
taskset!("WebsiteUser")
.set_wait_time(Duration::from_secs(5), Duration::from_secs(15))?
.register_task(task!(website_signup).set_on_start())
.register_task(task!(authenticated_index)),
)
.execute()
.await?
.print();
Ok(())
}
async fn website_signup(user: &mut GooseUser) -> GooseTaskResult {
let params = [("username", "test_user"), ("password", "")];
let response = user
.post_form("/signup", ¶ms)
.await?
.response?
.json::<AuthenticationResponse>()
.await?;
user.set_session_data(Session {
jwt_token: response.jwt_token,
});
Ok(())
}
async fn authenticated_index(user: &mut GooseUser) -> GooseTaskResult {
let session = user.get_session_data_unchecked::<Session>();
let reqwest_request_builder = user
.get_request_builder(&GooseMethod::Get, "/")?
.bearer_auth(&session.jwt_token);
let goose_request = GooseRequest::builder()
.set_request_builder(reqwest_request_builder)
.build();
user.request(goose_request).await?;
Ok(())
}