use toasty::stmt::List;
use topcoat::context::Cx;
use super::*;
use crate::{Resource, ResourceDef, lens, test_support::User};
struct UserResource;
impl Resource for UserResource {
type Model = User;
type Form = crate::NoForm<Self::Model>;
fn declare() -> ResourceDef<Self> {
ResourceDef::new().table(crate::table::Table::new(crate::TextColumn::new(lens!(
User.name
))))
}
fn query(_cx: &Cx) -> toasty::stmt::Query<List<User>> {
toasty::stmt::Query::<List<User>>::all().filter(User::fields().name().eq("Ada"))
}
}
#[test]
fn derived_targets_resolve_against_the_owning_panel() {
let derived = NavigationItem {
label: "Users".into(),
..NavigationItem::default()
};
let resolved = derived.clone().resolved("/backoffice/users");
assert_eq!(resolved.url(), Some("/backoffice/users"));
assert_eq!(resolved.label, "Users");
assert_eq!(
NavigationItem {
order: -1,
..derived.clone()
}
.resolved("/backoffice/users")
.order,
-1
);
assert_eq!(
resolved.clone().resolved("/elsewhere/users").url(),
Some("/backoffice/users")
);
for url in [
"/admin/users",
"/admin/posts?f.status=draft",
"/backoffice/users/drafts",
"/reports/users",
] {
let spelled_out = NavigationItem::at("Users", url);
assert_eq!(
spelled_out.resolved("/backoffice/users").url(),
Some(url),
"explicit URL must survive resolution"
);
}
}
#[test]
fn slugs_follow_the_filament_convention() {
let mounted = crate::resource::Mounted::new(UserResource::declare(), "/admin");
assert_eq!(mounted.slug, "users");
assert_eq!(mounted.plural_label, "Users");
}
#[test]
fn navigation_item_is_current_path() {
let users = NavigationItem::at("Users", "/admin/users");
let showcase = NavigationItem::at("Showcase", "/admin/showcase");
assert!(users.is_current_path("/admin/users"));
assert!(showcase.is_current_path("/admin/showcase"));
assert!(users.is_current_path("/admin/users/-/create"));
assert!(showcase.is_current_path("/admin/showcase/table"));
assert!(!users.is_current_path("/admin/userships"));
assert!(!showcase.is_current_path("/admin/showcases"));
assert!(!showcase.is_current_path("/admin/showcase-table"));
assert!(!users.is_current_path("/other"));
assert!(!showcase.is_current_path("/admin/users"));
let posts = NavigationItem::at("Posts", "/admin/posts?f.status=draft");
assert!(posts.is_current_path("/admin/posts"));
assert!(posts.is_current_path("/admin/posts/-/create"));
assert!(!posts.is_current_path("/admin/postscripts"));
let section = NavigationItem::at("Section", "/admin/posts#top");
assert!(section.is_current_path("/admin/posts"));
let query_only = NavigationItem::at("Query", "?f.status=draft");
assert!(!query_only.is_current_path("/admin/posts"));
}
#[test]
fn current_index_prefers_the_entry_the_request_holds() {
let items = [
NavigationItem::at("Drafts", "/admin/users?f.status=draft"),
NavigationItem::at("Users", "/admin/users"),
NavigationItem::at("Dashboard", "/admin"),
NavigationItem::at("Both", "/admin/users?f.status=draft&sort=name"),
];
assert_eq!(
current_index(&items, "/admin/users", ""),
Some(1),
"the plain entry, not the one its query names"
);
assert_eq!(
current_index(&items, "/admin/users", "f.status=review"),
Some(1)
);
assert_eq!(
current_index(&items, "/admin/users", "f.status=draft"),
Some(0)
);
assert_eq!(
current_index(&items, "/admin/users", "sort=name&f.status=draft"),
Some(3),
"the entry naming more of the request's query"
);
assert_eq!(current_index(&items, "/admin/media", ""), Some(2));
assert_eq!(current_index(&items, "/elsewhere", ""), None);
}