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_scenario(
scenario!("WebsiteUser")
.set_wait_time(Duration::from_secs(5), Duration::from_secs(15))?
.register_transaction(transaction!(website_signup).set_on_start())
.register_transaction(transaction!(authenticated_index)),
)
.execute()
.await?;
Ok(())
}
async fn website_signup(user: &mut GooseUser) -> TransactionResult {
let params = [("username", "test_user"), ("password", "")];
let response = match user.post_form("/signup", ¶ms).await?.response {
Ok(r) => match r.json::<AuthenticationResponse>().await {
Ok(j) => j,
Err(e) => return Err(Box::new(e.into())),
},
Err(e) => return Err(Box::new(e.into())),
};
user.set_session_data(Session {
jwt_token: response.jwt_token,
});
Ok(())
}
async fn authenticated_index(user: &mut GooseUser) -> TransactionResult {
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(())
}