Skip to content

Commit 1b55c18

Browse files
shelley.besscehoffman
authored andcommitted
add project membership test
1 parent b1151a9 commit 1b55c18

File tree

1 file changed

+187
-0
lines changed

1 file changed

+187
-0
lines changed
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
package gitlab
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform/helper/acctest"
9+
"github.com/hashicorp/terraform/helper/resource"
10+
"github.com/hashicorp/terraform/terraform"
11+
"github.com/xanzy/go-gitlab"
12+
)
13+
14+
func TestAccGitlabProjectMembership_basic(t *testing.T) {
15+
var membership gitlab.ProjectMember
16+
rInt := acctest.RandInt()
17+
18+
resource.Test(t, resource.TestCase{PreCheck: func() { testAccPreCheck(t) },
19+
Providers: testAccProviders,
20+
CheckDestroy: testAccCheckGitlabProjectMembershipDestroy,
21+
Steps: []resource.TestStep{
22+
23+
// Assign member to the project as a developer
24+
{
25+
Config: testAccGitlabProjectMembershipConfig(rInt),
26+
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabProjectMembershipExists("gitlab_project_membership.foo", &membership), testAccCheckGitlabProjectMembershipAttributes(&membership, &testAccGitlabProjectMembershipExpectedAttributes{
27+
access_level: fmt.Sprintf("developer"),
28+
})),
29+
},
30+
31+
// Update the project member to change the access level (use testAccGitlabProjectMembershipUpdateConfig for Config)
32+
{
33+
Config: testAccGitlabProjectMembershipUpdateConfig(rInt),
34+
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabProjectMembershipExists("gitlab_project_membership.foo", &membership), testAccCheckGitlabProjectMembershipAttributes(&membership, &testAccGitlabProjectMembershipExpectedAttributes{
35+
access_level: fmt.Sprintf("guest"),
36+
})),
37+
},
38+
39+
// Update the project member to change the access level back
40+
{
41+
Config: testAccGitlabProjectMembershipConfig(rInt),
42+
Check: resource.ComposeTestCheckFunc(testAccCheckGitlabProjectMembershipExists("gitlab_project_membership.foo", &membership), testAccCheckGitlabProjectMembershipAttributes(&membership, &testAccGitlabProjectMembershipExpectedAttributes{
43+
access_level: fmt.Sprintf("developer"),
44+
})),
45+
},
46+
},
47+
})
48+
}
49+
50+
func testAccCheckGitlabProjectMembershipExists(n string, membership *gitlab.ProjectMember) resource.TestCheckFunc {
51+
return func(s *terraform.State) error {
52+
rs, ok := s.RootModule().Resources[n]
53+
if !ok {
54+
return fmt.Errorf("Not found: %s", n)
55+
}
56+
57+
projectID := rs.Primary.Attributes["project_id"]
58+
if projectID == "" {
59+
return fmt.Errorf("No project ID is set")
60+
}
61+
62+
userID := rs.Primary.Attributes["userID"]
63+
if userID == "" {
64+
return fmt.Errorf("No user id is set")
65+
}
66+
67+
conn := testAccProvider.Meta().(*gitlab.Client)
68+
69+
user_ID, err := strconv.Atoi(userID)
70+
gotProjectMembership, _, err := conn.ProjectMembers.GetProjectMember(projectID, user_ID)
71+
if err != nil {
72+
return err
73+
}
74+
75+
*membership = *gotProjectMembership
76+
return nil
77+
}
78+
}
79+
80+
type testAccGitlabProjectMembershipExpectedAttributes struct {
81+
access_level string
82+
}
83+
84+
var AccessLevel = map[gitlab.AccessLevelValue]string{
85+
gitlab.GuestPermissions: "guest",
86+
gitlab.ReporterPermissions: "reporter",
87+
gitlab.DeveloperPermissions: "developer",
88+
gitlab.MasterPermissions: "master",
89+
gitlab.OwnerPermission: "owner",
90+
}
91+
92+
func testAccCheckGitlabProjectMembershipAttributes(membership *gitlab.ProjectMember, want *testAccGitlabProjectMembershipExpectedAttributes) resource.TestCheckFunc {
93+
return func(s *terraform.State) error {
94+
95+
access_level_id, ok := AccessLevel[membership.AccessLevel]
96+
if !ok {
97+
return fmt.Errorf("Invalid access level '%s'", access_level_id)
98+
}
99+
if access_level_id != want.access_level {
100+
return fmt.Errorf("got access level %s; want %s", access_level_id, want.access_level)
101+
}
102+
return nil
103+
}
104+
}
105+
106+
func testAccCheckGitlabProjectMembershipDestroy(s *terraform.State) error {
107+
conn := testAccProvider.Meta().(*gitlab.Client)
108+
109+
for _, rs := range s.RootModule().Resources {
110+
if rs.Type != "gitlab_project_membership" {
111+
continue
112+
}
113+
114+
projectID := rs.Primary.Attributes["project_id"]
115+
userID := rs.Primary.Attributes["user_id"]
116+
117+
// GetProjectMember needs int type for userID
118+
userIDI, err := strconv.Atoi(userID)
119+
gotMembership, resp, err := conn.ProjectMembers.GetProjectMember(projectID, userIDI)
120+
if err != nil {
121+
if gotMembership != nil && fmt.Sprintf("%d", gotMembership.AccessLevel) == rs.Primary.Attributes["access_level"] {
122+
return fmt.Errorf("Project still has member.")
123+
}
124+
return nil
125+
}
126+
127+
if resp.StatusCode != 404 {
128+
return err
129+
}
130+
return nil
131+
}
132+
return nil
133+
}
134+
135+
func testAccGitlabProjectMembershipConfig(rInt int) string {
136+
return fmt.Sprintf(`resource "gitlab_project" "foo" {
137+
name = "foo-%d"
138+
description = "Terraform acceptance tests"
139+
140+
# So that acceptance tests can be run in a gitlab organziation with no billing
141+
visibility_level ="public"
142+
}
143+
144+
resource "gitlab_user" "foo" {
145+
name = "foo %d"
146+
username = "listest%d"
147+
password = "test%dtt"
148+
email = "listest%[email protected]"
149+
is_admin = false
150+
projects_limit = 20
151+
can_create_group = false
152+
}
153+
154+
resource "gitlab_project_membership" "foo" {
155+
project_id = "${gitlab_project.foo.id}"
156+
user_id = "${gitlab_user.foo.id}"
157+
access_level = "developer"
158+
}
159+
`, rInt, rInt, rInt, rInt, rInt)
160+
}
161+
162+
func testAccGitlabProjectMembershipUpdateConfig(rInt int) string {
163+
return fmt.Sprintf(`resource "gitlab_project" "foo" {
164+
name = "foo-%d"
165+
description = Terraform acceptance tests"
166+
167+
# So that acceptance tests can be run in a gitlab organization with no billing
168+
visibility_level ="public"
169+
}
170+
171+
resource "gitlab_user" "foo" {
172+
name = "foo %d"
173+
username = "listest%d"
174+
password = "test%dtt"
175+
email = "listest%[email protected]"
176+
is_admin = false
177+
projects_limit = 20
178+
can_creat_group = false
179+
}
180+
181+
resource "gitlab_project_membership" "foo" {
182+
project_id = "${gitlab_project.foo.id}"
183+
user_id = "${gitlab_user.foo.id}"
184+
access_level = "guest"
185+
}
186+
`, rInt, rInt, rInt, rInt, rInt)
187+
}

0 commit comments

Comments
 (0)