@@ -8,37 +8,97 @@ import (
88 "strings"
99 "testing"
1010
11+ auth_model "code.gitea.io/gitea/models/auth"
1112 "code.gitea.io/gitea/models/db"
1213 "code.gitea.io/gitea/models/unittest"
1314 user_model "code.gitea.io/gitea/models/user"
1415
1516 "github.com/stretchr/testify/assert"
17+ "github.com/stretchr/testify/require"
1618)
1719
1820func TestAdminUserCreate (t * testing.T ) {
1921 app := NewMainApp (AppVersion {})
2022
2123 reset := func () {
22- assert .NoError (t , db .TruncateBeans (db .DefaultContext , & user_model.User {}))
23- assert .NoError (t , db .TruncateBeans (db .DefaultContext , & user_model.EmailAddress {}))
24+ require .NoError (t , db .TruncateBeans (db .DefaultContext , & user_model.User {}))
25+ require .NoError (t , db .TruncateBeans (db .DefaultContext , & user_model.EmailAddress {}))
26+ require .NoError (t , db .TruncateBeans (db .DefaultContext , & auth_model.AccessToken {}))
2427 }
28+ t .Run ("MustChangePassword" , func (t * testing.T ) {
29+ type check struct { IsAdmin , MustChangePassword bool }
30+ createCheck := func (name , args string ) check {
31+ assert .
NoError (
t ,
app .
Run (
strings .
Fields (
fmt .
Sprintf (
"./gitea admin user create --username %s --email %[email protected] %s --password foobar" ,
name ,
name ,
args ))))
32+ u := unittest .AssertExistsAndLoadBean (t , & user_model.User {LowerName : name })
33+ return check {u .IsAdmin , u .MustChangePassword }
34+ }
35+ reset ()
36+ assert .Equal (t , check {IsAdmin : false , MustChangePassword : false }, createCheck ("u" , "" ), "first non-admin user doesn't need to change password" )
2537
26- type createCheck struct { IsAdmin , MustChangePassword bool }
27- createUser := func (name , args string ) createCheck {
28- assert .
NoError (
t ,
app .
Run (
strings .
Fields (
fmt .
Sprintf (
"./gitea admin user create --username %s --email %[email protected] %s --password foobar" ,
name ,
name ,
args ))))
29- u := unittest .AssertExistsAndLoadBean (t , & user_model.User {LowerName : name })
30- return createCheck {u .IsAdmin , u .MustChangePassword }
38+ reset ()
39+ assert .Equal (t , check {IsAdmin : true , MustChangePassword : false }, createCheck ("u" , "--admin" ), "first admin user doesn't need to change password" )
40+
41+ reset ()
42+ assert .Equal (t , check {IsAdmin : true , MustChangePassword : true }, createCheck ("u" , "--admin --must-change-password" ))
43+ assert .Equal (t , check {IsAdmin : true , MustChangePassword : true }, createCheck ("u2" , "--admin" ))
44+ assert .Equal (t , check {IsAdmin : true , MustChangePassword : false }, createCheck ("u3" , "--admin --must-change-password=false" ))
45+ assert .Equal (t , check {IsAdmin : false , MustChangePassword : true }, createCheck ("u4" , "" ))
46+ assert .Equal (t , check {IsAdmin : false , MustChangePassword : false }, createCheck ("u5" , "--must-change-password=false" ))
47+ })
48+
49+ createUser := func (name , args string ) error {
50+ return app .
Run (
strings .
Fields (
fmt .
Sprintf (
"./gitea admin user create --username %s --email %[email protected] %s" ,
name ,
name ,
args )))
3151 }
32- reset ()
33- assert .Equal (t , createCheck {IsAdmin : false , MustChangePassword : false }, createUser ("u" , "" ), "first non-admin user doesn't need to change password" )
34-
35- reset ()
36- assert .Equal (t , createCheck {IsAdmin : true , MustChangePassword : false }, createUser ("u" , "--admin" ), "first admin user doesn't need to change password" )
37-
38- reset ()
39- assert .Equal (t , createCheck {IsAdmin : true , MustChangePassword : true }, createUser ("u" , "--admin --must-change-password" ))
40- assert .Equal (t , createCheck {IsAdmin : true , MustChangePassword : true }, createUser ("u2" , "--admin" ))
41- assert .Equal (t , createCheck {IsAdmin : true , MustChangePassword : false }, createUser ("u3" , "--admin --must-change-password=false" ))
42- assert .Equal (t , createCheck {IsAdmin : false , MustChangePassword : true }, createUser ("u4" , "" ))
43- assert .Equal (t , createCheck {IsAdmin : false , MustChangePassword : false }, createUser ("u5" , "--must-change-password=false" ))
52+
53+ t .Run ("AccessToken" , func (t * testing.T ) {
54+ // no generated access token
55+ reset ()
56+ assert .NoError (t , createUser ("u" , "--random-password" ))
57+ assert .Equal (t , 1 , unittest .GetCount (t , & user_model.User {}))
58+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
59+
60+ // using "--access-token" only means "all" access
61+ reset ()
62+ assert .NoError (t , createUser ("u" , "--random-password --access-token" ))
63+ assert .Equal (t , 1 , unittest .GetCount (t , & user_model.User {}))
64+ assert .Equal (t , 1 , unittest .GetCount (t , & auth_model.AccessToken {}))
65+ accessToken := unittest .AssertExistsAndLoadBean (t , & auth_model.AccessToken {Name : "gitea-admin" })
66+ hasScopes , err := accessToken .Scope .HasScope (auth_model .AccessTokenScopeWriteAdmin , auth_model .AccessTokenScopeWriteRepository )
67+ assert .NoError (t , err )
68+ assert .True (t , hasScopes )
69+
70+ // using "--access-token" with name & scopes
71+ reset ()
72+ assert .NoError (t , createUser ("u" , "--random-password --access-token --access-token-name new-token-name --access-token-scopes read:issue,read:user" ))
73+ assert .Equal (t , 1 , unittest .GetCount (t , & user_model.User {}))
74+ assert .Equal (t , 1 , unittest .GetCount (t , & auth_model.AccessToken {}))
75+ accessToken = unittest .AssertExistsAndLoadBean (t , & auth_model.AccessToken {Name : "new-token-name" })
76+ hasScopes , err = accessToken .Scope .HasScope (auth_model .AccessTokenScopeReadIssue , auth_model .AccessTokenScopeReadUser )
77+ assert .NoError (t , err )
78+ assert .True (t , hasScopes )
79+ hasScopes , err = accessToken .Scope .HasScope (auth_model .AccessTokenScopeWriteAdmin , auth_model .AccessTokenScopeWriteRepository )
80+ assert .NoError (t , err )
81+ assert .False (t , hasScopes )
82+
83+ // using "--access-token-name" without "--access-token"
84+ reset ()
85+ err = createUser ("u" , "--random-password --access-token-name new-token-name" )
86+ assert .Equal (t , 0 , unittest .GetCount (t , & user_model.User {}))
87+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
88+ assert .ErrorContains (t , err , "access-token-name and access-token-scopes flags are only valid when access-token flag is set" )
89+
90+ // using "--access-token-scopes" without "--access-token"
91+ reset ()
92+ err = createUser ("u" , "--random-password --access-token-scopes read:issue" )
93+ assert .Equal (t , 0 , unittest .GetCount (t , & user_model.User {}))
94+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
95+ assert .ErrorContains (t , err , "access-token-name and access-token-scopes flags are only valid when access-token flag is set" )
96+
97+ // empty permission
98+ reset ()
99+ err = createUser ("u" , "--random-password --access-token --access-token-scopes public-only" )
100+ assert .Equal (t , 0 , unittest .GetCount (t , & user_model.User {}))
101+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
102+ assert .ErrorContains (t , err , "access token does not have any permission" )
103+ })
44104}
0 commit comments