@@ -43,6 +43,37 @@ func TestAccGithubMembership_basic(t *testing.T) {
43
43
})
44
44
}
45
45
46
+ func TestAccGithubMembership_downgrade (t * testing.T ) {
47
+ if testCollaborator == "" {
48
+ t .Skip ("Skipping because `GITHUB_TEST_COLLABORATOR` is not set" )
49
+ }
50
+ if err := testAccCheckOrganization (); err != nil {
51
+ t .Skipf ("Skipping because %s." , err .Error ())
52
+ }
53
+
54
+ var membership github.Membership
55
+ rn := "github_membership.test_org_membership"
56
+
57
+ resource .ParallelTest (t , resource.TestCase {
58
+ PreCheck : func () { testAccPreCheck (t ) },
59
+ Providers : testAccProviders ,
60
+ CheckDestroy : testAccCheckGithubMembershipDestroy ,
61
+ Steps : []resource.TestStep {
62
+ {
63
+ Config : testAccGithubMembershipConfigDowngradable (testCollaborator ),
64
+ Check : resource .ComposeTestCheckFunc (
65
+ testAccCheckGithubMembershipExists (rn , & membership ),
66
+ testAccCheckGithubMembershipRoleState (rn , & membership ),
67
+ ),
68
+ },
69
+ {
70
+ ResourceName : rn ,
71
+ ImportState : true ,
72
+ },
73
+ },
74
+ })
75
+ }
76
+
46
77
func TestAccGithubMembership_caseInsensitive (t * testing.T ) {
47
78
if testCollaborator == "" {
48
79
t .Skip ("Skipping because `GITHUB_TEST_COLLABORATOR` is not set" )
@@ -95,22 +126,36 @@ func testAccCheckGithubMembershipDestroy(s *terraform.State) error {
95
126
if rs .Type != "github_membership" {
96
127
continue
97
128
}
129
+
98
130
orgName , username , err := parseTwoPartID (rs .Primary .ID , "organization" , "username" )
99
131
if err != nil {
100
132
return err
101
133
}
102
134
135
+ downgradedOnDestroy := rs .Primary .Attributes ["downgrade_on_destroy" ] == "true"
103
136
membership , resp , err := conn .Organizations .GetOrgMembership (context .TODO (), username , orgName )
137
+ responseIsSuccessful := err == nil && membership != nil && buildTwoPartID (orgName , username ) == rs .Primary .ID
104
138
105
- if err == nil {
106
- if membership != nil &&
107
- buildTwoPartID (orgName , username ) == rs .Primary .ID {
108
- return fmt .Errorf ("organization membership %q still exists" , rs .Primary .ID )
139
+ if downgradedOnDestroy {
140
+ if ! responseIsSuccessful {
141
+ return fmt .Errorf ("could not load organization membership for %q" , rs .Primary .ID )
109
142
}
110
- }
111
- if resp .StatusCode != 404 {
143
+
144
+ if * membership .Role != "member" {
145
+ return fmt .Errorf ("organization membership %q is not a member of the org or is not the 'member' role" , rs .Primary .ID )
146
+ }
147
+
148
+ // Now actually remove them from the org to clean up
149
+ _ , removeErr := conn .Organizations .RemoveOrgMembership (context .TODO (), username , orgName )
150
+ if removeErr != nil {
151
+ return fmt .Errorf ("organization membership %q could not be removed during membership downgrade test case cleanup: %s" , rs .Primary .ID , removeErr )
152
+ }
153
+ } else if responseIsSuccessful {
154
+ return fmt .Errorf ("organization membership %q still exists" , rs .Primary .ID )
155
+ } else if resp .StatusCode != 404 {
112
156
return err
113
157
}
158
+
114
159
return nil
115
160
}
116
161
return nil
@@ -184,6 +229,16 @@ func testAccGithubMembershipConfig(username string) string {
184
229
` , username )
185
230
}
186
231
232
+ func testAccGithubMembershipConfigDowngradable (username string ) string {
233
+ return fmt .Sprintf (`
234
+ resource "github_membership" "test_org_membership" {
235
+ username = "%s"
236
+ role = "admin"
237
+ downgrade_on_destroy = %t
238
+ }
239
+ ` , username , true )
240
+ }
241
+
187
242
func testAccGithubMembershipTheSame (orig , other * github.Membership ) resource.TestCheckFunc {
188
243
return func (s * terraform.State ) error {
189
244
if orig .GetURL () != other .GetURL () {
0 commit comments