feat: roles router

This commit is contained in:
Maulana Sodiqin
2025-03-25 10:48:34 +07:00
parent 77f12610dd
commit 34eaa418d5
9 changed files with 401 additions and 18 deletions
+80 -13
View File
@@ -18,6 +18,86 @@ async fn test_get_user_list_should_return_200() {
assert_eq!(status, StatusCode::OK);
}
#[tokio::test]
async fn test_list_users_should_fail_with_invalid_per_page() {
let state = create_mock_app_state().await;
let app = axum::Router::new()
.nest("/v1/users", users_router())
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server.get("/v1/users?page=1&per_page=0").await;
assert_eq!(res.status_code(), StatusCode::BAD_REQUEST);
}
#[tokio::test]
async fn test_list_users_should_fail_with_invalid_page() {
let state = create_mock_app_state().await;
let app = axum::Router::new()
.nest("/v1/users", users_router())
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server.get("/v1/users?page=0&per_page=10").await;
assert_eq!(res.status_code(), StatusCode::BAD_REQUEST);
}
#[tokio::test]
async fn test_list_users_should_ignore_invalid_sort_field() {
let state = create_mock_app_state().await;
let app = axum::Router::new()
.nest("/v1/users", users_router())
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server
.get("/v1/users?page=1&per_page=10&sort_by=invalid_field")
.await;
assert_eq!(res.status_code(), StatusCode::OK);
}
#[tokio::test]
async fn test_list_users_with_search_no_match_should_return_empty() {
let state = create_mock_app_state().await;
let app = axum::Router::new()
.nest("/v1/users", users_router())
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server
.get("/v1/users?page=1&per_page=10&search=nonexistinguserxyz")
.await;
let body: serde_json::Value = res.json();
assert_eq!(res.status_code(), StatusCode::OK);
assert_eq!(body["data"].as_array().unwrap().len(), 0);
}
#[tokio::test]
async fn test_list_users_should_return_empty_on_invalid_filter() {
let state = create_mock_app_state().await;
let app = axum::Router::new()
.nest("/v1/users", users_router())
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server
.get("/v1/users?page=1&per_page=10&filter_by=is_active&filter=maybe")
.await;
let body: serde_json::Value = res.json();
assert_eq!(res.status_code(), StatusCode::OK);
assert_eq!(body["data"].as_array().unwrap().len(), 0);
}
#[tokio::test]
async fn test_get_user_list_with_search_should_return_200() {
let state = create_mock_app_state().await;
let app = axum::Router::new()
.nest("/v1/users", users_router())
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server
.get("/v1/users?page=1&per_page=10&search=maulana")
.await;
let status = res.status_code();
dbg!(res.text());
assert_eq!(status, StatusCode::OK);
}
#[tokio::test]
async fn test_create_user_should_return_201() {
let state = create_mock_app_state().await;
@@ -363,19 +443,6 @@ async fn test_list_users_should_fail_with_invalid_pagination() {
);
}
#[tokio::test]
async fn test_list_users_should_ignore_invalid_sort_field() {
let state = create_mock_app_state().await;
let app = axum::Router::new()
.nest("/v1/users", users_router())
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server
.get("/v1/users?page=1&per_page=10&sort_by=nonexistent_field")
.await;
assert_eq!(res.status_code(), StatusCode::OK);
}
#[tokio::test]
async fn test_list_users_should_fallback_on_invalid_order() {
let state = create_mock_app_state().await;
+4 -2
View File
@@ -21,8 +21,10 @@ impl<'a> UsersRepository<'a> {
let db = &self.state.surrealdb_ws;
let table = ResourceEnum::Users.to_string();
let mut conditions = vec!["is_deleted = false".to_string()];
if meta.search.is_some() {
conditions.push("string::contains(name, $search)".into());
if let Some(search) = &meta.search {
if !search.is_empty() {
conditions.push("string::contains(fullname ?? '', $search)".to_string());
}
}
if meta.filter_by.is_some() && meta.filter.is_some() {
let filter_by = meta.filter_by.as_ref().unwrap();