Añade formatos `DateFormat`, `TimeFormat`, `RelativeFormat` y `DatePrecision`, con estilos traducidos vía Fluent (orden día/mes/año, nombre del mes, plurales). La zona horaria efectiva se resuelve por petición, la propia del usuario autenticado si la tiene, si no la configurada para la aplicación (`app.timezone`), o UTC en su defecto- y se expone en `Contextual` junto a format_date(), format_time(), format_datetime(), format_iso_datetime(), format_relative(), format_since() y format_until().
112 lines
3.5 KiB
Rust
112 lines
3.5 KiB
Rust
use pagetop::prelude::*;
|
|
|
|
// **< CurrentUser >********************************************************************************
|
|
|
|
#[pagetop::test]
|
|
async fn anonymous_reports_itself_correctly() {
|
|
let user = CurrentUser::Anonymous;
|
|
assert!(user.is_anonymous());
|
|
assert!(!user.is_authenticated());
|
|
assert_eq!(user.id(), None);
|
|
assert_eq!(user.display_name(), None);
|
|
}
|
|
|
|
#[pagetop::test]
|
|
async fn authenticated_reports_itself_correctly() {
|
|
let madrid: Tz = "Europe/Madrid".parse().unwrap();
|
|
let user = CurrentUser::Authenticated {
|
|
id: 42,
|
|
display_name: "Alice".to_owned(),
|
|
timezone: Some(madrid),
|
|
};
|
|
assert!(!user.is_anonymous());
|
|
assert!(user.is_authenticated());
|
|
assert_eq!(user.id(), Some(42));
|
|
assert_eq!(user.display_name(), Some("Alice"));
|
|
assert_eq!(user.timezone(), madrid);
|
|
}
|
|
|
|
#[pagetop::test]
|
|
async fn authenticated_falls_back_to_default_timezone_when_none() {
|
|
let user = CurrentUser::Authenticated {
|
|
id: 42,
|
|
display_name: "Alice".to_owned(),
|
|
timezone: None,
|
|
};
|
|
assert_eq!(user.timezone(), Timezone::default_tz());
|
|
}
|
|
|
|
// **< Context::current_user() >********************************************************************
|
|
|
|
#[pagetop::test]
|
|
async fn current_user_defaults_to_anonymous() {
|
|
let cx = Context::default();
|
|
assert!(cx.current_user().is_anonymous());
|
|
}
|
|
|
|
#[pagetop::test]
|
|
async fn current_user_propagates_from_request_extensions() {
|
|
let req = web::test::TestRequest::get()
|
|
.with_extension(CurrentUser::Authenticated {
|
|
id: 7,
|
|
display_name: "Bob".to_owned(),
|
|
timezone: None,
|
|
})
|
|
.to_http_request();
|
|
let cx = Context::new(req);
|
|
let user = cx.current_user();
|
|
assert!(user.is_authenticated());
|
|
assert_eq!(user.id(), Some(7));
|
|
assert_eq!(user.display_name(), Some("Bob"));
|
|
}
|
|
|
|
// **< HttpRequest::extension() >*******************************************************************
|
|
|
|
#[pagetop::test]
|
|
async fn request_extension_returns_none_for_unknown_type() {
|
|
let req = web::test::TestRequest::get().to_http_request();
|
|
assert!(req.extension::<CurrentUser>().is_none());
|
|
}
|
|
|
|
#[pagetop::test]
|
|
async fn request_extension_returns_injected_value() {
|
|
let req = web::test::TestRequest::get()
|
|
.with_extension(CurrentUser::Authenticated {
|
|
id: 1,
|
|
display_name: "Carol".to_owned(),
|
|
timezone: None,
|
|
})
|
|
.to_http_request();
|
|
|
|
let user = req
|
|
.extension::<CurrentUser>()
|
|
.expect("extension should exist");
|
|
assert!(user.is_authenticated());
|
|
assert_eq!(user.id(), Some(1));
|
|
assert_eq!(user.display_name(), Some("Carol"));
|
|
}
|
|
|
|
// **< Page::new() >********************************************************************************
|
|
|
|
#[pagetop::test]
|
|
async fn page_new_propagates_current_user_from_request_extensions() {
|
|
let req = web::test::TestRequest::get()
|
|
.with_extension(CurrentUser::Authenticated {
|
|
id: 5,
|
|
display_name: "Dave".to_owned(),
|
|
timezone: None,
|
|
})
|
|
.to_http_request();
|
|
let page = Page::new(req);
|
|
let user = page.current_user();
|
|
assert!(user.is_authenticated());
|
|
assert_eq!(user.id(), Some(5));
|
|
assert_eq!(user.display_name(), Some("Dave"));
|
|
}
|
|
|
|
#[pagetop::test]
|
|
async fn page_new_uses_anonymous_when_no_extension() {
|
|
let req = web::test::TestRequest::get().to_http_request();
|
|
let page = Page::new(req);
|
|
assert!(page.current_user().is_anonymous());
|
|
}
|