add tests and mock server

This commit is contained in:
Jan Husak
2025-11-19 10:52:32 +01:00
parent 5ad4072365
commit 41a1f70d02
7 changed files with 424 additions and 5 deletions

View File

@@ -0,0 +1,96 @@
package test
import (
"fmt"
"testing"
"github.com/hashicorp/terraform-plugin-framework/providerserver"
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-plugin-testing/terraform"
provider "terraform-provider-bitbucket-token/internal/provider"
mock "terraform-provider-bitbucket-token/mock_server"
)
// Acceptance test provider factories for protocol v6
var testAccProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){
"bitbucket": providerserver.NewProtocol6WithError(provider.NewProvider()),
}
func TestAccBitbucketToken_CRUD(t *testing.T) {
server := mock.NewMockBitbucketServer()
if err := server.Start(); err != nil {
t.Fatalf("server start error: %v", err)
}
resourceName := "bitbucket_token.test"
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProtoV6ProviderFactories: testAccProviderFactories,
CheckDestroy: testAccCheckBitbucketTokenDestroy(server),
Steps: []resource.TestStep{
{
// CREATE
Config: testAccBitbucketTokenConfig(server.URL),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttrSet(resourceName, "current_token_name"),
resource.TestCheckResourceAttrSet(resourceName, "current_token_expiry"),
resource.TestCheckResourceAttrSet(resourceName, "token"),
),
},
{
// READ (no drift) apply the same config again; plan should stay empty
Config: testAccBitbucketTokenConfig(server.URL),
},
},
})
}
//
// -------- Helper Functions --------
//
// Basic test configuration for the provider + resource
func testAccBitbucketTokenConfig(url string) string {
return fmt.Sprintf(`
provider "bitbucket" {
server_url = "%s"
auth_header = "dummy"
tls_skip_verify = true
}
resource "bitbucket_token" "test" {
project_name = "proj"
repository_name = "repo"
token_name = "prefix"
}
`, url)
}
// Ensures Terraform acceptance test environment is correct
func testAccPreCheck(t *testing.T) {
if testing.Short() {
t.Skip("skipping acceptance tests in short mode")
}
}
// Verifies that all tokens were removed by Delete()
func testAccCheckBitbucketTokenDestroy(server *mock.MockBitbucketServer) resource.TestCheckFunc {
return func(s *terraform.State) error {
server.Mu.Lock()
defer server.Mu.Unlock()
// server.Tokens should be empty after resource.Delete()
for _, tokens := range server.Tokens {
if len(tokens) != 0 {
return fmt.Errorf("expected no tokens, but found: %#v", server.Tokens)
}
}
return nil
}
}