blob: a6f94332ce756bf6fd4c787d25971e17a275be48 [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package tpgresource
import (
"testing"
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
)
func TestParseImportId(t *testing.T) {
regionalIdRegexes := []string{
"projects/(?P<project>[^/]+)/regions/(?P<region>[^/]+)/subnetworks/(?P<name>[^/]+)",
"(?P<project>[^/]+)/(?P<region>[^/]+)/(?P<name>[^/]+)",
"(?P<name>[^/]+)",
}
zonalIdRegexes := []string{
"projects/(?P<project>[^/]+)/zones/(?P<zone>[^/]+)/instances/(?P<name>[^/]+)",
"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<name>[^/]+)",
"(?P<name>[^/]+)",
}
multipleNondefaultIdRegexes := []string{
"projects/(?P<project>[^/]+)/zones/(?P<zone>[^/]+)/clusters/(?P<cluster>[^/]+)/nodePools/(?P<name>[^/]+)",
"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<cluster>[^/]+)/(?P<name>[^/]+)",
"(?P<cluster>[^/]+)/(?P<name>[^/]+)",
}
cases := map[string]struct {
ImportId string
IdRegexes []string
Config *transport_tpg.Config
ExpectedSchemaValues map[string]interface{}
ExpectError bool
}{
"full self_link": {
ImportId: "https://www.googleapis.com/compute/v1/projects/my-project/regions/my-region/subnetworks/my-subnetwork",
IdRegexes: regionalIdRegexes,
ExpectedSchemaValues: map[string]interface{}{
"project": "my-project",
"region": "my-region",
"name": "my-subnetwork",
},
},
"relative self_link": {
ImportId: "projects/my-project/regions/my-region/subnetworks/my-subnetwork",
IdRegexes: regionalIdRegexes,
ExpectedSchemaValues: map[string]interface{}{
"project": "my-project",
"region": "my-region",
"name": "my-subnetwork",
},
},
"short id": {
ImportId: "my-project/my-region/my-subnetwork",
IdRegexes: regionalIdRegexes,
ExpectedSchemaValues: map[string]interface{}{
"project": "my-project",
"region": "my-region",
"name": "my-subnetwork",
},
},
"short id with default project and region": {
ImportId: "my-subnetwork",
Config: &transport_tpg.Config{
Project: "default-project",
Region: "default-region",
},
IdRegexes: regionalIdRegexes,
ExpectedSchemaValues: map[string]interface{}{
"project": "default-project",
"region": "default-region",
"name": "my-subnetwork",
},
},
"short id with default project and zone": {
ImportId: "my-instance",
Config: &transport_tpg.Config{
Project: "default-project",
Zone: "default-zone",
},
IdRegexes: zonalIdRegexes,
ExpectedSchemaValues: map[string]interface{}{
"project": "default-project",
"zone": "default-zone",
"name": "my-instance",
},
},
"short id with two nondefault fields with default project and zone": {
ImportId: "my-cluster/my-node-pool",
Config: &transport_tpg.Config{
Project: "default-project",
Zone: "default-zone",
},
IdRegexes: multipleNondefaultIdRegexes,
ExpectedSchemaValues: map[string]interface{}{
"project": "default-project",
"zone": "default-zone",
"cluster": "my-cluster",
"name": "my-node-pool",
},
},
"short id with default project and region inferred from default zone": {
ImportId: "my-subnetwork",
Config: &transport_tpg.Config{
Project: "default-project",
Zone: "us-east1-a",
},
IdRegexes: regionalIdRegexes,
ExpectedSchemaValues: map[string]interface{}{
"project": "default-project",
"region": "us-east1",
"name": "my-subnetwork",
},
},
"invalid import id": {
ImportId: "i/n/v/a/l/i/d",
IdRegexes: regionalIdRegexes,
ExpectError: true,
},
"provider-level defaults not set": {
ImportId: "my-subnetwork",
IdRegexes: regionalIdRegexes,
ExpectError: true,
},
}
for tn, tc := range cases {
d := &ResourceDataMock{
FieldsInSchema: make(map[string]interface{}),
}
d.SetId(tc.ImportId)
config := tc.Config
if config == nil {
config = &transport_tpg.Config{}
}
if err := ParseImportId(tc.IdRegexes, d, config); err == nil {
for k, expectedValue := range tc.ExpectedSchemaValues {
if v, ok := d.GetOk(k); ok {
if v != expectedValue {
t.Errorf("%s failed; Expected value %q for field %q, got %q", tn, expectedValue, k, v)
}
} else {
t.Errorf("%s failed; Expected a value for field %q", tn, k)
}
}
} else if !tc.ExpectError {
t.Errorf("%s failed; unexpected error: %s", tn, err)
}
}
}