pub trait ForceLoginUser: Send + Sync {
fn session_user_id(&self) -> String;
fn session_is_staff(&self) -> bool {
false
}
fn session_is_superuser(&self) -> bool {
false
}
}
#[cfg(native)]
impl<T: reinhardt_auth::AuthIdentity> ForceLoginUser for T {
fn session_user_id(&self) -> String {
self.id()
}
fn session_is_superuser(&self) -> bool {
self.is_admin()
}
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::*;
struct StubUser {
id: String,
staff: bool,
superuser: bool,
}
impl ForceLoginUser for StubUser {
fn session_user_id(&self) -> String {
self.id.clone()
}
fn session_is_staff(&self) -> bool {
self.staff
}
fn session_is_superuser(&self) -> bool {
self.superuser
}
}
#[rstest]
fn extracts_user_id() {
let user = StubUser {
id: "user-42".into(),
staff: false,
superuser: false,
};
assert_eq!(user.session_user_id(), "user-42");
}
#[rstest]
fn defaults_staff_to_false() {
let user = StubUser {
id: "u1".into(),
staff: false,
superuser: false,
};
assert!(!user.session_is_staff());
}
#[rstest]
fn respects_explicit_staff() {
let user = StubUser {
id: "u1".into(),
staff: true,
superuser: false,
};
assert!(user.session_is_staff());
}
#[rstest]
fn respects_explicit_superuser() {
let user = StubUser {
id: "u1".into(),
staff: false,
superuser: true,
};
assert!(user.session_is_superuser());
}
}