terraform/builtin/providers/github/resource_github_repository_...

233 lines
7.1 KiB
Go

package github
import (
"context"
"fmt"
"strings"
"testing"
"github.com/google/go-github/github"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)
func TestAccGithubRepository_basic(t *testing.T) {
var repo github.Repository
randString := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)
name := fmt.Sprintf("tf-acc-test-%s", randString)
description := fmt.Sprintf("Terraform acceptance tests %s", randString)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckGithubRepositoryDestroy,
Steps: []resource.TestStep{
{
Config: testAccGithubRepositoryConfig(randString),
Check: resource.ComposeTestCheckFunc(
testAccCheckGithubRepositoryExists("github_repository.foo", &repo),
testAccCheckGithubRepositoryAttributes(&repo, &testAccGithubRepositoryExpectedAttributes{
Name: name,
Description: description,
Homepage: "http://example.com/",
HasIssues: true,
HasWiki: true,
HasDownloads: true,
DefaultBranch: "master",
}),
),
},
{
Config: testAccGithubRepositoryUpdateConfig(randString),
Check: resource.ComposeTestCheckFunc(
testAccCheckGithubRepositoryExists("github_repository.foo", &repo),
testAccCheckGithubRepositoryAttributes(&repo, &testAccGithubRepositoryExpectedAttributes{
Name: name,
Description: "Updated " + description,
Homepage: "http://example.com/",
DefaultBranch: "master",
}),
),
},
},
})
}
func TestAccGithubRepository_importBasic(t *testing.T) {
randString := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckGithubRepositoryDestroy,
Steps: []resource.TestStep{
{
Config: testAccGithubRepositoryConfig(randString),
},
{
ResourceName: "github_repository.foo",
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func testAccCheckGithubRepositoryExists(n string, repo *github.Repository) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not Found: %s", n)
}
repoName := rs.Primary.ID
if repoName == "" {
return fmt.Errorf("No repository name is set")
}
org := testAccProvider.Meta().(*Organization)
conn := org.client
gotRepo, _, err := conn.Repositories.Get(context.TODO(), org.name, repoName)
if err != nil {
return err
}
*repo = *gotRepo
return nil
}
}
type testAccGithubRepositoryExpectedAttributes struct {
Name string
Description string
Homepage string
Private bool
HasIssues bool
HasWiki bool
HasDownloads bool
DefaultBranch string
}
func testAccCheckGithubRepositoryAttributes(repo *github.Repository, want *testAccGithubRepositoryExpectedAttributes) resource.TestCheckFunc {
return func(s *terraform.State) error {
if *repo.Name != want.Name {
return fmt.Errorf("got repo %q; want %q", *repo.Name, want.Name)
}
if *repo.Description != want.Description {
return fmt.Errorf("got description %q; want %q", *repo.Description, want.Description)
}
if *repo.Homepage != want.Homepage {
return fmt.Errorf("got homepage URL %q; want %q", *repo.Homepage, want.Homepage)
}
if *repo.Private != want.Private {
return fmt.Errorf("got private %#v; want %#v", *repo.Private, want.Private)
}
if *repo.HasIssues != want.HasIssues {
return fmt.Errorf("got has issues %#v; want %#v", *repo.HasIssues, want.HasIssues)
}
if *repo.HasWiki != want.HasWiki {
return fmt.Errorf("got has wiki %#v; want %#v", *repo.HasWiki, want.HasWiki)
}
if *repo.HasDownloads != want.HasDownloads {
return fmt.Errorf("got has downloads %#v; want %#v", *repo.HasDownloads, want.HasDownloads)
}
if *repo.DefaultBranch != want.DefaultBranch {
return fmt.Errorf("got default branch %q; want %q", *repo.DefaultBranch, want.DefaultBranch)
}
// For the rest of these, we just want to make sure they've been
// populated with something that seems somewhat reasonable.
if !strings.HasSuffix(*repo.FullName, "/"+want.Name) {
return fmt.Errorf("got full name %q; want to end with '/%s'", *repo.FullName, want.Name)
}
if !strings.HasSuffix(*repo.CloneURL, "/"+want.Name+".git") {
return fmt.Errorf("got Clone URL %q; want to end with '/%s.git'", *repo.CloneURL, want.Name)
}
if !strings.HasPrefix(*repo.CloneURL, "https://") {
return fmt.Errorf("got Clone URL %q; want to start with 'https://'", *repo.CloneURL)
}
if !strings.HasSuffix(*repo.SSHURL, "/"+want.Name+".git") {
return fmt.Errorf("got SSH URL %q; want to end with '/%s.git'", *repo.SSHURL, want.Name)
}
if !strings.HasPrefix(*repo.SSHURL, "git@github.com:") {
return fmt.Errorf("got SSH URL %q; want to start with 'git@github.com:'", *repo.SSHURL)
}
if !strings.HasSuffix(*repo.GitURL, "/"+want.Name+".git") {
return fmt.Errorf("got git URL %q; want to end with '/%s.git'", *repo.GitURL, want.Name)
}
if !strings.HasPrefix(*repo.GitURL, "git://") {
return fmt.Errorf("got git URL %q; want to start with 'git://'", *repo.GitURL)
}
if !strings.HasSuffix(*repo.SVNURL, "/"+want.Name) {
return fmt.Errorf("got svn URL %q; want to end with '/%s'", *repo.SVNURL, want.Name)
}
if !strings.HasPrefix(*repo.SVNURL, "https://") {
return fmt.Errorf("got svn URL %q; want to start with 'https://'", *repo.SVNURL)
}
return nil
}
}
func testAccCheckGithubRepositoryDestroy(s *terraform.State) error {
conn := testAccProvider.Meta().(*Organization).client
orgName := testAccProvider.Meta().(*Organization).name
for _, rs := range s.RootModule().Resources {
if rs.Type != "github_repository" {
continue
}
gotRepo, resp, err := conn.Repositories.Get(context.TODO(), orgName, rs.Primary.ID)
if err == nil {
if gotRepo != nil && *gotRepo.Name == rs.Primary.ID {
return fmt.Errorf("Repository %s/%s still exists", orgName, *gotRepo.Name)
}
}
if resp.StatusCode != 404 {
return err
}
return nil
}
return nil
}
func testAccGithubRepositoryConfig(randString string) string {
return fmt.Sprintf(`
resource "github_repository" "foo" {
name = "tf-acc-test-%s"
description = "Terraform acceptance tests %s"
homepage_url = "http://example.com/"
# So that acceptance tests can be run in a github organization
# with no billing
private = false
has_issues = true
has_wiki = true
has_downloads = true
}
`, randString, randString)
}
func testAccGithubRepositoryUpdateConfig(randString string) string {
return fmt.Sprintf(`
resource "github_repository" "foo" {
name = "tf-acc-test-%s"
description = "Updated Terraform acceptance tests %s"
homepage_url = "http://example.com/"
# So that acceptance tests can be run in a github organization
# with no billing
private = false
has_issues = false
has_wiki = false
has_downloads = false
}
`, randString, randString)
}