blob: 8c6fed59cfc899bb965c5f02c9c5bd089ad3e997 [file] [log] [blame] [edit]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package healthcare_test
import (
"fmt"
"path"
"testing"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/healthcare"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
)
func TestAccHealthcareHl7V2StoreIdParsing(t *testing.T) {
t.Parallel()
cases := map[string]struct {
ImportId string
ExpectedError bool
ExpectedTerraformId string
ExpectedHl7V2StoreId string
Config *transport_tpg.Config
}{
"id is in project/location/datasetName/hl7V2StoreName format": {
ImportId: "test-project/us-central1/test-dataset/test-store-name",
ExpectedError: false,
ExpectedTerraformId: "test-project/us-central1/test-dataset/test-store-name",
ExpectedHl7V2StoreId: "projects/test-project/locations/us-central1/datasets/test-dataset/hl7V2Stores/test-store-name",
},
"id is in domain:project/location/datasetName/hl7V2StoreName format": {
ImportId: "example.com:test-project/us-central1/test-dataset/test-store-name",
ExpectedError: false,
ExpectedTerraformId: "example.com:test-project/us-central1/test-dataset/test-store-name",
ExpectedHl7V2StoreId: "projects/example.com:test-project/locations/us-central1/datasets/test-dataset/hl7V2Stores/test-store-name",
},
"id is in location/datasetName/hl7V2StoreName format": {
ImportId: "us-central1/test-dataset/test-store-name",
ExpectedError: false,
ExpectedTerraformId: "test-project/us-central1/test-dataset/test-store-name",
ExpectedHl7V2StoreId: "projects/test-project/locations/us-central1/datasets/test-dataset/hl7V2Stores/test-store-name",
Config: &transport_tpg.Config{Project: "test-project"},
},
"id is in location/datasetName/hl7V2StoreName format without project in config": {
ImportId: "us-central1/test-dataset/test-store-name",
ExpectedError: true,
Config: &transport_tpg.Config{Project: ""},
},
}
for tn, tc := range cases {
hl7V2StoreId, err := healthcare.ParseHealthcareHl7V2StoreId(tc.ImportId, tc.Config)
if tc.ExpectedError && err == nil {
t.Fatalf("bad: %s, expected an error", tn)
}
if err != nil {
if tc.ExpectedError {
continue
}
t.Fatalf("bad: %s, err: %#v", tn, err)
}
if hl7V2StoreId.TerraformId() != tc.ExpectedTerraformId {
t.Fatalf("bad: %s, expected Terraform ID to be `%s` but is `%s`", tn, tc.ExpectedTerraformId, hl7V2StoreId.TerraformId())
}
if hl7V2StoreId.Hl7V2StoreId() != tc.ExpectedHl7V2StoreId {
t.Fatalf("bad: %s, expected Hl7V2Store ID to be `%s` but is `%s`", tn, tc.ExpectedHl7V2StoreId, hl7V2StoreId.Hl7V2StoreId())
}
}
}
func TestAccHealthcareHl7V2Store_basic(t *testing.T) {
t.Parallel()
datasetName := fmt.Sprintf("tf-test-dataset-%s", acctest.RandString(t, 10))
hl7_v2StoreName := fmt.Sprintf("tf-test-hl7_v2-store-%s", acctest.RandString(t, 10))
pubsubTopic := fmt.Sprintf("tf-test-topic-%s", acctest.RandString(t, 10))
resourceName := "google_healthcare_hl7_v2_store.default"
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckHealthcareHl7V2StoreDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testGoogleHealthcareHl7V2Store_basic(hl7_v2StoreName, datasetName),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
},
{
Config: testGoogleHealthcareHl7V2Store_update(hl7_v2StoreName, datasetName, pubsubTopic),
Check: resource.ComposeTestCheckFunc(
testAccCheckGoogleHealthcareHl7V2StoreUpdate(t, pubsubTopic),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
},
{
Config: testGoogleHealthcareHl7V2Store_basic(hl7_v2StoreName, datasetName),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
},
},
})
}
func TestAccHealthcareHl7V2Store_updateSchema(t *testing.T) {
t.Parallel()
datasetName := fmt.Sprintf("tf-test-dataset-%s", acctest.RandString(t, 10))
hl7_v2StoreName := fmt.Sprintf("tf-test-hl7_v2-store-%s", acctest.RandString(t, 10))
resourceName := "google_healthcare_hl7_v2_store.default"
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
CheckDestroy: testAccCheckHealthcareHl7V2StoreDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testGoogleHealthcareHl7V2Store_basicSchema(hl7_v2StoreName, datasetName),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
{
Config: testGoogleHealthcareHl7V2Store_updateSchema(hl7_v2StoreName, datasetName),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func testGoogleHealthcareHl7V2Store_basic(hl7_v2StoreName, datasetName string) string {
return fmt.Sprintf(`
resource "google_healthcare_hl7_v2_store" "default" {
name = "%s"
dataset = google_healthcare_dataset.dataset.id
reject_duplicate_message = true
}
resource "google_healthcare_dataset" "dataset" {
name = "%s"
location = "us-central1"
}
`, hl7_v2StoreName, datasetName)
}
func testGoogleHealthcareHl7V2Store_update(hl7_v2StoreName, datasetName, pubsubTopic string) string {
return fmt.Sprintf(`
resource "google_healthcare_hl7_v2_store" "default" {
name = "%s"
dataset = google_healthcare_dataset.dataset.id
parser_config {
allow_null_header = true
segment_terminator = "Jw=="
}
notification_configs {
pubsub_topic = google_pubsub_topic.topic.id
}
labels = {
label1 = "labelvalue1"
}
}
resource "google_healthcare_dataset" "dataset" {
name = "%s"
location = "us-central1"
}
resource "google_pubsub_topic" "topic" {
name = "%s"
}
`, hl7_v2StoreName, datasetName, pubsubTopic)
}
func testGoogleHealthcareHl7V2Store_basicSchema(hl7_v2StoreName, datasetName string) string {
return fmt.Sprintf(`
resource "google_healthcare_hl7_v2_store" "default" {
provider = google-beta
name = "%s"
dataset = google_healthcare_dataset.dataset.id
parser_config {
schema = <<EOF
{
"schematizedParsingType": "SOFT_FAIL",
"ignoreMinOccurs": true
}
EOF
version = "V2"
}
}
resource "google_healthcare_dataset" "dataset" {
provider = google-beta
name = "%s"
location = "us-central1"
}
`, hl7_v2StoreName, datasetName)
}
func testGoogleHealthcareHl7V2Store_updateSchema(hl7_v2StoreName, datasetName string) string {
return fmt.Sprintf(`
resource "google_healthcare_hl7_v2_store" "default" {
provider = google-beta
name = "%s"
dataset = google_healthcare_dataset.dataset.id
parser_config {
schema = <<EOF
{
"schematizedParsingType": "SOFT_FAIL",
"ignoreMinOccurs": true,
"unexpectedSegmentHandling": "PARSE"
}
EOF
version = "V2"
}
}
resource "google_healthcare_dataset" "dataset" {
provider = google-beta
name = "%s"
location = "us-central1"
}
`, hl7_v2StoreName, datasetName)
}
func testAccCheckGoogleHealthcareHl7V2StoreUpdate(t *testing.T, pubsubTopic string) resource.TestCheckFunc {
return func(s *terraform.State) error {
var foundResource = false
for _, rs := range s.RootModule().Resources {
if rs.Type != "google_healthcare_hl7_v2_store" {
continue
}
foundResource = true
config := acctest.GoogleProviderConfig(t)
gcpResourceUri, err := tpgresource.ReplaceVarsForTest(config, rs, "{{dataset}}/hl7V2Stores/{{name}}")
if err != nil {
return err
}
response, err := config.NewHealthcareClient(config.UserAgent).Projects.Locations.Datasets.Hl7V2Stores.Get(gcpResourceUri).Do()
if err != nil {
return fmt.Errorf("Unexpected failure while verifying 'updated' dataset: %s", err)
}
if response.ParserConfig == nil {
return fmt.Errorf("hl7_v2_store had no parser config: %s", gcpResourceUri)
}
if !response.ParserConfig.AllowNullHeader {
return fmt.Errorf("hl7_v2_store allowNullHeader not changed to true: %s", gcpResourceUri)
}
if response.ParserConfig.SegmentTerminator != "Jw==" {
return fmt.Errorf("hl7_v2_store segmentTerminator was not changed to 'JW==' as was expected: %s", gcpResourceUri)
}
if len(response.Labels) == 0 || response.Labels["label1"] != "labelvalue1" {
return fmt.Errorf("hl7_v2_store labels not updated: %s", gcpResourceUri)
}
notifications := response.NotificationConfigs
if len(notifications) > 0 {
topicName := path.Base(notifications[0].PubsubTopic)
if topicName != pubsubTopic {
return fmt.Errorf("hl7_v2_store 'NotificationConfig' not updated ('%s' != '%s'): %s", topicName, pubsubTopic, gcpResourceUri)
}
}
}
if !foundResource {
return fmt.Errorf("google_healthcare_hl7_v2_store resource was missing")
}
return nil
}
}