@@ -10,6 +10,7 @@ import (
1010
1111 "github.com/dagucloud/dagu/api/v1"
1212 "github.com/dagucloud/dagu/internal/cmn/config"
13+ "github.com/dagucloud/dagu/internal/license"
1314 "github.com/dagucloud/dagu/internal/service/frontend"
1415 "github.com/dagucloud/dagu/internal/test"
1516 "github.com/stretchr/testify/assert"
@@ -50,6 +51,36 @@ func setupBuiltinAuthServer(t *testing.T) test.Server {
5051 return server
5152}
5253
54+ func setupBuiltinAuthCommunityServer (t * testing.T ) test.Server {
55+ t .Helper ()
56+ return setupBuiltinAuthTestServer (t )
57+ }
58+
59+ func setupBuiltinAuthExpiredLicenseServer (t * testing.T ) test.Server {
60+ t .Helper ()
61+ return setupBuiltinAuthTestServer (t , frontend .WithLicenseManager (license .NewExpiredTestManager ()))
62+ }
63+
64+ func setupBuiltinAuthTestServer (t * testing.T , opts ... frontend.ServerOption ) test.Server {
65+ t .Helper ()
66+ server := test .SetupServer (t ,
67+ test .WithConfigMutator (func (cfg * config.Config ) {
68+ cfg .Server .Auth .Mode = config .AuthModeBuiltin
69+ cfg .Server .Auth .Builtin .Token .Secret = "jwt-secret-key"
70+ cfg .Server .Auth .Builtin .Token .TTL = 24 * time .Hour
71+ }),
72+ test .WithServerOptions (opts ... ),
73+ )
74+
75+ // Create admin via setup endpoint
76+ server .Client ().Post ("/api/v1/auth/setup" , api.SetupRequest {
77+ Username : "admin" ,
78+ Password : "adminpass" ,
79+ }).ExpectStatus (http .StatusOK ).Send (t )
80+
81+ return server
82+ }
83+
5384// TestAPIKeys_ListEmpty tests listing API keys when none exist
5485func TestAPIKeys_ListEmpty (t * testing.T ) {
5586 t .Parallel ()
@@ -218,6 +249,68 @@ func TestAPIKeys_CreateDuplicate(t *testing.T) {
218249 }).WithBearerToken (token ).ExpectStatus (http .StatusConflict ).Send (t )
219250}
220251
252+ func TestAPIKeys_CreateCommunityLimit (t * testing.T ) {
253+ t .Parallel ()
254+ server := setupBuiltinAuthCommunityServer (t )
255+ token := getAdminToken (t , server )
256+
257+ for _ , name := range []string {"community-key-1" , "community-key-2" } {
258+ server .Client ().Post ("/api/v1/api-keys" , api.CreateAPIKeyRequest {
259+ Name : name ,
260+ Role : api .UserRoleViewer ,
261+ }).WithBearerToken (token ).ExpectStatus (http .StatusCreated ).Send (t )
262+ }
263+
264+ resp := server .Client ().Post ("/api/v1/api-keys" , api.CreateAPIKeyRequest {
265+ Name : "community-key-3" ,
266+ Role : api .UserRoleViewer ,
267+ }).WithBearerToken (token ).ExpectStatus (http .StatusForbidden ).Send (t )
268+
269+ var errResp api.Error
270+ resp .Unmarshal (t , & errResp )
271+ assert .Equal (t , api .ErrorCodeForbidden , errResp .Code )
272+ assert .Contains (t , errResp .Message , "Community edition supports up to 2 API keys" )
273+
274+ listResp := server .Client ().Get ("/api/v1/api-keys" ).
275+ WithBearerToken (token ).
276+ ExpectStatus (http .StatusOK ).Send (t )
277+
278+ var listResult api.APIKeysListResponse
279+ listResp .Unmarshal (t , & listResult )
280+ assert .Len (t , listResult .ApiKeys , 2 )
281+ }
282+
283+ func TestAPIKeys_CreateExpiredLicenseUsesCommunityLimit (t * testing.T ) {
284+ t .Parallel ()
285+ server := setupBuiltinAuthExpiredLicenseServer (t )
286+ token := getAdminToken (t , server )
287+
288+ for _ , name := range []string {"expired-key-1" , "expired-key-2" } {
289+ server .Client ().Post ("/api/v1/api-keys" , api.CreateAPIKeyRequest {
290+ Name : name ,
291+ Role : api .UserRoleViewer ,
292+ }).WithBearerToken (token ).ExpectStatus (http .StatusCreated ).Send (t )
293+ }
294+
295+ server .Client ().Post ("/api/v1/api-keys" , api.CreateAPIKeyRequest {
296+ Name : "expired-key-3" ,
297+ Role : api .UserRoleViewer ,
298+ }).WithBearerToken (token ).ExpectStatus (http .StatusForbidden ).Send (t )
299+ }
300+
301+ func TestAPIKeys_CreateLicensedAllowsMoreThanCommunityLimit (t * testing.T ) {
302+ t .Parallel ()
303+ server := setupBuiltinAuthServer (t )
304+ token := getAdminToken (t , server )
305+
306+ for _ , name := range []string {"licensed-key-1" , "licensed-key-2" , "licensed-key-3" } {
307+ server .Client ().Post ("/api/v1/api-keys" , api.CreateAPIKeyRequest {
308+ Name : name ,
309+ Role : api .UserRoleViewer ,
310+ }).WithBearerToken (token ).ExpectStatus (http .StatusCreated ).Send (t )
311+ }
312+ }
313+
221314// TestAPIKeys_GetNotFound tests getting a non-existent API key
222315func TestAPIKeys_GetNotFound (t * testing.T ) {
223316 t .Parallel ()
0 commit comments