For_Each block in terraform test file

Is there a way to incorporate the for_each block in a Terraform test file? I have multiple resource groups created and need to devise tests for each one.

Although I can write separate test cases for each resource, I’m wondering if there’s a way to utilize the for_each block within the run block or if there are any alternative suggestions to address this situation?

variable resource_group_variables = {
“resource_group_1” = {
resource_group_name = “test1”
resource_group_location = “eastus2”
resource_group_managed_by = “blabla” #(optional) The ID of the resource or application that manages this Resource Group.
resource_group_tags = {
Created_By = “testuser”,
Department = “IT”
}
},
“resource_group_2” = {
resource_group_name = “test2” #(Required) Name of the Resouce Group with which it should be created.
resource_group_location = “westus”
resource_group_managed_by = “blabla”
resource_group_tags = {
Created_By = “testuser”,
Department = “IT”
}
}
}

1 Like

Hi @anoop.pc, unfortunately I can’t think of anyway to do this purely within Terraform Test files. We have some long term plans to add for_each support to run blocks, but I think you might actually want them as part of the assertions which is something we haven’t thought much about.

You could potentially write a helper module that loads your target resources via a data source. You can then place a for_each within the data source, and write assertions as post conditions against the data source. Each post condition would then assert against the relevant values in the for_each. Then simply executing the helper module in a run block would attempt to load the data sources and as part of that the post conditions would be validated.

It’s not ideal, but the closest thing I can think of in terms of repeatable assertions. You could write out your idea for for_each meta attributes in assertions as an enhancement request within the Terraform repository. This would raise the issue with our product team.

Thanks!

1 Like

Yes, having for_each in assertions would be very useful.

For example

  assert {
    for_each      = [
      "serviceAccount:bar@foo-testproject.iam.gserviceaccount.com",
      "user:joe.smith@example.com",
    ]
    condition     = contains(
      keys(google_secret_manager_secret_iam_member.accessor_membership),
      each.key
    )
    error_message = "Member not found."
  }

Seems like there’s a proposal for addressing this, either using for_each or dynamic blocks.