@@ -3,12 +3,24 @@ package gitlab
3
3
import (
4
4
"errors"
5
5
"fmt"
6
+ "github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
7
+ "github.com/hashicorp/terraform-plugin-sdk/helper/resource"
8
+ "github.com/onsi/gomega"
9
+ "os"
6
10
"strings"
11
+ "testing"
7
12
8
13
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
9
14
"github.com/xanzy/go-gitlab"
10
15
)
11
16
17
+ func init () {
18
+ // We are using the gomega package for its matchers only, but it requires us to register a handler anyway.
19
+ gomega .RegisterFailHandler (func (_ string , _ ... int ) {
20
+ panic ("gomega fail handler should not be used" ) // lintignore: R009
21
+ })
22
+ }
23
+
12
24
// testAccCompareGitLabAttribute compares an attribute in two ResourceData's for
13
25
// equivalency.
14
26
func testAccCompareGitLabAttribute (attr string , expected , received * schema.ResourceData ) error {
@@ -51,3 +63,203 @@ func isRunningInCE() (bool, error) {
51
63
isEE , err := isRunningInEE ()
52
64
return ! isEE , err
53
65
}
66
+
67
+ // testAccCheck is a test helper that skips the current test if it is not an acceptance test.
68
+ func testAccCheck (t * testing.T ) {
69
+ t .Helper ()
70
+
71
+ if os .Getenv (resource .TestEnvVar ) == "" {
72
+ t .Skip (fmt .Sprintf ("Acceptance tests skipped unless env '%s' set" , resource .TestEnvVar ))
73
+ }
74
+ }
75
+
76
+ // testAccNewClient is a test helper that initializes a gitlab.Client to use in tests.
77
+ // This is preferable to using the provider metadata, which can cause unexpected behavior and breaks encapsulation.
78
+ func testAccNewClient (t * testing.T ) * gitlab.Client {
79
+ t .Helper ()
80
+
81
+ var options []gitlab.ClientOptionFunc
82
+ baseURL := os .Getenv ("GITLAB_BASE_URL" )
83
+ if baseURL != "" {
84
+ options = append (options , gitlab .WithBaseURL (baseURL ))
85
+ }
86
+
87
+ client , err := gitlab .NewClient (os .Getenv ("GITLAB_TOKEN" ), options ... )
88
+ if err != nil {
89
+ t .Fatalf ("could not initialize test client: %v" , err )
90
+ }
91
+
92
+ return client
93
+ }
94
+
95
+ // testAccCheckEE is a test helper that skips the current test if the GitLab version is not GitLab Enterprise.
96
+ // This is useful when the version needs to be checked during setup, before the Terraform acceptance test starts.
97
+ func testAccCheckEE (t * testing.T , client * gitlab.Client ) {
98
+ t .Helper ()
99
+
100
+ version , _ , err := client .Version .GetVersion ()
101
+ if err != nil {
102
+ t .Fatalf ("could not check GitLab version: %v" , err )
103
+ }
104
+
105
+ if ! strings .HasSuffix (version .Version , "-ee" ) {
106
+ t .Skipf ("Test is skipped for non-Enterprise version of GitLab (was %q)" , version .String ())
107
+ }
108
+ }
109
+
110
+ // testAccCurrentUser is a test helper for getting the current user of the provided client.
111
+ func testAccCurrentUser (t * testing.T , client * gitlab.Client ) * gitlab.User {
112
+ t .Helper ()
113
+
114
+ user , _ , err := client .Users .CurrentUser ()
115
+ if err != nil {
116
+ t .Fatalf ("could not get current user: %v" , err )
117
+ }
118
+
119
+ return user
120
+ }
121
+
122
+ // testAccCreateGroups is a test helper for creating a project.
123
+ func testAccCreateProject (t * testing.T , client * gitlab.Client ) * gitlab.Project {
124
+ t .Helper ()
125
+
126
+ project , _ , err := client .Projects .CreateProject (& gitlab.CreateProjectOptions {
127
+ Name : gitlab .String (acctest .RandomWithPrefix ("acctest" )),
128
+ Description : gitlab .String ("Terraform acceptance tests" ),
129
+ // So that acceptance tests can be run in a gitlab organization with no billing.
130
+ Visibility : gitlab .Visibility (gitlab .PublicVisibility ),
131
+ // So that a branch is created.
132
+ InitializeWithReadme : gitlab .Bool (true ),
133
+ })
134
+ if err != nil {
135
+ t .Fatalf ("could not create test project: %v" , err )
136
+ }
137
+
138
+ t .Cleanup (func () {
139
+ if _ , err := client .Projects .DeleteProject (project .ID ); err != nil {
140
+ t .Fatalf ("could not cleanup test project: %v" , err )
141
+ }
142
+ })
143
+
144
+ return project
145
+ }
146
+
147
+ // testAccCreateUsers is a test helper for creating a specified number of users.
148
+ func testAccCreateUsers (t * testing.T , client * gitlab.Client , n int ) []* gitlab.User {
149
+ t .Helper ()
150
+
151
+ users := make ([]* gitlab.User , n )
152
+
153
+ for i := range users {
154
+ var err error
155
+ username := acctest .RandomWithPrefix ("acctest-user" )
156
+ users [i ], _ , err = client .Users .CreateUser (& gitlab.CreateUserOptions {
157
+ Name : gitlab .String (username ),
158
+ Username : gitlab .String (username ),
159
+ Email : gitlab .String (username + "@example.com" ),
160
+ Password : gitlab .String (acctest .RandString (16 )),
161
+ SkipConfirmation : gitlab .Bool (true ),
162
+ })
163
+ if err != nil {
164
+ t .Fatalf ("could not create test user: %v" , err )
165
+ }
166
+
167
+ userID := users [i ].ID // Needed for closure.
168
+ t .Cleanup (func () {
169
+ if _ , err := client .Users .DeleteUser (userID ); err != nil {
170
+ t .Fatalf ("could not cleanup test user: %v" , err )
171
+ }
172
+ })
173
+ }
174
+
175
+ return users
176
+ }
177
+
178
+ // testAccCreateGroups is a test helper for creating a specified number of groups.
179
+ func testAccCreateGroups (t * testing.T , client * gitlab.Client , n int ) []* gitlab.Group {
180
+ t .Helper ()
181
+
182
+ groups := make ([]* gitlab.Group , n )
183
+
184
+ for i := range groups {
185
+ var err error
186
+ name := acctest .RandomWithPrefix ("acctest-group" )
187
+ groups [i ], _ , err = client .Groups .CreateGroup (& gitlab.CreateGroupOptions {
188
+ Name : gitlab .String (name ),
189
+ Path : gitlab .String (name ),
190
+ // So that acceptance tests can be run in a gitlab organization with no billing.
191
+ Visibility : gitlab .Visibility (gitlab .PublicVisibility ),
192
+ })
193
+ if err != nil {
194
+ t .Fatalf ("could not create test group: %v" , err )
195
+ }
196
+
197
+ groupID := groups [i ].ID // Needed for closure.
198
+ t .Cleanup (func () {
199
+ if _ , err := client .Groups .DeleteGroup (groupID ); err != nil {
200
+ t .Fatalf ("could not cleanup test group: %v" , err )
201
+ }
202
+ })
203
+ }
204
+
205
+ return groups
206
+ }
207
+
208
+ // testAccCreateProtectedBranches is a test helper for creating a specified number of protected branches.
209
+ // It assumes the project will be destroyed at the end of the test and will not cleanup created branches.
210
+ func testAccCreateProtectedBranches (t * testing.T , client * gitlab.Client , project * gitlab.Project , n int ) []* gitlab.ProtectedBranch {
211
+ t .Helper ()
212
+
213
+ protectedBranches := make ([]* gitlab.ProtectedBranch , n )
214
+
215
+ for i := range protectedBranches {
216
+ branch , _ , err := client .Branches .CreateBranch (project .ID , & gitlab.CreateBranchOptions {
217
+ Branch : gitlab .String (acctest .RandomWithPrefix ("acctest" )),
218
+ Ref : gitlab .String (project .DefaultBranch ),
219
+ })
220
+ if err != nil {
221
+ t .Fatalf ("could not create test branch: %v" , err )
222
+ }
223
+
224
+ protectedBranches [i ], _ , err = client .ProtectedBranches .ProtectRepositoryBranches (project .ID , & gitlab.ProtectRepositoryBranchesOptions {
225
+ Name : gitlab .String (branch .Name ),
226
+ })
227
+ if err != nil {
228
+ t .Fatalf ("could not protect test branch: %v" , err )
229
+ }
230
+ }
231
+
232
+ return protectedBranches
233
+ }
234
+
235
+ // testAccAddProjectMembers is a test helper for adding users as members of a project.
236
+ // It assumes the project will be destroyed at the end of the test and will not cleanup members.
237
+ func testAccAddProjectMembers (t * testing.T , client * gitlab.Client , pid interface {}, users []* gitlab.User ) {
238
+ t .Helper ()
239
+
240
+ for _ , user := range users {
241
+ _ , _ , err := client .ProjectMembers .AddProjectMember (pid , & gitlab.AddProjectMemberOptions {
242
+ UserID : user .ID ,
243
+ AccessLevel : gitlab .AccessLevel (gitlab .DeveloperPermissions ),
244
+ })
245
+ if err != nil {
246
+ t .Fatalf ("could not add test project member: %v" , err )
247
+ }
248
+ }
249
+ }
250
+
251
+ // testAccAddGroupMembers is a test helper for adding users as members of a group.
252
+ // It assumes the group will be destroyed at the end of the test and will not cleanup members.
253
+ func testAccAddGroupMembers (t * testing.T , client * gitlab.Client , gid interface {}, users []* gitlab.User ) {
254
+ t .Helper ()
255
+
256
+ for _ , user := range users {
257
+ _ , _ , err := client .GroupMembers .AddGroupMember (gid , & gitlab.AddGroupMemberOptions {
258
+ UserID : gitlab .Int (user .ID ),
259
+ AccessLevel : gitlab .AccessLevel (gitlab .DeveloperPermissions ),
260
+ })
261
+ if err != nil {
262
+ t .Fatalf ("could not add test group member: %v" , err )
263
+ }
264
+ }
265
+ }
0 commit comments