From 64e2955e46cd322dada3c22d9d3eb365c34213d6 Mon Sep 17 00:00:00 2001 From: Jitendra Gangwar Date: Tue, 20 Jan 2026 13:28:31 +0530 Subject: [PATCH 1/3] azurerm_api_management_logger: fixes TestAccApiManagementLogger_update because of ForceNew attributes --- .../api_management_logger_resource_test.go | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/internal/services/apimanagement/api_management_logger_resource_test.go b/internal/services/apimanagement/api_management_logger_resource_test.go index 523d2f500312..f55e4b5276f7 100644 --- a/internal/services/apimanagement/api_management_logger_resource_test.go +++ b/internal/services/apimanagement/api_management_logger_resource_test.go @@ -10,6 +10,8 @@ import ( "github.com/hashicorp/go-azure-helpers/lang/pointer" "github.com/hashicorp/go-azure-sdk/resource-manager/apimanagement/2022-08-01/logger" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/plancheck" "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance" "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check" "github.com/hashicorp/terraform-provider-azurerm/internal/clients" @@ -174,35 +176,41 @@ func TestAccApiManagementLogger_complete(t *testing.T) { }) } +// Uses ResourceTestIgnoreRecreate because eventhub, application_insights, and resource_id +// are ForceNew attributes - switching between them triggers resource recreation (replacement). func TestAccApiManagementLogger_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_api_management_logger", "test") r := ApiManagementLoggerResource{} - data.ResourceTest(t, r, []acceptance.TestStep{ + data.ResourceTestIgnoreRecreate(t, r, []acceptance.TestStep{ { - Config: r.basicApplicationInsights(data), + Config: r.basicEventHub(data), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("true"), check.That(data.ResourceName).Key("description").HasValue(""), - check.That(data.ResourceName).Key("eventhub.#").HasValue("0"), - check.That(data.ResourceName).Key("application_insights.#").HasValue("1"), - check.That(data.ResourceName).Key("application_insights.0.instrumentation_key").Exists(), + check.That(data.ResourceName).Key("eventhub.#").HasValue("1"), + check.That(data.ResourceName).Key("eventhub.0.name").Exists(), + check.That(data.ResourceName).Key("eventhub.0.connection_string").Exists(), ), }, { - Config: r.basicEventHub(data), + // Switching from eventhub to application_insights triggers recreation + Config: r.basicApplicationInsights(data), + ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionReplace), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("true"), check.That(data.ResourceName).Key("description").HasValue(""), - check.That(data.ResourceName).Key("eventhub.#").HasValue("1"), - check.That(data.ResourceName).Key("eventhub.0.name").Exists(), - check.That(data.ResourceName).Key("eventhub.0.connection_string").Exists(), + check.That(data.ResourceName).Key("eventhub.#").HasValue("0"), + check.That(data.ResourceName).Key("application_insights.#").HasValue("1"), + check.That(data.ResourceName).Key("application_insights.0.instrumentation_key").Exists(), ), }, { - Config: r.complete(data, "Logger from Terraform test", "false"), + // applications_insights resource_id is ForceNew - changing it triggers recreation + Config: r.complete(data, "Logger from Terraform test", "false"), + ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionReplace), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("false"), @@ -213,7 +221,8 @@ func TestAccApiManagementLogger_update(t *testing.T) { ), }, { - Config: r.complete(data, "Logger from Terraform update test", "true"), + Config: r.complete(data, "Logger from Terraform update test", "true"), + ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionUpdate), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("true"), @@ -224,7 +233,8 @@ func TestAccApiManagementLogger_update(t *testing.T) { ), }, { - Config: r.complete(data, "Logger from Terraform test", "false"), + Config: r.complete(data, "Logger from Terraform test", "false"), + ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionUpdate), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("false"), @@ -235,7 +245,9 @@ func TestAccApiManagementLogger_update(t *testing.T) { ), }, { - Config: r.basicEventHub(data), + // Switching from application_insights to eventhub triggers recreation + Config: r.basicEventHub(data), + ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionReplace), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("true"), @@ -248,6 +260,14 @@ func TestAccApiManagementLogger_update(t *testing.T) { }) } +func preApplyExpectActionCheck(resourceName string, actionType plancheck.ResourceActionType) resource.ConfigPlanChecks { + return resource.ConfigPlanChecks{ + PreApply: []plancheck.PlanCheck{ + plancheck.ExpectResourceAction(resourceName, actionType), + }, + } +} + func (ApiManagementLoggerResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { id, err := logger.ParseLoggerID(state.ID) if err != nil { From a33f6be52b0b63699018448d78b039424b1c8f8b Mon Sep 17 00:00:00 2001 From: Jitendra Gangwar Date: Mon, 2 Feb 2026 16:34:47 +0530 Subject: [PATCH 2/3] addressed review changes by creating a new config with updated fields only --- .../api_management_logger_resource_test.go | 105 ++++++++---------- 1 file changed, 47 insertions(+), 58 deletions(-) diff --git a/internal/services/apimanagement/api_management_logger_resource_test.go b/internal/services/apimanagement/api_management_logger_resource_test.go index f55e4b5276f7..fe12117b1205 100644 --- a/internal/services/apimanagement/api_management_logger_resource_test.go +++ b/internal/services/apimanagement/api_management_logger_resource_test.go @@ -10,8 +10,6 @@ import ( "github.com/hashicorp/go-azure-helpers/lang/pointer" "github.com/hashicorp/go-azure-sdk/resource-manager/apimanagement/2022-08-01/logger" - "github.com/hashicorp/terraform-plugin-testing/helper/resource" - "github.com/hashicorp/terraform-plugin-testing/plancheck" "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance" "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check" "github.com/hashicorp/terraform-provider-azurerm/internal/clients" @@ -176,28 +174,13 @@ func TestAccApiManagementLogger_complete(t *testing.T) { }) } -// Uses ResourceTestIgnoreRecreate because eventhub, application_insights, and resource_id -// are ForceNew attributes - switching between them triggers resource recreation (replacement). func TestAccApiManagementLogger_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_api_management_logger", "test") r := ApiManagementLoggerResource{} - data.ResourceTestIgnoreRecreate(t, r, []acceptance.TestStep{ - { - Config: r.basicEventHub(data), - Check: acceptance.ComposeTestCheckFunc( - check.That(data.ResourceName).ExistsInAzure(r), - check.That(data.ResourceName).Key("buffered").HasValue("true"), - check.That(data.ResourceName).Key("description").HasValue(""), - check.That(data.ResourceName).Key("eventhub.#").HasValue("1"), - check.That(data.ResourceName).Key("eventhub.0.name").Exists(), - check.That(data.ResourceName).Key("eventhub.0.connection_string").Exists(), - ), - }, + data.ResourceTest(t, r, []acceptance.TestStep{ { - // Switching from eventhub to application_insights triggers recreation - Config: r.basicApplicationInsights(data), - ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionReplace), + Config: r.basicApplicationInsights(data), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("true"), @@ -208,9 +191,7 @@ func TestAccApiManagementLogger_update(t *testing.T) { ), }, { - // applications_insights resource_id is ForceNew - changing it triggers recreation - Config: r.complete(data, "Logger from Terraform test", "false"), - ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionReplace), + Config: r.applicationInsightsUpdate(data, "Logger from Terraform test", "false"), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("false"), @@ -221,53 +202,19 @@ func TestAccApiManagementLogger_update(t *testing.T) { ), }, { - Config: r.complete(data, "Logger from Terraform update test", "true"), - ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionUpdate), + Config: r.basicApplicationInsights(data), Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("buffered").HasValue("true"), - check.That(data.ResourceName).Key("description").HasValue("Logger from Terraform update test"), - check.That(data.ResourceName).Key("eventhub.#").HasValue("0"), - check.That(data.ResourceName).Key("application_insights.#").HasValue("1"), - check.That(data.ResourceName).Key("application_insights.0.instrumentation_key").Exists(), - ), - }, - { - Config: r.complete(data, "Logger from Terraform test", "false"), - ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionUpdate), - Check: acceptance.ComposeTestCheckFunc( - check.That(data.ResourceName).ExistsInAzure(r), - check.That(data.ResourceName).Key("buffered").HasValue("false"), - check.That(data.ResourceName).Key("description").HasValue("Logger from Terraform test"), + check.That(data.ResourceName).Key("description").HasValue(""), check.That(data.ResourceName).Key("eventhub.#").HasValue("0"), check.That(data.ResourceName).Key("application_insights.#").HasValue("1"), check.That(data.ResourceName).Key("application_insights.0.instrumentation_key").Exists(), ), }, - { - // Switching from application_insights to eventhub triggers recreation - Config: r.basicEventHub(data), - ConfigPlanChecks: preApplyExpectActionCheck(data.ResourceName, plancheck.ResourceActionReplace), - Check: acceptance.ComposeTestCheckFunc( - check.That(data.ResourceName).ExistsInAzure(r), - check.That(data.ResourceName).Key("buffered").HasValue("true"), - check.That(data.ResourceName).Key("description").HasValue(""), - check.That(data.ResourceName).Key("eventhub.#").HasValue("1"), - check.That(data.ResourceName).Key("eventhub.0.name").Exists(), - check.That(data.ResourceName).Key("eventhub.0.connection_string").Exists(), - ), - }, }) } -func preApplyExpectActionCheck(resourceName string, actionType plancheck.ResourceActionType) resource.ConfigPlanChecks { - return resource.ConfigPlanChecks{ - PreApply: []plancheck.PlanCheck{ - plancheck.ExpectResourceAction(resourceName, actionType), - }, - } -} - func (ApiManagementLoggerResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { id, err := logger.ParseLoggerID(state.ID) if err != nil { @@ -516,6 +463,48 @@ resource "azurerm_api_management_logger" "test" { `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) } +func (ApiManagementLoggerResource) applicationInsightsUpdate(data acceptance.TestData, description, buffered string) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} + +resource "azurerm_resource_group" "test" { + name = "acctestRG-%[1]d" + location = "%[2]s" +} + +resource "azurerm_application_insights" "test" { + name = "acctestappinsights-%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + application_type = "other" +} + +resource "azurerm_api_management" "test" { + name = "acctestAM-%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + publisher_name = "pub1" + publisher_email = "pub1@email.com" + + sku_name = "Consumption_0" +} + +resource "azurerm_api_management_logger" "test" { + name = "acctestapimnglogger-%[1]d" + api_management_name = azurerm_api_management.test.name + resource_group_name = azurerm_resource_group.test.name + description = "%[3]s" + buffered = %[4]s + + application_insights { + instrumentation_key = azurerm_application_insights.test.instrumentation_key + } +} +`, data.RandomInteger, data.Locations.Primary, description, buffered) +} + func (ApiManagementLoggerResource) applicationInsightsConnectionString(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { From e37951e3866f11d6af289cd6352daee6f452f475 Mon Sep 17 00:00:00 2001 From: Jitendra Gangwar Date: Mon, 2 Feb 2026 20:02:53 +0530 Subject: [PATCH 3/3] added TestAccApiManagementLogger_switchBetweenApplicationInsightsAndEventHub --- .../api_management_logger_resource_test.go | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/internal/services/apimanagement/api_management_logger_resource_test.go b/internal/services/apimanagement/api_management_logger_resource_test.go index fe12117b1205..140dbf138c7f 100644 --- a/internal/services/apimanagement/api_management_logger_resource_test.go +++ b/internal/services/apimanagement/api_management_logger_resource_test.go @@ -10,6 +10,8 @@ import ( "github.com/hashicorp/go-azure-helpers/lang/pointer" "github.com/hashicorp/go-azure-sdk/resource-manager/apimanagement/2022-08-01/logger" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/plancheck" "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance" "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check" "github.com/hashicorp/terraform-provider-azurerm/internal/clients" @@ -215,6 +217,72 @@ func TestAccApiManagementLogger_update(t *testing.T) { }) } +func TestAccApiManagementLogger_switchBetweenApplicationInsightsAndEventHub(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_api_management_logger", "test") + r := ApiManagementLoggerResource{} + // switching between Application Insights and Event Hub requires recreation of the resource + data.ResourceTestIgnoreRecreate(t, r, []acceptance.TestStep{ + { + Config: r.basicEventHub(data), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + check.That(data.ResourceName).Key("buffered").HasValue("true"), + check.That(data.ResourceName).Key("description").HasValue(""), + check.That(data.ResourceName).Key("application_insights.#").HasValue("0"), + check.That(data.ResourceName).Key("eventhub.#").HasValue("1"), + check.That(data.ResourceName).Key("eventhub.0.name").Exists(), + check.That(data.ResourceName).Key("eventhub.0.connection_string").Exists(), + ), + }, + { + Config: r.basicApplicationInsights(data), + ConfigPlanChecks: expectResourceActionCheck(data.ResourceName, plancheck.ResourceActionReplace), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + check.That(data.ResourceName).Key("buffered").HasValue("true"), + check.That(data.ResourceName).Key("description").HasValue(""), + check.That(data.ResourceName).Key("eventhub.#").HasValue("0"), + check.That(data.ResourceName).Key("application_insights.#").HasValue("1"), + check.That(data.ResourceName).Key("application_insights.0.instrumentation_key").Exists(), + ), + }, + { + Config: r.complete(data, "Logger from Terraform test", "false"), + ConfigPlanChecks: expectResourceActionCheck(data.ResourceName, plancheck.ResourceActionReplace), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + check.That(data.ResourceName).Key("buffered").HasValue("false"), + check.That(data.ResourceName).Key("description").HasValue("Logger from Terraform test"), + check.That(data.ResourceName).Key("eventhub.#").HasValue("0"), + check.That(data.ResourceName).Key("application_insights.#").HasValue("1"), + check.That(data.ResourceName).Key("application_insights.0.instrumentation_key").Exists(), + check.That(data.ResourceName).Key("resource_id").Exists(), + ), + }, + { + Config: r.basicEventHub(data), + ConfigPlanChecks: expectResourceActionCheck(data.ResourceName, plancheck.ResourceActionReplace), + Check: acceptance.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + check.That(data.ResourceName).Key("buffered").HasValue("true"), + check.That(data.ResourceName).Key("description").HasValue(""), + check.That(data.ResourceName).Key("application_insights.#").HasValue("0"), + check.That(data.ResourceName).Key("eventhub.#").HasValue("1"), + check.That(data.ResourceName).Key("eventhub.0.name").Exists(), + check.That(data.ResourceName).Key("eventhub.0.connection_string").Exists(), + ), + }, + }) +} + +func expectResourceActionCheck(resourceName string, action plancheck.ResourceActionType) resource.ConfigPlanChecks { + return resource.ConfigPlanChecks{ + PreApply: []plancheck.PlanCheck{ + plancheck.ExpectResourceAction(resourceName, action), + }, + } +} + func (ApiManagementLoggerResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { id, err := logger.ParseLoggerID(state.ID) if err != nil {