From bc08358b126b6710d46301069210956d52cc5e5f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:44:12 +0000 Subject: [PATCH 1/5] Initial plan From 79eb41536e5c96e44e5615d77d7ddadee3734bfb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:54:34 +0000 Subject: [PATCH 2/5] Refactor AI connector tests into table-driven test Co-authored-by: dimuon <8962171+dimuon@users.noreply.github.com> --- internal/kibana/connectors/acc_test.go | 243 +++++++++++-------------- 1 file changed, 108 insertions(+), 135 deletions(-) diff --git a/internal/kibana/connectors/acc_test.go b/internal/kibana/connectors/acc_test.go index 8bfcc3d5e..5c78c0da7 100644 --- a/internal/kibana/connectors/acc_test.go +++ b/internal/kibana/connectors/acc_test.go @@ -386,97 +386,92 @@ func TestAccResourceKibanaConnectorEmptyConfigFromSDK(t *testing.T) { }) } -func TestAccResourceKibanaConnectorBedrock(t *testing.T) { - minSupportedVersion := version.Must(version.NewSemver("8.16.2")) - - connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) - - create := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "%s" - config = jsonencode({ +func TestAccResourceKibanaConnectorAI(t *testing.T) { + testCases := []struct { + name string + connectorTypeID string + minSupportedVersion *version.Version + createConfig string + createSecrets string + updateConfig string + updateSecrets string + createChecks []resource.TestCheckFunc + updateChecks []resource.TestCheckFunc + }{ + { + name: "bedrock", + connectorTypeID: ".bedrock", + minSupportedVersion: version.Must(version.NewSemver("8.16.2")), + createConfig: `{ apiUrl = "https://bedrock-runtime.us-east-1.amazonaws.com" defaultModel = "anthropic.claude-v2" - }) - secrets = jsonencode({ + }`, + createSecrets: `{ accessKey = "test-access-key" secret = "test-secret-key" - }) - connector_type_id = ".bedrock" - }`, - name) - } - - update := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "Updated %s" - config = jsonencode({ + }`, + updateConfig: `{ apiUrl = "https://bedrock-runtime.us-west-2.amazonaws.com" defaultModel = "anthropic.claude-3-5-sonnet-20240620-v1:0" - }) - secrets = jsonencode({ + }`, + updateSecrets: `{ accessKey = "updated-access-key" secret = "updated-secret-key" - }) - connector_type_id = ".bedrock" - }`, - name) - } - - resource.Test(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t) }, - CheckDestroy: checkResourceKibanaConnectorDestroy, - ProtoV6ProviderFactories: acctest.Providers, - Steps: []resource.TestStep{ - { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: create(connectorName), - Check: resource.ComposeTestCheckFunc( - testCommonAttributes(connectorName, ".bedrock"), - - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://bedrock-runtime\.us-east-1\.amazonaws\.com\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"anthropic\.claude-v2\"`)), - - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"accessKey\":\"test-access-key\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"secret\":\"test-secret-key\"`)), - ), + }`, + createChecks: []resource.TestCheckFunc{ + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://bedrock-runtime\.us-east-1\.amazonaws\.com\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"anthropic\.claude-v2\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"accessKey\":\"test-access-key\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"secret\":\"test-secret-key\"`)), }, - { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: update(connectorName), - Check: resource.ComposeTestCheckFunc( - testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), ".bedrock"), - - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://bedrock-runtime\.us-west-2\.amazonaws\.com\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"anthropic\.claude-3-5-sonnet-20240620-v1:0\"`)), - - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"accessKey\":\"updated-access-key\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"secret\":\"updated-secret-key\"`)), - ), + updateChecks: []resource.TestCheckFunc{ + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://bedrock-runtime\.us-west-2\.amazonaws\.com\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"anthropic\.claude-3-5-sonnet-20240620-v1:0\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"accessKey\":\"updated-access-key\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"updated-secret-key\"`)), }, }, - }) -} - -func TestAccResourceKibanaConnectorGenAi(t *testing.T) { - minSupportedVersion := version.Must(version.NewSemver("8.10.3")) + { + name: "gen-ai", + connectorTypeID: ".gen-ai", + minSupportedVersion: version.Must(version.NewSemver("8.10.3")), + createConfig: `{ + apiProvider = "OpenAI" + apiUrl = "https://api.openai.com/v1" + defaultModel = "gpt-4" + }`, + createSecrets: `{ + apiKey = "test-api-key" + }`, + updateConfig: `{ + apiProvider = "OpenAI" + apiUrl = "https://api.openai.com/v1" + defaultModel = "gpt-4o" + }`, + updateSecrets: `{ + apiKey = "updated-api-key" + }`, + createChecks: []resource.TestCheckFunc{ + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiProvider\":\"OpenAI\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://api\.openai\.com/v1\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"gpt-4\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"apiKey\":\"test-api-key\"`)), + }, + updateChecks: []resource.TestCheckFunc{ + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiProvider\":\"OpenAI\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://api\.openai\.com/v1\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"gpt-4o\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"apiKey\":\"updated-api-key\"`)), + }, + }, + } - connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) - create := func(name string) string { - return fmt.Sprintf(` + create := func(name string) string { + return fmt.Sprintf(` provider "elasticstack" { elasticsearch {} kibana {} @@ -484,21 +479,15 @@ func TestAccResourceKibanaConnectorGenAi(t *testing.T) { resource "elasticstack_kibana_action_connector" "test" { name = "%s" - config = jsonencode({ - apiProvider = "OpenAI" - apiUrl = "https://api.openai.com/v1" - defaultModel = "gpt-4" - }) - secrets = jsonencode({ - apiKey = "test-api-key" - }) - connector_type_id = ".gen-ai" + config = jsonencode(%s) + secrets = jsonencode(%s) + connector_type_id = "%s" }`, - name) - } + name, tc.createConfig, tc.createSecrets, tc.connectorTypeID) + } - update := func(name string) string { - return fmt.Sprintf(` + update := func(name string) string { + return fmt.Sprintf(` provider "elasticstack" { elasticsearch {} kibana {} @@ -506,50 +495,34 @@ func TestAccResourceKibanaConnectorGenAi(t *testing.T) { resource "elasticstack_kibana_action_connector" "test" { name = "Updated %s" - config = jsonencode({ - apiProvider = "OpenAI" - apiUrl = "https://api.openai.com/v1" - defaultModel = "gpt-4o" - }) - secrets = jsonencode({ - apiKey = "updated-api-key" - }) - connector_type_id = ".gen-ai" + config = jsonencode(%s) + secrets = jsonencode(%s) + connector_type_id = "%s" }`, - name) - } - - resource.Test(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t) }, - CheckDestroy: checkResourceKibanaConnectorDestroy, - ProtoV6ProviderFactories: acctest.Providers, - Steps: []resource.TestStep{ - { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: create(connectorName), - Check: resource.ComposeTestCheckFunc( - testCommonAttributes(connectorName, ".gen-ai"), - - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiProvider\":\"OpenAI\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://api\.openai\.com/v1\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"gpt-4\"`)), - - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"apiKey\":\"test-api-key\"`)), - ), - }, - { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: update(connectorName), - Check: resource.ComposeTestCheckFunc( - testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), ".gen-ai"), - - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiProvider\":\"OpenAI\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://api\.openai\.com/v1\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"gpt-4o\"`)), + name, tc.updateConfig, tc.updateSecrets, tc.connectorTypeID) + } - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"apiKey\":\"updated-api-key\"`)), - ), - }, - }, - }) + resource.Test(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + CheckDestroy: checkResourceKibanaConnectorDestroy, + ProtoV6ProviderFactories: acctest.Providers, + Steps: []resource.TestStep{ + { + SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minSupportedVersion), + Config: create(connectorName), + Check: resource.ComposeTestCheckFunc( + append([]resource.TestCheckFunc{testCommonAttributes(connectorName, tc.connectorTypeID)}, tc.createChecks...)..., + ), + }, + { + SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minSupportedVersion), + Config: update(connectorName), + Check: resource.ComposeTestCheckFunc( + append([]resource.TestCheckFunc{testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), tc.connectorTypeID)}, tc.updateChecks...)..., + ), + }, + }, + }) + }) + } } From 973342d1271e07f514cf41e74762b071c0743598 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:57:17 +0000 Subject: [PATCH 3/5] Fix regex pattern for secret field in bedrock update checks Co-authored-by: dimuon <8962171+dimuon@users.noreply.github.com> --- internal/kibana/connectors/acc_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/kibana/connectors/acc_test.go b/internal/kibana/connectors/acc_test.go index 5c78c0da7..1e6c842a9 100644 --- a/internal/kibana/connectors/acc_test.go +++ b/internal/kibana/connectors/acc_test.go @@ -428,7 +428,7 @@ func TestAccResourceKibanaConnectorAI(t *testing.T) { resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://bedrock-runtime\.us-west-2\.amazonaws\.com\"`)), resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"anthropic\.claude-3-5-sonnet-20240620-v1:0\"`)), resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"accessKey\":\"updated-access-key\"`)), - resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"updated-secret-key\"`)), + resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "secrets", regexp.MustCompile(`\"secret\":\"updated-secret-key\"`)), }, }, { From f5b838ed9e5f37828067cb1709ba86db5a5a4081 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:40:23 +0000 Subject: [PATCH 4/5] Restructure test to use ConfigDirectory pattern with testdata files Co-authored-by: dimuon <8962171+dimuon@users.noreply.github.com> --- internal/kibana/connectors/acc_test.go | 83 +++---------------- .../bedrock/create/connector.tf | 17 ++++ .../bedrock/update/connector.tf | 17 ++++ .../gen-ai/create/connector.tf | 17 ++++ .../gen-ai/update/connector.tf | 17 ++++ 5 files changed, 79 insertions(+), 72 deletions(-) create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/create/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/update/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/create/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/update/connector.tf diff --git a/internal/kibana/connectors/acc_test.go b/internal/kibana/connectors/acc_test.go index 1e6c842a9..71e5e2084 100644 --- a/internal/kibana/connectors/acc_test.go +++ b/internal/kibana/connectors/acc_test.go @@ -13,6 +13,7 @@ import ( "github.com/elastic/terraform-provider-elasticstack/internal/versionutils" "github.com/google/uuid" "github.com/hashicorp/go-version" + "github.com/hashicorp/terraform-plugin-testing/config" sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" @@ -391,10 +392,6 @@ func TestAccResourceKibanaConnectorAI(t *testing.T) { name string connectorTypeID string minSupportedVersion *version.Version - createConfig string - createSecrets string - updateConfig string - updateSecrets string createChecks []resource.TestCheckFunc updateChecks []resource.TestCheckFunc }{ @@ -402,22 +399,6 @@ func TestAccResourceKibanaConnectorAI(t *testing.T) { name: "bedrock", connectorTypeID: ".bedrock", minSupportedVersion: version.Must(version.NewSemver("8.16.2")), - createConfig: `{ - apiUrl = "https://bedrock-runtime.us-east-1.amazonaws.com" - defaultModel = "anthropic.claude-v2" - }`, - createSecrets: `{ - accessKey = "test-access-key" - secret = "test-secret-key" - }`, - updateConfig: `{ - apiUrl = "https://bedrock-runtime.us-west-2.amazonaws.com" - defaultModel = "anthropic.claude-3-5-sonnet-20240620-v1:0" - }`, - updateSecrets: `{ - accessKey = "updated-access-key" - secret = "updated-secret-key" - }`, createChecks: []resource.TestCheckFunc{ resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://bedrock-runtime\.us-east-1\.amazonaws\.com\"`)), resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"defaultModel\":\"anthropic\.claude-v2\"`)), @@ -435,22 +416,6 @@ func TestAccResourceKibanaConnectorAI(t *testing.T) { name: "gen-ai", connectorTypeID: ".gen-ai", minSupportedVersion: version.Must(version.NewSemver("8.10.3")), - createConfig: `{ - apiProvider = "OpenAI" - apiUrl = "https://api.openai.com/v1" - defaultModel = "gpt-4" - }`, - createSecrets: `{ - apiKey = "test-api-key" - }`, - updateConfig: `{ - apiProvider = "OpenAI" - apiUrl = "https://api.openai.com/v1" - defaultModel = "gpt-4o" - }`, - updateSecrets: `{ - apiKey = "updated-api-key" - }`, createChecks: []resource.TestCheckFunc{ resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiProvider\":\"OpenAI\"`)), resource.TestMatchResourceAttr("elasticstack_kibana_action_connector.test", "config", regexp.MustCompile(`\"apiUrl\":\"https://api\.openai\.com/v1\"`)), @@ -470,53 +435,27 @@ func TestAccResourceKibanaConnectorAI(t *testing.T) { t.Run(tc.name, func(t *testing.T) { connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) - create := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "%s" - config = jsonencode(%s) - secrets = jsonencode(%s) - connector_type_id = "%s" - }`, - name, tc.createConfig, tc.createSecrets, tc.connectorTypeID) - } - - update := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "Updated %s" - config = jsonencode(%s) - secrets = jsonencode(%s) - connector_type_id = "%s" - }`, - name, tc.updateConfig, tc.updateSecrets, tc.connectorTypeID) - } - resource.Test(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, CheckDestroy: checkResourceKibanaConnectorDestroy, ProtoV6ProviderFactories: acctest.Providers, Steps: []resource.TestStep{ { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minSupportedVersion), - Config: create(connectorName), + SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minSupportedVersion), + ConfigDirectory: acctest.NamedTestCaseDirectory("create"), + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( append([]resource.TestCheckFunc{testCommonAttributes(connectorName, tc.connectorTypeID)}, tc.createChecks...)..., ), }, { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minSupportedVersion), - Config: update(connectorName), + SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minSupportedVersion), + ConfigDirectory: acctest.NamedTestCaseDirectory("update"), + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( append([]resource.TestCheckFunc{testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), tc.connectorTypeID)}, tc.updateChecks...)..., ), diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/create/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/create/connector.tf new file mode 100644 index 000000000..7d96d7840 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/create/connector.tf @@ -0,0 +1,17 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = var.connector_name + config = jsonencode({ + apiUrl = "https://bedrock-runtime.us-east-1.amazonaws.com" + defaultModel = "anthropic.claude-v2" + }) + secrets = jsonencode({ + accessKey = "test-access-key" + secret = "test-secret-key" + }) + connector_type_id = ".bedrock" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/update/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/update/connector.tf new file mode 100644 index 000000000..df0b5b0e0 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/bedrock/update/connector.tf @@ -0,0 +1,17 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = "Updated ${var.connector_name}" + config = jsonencode({ + apiUrl = "https://bedrock-runtime.us-west-2.amazonaws.com" + defaultModel = "anthropic.claude-3-5-sonnet-20240620-v1:0" + }) + secrets = jsonencode({ + accessKey = "updated-access-key" + secret = "updated-secret-key" + }) + connector_type_id = ".bedrock" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/create/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/create/connector.tf new file mode 100644 index 000000000..f92ef6a65 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/create/connector.tf @@ -0,0 +1,17 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = var.connector_name + config = jsonencode({ + apiProvider = "OpenAI" + apiUrl = "https://api.openai.com/v1" + defaultModel = "gpt-4" + }) + secrets = jsonencode({ + apiKey = "test-api-key" + }) + connector_type_id = ".gen-ai" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/update/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/update/connector.tf new file mode 100644 index 000000000..521e63cad --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorAI/gen-ai/update/connector.tf @@ -0,0 +1,17 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = "Updated ${var.connector_name}" + config = jsonencode({ + apiProvider = "OpenAI" + apiUrl = "https://api.openai.com/v1" + defaultModel = "gpt-4o" + }) + secrets = jsonencode({ + apiKey = "updated-api-key" + }) + connector_type_id = ".gen-ai" +} From 7bb50da7b1ad22a57565b16a523bbcbffd886dec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 19:51:34 +0000 Subject: [PATCH 5/5] Refactor all connector acceptance tests to use ConfigDirectory pattern Co-authored-by: tobio <444668+tobio@users.noreply.github.com> --- internal/kibana/connectors/acc_test.go | 221 ++++++------------ .../create/connector.tf | 23 ++ .../update/connector.tf | 24 ++ .../create/connector.tf | 29 +++ .../update/connector.tf | 30 +++ .../connector.tf | 17 ++ .../connector.tf | 18 ++ .../create/connector.tf | 13 ++ .../update/connector.tf | 13 ++ 9 files changed, 232 insertions(+), 156 deletions(-) create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/create/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/update/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/create/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/update/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorEmptyConfigFromSDK/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorFromSDK/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/create/connector.tf create mode 100644 internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/update/connector.tf diff --git a/internal/kibana/connectors/acc_test.go b/internal/kibana/connectors/acc_test.go index 71e5e2084..367fe6597 100644 --- a/internal/kibana/connectors/acc_test.go +++ b/internal/kibana/connectors/acc_test.go @@ -2,6 +2,7 @@ package connectors_test import ( "context" + _ "embed" "fmt" "regexp" "testing" @@ -19,97 +20,57 @@ import ( "github.com/hashicorp/terraform-plugin-testing/terraform" ) +//go:embed testdata/TestAccResourceKibanaConnectorFromSDK/connector.tf +var sdkIndexConnectorConfig string + +//go:embed testdata/TestAccResourceKibanaConnectorEmptyConfigFromSDK/connector.tf +var sdkSlackConnectorConfig string + func TestAccResourceKibanaConnectorCasesWebhook(t *testing.T) { minSupportedVersion := version.Must(version.NewSemver("8.4.0")) connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) - create := func(name, id string) string { - idAttribute := "" - if id != "" { - idAttribute = fmt.Sprintf(`connector_id = "%s"`, id) - } - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "%s" - %s - config = jsonencode({ - createIncidentJson = "{}" - createIncidentResponseKey = "key" - createIncidentUrl = "https://www.elastic.co/" - getIncidentResponseExternalTitleKey = "title" - getIncidentUrl = "https://www.elastic.co/" - updateIncidentJson = "{}" - updateIncidentUrl = "https://www.elastic.co/" - viewIncidentUrl = "https://www.elastic.co/" - }) - secrets = jsonencode({ - user = "user1" - password = "password1" - }) - connector_type_id = ".cases-webhook" - }`, - name, idAttribute) - } - - update := func(name, id string) string { - idAttribute := "" - if id != "" { - idAttribute = fmt.Sprintf(`connector_id = "%s"`, id) - } - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "Updated %s" - %s - config = jsonencode({ - createIncidentJson = "{}" - createIncidentResponseKey = "key" - createIncidentUrl = "https://www.elastic.co/" - getIncidentResponseExternalTitleKey = "title" - getIncidentUrl = "https://www.elastic.co/" - updateIncidentJson = "{}" - updateIncidentUrl = "https://elasticsearch.com/" - viewIncidentUrl = "https://www.elastic.co/" - createIncidentMethod = "put" - }) - secrets = jsonencode({ - user = "user2" - password = "password2" - }) - connector_type_id = ".cases-webhook" - }`, - name, idAttribute) + testCases := []struct { + name string + connectorID string + minVersion *version.Version + }{ + { + name: "with_empty_connector_id", + connectorID: "", + minVersion: minSupportedVersion, + }, + { + name: "with_predefined_connector_id", + connectorID: uuid.NewString(), + minVersion: connectors.MinVersionSupportingPreconfiguredIDs, + }, } - for _, connectorID := range []string{"", uuid.NewString()} { - t.Run(fmt.Sprintf("with connector ID '%s'", connectorID), func(t *testing.T) { - minVersion := minSupportedVersion - if connectorID != "" { - minVersion = connectors.MinVersionSupportingPreconfiguredIDs + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + vars := config.Variables{ + "connector_name": config.StringVariable(connectorName), } + if tc.connectorID != "" { + vars["connector_id"] = config.StringVariable(tc.connectorID) + } + resource.Test(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, CheckDestroy: checkResourceKibanaConnectorDestroy, ProtoV6ProviderFactories: acctest.Providers, Steps: []resource.TestStep{ { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersion), - Config: create(connectorName, connectorID), + SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minVersion), + ConfigDirectory: acctest.NamedTestCaseDirectory("create"), + ConfigVariables: vars, Check: resource.ComposeTestCheckFunc( testCommonAttributes(connectorName, ".cases-webhook"), resource.TestCheckResourceAttrWith("elasticstack_kibana_action_connector.test", "connector_id", func(value string) error { - if connectorID == "" { + if tc.connectorID == "" { if _, err := uuid.Parse(value); err != nil { return fmt.Errorf("expected connector_id to be a uuid: %w", err) } @@ -117,8 +78,8 @@ func TestAccResourceKibanaConnectorCasesWebhook(t *testing.T) { return nil } - if connectorID != value { - return fmt.Errorf("expected connector_id to match pre-defined id. '%s' != %s", connectorID, value) + if tc.connectorID != value { + return fmt.Errorf("expected connector_id to match pre-defined id. '%s' != %s", tc.connectorID, value) } return nil @@ -138,8 +99,9 @@ func TestAccResourceKibanaConnectorCasesWebhook(t *testing.T) { ), }, { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersion), - Config: update(connectorName, connectorID), + SkipFunc: versionutils.CheckIfVersionIsUnsupported(tc.minVersion), + ConfigDirectory: acctest.NamedTestCaseDirectory("update"), + ConfigVariables: vars, Check: resource.ComposeTestCheckFunc( testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), ".cases-webhook"), @@ -207,50 +169,17 @@ func TestAccResourceKibanaConnectorIndex(t *testing.T) { connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) - create := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "%s" - config = jsonencode({ - index = ".kibana" - refresh = true - }) - connector_type_id = ".index" - }`, - name) - } - - update := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "Updated %s" - config = jsonencode({ - index = ".kibana" - refresh = false - }) - connector_type_id = ".index" - }`, - name) - } - resource.Test(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, CheckDestroy: checkResourceKibanaConnectorDestroy, ProtoV6ProviderFactories: acctest.Providers, Steps: []resource.TestStep{ { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: create(connectorName), + SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), + ConfigDirectory: acctest.NamedTestCaseDirectory("create"), + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( testCommonAttributes(connectorName, ".index"), @@ -259,8 +188,11 @@ func TestAccResourceKibanaConnectorIndex(t *testing.T) { ), }, { - SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: update(connectorName), + SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), + ConfigDirectory: acctest.NamedTestCaseDirectory("update"), + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( testCommonAttributes(fmt.Sprintf("Updated %s", connectorName), ".index"), @@ -277,24 +209,6 @@ func TestAccResourceKibanaConnectorFromSDK(t *testing.T) { connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) - create := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "%s" - config = jsonencode({ - index = ".kibana" - refresh = true - }) - connector_type_id = ".index" - }`, - name) - } - resource.Test(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, CheckDestroy: checkResourceKibanaConnectorDestroy, @@ -308,7 +222,10 @@ func TestAccResourceKibanaConnectorFromSDK(t *testing.T) { }, }, SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: create(connectorName), + Config: sdkIndexConnectorConfig, + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( testCommonAttributes(connectorName, ".index"), @@ -319,7 +236,10 @@ func TestAccResourceKibanaConnectorFromSDK(t *testing.T) { { ProtoV6ProviderFactories: acctest.Providers, SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: create(connectorName), + ConfigDirectory: config.TestNameDirectory(), + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( testCommonAttributes(connectorName, ".index"), @@ -336,23 +256,6 @@ func TestAccResourceKibanaConnectorEmptyConfigFromSDK(t *testing.T) { connectorName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum) - create := func(name string) string { - return fmt.Sprintf(` - provider "elasticstack" { - elasticsearch {} - kibana {} - } - - resource "elasticstack_kibana_action_connector" "test" { - name = "%s" - connector_type_id = ".slack" - secrets = jsonencode({ - webhookUrl = "https://example.com/webhook" - }) - }`, - name) - } - resource.Test(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, CheckDestroy: checkResourceKibanaConnectorDestroy, @@ -366,7 +269,10 @@ func TestAccResourceKibanaConnectorEmptyConfigFromSDK(t *testing.T) { }, }, SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: create(connectorName), + Config: sdkSlackConnectorConfig, + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( testCommonAttributes(connectorName, ".slack"), @@ -376,7 +282,10 @@ func TestAccResourceKibanaConnectorEmptyConfigFromSDK(t *testing.T) { { ProtoV6ProviderFactories: acctest.Providers, SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedVersion), - Config: create(connectorName), + ConfigDirectory: config.TestNameDirectory(), + ConfigVariables: config.Variables{ + "connector_name": config.StringVariable(connectorName), + }, Check: resource.ComposeTestCheckFunc( testCommonAttributes(connectorName, ".slack"), diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/create/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/create/connector.tf new file mode 100644 index 000000000..ac2fd6df6 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/create/connector.tf @@ -0,0 +1,23 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = var.connector_name + config = jsonencode({ + createIncidentJson = "{}" + createIncidentResponseKey = "key" + createIncidentUrl = "https://www.elastic.co/" + getIncidentResponseExternalTitleKey = "title" + getIncidentUrl = "https://www.elastic.co/" + updateIncidentJson = "{}" + updateIncidentUrl = "https://www.elastic.co/" + viewIncidentUrl = "https://www.elastic.co/" + }) + secrets = jsonencode({ + user = "user1" + password = "password1" + }) + connector_type_id = ".cases-webhook" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/update/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/update/connector.tf new file mode 100644 index 000000000..3f436f34a --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_empty_connector_id/update/connector.tf @@ -0,0 +1,24 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = "Updated ${var.connector_name}" + config = jsonencode({ + createIncidentJson = "{}" + createIncidentResponseKey = "key" + createIncidentUrl = "https://www.elastic.co/" + getIncidentResponseExternalTitleKey = "title" + getIncidentUrl = "https://www.elastic.co/" + updateIncidentJson = "{}" + updateIncidentUrl = "https://elasticsearch.com/" + viewIncidentUrl = "https://www.elastic.co/" + createIncidentMethod = "put" + }) + secrets = jsonencode({ + user = "user2" + password = "password2" + }) + connector_type_id = ".cases-webhook" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/create/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/create/connector.tf new file mode 100644 index 000000000..ed759f5bf --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/create/connector.tf @@ -0,0 +1,29 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +variable "connector_id" { + description = "Connector ID" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = var.connector_name + connector_id = var.connector_id + config = jsonencode({ + createIncidentJson = "{}" + createIncidentResponseKey = "key" + createIncidentUrl = "https://www.elastic.co/" + getIncidentResponseExternalTitleKey = "title" + getIncidentUrl = "https://www.elastic.co/" + updateIncidentJson = "{}" + updateIncidentUrl = "https://www.elastic.co/" + viewIncidentUrl = "https://www.elastic.co/" + }) + secrets = jsonencode({ + user = "user1" + password = "password1" + }) + connector_type_id = ".cases-webhook" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/update/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/update/connector.tf new file mode 100644 index 000000000..d3d334bf9 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorCasesWebhook/with_predefined_connector_id/update/connector.tf @@ -0,0 +1,30 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +variable "connector_id" { + description = "Connector ID" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = "Updated ${var.connector_name}" + connector_id = var.connector_id + config = jsonencode({ + createIncidentJson = "{}" + createIncidentResponseKey = "key" + createIncidentUrl = "https://www.elastic.co/" + getIncidentResponseExternalTitleKey = "title" + getIncidentUrl = "https://www.elastic.co/" + updateIncidentJson = "{}" + updateIncidentUrl = "https://elasticsearch.com/" + viewIncidentUrl = "https://www.elastic.co/" + createIncidentMethod = "put" + }) + secrets = jsonencode({ + user = "user2" + password = "password2" + }) + connector_type_id = ".cases-webhook" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorEmptyConfigFromSDK/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorEmptyConfigFromSDK/connector.tf new file mode 100644 index 000000000..498466393 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorEmptyConfigFromSDK/connector.tf @@ -0,0 +1,17 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +provider "elasticstack" { + elasticsearch {} + kibana {} +} + +resource "elasticstack_kibana_action_connector" "test" { + name = var.connector_name + connector_type_id = ".slack" + secrets = jsonencode({ + webhookUrl = "https://example.com/webhook" + }) +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorFromSDK/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorFromSDK/connector.tf new file mode 100644 index 000000000..e13f5e783 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorFromSDK/connector.tf @@ -0,0 +1,18 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +provider "elasticstack" { + elasticsearch {} + kibana {} +} + +resource "elasticstack_kibana_action_connector" "test" { + name = var.connector_name + config = jsonencode({ + index = ".kibana" + refresh = true + }) + connector_type_id = ".index" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/create/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/create/connector.tf new file mode 100644 index 000000000..3b063d277 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/create/connector.tf @@ -0,0 +1,13 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = var.connector_name + config = jsonencode({ + index = ".kibana" + refresh = true + }) + connector_type_id = ".index" +} diff --git a/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/update/connector.tf b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/update/connector.tf new file mode 100644 index 000000000..4193fc380 --- /dev/null +++ b/internal/kibana/connectors/testdata/TestAccResourceKibanaConnectorIndex/update/connector.tf @@ -0,0 +1,13 @@ +variable "connector_name" { + description = "The connector name" + type = string +} + +resource "elasticstack_kibana_action_connector" "test" { + name = "Updated ${var.connector_name}" + config = jsonencode({ + index = ".kibana" + refresh = false + }) + connector_type_id = ".index" +}