github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/github/resource_github_repository_webhook_test.go (about) 1 package github 2 3 import ( 4 "context" 5 "fmt" 6 "reflect" 7 "strconv" 8 "strings" 9 "testing" 10 11 "github.com/google/go-github/github" 12 "github.com/hashicorp/terraform/helper/acctest" 13 "github.com/hashicorp/terraform/helper/resource" 14 "github.com/hashicorp/terraform/terraform" 15 ) 16 17 func TestAccGithubRepositoryWebhook_basic(t *testing.T) { 18 randString := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum) 19 var hook github.Hook 20 21 resource.Test(t, resource.TestCase{ 22 PreCheck: func() { testAccPreCheck(t) }, 23 Providers: testAccProviders, 24 CheckDestroy: testAccCheckGithubRepositoryWebhookDestroy, 25 Steps: []resource.TestStep{ 26 { 27 Config: testAccGithubRepositoryWebhookConfig(randString), 28 Check: resource.ComposeTestCheckFunc( 29 testAccCheckGithubRepositoryWebhookExists("github_repository_webhook.foo", fmt.Sprintf("foo-%s", randString), &hook), 30 testAccCheckGithubRepositoryWebhookAttributes(&hook, &testAccGithubRepositoryWebhookExpectedAttributes{ 31 Name: "web", 32 Events: []string{"pull_request"}, 33 Configuration: map[string]interface{}{ 34 "url": "https://google.de/webhook", 35 "content_type": "json", 36 "insecure_ssl": "1", 37 }, 38 Active: true, 39 }), 40 ), 41 }, 42 { 43 Config: testAccGithubRepositoryWebhookUpdateConfig(randString), 44 Check: resource.ComposeTestCheckFunc( 45 testAccCheckGithubRepositoryWebhookExists("github_repository_webhook.foo", fmt.Sprintf("foo-%s", randString), &hook), 46 testAccCheckGithubRepositoryWebhookAttributes(&hook, &testAccGithubRepositoryWebhookExpectedAttributes{ 47 Name: "web", 48 Events: []string{"issues"}, 49 Configuration: map[string]interface{}{ 50 "url": "https://google.de/webhooks", 51 "content_type": "form", 52 "insecure_ssl": "0", 53 }, 54 Active: false, 55 }), 56 ), 57 }, 58 }, 59 }) 60 } 61 62 func testAccCheckGithubRepositoryWebhookExists(n string, repoName string, hook *github.Hook) resource.TestCheckFunc { 63 return func(s *terraform.State) error { 64 rs, ok := s.RootModule().Resources[n] 65 if !ok { 66 return fmt.Errorf("Not Found: %s", n) 67 } 68 69 hookID, _ := strconv.Atoi(rs.Primary.ID) 70 if hookID == 0 { 71 return fmt.Errorf("No repository name is set") 72 } 73 74 org := testAccProvider.Meta().(*Organization) 75 conn := org.client 76 getHook, _, err := conn.Repositories.GetHook(context.TODO(), org.name, repoName, hookID) 77 if err != nil { 78 return err 79 } 80 *hook = *getHook 81 return nil 82 } 83 } 84 85 type testAccGithubRepositoryWebhookExpectedAttributes struct { 86 Name string 87 Events []string 88 Configuration map[string]interface{} 89 Active bool 90 } 91 92 func testAccCheckGithubRepositoryWebhookAttributes(hook *github.Hook, want *testAccGithubRepositoryWebhookExpectedAttributes) resource.TestCheckFunc { 93 return func(s *terraform.State) error { 94 95 if *hook.Name != want.Name { 96 return fmt.Errorf("got hook %q; want %q", *hook.Name, want.Name) 97 } 98 if *hook.Active != want.Active { 99 return fmt.Errorf("got hook %t; want %t", *hook.Active, want.Active) 100 } 101 if !strings.HasPrefix(*hook.URL, "https://") { 102 return fmt.Errorf("got http URL %q; want to start with 'https://'", *hook.URL) 103 } 104 if !reflect.DeepEqual(hook.Events, want.Events) { 105 return fmt.Errorf("got hook events %q; want %q", hook.Events, want.Events) 106 } 107 if !reflect.DeepEqual(hook.Config, want.Configuration) { 108 return fmt.Errorf("got hook configuration %q; want %q", hook.Config, want.Configuration) 109 } 110 111 return nil 112 } 113 } 114 115 func testAccCheckGithubRepositoryWebhookDestroy(s *terraform.State) error { 116 conn := testAccProvider.Meta().(*Organization).client 117 orgName := testAccProvider.Meta().(*Organization).name 118 119 for _, rs := range s.RootModule().Resources { 120 if rs.Type != "github_repository_webhook" { 121 continue 122 } 123 124 id, err := strconv.Atoi(rs.Primary.ID) 125 if err != nil { 126 return err 127 } 128 129 gotHook, resp, err := conn.Repositories.GetHook(context.TODO(), orgName, rs.Primary.Attributes["repository"], id) 130 if err == nil { 131 if gotHook != nil && *gotHook.ID == id { 132 return fmt.Errorf("Webhook still exists") 133 } 134 } 135 if resp.StatusCode != 404 { 136 return err 137 } 138 return nil 139 } 140 return nil 141 } 142 143 func testAccGithubRepositoryWebhookConfig(randString string) string { 144 return fmt.Sprintf(` 145 resource "github_repository" "foo" { 146 name = "foo-%s" 147 description = "Terraform acceptance tests" 148 homepage_url = "http://example.com/" 149 150 # So that acceptance tests can be run in a github organization 151 # with no billing 152 private = false 153 154 has_issues = true 155 has_wiki = true 156 has_downloads = true 157 } 158 159 resource "github_repository_webhook" "foo" { 160 depends_on = ["github_repository.foo"] 161 repository = "foo-%s" 162 163 name = "web" 164 configuration { 165 url = "https://google.de/webhook" 166 content_type = "json" 167 insecure_ssl = true 168 } 169 170 events = ["pull_request"] 171 } 172 `, randString, randString) 173 } 174 175 func testAccGithubRepositoryWebhookUpdateConfig(randString string) string { 176 return fmt.Sprintf(` 177 resource "github_repository" "foo" { 178 name = "foo-%s" 179 description = "Terraform acceptance tests" 180 homepage_url = "http://example.com/" 181 182 # So that acceptance tests can be run in a github organization 183 # with no billing 184 private = false 185 186 has_issues = true 187 has_wiki = true 188 has_downloads = true 189 } 190 191 resource "github_repository_webhook" "foo" { 192 depends_on = ["github_repository.foo"] 193 repository = "foo-%s" 194 195 name = "web" 196 configuration { 197 url = "https://google.de/webhooks" 198 content_type = "form" 199 insecure_ssl = false 200 } 201 active = false 202 203 events = ["issues"] 204 } 205 `, randString, randString) 206 }