Skip to content

Commit 7375664

Browse files
committed
chore: debug tests
1 parent d5c62af commit 7375664

5 files changed

+368
-1
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# DEBUG VERSION - Imports existing database
2+
# Template signature: fmt.Sprintf(template, subscription_id, database_id, database_name, password)
3+
locals {
4+
subscription_id = "%s"
5+
database_id = "%s"
6+
database_name = "%s"
7+
password = "%s"
8+
}
9+
10+
# Step 1: global=true, both regions inherit (NO enable_default_user in override_region)
11+
resource "rediscloud_active_active_subscription_database" "example" {
12+
subscription_id = local.subscription_id
13+
db_id = local.database_id
14+
name = local.database_name
15+
memory_limit_in_gb = 1
16+
17+
# Global enable_default_user is true
18+
global_enable_default_user = true
19+
global_password = local.password
20+
21+
# Both regions inherit from global - NO enable_default_user specified
22+
override_region {
23+
name = "us-east-1"
24+
}
25+
26+
override_region {
27+
name = "us-east-2"
28+
}
29+
30+
lifecycle {
31+
ignore_changes = [
32+
# Ignore changes to fields we're not testing
33+
global_data_persistence,
34+
global_source_ips,
35+
global_alert,
36+
]
37+
}
38+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# DEBUG VERSION - Imports existing database
2+
# Template signature: fmt.Sprintf(template, subscription_id, database_id, database_name, password)
3+
locals {
4+
subscription_id = "%s"
5+
database_id = "%s"
6+
database_name = "%s"
7+
password = "%s"
8+
}
9+
10+
# Step 2: global=true, us-east-1 explicit false
11+
resource "rediscloud_active_active_subscription_database" "example" {
12+
subscription_id = local.subscription_id
13+
db_id = local.database_id
14+
name = local.database_name
15+
memory_limit_in_gb = 1
16+
17+
# Global enable_default_user is true
18+
global_enable_default_user = true
19+
global_password = local.password
20+
21+
# us-east-1 explicitly set to false (differs from global)
22+
override_region {
23+
name = "us-east-1"
24+
enable_default_user = false
25+
}
26+
27+
# us-east-2 inherits from global
28+
override_region {
29+
name = "us-east-2"
30+
}
31+
32+
lifecycle {
33+
ignore_changes = [
34+
# Ignore changes to fields we're not testing
35+
global_data_persistence,
36+
global_source_ips,
37+
global_alert,
38+
]
39+
}
40+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# DEBUG VERSION - Imports existing database
2+
# Template signature: fmt.Sprintf(template, subscription_id, database_id, database_name, password)
3+
locals {
4+
subscription_id = "%s"
5+
database_id = "%s"
6+
database_name = "%s"
7+
password = "%s"
8+
}
9+
10+
# Step 3: global=false, us-east-1 explicit true
11+
resource "rediscloud_active_active_subscription_database" "example" {
12+
subscription_id = local.subscription_id
13+
db_id = local.database_id
14+
name = local.database_name
15+
memory_limit_in_gb = 1
16+
17+
# Global enable_default_user is false
18+
global_enable_default_user = false
19+
global_password = local.password
20+
21+
# us-east-1 explicitly set to true (differs from global)
22+
override_region {
23+
name = "us-east-1"
24+
enable_default_user = true
25+
}
26+
27+
# us-east-2 inherits from global
28+
override_region {
29+
name = "us-east-2"
30+
}
31+
32+
lifecycle {
33+
ignore_changes = [
34+
# Ignore changes to fields we're not testing
35+
global_data_persistence,
36+
global_source_ips,
37+
global_alert,
38+
]
39+
}
40+
}

provider/rediscloud_active_active_database_enable_default_user_debug_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"testing"
99

1010
"github.com/RedisLabs/rediscloud-go-api/redis"
11+
"github.com/RedisLabs/rediscloud-go-api/service/databases"
1112
"github.com/RedisLabs/terraform-provider-rediscloud/provider/client"
1213
"github.com/RedisLabs/terraform-provider-rediscloud/provider/utils"
1314
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
@@ -204,7 +205,7 @@ func testAccCheckActiveActiveDatabaseDestroy(s *terraform.State) error {
204205
db, err := apiClient.Client.Database.GetActiveActive(ctx, subId, dbId)
205206
if err != nil {
206207
// Database not found is expected
207-
if _, ok := err.(*redis.NotFound); ok {
208+
if _, ok := err.(*databases.NotFound); ok {
208209
continue
209210
}
210211
return err
Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
package provider
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"strconv"
8+
"testing"
9+
10+
"github.com/RedisLabs/rediscloud-go-api/redis"
11+
"github.com/RedisLabs/terraform-provider-rediscloud/provider/client"
12+
"github.com/RedisLabs/terraform-provider-rediscloud/provider/utils"
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
16+
)
17+
18+
// TestAccResourceRedisCloudActiveActiveDatabase_enableDefaultUserImport is a DEBUG version
19+
// that imports and modifies an existing database to speed up testing during development.
20+
//
21+
// SETUP:
22+
// 1. Set DEBUG_SUBSCRIPTION_ID and DEBUG_DATABASE_ID environment variables
23+
// 2. The database must have us-east-1 and us-east-2 regions
24+
// 3. Run with: DEBUG_SUBSCRIPTION_ID=124134 DEBUG_DATABASE_ID=4923 EXECUTE_TESTS=true make testacc TESTARGS='-run=TestAccResourceRedisCloudActiveActiveDatabase_enableDefaultUserImport'
25+
//
26+
// This test will:
27+
// - Import the existing database
28+
// - Update it through 3 test steps to test enable_default_user drift detection
29+
// - Leave the database in place (no destroy)
30+
func TestAccResourceRedisCloudActiveActiveDatabase_enableDefaultUserImport(t *testing.T) {
31+
utils.AccRequiresEnvVar(t, "EXECUTE_TESTS")
32+
33+
subscriptionID := os.Getenv("DEBUG_SUBSCRIPTION_ID")
34+
databaseID := os.Getenv("DEBUG_DATABASE_ID")
35+
36+
if subscriptionID == "" || databaseID == "" {
37+
t.Skip("DEBUG_SUBSCRIPTION_ID and DEBUG_DATABASE_ID must be set - skipping import debug test")
38+
}
39+
40+
// Get the actual database name and password from API
41+
apiClient, err := client.NewClient()
42+
if err != nil {
43+
t.Fatalf("Failed to create API client: %v", err)
44+
}
45+
46+
subId, _ := strconv.Atoi(subscriptionID)
47+
dbId, _ := strconv.Atoi(databaseID)
48+
ctx := context.Background()
49+
50+
db, err := apiClient.Client.Database.GetActiveActive(ctx, subId, dbId)
51+
if err != nil {
52+
t.Fatalf("Failed to fetch database %s/%s: %v", subscriptionID, databaseID, err)
53+
}
54+
55+
databaseName := redis.StringValue(db.Name)
56+
databasePassword := acctest.RandString(20) // Use new password for testing
57+
58+
const databaseResourceName = "rediscloud_active_active_subscription_database.example"
59+
importID := fmt.Sprintf("%s/%s", subscriptionID, databaseID)
60+
61+
resource.Test(t, resource.TestCase{
62+
PreCheck: func() { testAccPreCheck(t); testAccAwsPreExistingCloudAccountPreCheck(t) },
63+
ProviderFactories: providerFactories,
64+
Steps: []resource.TestStep{
65+
// Step 0: Import existing database
66+
{
67+
PreConfig: func() {
68+
t.Logf("DEBUG Step 0: Importing database %s (sub: %s, db: %s)", databaseName, subscriptionID, databaseID)
69+
},
70+
Config: fmt.Sprintf(
71+
utils.GetTestConfig(t, "./activeactive/testdata/enable_default_user_debug_import_step1.tf"),
72+
subscriptionID,
73+
databaseID,
74+
databaseName,
75+
databasePassword,
76+
),
77+
ResourceName: databaseResourceName,
78+
ImportState: true,
79+
ImportStateId: importID,
80+
ImportStateVerify: false, // Don't verify all fields, just get it into state
81+
},
82+
// Step 1: global=true, both regions inherit
83+
{
84+
PreConfig: func() {
85+
t.Logf("DEBUG Step 1: global=true, both inherit")
86+
},
87+
Config: fmt.Sprintf(
88+
utils.GetTestConfig(t, "./activeactive/testdata/enable_default_user_debug_import_step1.tf"),
89+
subscriptionID,
90+
databaseID,
91+
databaseName,
92+
databasePassword,
93+
),
94+
Check: resource.ComposeAggregateTestCheckFunc(
95+
// Global setting
96+
resource.TestCheckResourceAttr(databaseResourceName, "global_enable_default_user", "true"),
97+
resource.TestCheckResourceAttr(databaseResourceName, "subscription_id", subscriptionID),
98+
resource.TestCheckResourceAttr(databaseResourceName, "db_id", databaseID),
99+
100+
// Both regions should exist
101+
resource.TestCheckResourceAttr(databaseResourceName, "override_region.#", "2"),
102+
103+
// Neither region should have enable_default_user in state
104+
resource.TestCheckNoResourceAttr(databaseResourceName, "override_region.0.enable_default_user"),
105+
resource.TestCheckNoResourceAttr(databaseResourceName, "override_region.1.enable_default_user"),
106+
107+
// API check
108+
testCheckEnableDefaultUserInAPIImport(databaseResourceName, true, map[string]*bool{
109+
"us-east-1": nil,
110+
"us-east-2": nil,
111+
}),
112+
),
113+
},
114+
// Step 2: global=true, us-east-1 explicit false
115+
{
116+
PreConfig: func() {
117+
t.Logf("DEBUG Step 2: global=true, us-east-1 explicit false")
118+
},
119+
Config: fmt.Sprintf(
120+
utils.GetTestConfig(t, "./activeactive/testdata/enable_default_user_debug_import_step2.tf"),
121+
subscriptionID,
122+
databaseID,
123+
databaseName,
124+
databasePassword,
125+
),
126+
Check: resource.ComposeAggregateTestCheckFunc(
127+
// Global setting
128+
resource.TestCheckResourceAttr(databaseResourceName, "global_enable_default_user", "true"),
129+
130+
// Two regions
131+
resource.TestCheckResourceAttr(databaseResourceName, "override_region.#", "2"),
132+
133+
// us-east-1 has explicit false
134+
resource.TestCheckTypeSetElemNestedAttrs(databaseResourceName, "override_region.*", map[string]string{
135+
"name": "us-east-1",
136+
"enable_default_user": "false",
137+
}),
138+
139+
// API check
140+
testCheckEnableDefaultUserInAPIImport(databaseResourceName, true, map[string]*bool{
141+
"us-east-1": redis.Bool(false),
142+
"us-east-2": nil,
143+
}),
144+
),
145+
},
146+
// Step 3: global=false, us-east-1 explicit true
147+
{
148+
PreConfig: func() {
149+
t.Logf("DEBUG Step 3: global=false, us-east-1 explicit true")
150+
},
151+
Config: fmt.Sprintf(
152+
utils.GetTestConfig(t, "./activeactive/testdata/enable_default_user_debug_import_step3.tf"),
153+
subscriptionID,
154+
databaseID,
155+
databaseName,
156+
databasePassword,
157+
),
158+
Check: resource.ComposeAggregateTestCheckFunc(
159+
// Global setting
160+
resource.TestCheckResourceAttr(databaseResourceName, "global_enable_default_user", "false"),
161+
162+
// Two regions
163+
resource.TestCheckResourceAttr(databaseResourceName, "override_region.#", "2"),
164+
165+
// us-east-1 has explicit true
166+
resource.TestCheckTypeSetElemNestedAttrs(databaseResourceName, "override_region.*", map[string]string{
167+
"name": "us-east-1",
168+
"enable_default_user": "true",
169+
}),
170+
171+
// API check
172+
testCheckEnableDefaultUserInAPIImport(databaseResourceName, false, map[string]*bool{
173+
"us-east-1": redis.Bool(true),
174+
"us-east-2": nil,
175+
}),
176+
),
177+
},
178+
},
179+
})
180+
}
181+
182+
// testCheckEnableDefaultUserInAPIImport is identical to the regular version but for the import test
183+
func testCheckEnableDefaultUserInAPIImport(resourceName string, expectedGlobal bool, expectedRegions map[string]*bool) resource.TestCheckFunc {
184+
return func(s *terraform.State) error {
185+
rs, ok := s.RootModule().Resources[resourceName]
186+
if !ok {
187+
return fmt.Errorf("resource not found: %s", resourceName)
188+
}
189+
190+
subIdStr := rs.Primary.Attributes["subscription_id"]
191+
dbIdStr := rs.Primary.Attributes["db_id"]
192+
193+
subId, err := strconv.Atoi(subIdStr)
194+
if err != nil {
195+
return fmt.Errorf("failed to parse subscription_id: %v", err)
196+
}
197+
198+
dbId, err := strconv.Atoi(dbIdStr)
199+
if err != nil {
200+
return fmt.Errorf("failed to parse db_id: %v", err)
201+
}
202+
203+
apiClient, err := client.NewClient()
204+
if err != nil {
205+
return fmt.Errorf("failed to get API client: %v", err)
206+
}
207+
208+
ctx := context.Background()
209+
db, err := apiClient.Client.Database.GetActiveActive(ctx, subId, dbId)
210+
if err != nil {
211+
return fmt.Errorf("failed to get database from API: %v", err)
212+
}
213+
214+
if db.GlobalEnableDefaultUser == nil {
215+
return fmt.Errorf("API returned nil for GlobalEnableDefaultUser")
216+
}
217+
actualGlobal := redis.BoolValue(db.GlobalEnableDefaultUser)
218+
if actualGlobal != expectedGlobal {
219+
return fmt.Errorf("API global_enable_default_user: expected %v, got %v", expectedGlobal, actualGlobal)
220+
}
221+
222+
for _, regionDb := range db.CrdbDatabases {
223+
regionName := redis.StringValue(regionDb.Region)
224+
225+
if regionDb.Security == nil || regionDb.Security.EnableDefaultUser == nil {
226+
return fmt.Errorf("API returned nil for region %s EnableDefaultUser", regionName)
227+
}
228+
229+
actualRegionValue := redis.BoolValue(regionDb.Security.EnableDefaultUser)
230+
231+
expectedValue, hasExplicitOverride := expectedRegions[regionName]
232+
233+
var expectedRegionValue bool
234+
if hasExplicitOverride && expectedValue != nil {
235+
expectedRegionValue = *expectedValue
236+
} else {
237+
expectedRegionValue = expectedGlobal
238+
}
239+
240+
if actualRegionValue != expectedRegionValue {
241+
return fmt.Errorf("API region %s enable_default_user: expected %v, got %v",
242+
regionName, expectedRegionValue, actualRegionValue)
243+
}
244+
}
245+
246+
return nil
247+
}
248+
}

0 commit comments

Comments
 (0)