@@ -8,37 +8,109 @@ 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 ("UserType" , func (t * testing.T ) {
54+ reset ()
55+ assert .ErrorContains (t , createUser ("u" , "--user-type invalid" ), "invalid user type" )
56+ assert .ErrorContains (t , createUser ("u" , "--user-type bot --password 123" ), "can only be set for individual users" )
57+ assert .ErrorContains (t , createUser ("u" , "--user-type bot --must-change-password" ), "can only be set for individual users" )
58+
59+ assert .NoError (t , createUser ("u" , "--user-type bot" ))
60+ u := unittest .AssertExistsAndLoadBean (t , & user_model.User {LowerName : "u" })
61+ assert .Equal (t , user_model .UserTypeBot , u .Type )
62+ assert .Empty (t , u .Passwd )
63+ })
64+
65+ t .Run ("AccessToken" , func (t * testing.T ) {
66+ // no generated access token
67+ reset ()
68+ assert .NoError (t , createUser ("u" , "--random-password" ))
69+ assert .Equal (t , 1 , unittest .GetCount (t , & user_model.User {}))
70+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
71+
72+ // using "--access-token" only means "all" access
73+ reset ()
74+ assert .NoError (t , createUser ("u" , "--random-password --access-token" ))
75+ assert .Equal (t , 1 , unittest .GetCount (t , & user_model.User {}))
76+ assert .Equal (t , 1 , unittest .GetCount (t , & auth_model.AccessToken {}))
77+ accessToken := unittest .AssertExistsAndLoadBean (t , & auth_model.AccessToken {Name : "gitea-admin" })
78+ hasScopes , err := accessToken .Scope .HasScope (auth_model .AccessTokenScopeWriteAdmin , auth_model .AccessTokenScopeWriteRepository )
79+ assert .NoError (t , err )
80+ assert .True (t , hasScopes )
81+
82+ // using "--access-token" with name & scopes
83+ reset ()
84+ assert .NoError (t , createUser ("u" , "--random-password --access-token --access-token-name new-token-name --access-token-scopes read:issue,read:user" ))
85+ assert .Equal (t , 1 , unittest .GetCount (t , & user_model.User {}))
86+ assert .Equal (t , 1 , unittest .GetCount (t , & auth_model.AccessToken {}))
87+ accessToken = unittest .AssertExistsAndLoadBean (t , & auth_model.AccessToken {Name : "new-token-name" })
88+ hasScopes , err = accessToken .Scope .HasScope (auth_model .AccessTokenScopeReadIssue , auth_model .AccessTokenScopeReadUser )
89+ assert .NoError (t , err )
90+ assert .True (t , hasScopes )
91+ hasScopes , err = accessToken .Scope .HasScope (auth_model .AccessTokenScopeWriteAdmin , auth_model .AccessTokenScopeWriteRepository )
92+ assert .NoError (t , err )
93+ assert .False (t , hasScopes )
94+
95+ // using "--access-token-name" without "--access-token"
96+ reset ()
97+ err = createUser ("u" , "--random-password --access-token-name new-token-name" )
98+ assert .Equal (t , 0 , unittest .GetCount (t , & user_model.User {}))
99+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
100+ assert .ErrorContains (t , err , "access-token-name and access-token-scopes flags are only valid when access-token flag is set" )
101+
102+ // using "--access-token-scopes" without "--access-token"
103+ reset ()
104+ err = createUser ("u" , "--random-password --access-token-scopes read:issue" )
105+ assert .Equal (t , 0 , unittest .GetCount (t , & user_model.User {}))
106+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
107+ assert .ErrorContains (t , err , "access-token-name and access-token-scopes flags are only valid when access-token flag is set" )
108+
109+ // empty permission
110+ reset ()
111+ err = createUser ("u" , "--random-password --access-token --access-token-scopes public-only" )
112+ assert .Equal (t , 0 , unittest .GetCount (t , & user_model.User {}))
113+ assert .Equal (t , 0 , unittest .GetCount (t , & auth_model.AccessToken {}))
114+ assert .ErrorContains (t , err , "access token does not have any permission" )
115+ })
44116}
0 commit comments