Skip to content

Commit

Permalink
Playlist tests: Use OpenAPI client (#1140)
Browse files Browse the repository at this point in the history
* Playlist tests: Use OpenAPI client
Gets rid of the manually written checkers in favor of the new ones that use the OpenAPI client

* Get by ID, for older versions

* Add version restriction for org test
  • Loading branch information
julienduchesne authored Nov 9, 2023
1 parent 77faf3f commit 9b479bf
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 73 deletions.
14 changes: 14 additions & 0 deletions internal/resources/grafana/common_check_exists_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/grafana/grafana-openapi-client-go/client/datasources"
"github.com/grafana/grafana-openapi-client-go/client/folders"
"github.com/grafana/grafana-openapi-client-go/client/library_elements"
"github.com/grafana/grafana-openapi-client-go/client/playlists"
"github.com/grafana/grafana-openapi-client-go/client/service_accounts"
"github.com/grafana/grafana-openapi-client-go/client/teams"
"github.com/grafana/grafana-openapi-client-go/client/users"
Expand Down Expand Up @@ -57,6 +58,19 @@ var (
return payloadOrError(resp, err)
},
)
playlistCheckExists = newCheckExistsHelper(
func(p *models.Playlist) string {
if p.UID == "" {
return strconv.FormatInt(p.ID, 10)
}
return p.UID
},
func(client *goapi.GrafanaHTTPAPI, id string) (*models.Playlist, error) {
params := playlists.NewGetPlaylistParams().WithUID(id)
resp, err := client.Playlists.GetPlaylist(params, nil)
return payloadOrError(resp, err)
},
)
roleCheckExists = newCheckExistsHelper(
func(r *models.RoleDTO) string { return r.UID },
func(client *goapi.GrafanaHTTPAPI, id string) (*models.RoleDTO, error) {
Expand Down
93 changes: 20 additions & 73 deletions internal/resources/grafana/resource_playlist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ package grafana_test

import (
"fmt"
"strings"
"testing"

gapi "github.com/grafana/grafana-api-golang-client"
"github.com/grafana/terraform-provider-grafana/internal/common"
"github.com/grafana/grafana-openapi-client-go/client/playlists"
"github.com/grafana/grafana-openapi-client-go/models"
"github.com/grafana/terraform-provider-grafana/internal/resources/grafana"
"github.com/grafana/terraform-provider-grafana/internal/testutils"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
Expand All @@ -20,15 +20,16 @@ func TestAccPlaylist_basic(t *testing.T) {
testutils.CheckOSSTestsEnabled(t)

rName := acctest.RandomWithPrefix("tf-acc-test")
var playlist models.Playlist

resource.ParallelTest(t, resource.TestCase{
ProviderFactories: testutils.ProviderFactories,
CheckDestroy: testAccPlaylistDestroy,
CheckDestroy: playlistCheckExists.destroyed(&playlist, nil),
Steps: []resource.TestStep{
{
Config: testAccPlaylistConfigBasic(rName, "5m"),
Check: resource.ComposeTestCheckFunc(
testAccPlaylistCheckExists(),
playlistCheckExists.exists(paylistResource, &playlist),
resource.TestMatchResourceAttr(paylistResource, "id", defaultOrgIDRegexp),
resource.TestCheckResourceAttr(paylistResource, "name", rName),
resource.TestCheckResourceAttr(paylistResource, "item.#", "2"),
Expand Down Expand Up @@ -56,29 +57,30 @@ func TestAccPlaylist_update(t *testing.T) {

rName := acctest.RandomWithPrefix("tf-acc-test")
updatedName := "updated name"
var playlist models.Playlist

resource.ParallelTest(t, resource.TestCase{
ProviderFactories: testutils.ProviderFactories,
CheckDestroy: testAccPlaylistDestroy,
CheckDestroy: playlistCheckExists.destroyed(&playlist, nil),
Steps: []resource.TestStep{
{
Config: testAccPlaylistConfigBasic(rName, "5m"),
Check: resource.ComposeTestCheckFunc(
testAccPlaylistCheckExists(),
playlistCheckExists.exists(paylistResource, &playlist),
resource.TestCheckResourceAttr(paylistResource, "interval", "5m"),
),
},
{
Config: testAccPlaylistConfigBasic(rName, "10m"),
Check: resource.ComposeTestCheckFunc(
testAccPlaylistCheckExists(),
playlistCheckExists.exists(paylistResource, &playlist),
resource.TestCheckResourceAttr(paylistResource, "interval", "10m"),
),
},
{
Config: testAccPlaylistConfigUpdate(updatedName),
Check: resource.ComposeTestCheckFunc(
testAccPlaylistCheckExists(),
playlistCheckExists.exists(paylistResource, &playlist),
resource.TestMatchResourceAttr(paylistResource, "id", defaultOrgIDRegexp),
resource.TestCheckResourceAttr(paylistResource, "name", updatedName),
resource.TestCheckResourceAttr(paylistResource, "item.#", "1"),
Expand All @@ -103,15 +105,16 @@ func TestAccPlaylist_disappears(t *testing.T) {
testutils.CheckOSSTestsEnabled(t)

rName := acctest.RandomWithPrefix("tf-acc-test")
var playlist models.Playlist

resource.ParallelTest(t, resource.TestCase{
ProviderFactories: testutils.ProviderFactories,
CheckDestroy: testAccPlaylistDestroy,
CheckDestroy: playlistCheckExists.destroyed(&playlist, nil),
Steps: []resource.TestStep{
{
Config: testAccPlaylistConfigBasic(rName, "5m"),
Check: resource.ComposeTestCheckFunc(
testAccPlaylistCheckExists(),
playlistCheckExists.exists(paylistResource, &playlist),
testAccPlaylistDisappears(),
),
ExpectNonEmptyPlan: true,
Expand All @@ -121,14 +124,15 @@ func TestAccPlaylist_disappears(t *testing.T) {
}

func TestAccPlaylist_inOrg(t *testing.T) {
testutils.CheckOSSTestsEnabled(t)
testutils.CheckOSSTestsEnabled(t, ">=9.0.0") // Querying org-specific playlists is broken pre-9

rName := acctest.RandomWithPrefix("tf-acc-test")
var org gapi.Org
var playlist models.Playlist

resource.ParallelTest(t, resource.TestCase{
ProviderFactories: testutils.ProviderFactories,
CheckDestroy: testAccPlaylistDestroy,
CheckDestroy: playlistCheckExists.destroyed(&playlist, &org),
Steps: []resource.TestStep{
{
Config: testAccPlaylistConfigInOrg(rName, "5m"),
Expand All @@ -138,7 +142,7 @@ func TestAccPlaylist_inOrg(t *testing.T) {
testAccOrganizationCheckExists("grafana_organization.test", &org),
checkResourceIsInOrg(paylistResource, "grafana_organization.test"),

testAccPlaylistCheckExists(),
playlistCheckExists.exists(paylistResource, &playlist),
resource.TestCheckResourceAttr(paylistResource, "name", rName),
resource.TestCheckResourceAttr(paylistResource, "item.#", "2"),
resource.TestCheckTypeSetElemNestedAttrs(paylistResource, "item.*", map[string]string{
Expand All @@ -160,39 +164,6 @@ func TestAccPlaylist_inOrg(t *testing.T) {
})
}

func testAccPlaylistCheckExists() resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[paylistResource]
if !ok {
return fmt.Errorf("resource not found: %s\n %#v", paylistResource, s.RootModule().Resources)
}

if rs.Primary.ID == "" {
return fmt.Errorf("resource id not set")
}

client := testutils.Provider.Meta().(*common.Client).GrafanaAPI

orgID, playlistID := grafana.SplitOrgResourceID(rs.Primary.ID)

// If the org ID is set, check that the playlist doesn't exist in the default org
if orgID > 1 {
playlist, err := client.Playlist(playlistID)
if err == nil || playlist != nil {
return fmt.Errorf("expected no playlist with ID %s in default org but found one", playlistID)
}
client = client.WithOrgID(orgID)
}

_, err := client.Playlist(playlistID)
if err != nil {
return fmt.Errorf("error getting playlist: %w", err)
}

return nil
}
}

func testAccPlaylistDisappears() resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[paylistResource]
Expand All @@ -204,36 +175,12 @@ func testAccPlaylistDisappears() resource.TestCheckFunc {
return fmt.Errorf("resource id not set")
}

client, _, playlistID := grafana.ClientFromExistingOrgResource(testutils.Provider.Meta(), rs.Primary.ID)

return client.DeletePlaylist(playlistID)
client, _, playlistID := grafana.OAPIClientFromExistingOrgResource(testutils.Provider.Meta(), rs.Primary.ID)
_, err := client.Playlists.DeletePlaylist(playlists.NewDeletePlaylistParams().WithUID(playlistID), nil)
return err
}
}

func testAccPlaylistDestroy(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != "grafana_playlist" {
continue
}

client, _, playlistID := grafana.ClientFromExistingOrgResource(testutils.Provider.Meta(), rs.Primary.ID)
playlist, err := client.Playlist(playlistID)

if err != nil {
if strings.HasPrefix(err.Error(), "status: 404") {
continue
}
return err
}

if playlist != nil && playlist.ID != 0 {
return fmt.Errorf("Playlist still exists: %+v", playlist)
}
}

return nil
}

func testAccPlaylistConfigBasic(name, interval string) string {
return fmt.Sprintf(`
resource "grafana_playlist" "test" {
Expand Down

0 comments on commit 9b479bf

Please sign in to comment.