@@ -2,6 +2,120 @@ import { expect, test } from "bun:test";
22import Client from "../../client.node" ;
33import { serve } from "../../test" ;
44
5+ test ( "POST /api/admin/users returns 403 for non-admin user" , async ( ) => {
6+ const { helpers } = await serve ( ) ;
7+ const { client } = await helpers . createUser ( { site_role : "member" } ) ;
8+
9+ await expect (
10+ client . admin . users . create ( {
11+ email : "newuser@example.com" ,
12+ password : "password123" ,
13+ authentication_type : "password" ,
14+ } )
15+ ) . rejects . toThrow ( "Forbidden" ) ;
16+ } ) ;
17+
18+ test ( "POST /api/admin/users returns 401 for unauthenticated request" , async ( ) => {
19+ const { url } = await serve ( ) ;
20+ const unauthClient = new Client ( { baseURL : url . toString ( ) } ) ;
21+
22+ await expect (
23+ unauthClient . admin . users . create ( {
24+ email : "newuser@example.com" ,
25+ password : "password123" ,
26+ authentication_type : "password" ,
27+ } )
28+ ) . rejects . toThrow ( "Unauthorized" ) ;
29+ } ) ;
30+
31+ test ( "POST /api/admin/users successfully creates a user" , async ( ) => {
32+ const { helpers, bindings } = await serve ( ) ;
33+ const { client : adminClient } = await helpers . createUser ( {
34+ site_role : "admin" ,
35+ } ) ;
36+
37+ const result = await adminClient . admin . users . create ( {
38+ email : "newuser@example.com" ,
39+ password : "password123" ,
40+ display_name : "New User" ,
41+ site_role : "member" ,
42+ authentication_type : "password" ,
43+ } ) ;
44+
45+ expect ( result . email ) . toBe ( "newuser@example.com" ) ;
46+ expect ( result . display_name ) . toBe ( "New User" ) ;
47+ expect ( result . site_role ) . toBe ( "member" ) ;
48+ expect ( result . suspended ) . toBe ( false ) ;
49+
50+ // Verify user was created in database
51+ const db = await bindings . database ( ) ;
52+ const user = await db . selectUserByEmail ( result . email ) ;
53+ expect ( user ) . toBeDefined ( ) ;
54+ expect ( user ?. email ) . toBe ( result . email ) ;
55+ expect ( user ?. display_name ) . toBe ( result . display_name ) ;
56+ expect ( user ?. site_role ) . toBe ( result . site_role ) ;
57+ expect ( user ?. email_verified ) . not . toBeNull ( ) ;
58+ expect ( user ?. password ) . toBeDefined ( ) ;
59+ } ) ;
60+
61+ test ( "POST /api/admin/users returns 409 for duplicate email" , async ( ) => {
62+ const { helpers } = await serve ( ) ;
63+ const { client : adminClient } = await helpers . createUser ( {
64+ site_role : "admin" ,
65+ } ) ;
66+ await helpers . createUser ( {
67+ email : "existing@example.com" ,
68+ } ) ;
69+
70+ await expect (
71+ adminClient . admin . users . create ( {
72+ email : "existing@example.com" ,
73+ password : "password123" ,
74+ authentication_type : "password" ,
75+ } )
76+ ) . rejects . toThrow ( "User with this email already exists" ) ;
77+ } ) ;
78+
79+ test ( "POST /api/admin/users validates password minimum length" , async ( ) => {
80+ const { helpers } = await serve ( ) ;
81+ const { client : adminClient } = await helpers . createUser ( {
82+ site_role : "admin" ,
83+ } ) ;
84+
85+ await expect (
86+ adminClient . admin . users . create ( {
87+ email : "newuser@example.com" ,
88+ password : "short" ,
89+ authentication_type : "password" ,
90+ } )
91+ ) . rejects . toThrow ( ) ;
92+ } ) ;
93+
94+ test ( "POST /api/admin/users created user can login" , async ( ) => {
95+ const { helpers, url } = await serve ( ) ;
96+ const { client : adminClient } = await helpers . createUser ( {
97+ site_role : "admin" ,
98+ } ) ;
99+
100+ const email = "logintest@example.com" ;
101+ const password = "password123" ;
102+
103+ await adminClient . admin . users . create ( {
104+ email,
105+ password,
106+ authentication_type : "password" ,
107+ } ) ;
108+
109+ // Test that the created user can sign in
110+ const newClient = new Client ( { baseURL : url . toString ( ) } ) ;
111+ const loginResult = await newClient . auth . signInWithCredentials ( {
112+ email,
113+ password,
114+ } ) ;
115+ expect ( loginResult . ok ) . toBe ( true ) ;
116+ expect ( loginResult . url ) . toBeDefined ( ) ;
117+ } ) ;
118+
5119test ( "GET /api/admin/users returns 403 for non-admin user" , async ( ) => {
6120 const { helpers } = await serve ( ) ;
7121 const { client } = await helpers . createUser ( { site_role : "member" } ) ;
@@ -83,7 +197,7 @@ test("GET /api/admin/users includes suspended field", async () => {
83197 const response = await adminClient . admin . users . list ( ) ;
84198
85199 expect ( response . items . length ) . toBeGreaterThanOrEqual ( 1 ) ;
86- expect ( response . items [ 0 ] . suspended ) . toBe ( false ) ;
200+ expect ( response . items [ 0 ] ? .suspended ) . toBe ( false ) ;
87201} ) ;
88202
89203test ( "PATCH /api/admin/users/:id/suspension returns 403 for non-admin user" , async ( ) => {
0 commit comments