mirror of
https://github.com/pfzetto/axum-oidc.git
synced 2024-11-22 19:42:50 +01:00
Paul Zinselmeyer
e62aba722c
Adds automated CI integration tests to the basic example. The integration tests launch and configure a keycloak server, launch the example and test its functionality with a headless browser.
101 lines
2.9 KiB
Rust
101 lines
2.9 KiB
Rust
mod keycloak;
|
|
|
|
use headless_chrome::Browser;
|
|
use log::info;
|
|
use testcontainers::*;
|
|
|
|
use crate::keycloak::{Client, Keycloak, Realm, User};
|
|
|
|
#[tokio::test(flavor = "multi_thread")]
|
|
async fn first() {
|
|
env_logger::init();
|
|
|
|
let docker = clients::Cli::default();
|
|
|
|
let alice = User {
|
|
username: "alice".to_string(),
|
|
email: "alice@example.com".to_string(),
|
|
firstname: "alice".to_string(),
|
|
lastname: "doe".to_string(),
|
|
password: "alice".to_string(),
|
|
};
|
|
|
|
let basic_client = Client {
|
|
client_id: "axum-oidc-example-basic".to_string(),
|
|
client_secret: Some("123456".to_string()),
|
|
};
|
|
|
|
let keycloak = Keycloak::start(
|
|
vec![Realm {
|
|
name: "test".to_string(),
|
|
users: vec![alice.clone()],
|
|
clients: vec![basic_client.clone()],
|
|
}],
|
|
&docker,
|
|
)
|
|
.await;
|
|
|
|
info!("starting basic example app");
|
|
|
|
let app_url = "http://127.0.0.1:8080/";
|
|
let app_handle = tokio::spawn(basic::run(
|
|
app_url.to_string(),
|
|
format!("{}/realms/test", keycloak.url()),
|
|
basic_client.client_id.to_string(),
|
|
basic_client.client_secret.clone(),
|
|
));
|
|
|
|
info!("starting browser");
|
|
|
|
let browser = Browser::default().unwrap();
|
|
let tab = browser.new_tab().unwrap();
|
|
|
|
tab.navigate_to(&format!("{}bar", app_url)).unwrap();
|
|
let body = tab
|
|
.wait_for_xpath(r#"/html/body/pre"#)
|
|
.unwrap()
|
|
.get_inner_text()
|
|
.unwrap();
|
|
assert_eq!(body, "Hello anon!");
|
|
|
|
tab.navigate_to(&format!("{}foo", app_url)).unwrap();
|
|
let username = tab.wait_for_xpath(r#"//*[@id="username"]"#).unwrap();
|
|
username.type_into(&alice.username).unwrap();
|
|
let password = tab.wait_for_xpath(r#"//*[@id="password"]"#).unwrap();
|
|
password.type_into(&alice.password).unwrap();
|
|
let submit = tab.wait_for_xpath(r#"//*[@id="kc-login"]"#).unwrap();
|
|
submit.click().unwrap();
|
|
|
|
let body = tab
|
|
.wait_for_xpath(r#"/html/body/pre"#)
|
|
.unwrap()
|
|
.get_inner_text()
|
|
.unwrap();
|
|
assert!(body.starts_with("Hello ") && body.contains('-'));
|
|
|
|
tab.navigate_to(&format!("{}bar", app_url)).unwrap();
|
|
let body = tab
|
|
.wait_for_xpath(r#"/html/body/pre"#)
|
|
.unwrap()
|
|
.get_inner_text()
|
|
.unwrap();
|
|
assert!(body.contains("! You are already logged in from another Handler."));
|
|
|
|
tab.navigate_to(&format!("{}logout", app_url)).unwrap();
|
|
tab.wait_until_navigated().unwrap();
|
|
|
|
tab.navigate_to(&format!("{}bar", app_url)).unwrap();
|
|
let body = tab
|
|
.wait_for_xpath(r#"/html/body/pre"#)
|
|
.unwrap()
|
|
.get_inner_text()
|
|
.unwrap();
|
|
assert_eq!(body, "Hello anon!");
|
|
|
|
tab.navigate_to(&format!("{}foo", app_url)).unwrap();
|
|
tab.wait_until_navigated().unwrap();
|
|
tab.find_element_by_xpath(r#"//*[@id="username"]"#).unwrap();
|
|
|
|
tab.close(true).unwrap();
|
|
app_handle.abort();
|
|
}
|