actix-web-admin 0.1.1

A powerful admin panel library for Actix-web 4 applications
Documentation
use actix_web_admin::{AdminRegistry, AdminResource};
use actix_web_admin::types::*;
use async_trait::async_trait;
use std::collections::HashMap;

struct MockResource {
    slug: String,
}

#[async_trait]
impl AdminResource for MockResource {
    fn name(&self) -> &str { "Mock" }
    fn plural_name(&self) -> &str { "Mocks" }
    fn slug(&self) -> &str { &self.slug }
    fn list_columns(&self) -> Vec<Column> { vec![] }
    fn form_fields(&self) -> Vec<FormField> { vec![] }
    async fn list(&self, _: ListQuery) -> Result<ListResult, AdminError> {
        Ok(ListResult { rows: vec![], total: 0, page: 1, per_page: 10 })
    }
    async fn get(&self, _: &str) -> Result<serde_json::Value, AdminError> {
        Ok(serde_json::json!({}))
    }
    async fn create(&self, _: HashMap<String, serde_json::Value>) -> Result<serde_json::Value, AdminError> {
        Ok(serde_json::json!({}))
    }
    async fn update(&self, _: &str, _: HashMap<String, serde_json::Value>) -> Result<serde_json::Value, AdminError> {
        Ok(serde_json::json!({}))
    }
    async fn delete(&self, _: &str) -> Result<(), AdminError> {
        Ok(())
    }
}

#[test]
fn test_register_and_get() {
    let mut registry = AdminRegistry::new();
    registry.register(MockResource { slug: "mock".to_string() });
    assert!(registry.get("mock").is_some());
    assert!(registry.get("nonexistent").is_none());
}

#[test]
fn test_insertion_order() {
    let mut registry = AdminRegistry::new();
    registry.register(MockResource { slug: "a".to_string() });
    registry.register(MockResource { slug: "b".to_string() });
    registry.register(MockResource { slug: "c".to_string() });
    
    let all = registry.all();
    assert_eq!(all[0].slug(), "a");
    assert_eq!(all[1].slug(), "b");
    assert_eq!(all[2].slug(), "c");
}

#[test]
#[should_panic(expected = "already registered")]
fn test_duplicate_slug_panics() {
    let mut registry = AdminRegistry::new();
    registry.register(MockResource { slug: "mock".to_string() });
    registry.register(MockResource { slug: "mock".to_string() });
}