[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-hashicorp-provider-test-patterns":3,"mdc--3qkz9w-key":37,"related-org-hashicorp-provider-test-patterns":2711,"related-repo-hashicorp-provider-test-patterns":2863},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"provider-test-patterns","implement Terraform provider acceptance test patterns","Terraform provider acceptance test patterns using terraform-plugin-testing with the Plugin Framework. Covers test structure, TestCase\u002FTestStep fields, ConfigStateChecks with custom statecheck.StateCheck implementations, plan checks, CompareValue for cross-step assertions, config helpers, import testing with ImportStateKind, sweepers, and scenario patterns (basic, update, disappears, validation, regression), and ephemeral resource testing with the echoprovider package. Use when writing, reviewing, or debugging provider acceptance tests, including questions about statecheck, plancheck, TestCheckFunc, CheckDestroy, ExpectError, import state verification, ephemeral resources, or how to structure test files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"hashicorp","HashiCorp","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fhashicorp.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"QA","qa","tag",{"name":17,"slug":18,"type":15},"Plugin Development","plugin-development",{"name":20,"slug":21,"type":15},"Terraform","terraform",{"name":23,"slug":24,"type":15},"Testing","testing",728,"https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fagent-skills","2026-04-06T18:25:14.352781",null,104,[31],"doormat-managed",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"A collection of Agent skills and Claude Code plugins for HashiCorp products.","https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fterraform\u002Fprovider-development\u002Fskills\u002Fprovider-test-patterns","---\nname: provider-test-patterns\ndescription: >-\n  Terraform provider acceptance test patterns using terraform-plugin-testing\n  with the Plugin Framework. Covers test structure, TestCase\u002FTestStep fields,\n  ConfigStateChecks with custom statecheck.StateCheck implementations,\n  plan checks, CompareValue for cross-step assertions, config helpers,\n  import testing with ImportStateKind, sweepers, and scenario patterns\n  (basic, update, disappears, validation, regression), and ephemeral resource\n  testing with the echoprovider package. Use when writing, reviewing, or\n  debugging provider acceptance tests, including questions about statecheck,\n  plancheck, TestCheckFunc, CheckDestroy, ExpectError, import state\n  verification, ephemeral resources, or how to structure test files.\nmetadata:\n  copyright: Copyright IBM Corp. 2026\n  version: \"0.0.1\"\n---\n\n# Provider Acceptance Test Patterns\n\nPatterns for writing acceptance tests using\n[terraform-plugin-testing](https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fterraform-plugin-testing)\nwith the [Plugin Framework](https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fterraform-plugin-framework).\n\nSource: [HashiCorp Testing Patterns](https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Ftesting\u002Ftesting-patterns)\n\n**References** (load when needed):\n- `references\u002Fchecks.md` — statecheck, plancheck, knownvalue types, tfjsonpath, comparers\n- `references\u002Fsweepers.md` — sweeper setup, TestMain, dependencies\n- `references\u002Fephemeral.md` — ephemeral resource testing, echoprovider, multi-step patterns\n\n---\n\n## Test Lifecycle\n\nThe framework runs each TestStep through: **plan → apply → refresh → final\nplan**. If the final plan shows a diff, the test fails (unless\n`ExpectNonEmptyPlan` is set). After all steps, destroy runs followed by\n`CheckDestroy`. This means every test automatically verifies that\nconfigurations apply cleanly and produce no drift — no assertions needed for\nthat.\n\n---\n\n## Test Function Structure\n\n```go\nfunc TestAccExample_basic(t *testing.T) {\n    var widget example.Widget\n    rName := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)\n    resourceName := \"example_widget.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { testAccPreCheck(t) },\n        ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy,\n        Steps: []resource.TestStep{\n            {\n                Config: testAccExampleConfig_basic(rName),\n                ConfigStateChecks: []statecheck.StateCheck{\n                    stateCheckExampleExists(resourceName, &widget),\n                    statecheck.ExpectKnownValue(resourceName,\n                        tfjsonpath.New(\"name\"), knownvalue.StringExact(rName)),\n                    statecheck.ExpectKnownValue(resourceName,\n                        tfjsonpath.New(\"id\"), knownvalue.NotNull()),\n                },\n            },\n        },\n    })\n}\n```\n\nUse `resource.ParallelTest` by default. Use `resource.Test` only when tests\nshare state or cannot run concurrently.\n\n---\n\n## Provider Factory\n\n```go\n\u002F\u002F provider_test.go — Plugin Framework with Protocol 6 (use Protocol5 variant if needed)\nvar testAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){\n    \"example\": providerserver.NewProtocol6WithError(New(\"test\")()),\n}\n```\n\n---\n\n## TestCase Fields\n\n| Field | Purpose |\n|-------|---------|\n| `PreCheck` | `func()` — verify prerequisites (env vars, API access) |\n| `ProtoV6ProviderFactories` | Plugin Framework provider factories |\n| `CheckDestroy` | `TestCheckFunc` — verify resources destroyed after all steps |\n| `Steps` | `[]TestStep` — sequential test operations |\n| `TerraformVersionChecks` | `[]tfversion.TerraformVersionCheck` — gate by CLI version |\n\n---\n\n## TestStep Fields\n\n### Config Mode\n\n| Field | Purpose |\n|-------|---------|\n| `Config` | Inline HCL string to apply |\n| `ConfigStateChecks` | `[]statecheck.StateCheck` — modern assertions (preferred) |\n| `ConfigPlanChecks` | `resource.ConfigPlanChecks{PreApply: []plancheck.PlanCheck{...}}` |\n| `ExpectError` | `*regexp.Regexp` — expect failure matching pattern |\n| `ExpectNonEmptyPlan` | `bool` — expect non-empty plan after apply |\n| `PlanOnly` | `bool` — plan without applying |\n| `Destroy` | `bool` — run destroy step |\n| `PreConfig` | `func()` — setup before step |\n\n### Import Mode\n\n| Field | Purpose |\n|-------|---------|\n| `ImportState` | `true` to enable import mode |\n| `ImportStateVerify` | Verify imported state matches prior state |\n| `ImportStateVerifyIgnore` | `[]string` — attributes to skip during verify |\n| `ImportStateKind` | `resource.ImportBlockWithID` — import block generation |\n| `ResourceName` | Resource address to import |\n| `ImportStateId` | Override the ID used for import |\n\n---\n\n## Check Functions\n\n### Modern: ConfigStateChecks (preferred)\n\nType-safe with aggregated error reporting. Compose built-in checks with custom\n`statecheck.StateCheck` implementations. See `references\u002Fchecks.md` for full\nknownvalue types, tfjsonpath navigation, and comparers.\n\n```go\nConfigStateChecks: []statecheck.StateCheck{\n    stateCheckExampleExists(resourceName, &widget),\n    statecheck.ExpectKnownValue(resourceName,\n        tfjsonpath.New(\"name\"), knownvalue.StringExact(\"my-widget\")),\n    statecheck.ExpectKnownValue(resourceName,\n        tfjsonpath.New(\"enabled\"), knownvalue.Bool(true)),\n    statecheck.ExpectKnownValue(resourceName,\n        tfjsonpath.New(\"id\"), knownvalue.NotNull()),\n    statecheck.ExpectSensitiveValue(resourceName,\n        tfjsonpath.New(\"api_key\")),\n},\n```\n\nDo not mix `Check` (legacy) and `ConfigStateChecks` in the same step.\n\n### Legacy: Check (for CheckDestroy and migration)\n\n`CheckDestroy` on `TestCase` requires `TestCheckFunc`. The `Check` field on\n`TestStep` also accepts `TestCheckFunc` but prefer `ConfigStateChecks` for new\ntests.\n\n```go\nCheck: resource.ComposeAggregateTestCheckFunc(\n    resource.TestCheckResourceAttr(name, \"key\", \"expected\"),\n    resource.TestCheckResourceAttrSet(name, \"id\"),\n    resource.TestCheckNoResourceAttr(name, \"removed\"),\n    resource.TestMatchResourceAttr(name, \"url\", regexp.MustCompile(`^https:\u002F\u002F`)),\n    resource.TestCheckResourceAttrPair(res1, \"ref_id\", res2, \"id\"),\n),\n```\n\n`ComposeAggregateTestCheckFunc` reports all errors; `ComposeTestCheckFunc`\nfails fast on the first.\n\n---\n\n## Config Helpers\n\nUse numbered format verbs — `%[1]q` for quoted strings, `%[1]s` for raw:\n\n```go\nfunc testAccExampleConfig_basic(rName string) string {\n    return fmt.Sprintf(`\nresource \"example_widget\" \"test\" {\n  name = %[1]q\n}\n`, rName)\n}\n\nfunc testAccExampleConfig_full(rName, description string) string {\n    return fmt.Sprintf(`\nresource \"example_widget\" \"test\" {\n  name        = %[1]q\n  description = %[2]q\n  enabled     = true\n}\n`, rName, description)\n}\n```\n\n---\n\n## Scenario Patterns\n\n### Basic + Update (combine in one test — updates are supersets of basic)\n\n```go\nSteps: []resource.TestStep{\n    {\n        Config: testAccExampleConfig_basic(rName),\n        ConfigStateChecks: []statecheck.StateCheck{\n            stateCheckExampleExists(resourceName, &widget),\n            statecheck.ExpectKnownValue(resourceName,\n                tfjsonpath.New(\"name\"), knownvalue.StringExact(rName)),\n        },\n    },\n    {\n        Config: testAccExampleConfig_full(rName, \"updated\"),\n        ConfigStateChecks: []statecheck.StateCheck{\n            stateCheckExampleExists(resourceName, &widget),\n            statecheck.ExpectKnownValue(resourceName,\n                tfjsonpath.New(\"description\"), knownvalue.StringExact(\"updated\")),\n        },\n    },\n},\n```\n\n### Import\n\nAfter a config step, verify import produces identical state. Use\n`ImportStateKind` for import block generation:\n\n```go\n{\n    ResourceName:      resourceName,\n    ImportState:       true,\n    ImportStateVerify: true,\n    ImportStateKind:   resource.ImportBlockWithID,\n},\n```\n\n### Disappears (resource deleted externally)\n\n```go\n{\n    Config: testAccExampleConfig_basic(rName),\n    ConfigStateChecks: []statecheck.StateCheck{\n        stateCheckExampleExists(resourceName, &widget),\n        stateCheckExampleDisappears(resourceName),\n    },\n    ExpectNonEmptyPlan: true,\n},\n```\n\n### Validation (expect error)\n\n```go\n{\n    Config:      testAccExampleConfig_invalidName(\"\"),\n    ExpectError: regexp.MustCompile(`name must not be empty`),\n},\n```\n\n### Regression (two-commit workflow)\n\nA proper bug fix uses at least two commits: first commit the regression test\n(which fails, confirming the bug), then commit the fix (test passes). This\nlets reviewers independently verify the test reproduces the issue by checking\nout the first commit, then advancing to the fix.\n\nName and document regression tests to identify the issue they fix. Include a\nlink to the original bug report when possible.\n\n```go\n\u002F\u002F TestAccExample_regressionGH1234 verifies fix for https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\u002Fissues\u002F1234\nfunc TestAccExample_regressionGH1234(t *testing.T) {\n    rName := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)\n    resourceName := \"example_widget.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { testAccPreCheck(t) },\n        ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy,\n        Steps: []resource.TestStep{\n            {\n                \u002F\u002F Reproduce the issue: this config triggered the bug\n                Config: testAccExampleConfig_regressionGH1234(rName),\n                ConfigStateChecks: []statecheck.StateCheck{\n                    stateCheckExampleExists(resourceName, nil),\n                    statecheck.ExpectKnownValue(resourceName,\n                        tfjsonpath.New(\"computed_field\"), knownvalue.NotNull()),\n                },\n            },\n        },\n    })\n}\n```\n\n---\n\n## Helper Functions\n\n### Custom StateCheck: Exists\n\nImplement `statecheck.StateCheck` for API existence verification. Separate the\nexists check into its own function for reuse across steps — the source\nrecommends this as a design principle:\n\n```go\ntype exampleExistsCheck struct {\n    resourceAddress string\n    widget          *example.Widget\n}\n\nfunc (e exampleExistsCheck) CheckState(ctx context.Context, req statecheck.CheckStateRequest, resp *statecheck.CheckStateResponse) {\n    r, err := stateResourceAtAddress(req.State, e.resourceAddress)\n    if err != nil {\n        resp.Error = err\n        return\n    }\n\n    id, ok := r.AttributeValues[\"id\"].(string)\n    if !ok {\n        resp.Error = fmt.Errorf(\"no id found for %s\", e.resourceAddress)\n        return\n    }\n\n    conn := testAccAPIClient()\n    widget, err := conn.GetWidget(id)\n    if err != nil {\n        resp.Error = fmt.Errorf(\"%s not found via API: %w\", e.resourceAddress, err)\n        return\n    }\n\n    if e.widget != nil {\n        *e.widget = *widget\n    }\n}\n\nfunc stateCheckExampleExists(name string, widget *example.Widget) statecheck.StateCheck {\n    return exampleExistsCheck{resourceAddress: name, widget: widget}\n}\n```\n\n### Custom StateCheck: Disappears\n\nDelete a resource via API to simulate external deletion:\n\n```go\ntype exampleDisappearsCheck struct {\n    resourceAddress string\n}\n\nfunc (e exampleDisappearsCheck) CheckState(ctx context.Context, req statecheck.CheckStateRequest, resp *statecheck.CheckStateResponse) {\n    r, err := stateResourceAtAddress(req.State, e.resourceAddress)\n    if err != nil {\n        resp.Error = err\n        return\n    }\n\n    id := r.AttributeValues[\"id\"].(string)\n    conn := testAccAPIClient()\n    resp.Error = conn.DeleteWidget(id)\n}\n\nfunc stateCheckExampleDisappears(name string) statecheck.StateCheck {\n    return exampleDisappearsCheck{resourceAddress: name}\n}\n```\n\n### State Resource Lookup (shared utility)\n\n```go\nfunc stateResourceAtAddress(state *tfjson.State, address string) (*tfjson.StateResource, error) {\n    if state == nil || state.Values == nil || state.Values.RootModule == nil {\n        return nil, fmt.Errorf(\"no state available\")\n    }\n    for _, r := range state.Values.RootModule.Resources {\n        if r.Address == address {\n            return r, nil\n        }\n    }\n    return nil, fmt.Errorf(\"not found in state: %s\", address)\n}\n```\n\n### Destroy Check (TestCheckFunc — required by CheckDestroy)\n\n```go\nfunc testAccCheckExampleDestroy(s *terraform.State) error {\n    conn := testAccAPIClient()\n    for _, rs := range s.RootModule().Resources {\n        if rs.Type != \"example_widget\" {\n            continue\n        }\n        _, err := conn.GetWidget(rs.Primary.ID)\n        if err == nil {\n            return fmt.Errorf(\"widget %s still exists\", rs.Primary.ID)\n        }\n        if !isNotFoundError(err) {\n            return err\n        }\n    }\n    return nil\n}\n```\n\n### PreCheck\n\n```go\nfunc testAccPreCheck(t *testing.T) {\n    t.Helper()\n    if os.Getenv(\"EXAMPLE_API_KEY\") == \"\" {\n        t.Fatal(\"EXAMPLE_API_KEY must be set for acceptance tests\")\n    }\n}\n```\n",{"data":38,"body":42},{"name":4,"description":6,"metadata":39},{"copyright":40,"version":41},"Copyright IBM Corp. 2026","0.0.1",{"type":43,"children":44},"root",[45,54,80,92,103,142,146,153,181,184,190,410,431,434,440,478,481,487,623,626,632,639,831,837,977,980,986,992,1012,1105,1125,1131,1185,1248,1267,1270,1276,1297,1433,1436,1442,1448,1591,1597,1609,1663,1669,1737,1743,1780,1786,1791,1796,1963,1966,1972,1978,1990,2257,2263,2268,2414,2420,2512,2518,2647,2652,2705],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"provider-acceptance-test-patterns",[51],{"type":52,"value":53},"text","Provider Acceptance Test Patterns",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58,60,69,71,78],{"type":52,"value":59},"Patterns for writing acceptance tests using\n",{"type":46,"tag":61,"props":62,"children":66},"a",{"href":63,"rel":64},"https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fterraform-plugin-testing",[65],"nofollow",[67],{"type":52,"value":68},"terraform-plugin-testing",{"type":52,"value":70},"\nwith the ",{"type":46,"tag":61,"props":72,"children":75},{"href":73,"rel":74},"https:\u002F\u002Fgithub.com\u002Fhashicorp\u002Fterraform-plugin-framework",[65],[76],{"type":52,"value":77},"Plugin Framework",{"type":52,"value":79},".",{"type":46,"tag":55,"props":81,"children":82},{},[83,85],{"type":52,"value":84},"Source: ",{"type":46,"tag":61,"props":86,"children":89},{"href":87,"rel":88},"https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Fplugin\u002Ftesting\u002Ftesting-patterns",[65],[90],{"type":52,"value":91},"HashiCorp Testing Patterns",{"type":46,"tag":55,"props":93,"children":94},{},[95,101],{"type":46,"tag":96,"props":97,"children":98},"strong",{},[99],{"type":52,"value":100},"References",{"type":52,"value":102}," (load when needed):",{"type":46,"tag":104,"props":105,"children":106},"ul",{},[107,120,131],{"type":46,"tag":108,"props":109,"children":110},"li",{},[111,118],{"type":46,"tag":112,"props":113,"children":115},"code",{"className":114},[],[116],{"type":52,"value":117},"references\u002Fchecks.md",{"type":52,"value":119}," — statecheck, plancheck, knownvalue types, tfjsonpath, comparers",{"type":46,"tag":108,"props":121,"children":122},{},[123,129],{"type":46,"tag":112,"props":124,"children":126},{"className":125},[],[127],{"type":52,"value":128},"references\u002Fsweepers.md",{"type":52,"value":130}," — sweeper setup, TestMain, dependencies",{"type":46,"tag":108,"props":132,"children":133},{},[134,140],{"type":46,"tag":112,"props":135,"children":137},{"className":136},[],[138],{"type":52,"value":139},"references\u002Fephemeral.md",{"type":52,"value":141}," — ephemeral resource testing, echoprovider, multi-step patterns",{"type":46,"tag":143,"props":144,"children":145},"hr",{},[],{"type":46,"tag":147,"props":148,"children":150},"h2",{"id":149},"test-lifecycle",[151],{"type":52,"value":152},"Test Lifecycle",{"type":46,"tag":55,"props":154,"children":155},{},[156,158,163,165,171,173,179],{"type":52,"value":157},"The framework runs each TestStep through: ",{"type":46,"tag":96,"props":159,"children":160},{},[161],{"type":52,"value":162},"plan → apply → refresh → final\nplan",{"type":52,"value":164},". If the final plan shows a diff, the test fails (unless\n",{"type":46,"tag":112,"props":166,"children":168},{"className":167},[],[169],{"type":52,"value":170},"ExpectNonEmptyPlan",{"type":52,"value":172}," is set). After all steps, destroy runs followed by\n",{"type":46,"tag":112,"props":174,"children":176},{"className":175},[],[177],{"type":52,"value":178},"CheckDestroy",{"type":52,"value":180},". This means every test automatically verifies that\nconfigurations apply cleanly and produce no drift — no assertions needed for\nthat.",{"type":46,"tag":143,"props":182,"children":183},{},[],{"type":46,"tag":147,"props":185,"children":187},{"id":186},"test-function-structure",[188],{"type":52,"value":189},"Test Function Structure",{"type":46,"tag":191,"props":192,"children":197},"pre",{"className":193,"code":194,"language":195,"meta":196,"style":196},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func TestAccExample_basic(t *testing.T) {\n    var widget example.Widget\n    rName := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)\n    resourceName := \"example_widget.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { testAccPreCheck(t) },\n        ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy,\n        Steps: []resource.TestStep{\n            {\n                Config: testAccExampleConfig_basic(rName),\n                ConfigStateChecks: []statecheck.StateCheck{\n                    stateCheckExampleExists(resourceName, &widget),\n                    statecheck.ExpectKnownValue(resourceName,\n                        tfjsonpath.New(\"name\"), knownvalue.StringExact(rName)),\n                    statecheck.ExpectKnownValue(resourceName,\n                        tfjsonpath.New(\"id\"), knownvalue.NotNull()),\n                },\n            },\n        },\n    })\n}\n","go","",[198],{"type":46,"tag":112,"props":199,"children":200},{"__ignoreMap":196},[201,212,221,230,239,249,258,267,276,285,294,303,312,321,330,339,348,356,365,374,383,392,401],{"type":46,"tag":202,"props":203,"children":206},"span",{"class":204,"line":205},"line",1,[207],{"type":46,"tag":202,"props":208,"children":209},{},[210],{"type":52,"value":211},"func TestAccExample_basic(t *testing.T) {\n",{"type":46,"tag":202,"props":213,"children":215},{"class":204,"line":214},2,[216],{"type":46,"tag":202,"props":217,"children":218},{},[219],{"type":52,"value":220},"    var widget example.Widget\n",{"type":46,"tag":202,"props":222,"children":224},{"class":204,"line":223},3,[225],{"type":46,"tag":202,"props":226,"children":227},{},[228],{"type":52,"value":229},"    rName := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)\n",{"type":46,"tag":202,"props":231,"children":233},{"class":204,"line":232},4,[234],{"type":46,"tag":202,"props":235,"children":236},{},[237],{"type":52,"value":238},"    resourceName := \"example_widget.test\"\n",{"type":46,"tag":202,"props":240,"children":242},{"class":204,"line":241},5,[243],{"type":46,"tag":202,"props":244,"children":246},{"emptyLinePlaceholder":245},true,[247],{"type":52,"value":248},"\n",{"type":46,"tag":202,"props":250,"children":252},{"class":204,"line":251},6,[253],{"type":46,"tag":202,"props":254,"children":255},{},[256],{"type":52,"value":257},"    resource.ParallelTest(t, resource.TestCase{\n",{"type":46,"tag":202,"props":259,"children":261},{"class":204,"line":260},7,[262],{"type":46,"tag":202,"props":263,"children":264},{},[265],{"type":52,"value":266},"        PreCheck:                 func() { testAccPreCheck(t) },\n",{"type":46,"tag":202,"props":268,"children":270},{"class":204,"line":269},8,[271],{"type":46,"tag":202,"props":272,"children":273},{},[274],{"type":52,"value":275},"        ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,\n",{"type":46,"tag":202,"props":277,"children":279},{"class":204,"line":278},9,[280],{"type":46,"tag":202,"props":281,"children":282},{},[283],{"type":52,"value":284},"        CheckDestroy:             testAccCheckExampleDestroy,\n",{"type":46,"tag":202,"props":286,"children":288},{"class":204,"line":287},10,[289],{"type":46,"tag":202,"props":290,"children":291},{},[292],{"type":52,"value":293},"        Steps: []resource.TestStep{\n",{"type":46,"tag":202,"props":295,"children":297},{"class":204,"line":296},11,[298],{"type":46,"tag":202,"props":299,"children":300},{},[301],{"type":52,"value":302},"            {\n",{"type":46,"tag":202,"props":304,"children":306},{"class":204,"line":305},12,[307],{"type":46,"tag":202,"props":308,"children":309},{},[310],{"type":52,"value":311},"                Config: testAccExampleConfig_basic(rName),\n",{"type":46,"tag":202,"props":313,"children":315},{"class":204,"line":314},13,[316],{"type":46,"tag":202,"props":317,"children":318},{},[319],{"type":52,"value":320},"                ConfigStateChecks: []statecheck.StateCheck{\n",{"type":46,"tag":202,"props":322,"children":324},{"class":204,"line":323},14,[325],{"type":46,"tag":202,"props":326,"children":327},{},[328],{"type":52,"value":329},"                    stateCheckExampleExists(resourceName, &widget),\n",{"type":46,"tag":202,"props":331,"children":333},{"class":204,"line":332},15,[334],{"type":46,"tag":202,"props":335,"children":336},{},[337],{"type":52,"value":338},"                    statecheck.ExpectKnownValue(resourceName,\n",{"type":46,"tag":202,"props":340,"children":342},{"class":204,"line":341},16,[343],{"type":46,"tag":202,"props":344,"children":345},{},[346],{"type":52,"value":347},"                        tfjsonpath.New(\"name\"), knownvalue.StringExact(rName)),\n",{"type":46,"tag":202,"props":349,"children":351},{"class":204,"line":350},17,[352],{"type":46,"tag":202,"props":353,"children":354},{},[355],{"type":52,"value":338},{"type":46,"tag":202,"props":357,"children":359},{"class":204,"line":358},18,[360],{"type":46,"tag":202,"props":361,"children":362},{},[363],{"type":52,"value":364},"                        tfjsonpath.New(\"id\"), knownvalue.NotNull()),\n",{"type":46,"tag":202,"props":366,"children":368},{"class":204,"line":367},19,[369],{"type":46,"tag":202,"props":370,"children":371},{},[372],{"type":52,"value":373},"                },\n",{"type":46,"tag":202,"props":375,"children":377},{"class":204,"line":376},20,[378],{"type":46,"tag":202,"props":379,"children":380},{},[381],{"type":52,"value":382},"            },\n",{"type":46,"tag":202,"props":384,"children":386},{"class":204,"line":385},21,[387],{"type":46,"tag":202,"props":388,"children":389},{},[390],{"type":52,"value":391},"        },\n",{"type":46,"tag":202,"props":393,"children":395},{"class":204,"line":394},22,[396],{"type":46,"tag":202,"props":397,"children":398},{},[399],{"type":52,"value":400},"    })\n",{"type":46,"tag":202,"props":402,"children":404},{"class":204,"line":403},23,[405],{"type":46,"tag":202,"props":406,"children":407},{},[408],{"type":52,"value":409},"}\n",{"type":46,"tag":55,"props":411,"children":412},{},[413,415,421,423,429],{"type":52,"value":414},"Use ",{"type":46,"tag":112,"props":416,"children":418},{"className":417},[],[419],{"type":52,"value":420},"resource.ParallelTest",{"type":52,"value":422}," by default. Use ",{"type":46,"tag":112,"props":424,"children":426},{"className":425},[],[427],{"type":52,"value":428},"resource.Test",{"type":52,"value":430}," only when tests\nshare state or cannot run concurrently.",{"type":46,"tag":143,"props":432,"children":433},{},[],{"type":46,"tag":147,"props":435,"children":437},{"id":436},"provider-factory",[438],{"type":52,"value":439},"Provider Factory",{"type":46,"tag":191,"props":441,"children":443},{"className":193,"code":442,"language":195,"meta":196,"style":196},"\u002F\u002F provider_test.go — Plugin Framework with Protocol 6 (use Protocol5 variant if needed)\nvar testAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){\n    \"example\": providerserver.NewProtocol6WithError(New(\"test\")()),\n}\n",[444],{"type":46,"tag":112,"props":445,"children":446},{"__ignoreMap":196},[447,455,463,471],{"type":46,"tag":202,"props":448,"children":449},{"class":204,"line":205},[450],{"type":46,"tag":202,"props":451,"children":452},{},[453],{"type":52,"value":454},"\u002F\u002F provider_test.go — Plugin Framework with Protocol 6 (use Protocol5 variant if needed)\n",{"type":46,"tag":202,"props":456,"children":457},{"class":204,"line":214},[458],{"type":46,"tag":202,"props":459,"children":460},{},[461],{"type":52,"value":462},"var testAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){\n",{"type":46,"tag":202,"props":464,"children":465},{"class":204,"line":223},[466],{"type":46,"tag":202,"props":467,"children":468},{},[469],{"type":52,"value":470},"    \"example\": providerserver.NewProtocol6WithError(New(\"test\")()),\n",{"type":46,"tag":202,"props":472,"children":473},{"class":204,"line":232},[474],{"type":46,"tag":202,"props":475,"children":476},{},[477],{"type":52,"value":409},{"type":46,"tag":143,"props":479,"children":480},{},[],{"type":46,"tag":147,"props":482,"children":484},{"id":483},"testcase-fields",[485],{"type":52,"value":486},"TestCase Fields",{"type":46,"tag":488,"props":489,"children":490},"table",{},[491,510],{"type":46,"tag":492,"props":493,"children":494},"thead",{},[495],{"type":46,"tag":496,"props":497,"children":498},"tr",{},[499,505],{"type":46,"tag":500,"props":501,"children":502},"th",{},[503],{"type":52,"value":504},"Field",{"type":46,"tag":500,"props":506,"children":507},{},[508],{"type":52,"value":509},"Purpose",{"type":46,"tag":511,"props":512,"children":513},"tbody",{},[514,538,555,577,600],{"type":46,"tag":496,"props":515,"children":516},{},[517,527],{"type":46,"tag":518,"props":519,"children":520},"td",{},[521],{"type":46,"tag":112,"props":522,"children":524},{"className":523},[],[525],{"type":52,"value":526},"PreCheck",{"type":46,"tag":518,"props":528,"children":529},{},[530,536],{"type":46,"tag":112,"props":531,"children":533},{"className":532},[],[534],{"type":52,"value":535},"func()",{"type":52,"value":537}," — verify prerequisites (env vars, API access)",{"type":46,"tag":496,"props":539,"children":540},{},[541,550],{"type":46,"tag":518,"props":542,"children":543},{},[544],{"type":46,"tag":112,"props":545,"children":547},{"className":546},[],[548],{"type":52,"value":549},"ProtoV6ProviderFactories",{"type":46,"tag":518,"props":551,"children":552},{},[553],{"type":52,"value":554},"Plugin Framework provider factories",{"type":46,"tag":496,"props":556,"children":557},{},[558,566],{"type":46,"tag":518,"props":559,"children":560},{},[561],{"type":46,"tag":112,"props":562,"children":564},{"className":563},[],[565],{"type":52,"value":178},{"type":46,"tag":518,"props":567,"children":568},{},[569,575],{"type":46,"tag":112,"props":570,"children":572},{"className":571},[],[573],{"type":52,"value":574},"TestCheckFunc",{"type":52,"value":576}," — verify resources destroyed after all steps",{"type":46,"tag":496,"props":578,"children":579},{},[580,589],{"type":46,"tag":518,"props":581,"children":582},{},[583],{"type":46,"tag":112,"props":584,"children":586},{"className":585},[],[587],{"type":52,"value":588},"Steps",{"type":46,"tag":518,"props":590,"children":591},{},[592,598],{"type":46,"tag":112,"props":593,"children":595},{"className":594},[],[596],{"type":52,"value":597},"[]TestStep",{"type":52,"value":599}," — sequential test operations",{"type":46,"tag":496,"props":601,"children":602},{},[603,612],{"type":46,"tag":518,"props":604,"children":605},{},[606],{"type":46,"tag":112,"props":607,"children":609},{"className":608},[],[610],{"type":52,"value":611},"TerraformVersionChecks",{"type":46,"tag":518,"props":613,"children":614},{},[615,621],{"type":46,"tag":112,"props":616,"children":618},{"className":617},[],[619],{"type":52,"value":620},"[]tfversion.TerraformVersionCheck",{"type":52,"value":622}," — gate by CLI version",{"type":46,"tag":143,"props":624,"children":625},{},[],{"type":46,"tag":147,"props":627,"children":629},{"id":628},"teststep-fields",[630],{"type":52,"value":631},"TestStep Fields",{"type":46,"tag":633,"props":634,"children":636},"h3",{"id":635},"config-mode",[637],{"type":52,"value":638},"Config Mode",{"type":46,"tag":488,"props":640,"children":641},{},[642,656],{"type":46,"tag":492,"props":643,"children":644},{},[645],{"type":46,"tag":496,"props":646,"children":647},{},[648,652],{"type":46,"tag":500,"props":649,"children":650},{},[651],{"type":52,"value":504},{"type":46,"tag":500,"props":653,"children":654},{},[655],{"type":52,"value":509},{"type":46,"tag":511,"props":657,"children":658},{},[659,676,699,720,743,765,787,809],{"type":46,"tag":496,"props":660,"children":661},{},[662,671],{"type":46,"tag":518,"props":663,"children":664},{},[665],{"type":46,"tag":112,"props":666,"children":668},{"className":667},[],[669],{"type":52,"value":670},"Config",{"type":46,"tag":518,"props":672,"children":673},{},[674],{"type":52,"value":675},"Inline HCL string to apply",{"type":46,"tag":496,"props":677,"children":678},{},[679,688],{"type":46,"tag":518,"props":680,"children":681},{},[682],{"type":46,"tag":112,"props":683,"children":685},{"className":684},[],[686],{"type":52,"value":687},"ConfigStateChecks",{"type":46,"tag":518,"props":689,"children":690},{},[691,697],{"type":46,"tag":112,"props":692,"children":694},{"className":693},[],[695],{"type":52,"value":696},"[]statecheck.StateCheck",{"type":52,"value":698}," — modern assertions (preferred)",{"type":46,"tag":496,"props":700,"children":701},{},[702,711],{"type":46,"tag":518,"props":703,"children":704},{},[705],{"type":46,"tag":112,"props":706,"children":708},{"className":707},[],[709],{"type":52,"value":710},"ConfigPlanChecks",{"type":46,"tag":518,"props":712,"children":713},{},[714],{"type":46,"tag":112,"props":715,"children":717},{"className":716},[],[718],{"type":52,"value":719},"resource.ConfigPlanChecks{PreApply: []plancheck.PlanCheck{...}}",{"type":46,"tag":496,"props":721,"children":722},{},[723,732],{"type":46,"tag":518,"props":724,"children":725},{},[726],{"type":46,"tag":112,"props":727,"children":729},{"className":728},[],[730],{"type":52,"value":731},"ExpectError",{"type":46,"tag":518,"props":733,"children":734},{},[735,741],{"type":46,"tag":112,"props":736,"children":738},{"className":737},[],[739],{"type":52,"value":740},"*regexp.Regexp",{"type":52,"value":742}," — expect failure matching pattern",{"type":46,"tag":496,"props":744,"children":745},{},[746,754],{"type":46,"tag":518,"props":747,"children":748},{},[749],{"type":46,"tag":112,"props":750,"children":752},{"className":751},[],[753],{"type":52,"value":170},{"type":46,"tag":518,"props":755,"children":756},{},[757,763],{"type":46,"tag":112,"props":758,"children":760},{"className":759},[],[761],{"type":52,"value":762},"bool",{"type":52,"value":764}," — expect non-empty plan after apply",{"type":46,"tag":496,"props":766,"children":767},{},[768,777],{"type":46,"tag":518,"props":769,"children":770},{},[771],{"type":46,"tag":112,"props":772,"children":774},{"className":773},[],[775],{"type":52,"value":776},"PlanOnly",{"type":46,"tag":518,"props":778,"children":779},{},[780,785],{"type":46,"tag":112,"props":781,"children":783},{"className":782},[],[784],{"type":52,"value":762},{"type":52,"value":786}," — plan without applying",{"type":46,"tag":496,"props":788,"children":789},{},[790,799],{"type":46,"tag":518,"props":791,"children":792},{},[793],{"type":46,"tag":112,"props":794,"children":796},{"className":795},[],[797],{"type":52,"value":798},"Destroy",{"type":46,"tag":518,"props":800,"children":801},{},[802,807],{"type":46,"tag":112,"props":803,"children":805},{"className":804},[],[806],{"type":52,"value":762},{"type":52,"value":808}," — run destroy step",{"type":46,"tag":496,"props":810,"children":811},{},[812,821],{"type":46,"tag":518,"props":813,"children":814},{},[815],{"type":46,"tag":112,"props":816,"children":818},{"className":817},[],[819],{"type":52,"value":820},"PreConfig",{"type":46,"tag":518,"props":822,"children":823},{},[824,829],{"type":46,"tag":112,"props":825,"children":827},{"className":826},[],[828],{"type":52,"value":535},{"type":52,"value":830}," — setup before step",{"type":46,"tag":633,"props":832,"children":834},{"id":833},"import-mode",[835],{"type":52,"value":836},"Import Mode",{"type":46,"tag":488,"props":838,"children":839},{},[840,854],{"type":46,"tag":492,"props":841,"children":842},{},[843],{"type":46,"tag":496,"props":844,"children":845},{},[846,850],{"type":46,"tag":500,"props":847,"children":848},{},[849],{"type":52,"value":504},{"type":46,"tag":500,"props":851,"children":852},{},[853],{"type":52,"value":509},{"type":46,"tag":511,"props":855,"children":856},{},[857,880,897,920,943,960],{"type":46,"tag":496,"props":858,"children":859},{},[860,869],{"type":46,"tag":518,"props":861,"children":862},{},[863],{"type":46,"tag":112,"props":864,"children":866},{"className":865},[],[867],{"type":52,"value":868},"ImportState",{"type":46,"tag":518,"props":870,"children":871},{},[872,878],{"type":46,"tag":112,"props":873,"children":875},{"className":874},[],[876],{"type":52,"value":877},"true",{"type":52,"value":879}," to enable import mode",{"type":46,"tag":496,"props":881,"children":882},{},[883,892],{"type":46,"tag":518,"props":884,"children":885},{},[886],{"type":46,"tag":112,"props":887,"children":889},{"className":888},[],[890],{"type":52,"value":891},"ImportStateVerify",{"type":46,"tag":518,"props":893,"children":894},{},[895],{"type":52,"value":896},"Verify imported state matches prior state",{"type":46,"tag":496,"props":898,"children":899},{},[900,909],{"type":46,"tag":518,"props":901,"children":902},{},[903],{"type":46,"tag":112,"props":904,"children":906},{"className":905},[],[907],{"type":52,"value":908},"ImportStateVerifyIgnore",{"type":46,"tag":518,"props":910,"children":911},{},[912,918],{"type":46,"tag":112,"props":913,"children":915},{"className":914},[],[916],{"type":52,"value":917},"[]string",{"type":52,"value":919}," — attributes to skip during verify",{"type":46,"tag":496,"props":921,"children":922},{},[923,932],{"type":46,"tag":518,"props":924,"children":925},{},[926],{"type":46,"tag":112,"props":927,"children":929},{"className":928},[],[930],{"type":52,"value":931},"ImportStateKind",{"type":46,"tag":518,"props":933,"children":934},{},[935,941],{"type":46,"tag":112,"props":936,"children":938},{"className":937},[],[939],{"type":52,"value":940},"resource.ImportBlockWithID",{"type":52,"value":942}," — import block generation",{"type":46,"tag":496,"props":944,"children":945},{},[946,955],{"type":46,"tag":518,"props":947,"children":948},{},[949],{"type":46,"tag":112,"props":950,"children":952},{"className":951},[],[953],{"type":52,"value":954},"ResourceName",{"type":46,"tag":518,"props":956,"children":957},{},[958],{"type":52,"value":959},"Resource address to import",{"type":46,"tag":496,"props":961,"children":962},{},[963,972],{"type":46,"tag":518,"props":964,"children":965},{},[966],{"type":46,"tag":112,"props":967,"children":969},{"className":968},[],[970],{"type":52,"value":971},"ImportStateId",{"type":46,"tag":518,"props":973,"children":974},{},[975],{"type":52,"value":976},"Override the ID used for import",{"type":46,"tag":143,"props":978,"children":979},{},[],{"type":46,"tag":147,"props":981,"children":983},{"id":982},"check-functions",[984],{"type":52,"value":985},"Check Functions",{"type":46,"tag":633,"props":987,"children":989},{"id":988},"modern-configstatechecks-preferred",[990],{"type":52,"value":991},"Modern: ConfigStateChecks (preferred)",{"type":46,"tag":55,"props":993,"children":994},{},[995,997,1003,1005,1010],{"type":52,"value":996},"Type-safe with aggregated error reporting. Compose built-in checks with custom\n",{"type":46,"tag":112,"props":998,"children":1000},{"className":999},[],[1001],{"type":52,"value":1002},"statecheck.StateCheck",{"type":52,"value":1004}," implementations. See ",{"type":46,"tag":112,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":52,"value":117},{"type":52,"value":1011}," for full\nknownvalue types, tfjsonpath navigation, and comparers.",{"type":46,"tag":191,"props":1013,"children":1015},{"className":193,"code":1014,"language":195,"meta":196,"style":196},"ConfigStateChecks: []statecheck.StateCheck{\n    stateCheckExampleExists(resourceName, &widget),\n    statecheck.ExpectKnownValue(resourceName,\n        tfjsonpath.New(\"name\"), knownvalue.StringExact(\"my-widget\")),\n    statecheck.ExpectKnownValue(resourceName,\n        tfjsonpath.New(\"enabled\"), knownvalue.Bool(true)),\n    statecheck.ExpectKnownValue(resourceName,\n        tfjsonpath.New(\"id\"), knownvalue.NotNull()),\n    statecheck.ExpectSensitiveValue(resourceName,\n        tfjsonpath.New(\"api_key\")),\n},\n",[1016],{"type":46,"tag":112,"props":1017,"children":1018},{"__ignoreMap":196},[1019,1027,1035,1043,1051,1058,1066,1073,1081,1089,1097],{"type":46,"tag":202,"props":1020,"children":1021},{"class":204,"line":205},[1022],{"type":46,"tag":202,"props":1023,"children":1024},{},[1025],{"type":52,"value":1026},"ConfigStateChecks: []statecheck.StateCheck{\n",{"type":46,"tag":202,"props":1028,"children":1029},{"class":204,"line":214},[1030],{"type":46,"tag":202,"props":1031,"children":1032},{},[1033],{"type":52,"value":1034},"    stateCheckExampleExists(resourceName, &widget),\n",{"type":46,"tag":202,"props":1036,"children":1037},{"class":204,"line":223},[1038],{"type":46,"tag":202,"props":1039,"children":1040},{},[1041],{"type":52,"value":1042},"    statecheck.ExpectKnownValue(resourceName,\n",{"type":46,"tag":202,"props":1044,"children":1045},{"class":204,"line":232},[1046],{"type":46,"tag":202,"props":1047,"children":1048},{},[1049],{"type":52,"value":1050},"        tfjsonpath.New(\"name\"), knownvalue.StringExact(\"my-widget\")),\n",{"type":46,"tag":202,"props":1052,"children":1053},{"class":204,"line":241},[1054],{"type":46,"tag":202,"props":1055,"children":1056},{},[1057],{"type":52,"value":1042},{"type":46,"tag":202,"props":1059,"children":1060},{"class":204,"line":251},[1061],{"type":46,"tag":202,"props":1062,"children":1063},{},[1064],{"type":52,"value":1065},"        tfjsonpath.New(\"enabled\"), knownvalue.Bool(true)),\n",{"type":46,"tag":202,"props":1067,"children":1068},{"class":204,"line":260},[1069],{"type":46,"tag":202,"props":1070,"children":1071},{},[1072],{"type":52,"value":1042},{"type":46,"tag":202,"props":1074,"children":1075},{"class":204,"line":269},[1076],{"type":46,"tag":202,"props":1077,"children":1078},{},[1079],{"type":52,"value":1080},"        tfjsonpath.New(\"id\"), knownvalue.NotNull()),\n",{"type":46,"tag":202,"props":1082,"children":1083},{"class":204,"line":278},[1084],{"type":46,"tag":202,"props":1085,"children":1086},{},[1087],{"type":52,"value":1088},"    statecheck.ExpectSensitiveValue(resourceName,\n",{"type":46,"tag":202,"props":1090,"children":1091},{"class":204,"line":287},[1092],{"type":46,"tag":202,"props":1093,"children":1094},{},[1095],{"type":52,"value":1096},"        tfjsonpath.New(\"api_key\")),\n",{"type":46,"tag":202,"props":1098,"children":1099},{"class":204,"line":296},[1100],{"type":46,"tag":202,"props":1101,"children":1102},{},[1103],{"type":52,"value":1104},"},\n",{"type":46,"tag":55,"props":1106,"children":1107},{},[1108,1110,1116,1118,1123],{"type":52,"value":1109},"Do not mix ",{"type":46,"tag":112,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":52,"value":1115},"Check",{"type":52,"value":1117}," (legacy) and ",{"type":46,"tag":112,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":52,"value":687},{"type":52,"value":1124}," in the same step.",{"type":46,"tag":633,"props":1126,"children":1128},{"id":1127},"legacy-check-for-checkdestroy-and-migration",[1129],{"type":52,"value":1130},"Legacy: Check (for CheckDestroy and migration)",{"type":46,"tag":55,"props":1132,"children":1133},{},[1134,1139,1141,1147,1149,1154,1156,1161,1163,1169,1171,1176,1178,1183],{"type":46,"tag":112,"props":1135,"children":1137},{"className":1136},[],[1138],{"type":52,"value":178},{"type":52,"value":1140}," on ",{"type":46,"tag":112,"props":1142,"children":1144},{"className":1143},[],[1145],{"type":52,"value":1146},"TestCase",{"type":52,"value":1148}," requires ",{"type":46,"tag":112,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":52,"value":574},{"type":52,"value":1155},". The ",{"type":46,"tag":112,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":52,"value":1115},{"type":52,"value":1162}," field on\n",{"type":46,"tag":112,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":52,"value":1168},"TestStep",{"type":52,"value":1170}," also accepts ",{"type":46,"tag":112,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":52,"value":574},{"type":52,"value":1177}," but prefer ",{"type":46,"tag":112,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":52,"value":687},{"type":52,"value":1184}," for new\ntests.",{"type":46,"tag":191,"props":1186,"children":1188},{"className":193,"code":1187,"language":195,"meta":196,"style":196},"Check: resource.ComposeAggregateTestCheckFunc(\n    resource.TestCheckResourceAttr(name, \"key\", \"expected\"),\n    resource.TestCheckResourceAttrSet(name, \"id\"),\n    resource.TestCheckNoResourceAttr(name, \"removed\"),\n    resource.TestMatchResourceAttr(name, \"url\", regexp.MustCompile(`^https:\u002F\u002F`)),\n    resource.TestCheckResourceAttrPair(res1, \"ref_id\", res2, \"id\"),\n),\n",[1189],{"type":46,"tag":112,"props":1190,"children":1191},{"__ignoreMap":196},[1192,1200,1208,1216,1224,1232,1240],{"type":46,"tag":202,"props":1193,"children":1194},{"class":204,"line":205},[1195],{"type":46,"tag":202,"props":1196,"children":1197},{},[1198],{"type":52,"value":1199},"Check: resource.ComposeAggregateTestCheckFunc(\n",{"type":46,"tag":202,"props":1201,"children":1202},{"class":204,"line":214},[1203],{"type":46,"tag":202,"props":1204,"children":1205},{},[1206],{"type":52,"value":1207},"    resource.TestCheckResourceAttr(name, \"key\", \"expected\"),\n",{"type":46,"tag":202,"props":1209,"children":1210},{"class":204,"line":223},[1211],{"type":46,"tag":202,"props":1212,"children":1213},{},[1214],{"type":52,"value":1215},"    resource.TestCheckResourceAttrSet(name, \"id\"),\n",{"type":46,"tag":202,"props":1217,"children":1218},{"class":204,"line":232},[1219],{"type":46,"tag":202,"props":1220,"children":1221},{},[1222],{"type":52,"value":1223},"    resource.TestCheckNoResourceAttr(name, \"removed\"),\n",{"type":46,"tag":202,"props":1225,"children":1226},{"class":204,"line":241},[1227],{"type":46,"tag":202,"props":1228,"children":1229},{},[1230],{"type":52,"value":1231},"    resource.TestMatchResourceAttr(name, \"url\", regexp.MustCompile(`^https:\u002F\u002F`)),\n",{"type":46,"tag":202,"props":1233,"children":1234},{"class":204,"line":251},[1235],{"type":46,"tag":202,"props":1236,"children":1237},{},[1238],{"type":52,"value":1239},"    resource.TestCheckResourceAttrPair(res1, \"ref_id\", res2, \"id\"),\n",{"type":46,"tag":202,"props":1241,"children":1242},{"class":204,"line":260},[1243],{"type":46,"tag":202,"props":1244,"children":1245},{},[1246],{"type":52,"value":1247},"),\n",{"type":46,"tag":55,"props":1249,"children":1250},{},[1251,1257,1259,1265],{"type":46,"tag":112,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":52,"value":1256},"ComposeAggregateTestCheckFunc",{"type":52,"value":1258}," reports all errors; ",{"type":46,"tag":112,"props":1260,"children":1262},{"className":1261},[],[1263],{"type":52,"value":1264},"ComposeTestCheckFunc",{"type":52,"value":1266},"\nfails fast on the first.",{"type":46,"tag":143,"props":1268,"children":1269},{},[],{"type":46,"tag":147,"props":1271,"children":1273},{"id":1272},"config-helpers",[1274],{"type":52,"value":1275},"Config Helpers",{"type":46,"tag":55,"props":1277,"children":1278},{},[1279,1281,1287,1289,1295],{"type":52,"value":1280},"Use numbered format verbs — ",{"type":46,"tag":112,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":52,"value":1286},"%[1]q",{"type":52,"value":1288}," for quoted strings, ",{"type":46,"tag":112,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":52,"value":1294},"%[1]s",{"type":52,"value":1296}," for raw:",{"type":46,"tag":191,"props":1298,"children":1300},{"className":193,"code":1299,"language":195,"meta":196,"style":196},"func testAccExampleConfig_basic(rName string) string {\n    return fmt.Sprintf(`\nresource \"example_widget\" \"test\" {\n  name = %[1]q\n}\n`, rName)\n}\n\nfunc testAccExampleConfig_full(rName, description string) string {\n    return fmt.Sprintf(`\nresource \"example_widget\" \"test\" {\n  name        = %[1]q\n  description = %[2]q\n  enabled     = true\n}\n`, rName, description)\n}\n",[1301],{"type":46,"tag":112,"props":1302,"children":1303},{"__ignoreMap":196},[1304,1312,1320,1328,1336,1343,1351,1358,1365,1373,1380,1387,1395,1403,1411,1418,1426],{"type":46,"tag":202,"props":1305,"children":1306},{"class":204,"line":205},[1307],{"type":46,"tag":202,"props":1308,"children":1309},{},[1310],{"type":52,"value":1311},"func testAccExampleConfig_basic(rName string) string {\n",{"type":46,"tag":202,"props":1313,"children":1314},{"class":204,"line":214},[1315],{"type":46,"tag":202,"props":1316,"children":1317},{},[1318],{"type":52,"value":1319},"    return fmt.Sprintf(`\n",{"type":46,"tag":202,"props":1321,"children":1322},{"class":204,"line":223},[1323],{"type":46,"tag":202,"props":1324,"children":1325},{},[1326],{"type":52,"value":1327},"resource \"example_widget\" \"test\" {\n",{"type":46,"tag":202,"props":1329,"children":1330},{"class":204,"line":232},[1331],{"type":46,"tag":202,"props":1332,"children":1333},{},[1334],{"type":52,"value":1335},"  name = %[1]q\n",{"type":46,"tag":202,"props":1337,"children":1338},{"class":204,"line":241},[1339],{"type":46,"tag":202,"props":1340,"children":1341},{},[1342],{"type":52,"value":409},{"type":46,"tag":202,"props":1344,"children":1345},{"class":204,"line":251},[1346],{"type":46,"tag":202,"props":1347,"children":1348},{},[1349],{"type":52,"value":1350},"`, rName)\n",{"type":46,"tag":202,"props":1352,"children":1353},{"class":204,"line":260},[1354],{"type":46,"tag":202,"props":1355,"children":1356},{},[1357],{"type":52,"value":409},{"type":46,"tag":202,"props":1359,"children":1360},{"class":204,"line":269},[1361],{"type":46,"tag":202,"props":1362,"children":1363},{"emptyLinePlaceholder":245},[1364],{"type":52,"value":248},{"type":46,"tag":202,"props":1366,"children":1367},{"class":204,"line":278},[1368],{"type":46,"tag":202,"props":1369,"children":1370},{},[1371],{"type":52,"value":1372},"func testAccExampleConfig_full(rName, description string) string {\n",{"type":46,"tag":202,"props":1374,"children":1375},{"class":204,"line":287},[1376],{"type":46,"tag":202,"props":1377,"children":1378},{},[1379],{"type":52,"value":1319},{"type":46,"tag":202,"props":1381,"children":1382},{"class":204,"line":296},[1383],{"type":46,"tag":202,"props":1384,"children":1385},{},[1386],{"type":52,"value":1327},{"type":46,"tag":202,"props":1388,"children":1389},{"class":204,"line":305},[1390],{"type":46,"tag":202,"props":1391,"children":1392},{},[1393],{"type":52,"value":1394},"  name        = %[1]q\n",{"type":46,"tag":202,"props":1396,"children":1397},{"class":204,"line":314},[1398],{"type":46,"tag":202,"props":1399,"children":1400},{},[1401],{"type":52,"value":1402},"  description = %[2]q\n",{"type":46,"tag":202,"props":1404,"children":1405},{"class":204,"line":323},[1406],{"type":46,"tag":202,"props":1407,"children":1408},{},[1409],{"type":52,"value":1410},"  enabled     = true\n",{"type":46,"tag":202,"props":1412,"children":1413},{"class":204,"line":332},[1414],{"type":46,"tag":202,"props":1415,"children":1416},{},[1417],{"type":52,"value":409},{"type":46,"tag":202,"props":1419,"children":1420},{"class":204,"line":341},[1421],{"type":46,"tag":202,"props":1422,"children":1423},{},[1424],{"type":52,"value":1425},"`, rName, description)\n",{"type":46,"tag":202,"props":1427,"children":1428},{"class":204,"line":350},[1429],{"type":46,"tag":202,"props":1430,"children":1431},{},[1432],{"type":52,"value":409},{"type":46,"tag":143,"props":1434,"children":1435},{},[],{"type":46,"tag":147,"props":1437,"children":1439},{"id":1438},"scenario-patterns",[1440],{"type":52,"value":1441},"Scenario Patterns",{"type":46,"tag":633,"props":1443,"children":1445},{"id":1444},"basic-update-combine-in-one-test-updates-are-supersets-of-basic",[1446],{"type":52,"value":1447},"Basic + Update (combine in one test — updates are supersets of basic)",{"type":46,"tag":191,"props":1449,"children":1451},{"className":193,"code":1450,"language":195,"meta":196,"style":196},"Steps: []resource.TestStep{\n    {\n        Config: testAccExampleConfig_basic(rName),\n        ConfigStateChecks: []statecheck.StateCheck{\n            stateCheckExampleExists(resourceName, &widget),\n            statecheck.ExpectKnownValue(resourceName,\n                tfjsonpath.New(\"name\"), knownvalue.StringExact(rName)),\n        },\n    },\n    {\n        Config: testAccExampleConfig_full(rName, \"updated\"),\n        ConfigStateChecks: []statecheck.StateCheck{\n            stateCheckExampleExists(resourceName, &widget),\n            statecheck.ExpectKnownValue(resourceName,\n                tfjsonpath.New(\"description\"), knownvalue.StringExact(\"updated\")),\n        },\n    },\n},\n",[1452],{"type":46,"tag":112,"props":1453,"children":1454},{"__ignoreMap":196},[1455,1463,1471,1479,1487,1495,1503,1511,1518,1526,1533,1541,1548,1555,1562,1570,1577,1584],{"type":46,"tag":202,"props":1456,"children":1457},{"class":204,"line":205},[1458],{"type":46,"tag":202,"props":1459,"children":1460},{},[1461],{"type":52,"value":1462},"Steps: []resource.TestStep{\n",{"type":46,"tag":202,"props":1464,"children":1465},{"class":204,"line":214},[1466],{"type":46,"tag":202,"props":1467,"children":1468},{},[1469],{"type":52,"value":1470},"    {\n",{"type":46,"tag":202,"props":1472,"children":1473},{"class":204,"line":223},[1474],{"type":46,"tag":202,"props":1475,"children":1476},{},[1477],{"type":52,"value":1478},"        Config: testAccExampleConfig_basic(rName),\n",{"type":46,"tag":202,"props":1480,"children":1481},{"class":204,"line":232},[1482],{"type":46,"tag":202,"props":1483,"children":1484},{},[1485],{"type":52,"value":1486},"        ConfigStateChecks: []statecheck.StateCheck{\n",{"type":46,"tag":202,"props":1488,"children":1489},{"class":204,"line":241},[1490],{"type":46,"tag":202,"props":1491,"children":1492},{},[1493],{"type":52,"value":1494},"            stateCheckExampleExists(resourceName, &widget),\n",{"type":46,"tag":202,"props":1496,"children":1497},{"class":204,"line":251},[1498],{"type":46,"tag":202,"props":1499,"children":1500},{},[1501],{"type":52,"value":1502},"            statecheck.ExpectKnownValue(resourceName,\n",{"type":46,"tag":202,"props":1504,"children":1505},{"class":204,"line":260},[1506],{"type":46,"tag":202,"props":1507,"children":1508},{},[1509],{"type":52,"value":1510},"                tfjsonpath.New(\"name\"), knownvalue.StringExact(rName)),\n",{"type":46,"tag":202,"props":1512,"children":1513},{"class":204,"line":269},[1514],{"type":46,"tag":202,"props":1515,"children":1516},{},[1517],{"type":52,"value":391},{"type":46,"tag":202,"props":1519,"children":1520},{"class":204,"line":278},[1521],{"type":46,"tag":202,"props":1522,"children":1523},{},[1524],{"type":52,"value":1525},"    },\n",{"type":46,"tag":202,"props":1527,"children":1528},{"class":204,"line":287},[1529],{"type":46,"tag":202,"props":1530,"children":1531},{},[1532],{"type":52,"value":1470},{"type":46,"tag":202,"props":1534,"children":1535},{"class":204,"line":296},[1536],{"type":46,"tag":202,"props":1537,"children":1538},{},[1539],{"type":52,"value":1540},"        Config: testAccExampleConfig_full(rName, \"updated\"),\n",{"type":46,"tag":202,"props":1542,"children":1543},{"class":204,"line":305},[1544],{"type":46,"tag":202,"props":1545,"children":1546},{},[1547],{"type":52,"value":1486},{"type":46,"tag":202,"props":1549,"children":1550},{"class":204,"line":314},[1551],{"type":46,"tag":202,"props":1552,"children":1553},{},[1554],{"type":52,"value":1494},{"type":46,"tag":202,"props":1556,"children":1557},{"class":204,"line":323},[1558],{"type":46,"tag":202,"props":1559,"children":1560},{},[1561],{"type":52,"value":1502},{"type":46,"tag":202,"props":1563,"children":1564},{"class":204,"line":332},[1565],{"type":46,"tag":202,"props":1566,"children":1567},{},[1568],{"type":52,"value":1569},"                tfjsonpath.New(\"description\"), knownvalue.StringExact(\"updated\")),\n",{"type":46,"tag":202,"props":1571,"children":1572},{"class":204,"line":341},[1573],{"type":46,"tag":202,"props":1574,"children":1575},{},[1576],{"type":52,"value":391},{"type":46,"tag":202,"props":1578,"children":1579},{"class":204,"line":350},[1580],{"type":46,"tag":202,"props":1581,"children":1582},{},[1583],{"type":52,"value":1525},{"type":46,"tag":202,"props":1585,"children":1586},{"class":204,"line":358},[1587],{"type":46,"tag":202,"props":1588,"children":1589},{},[1590],{"type":52,"value":1104},{"type":46,"tag":633,"props":1592,"children":1594},{"id":1593},"import",[1595],{"type":52,"value":1596},"Import",{"type":46,"tag":55,"props":1598,"children":1599},{},[1600,1602,1607],{"type":52,"value":1601},"After a config step, verify import produces identical state. Use\n",{"type":46,"tag":112,"props":1603,"children":1605},{"className":1604},[],[1606],{"type":52,"value":931},{"type":52,"value":1608}," for import block generation:",{"type":46,"tag":191,"props":1610,"children":1612},{"className":193,"code":1611,"language":195,"meta":196,"style":196},"{\n    ResourceName:      resourceName,\n    ImportState:       true,\n    ImportStateVerify: true,\n    ImportStateKind:   resource.ImportBlockWithID,\n},\n",[1613],{"type":46,"tag":112,"props":1614,"children":1615},{"__ignoreMap":196},[1616,1624,1632,1640,1648,1656],{"type":46,"tag":202,"props":1617,"children":1618},{"class":204,"line":205},[1619],{"type":46,"tag":202,"props":1620,"children":1621},{},[1622],{"type":52,"value":1623},"{\n",{"type":46,"tag":202,"props":1625,"children":1626},{"class":204,"line":214},[1627],{"type":46,"tag":202,"props":1628,"children":1629},{},[1630],{"type":52,"value":1631},"    ResourceName:      resourceName,\n",{"type":46,"tag":202,"props":1633,"children":1634},{"class":204,"line":223},[1635],{"type":46,"tag":202,"props":1636,"children":1637},{},[1638],{"type":52,"value":1639},"    ImportState:       true,\n",{"type":46,"tag":202,"props":1641,"children":1642},{"class":204,"line":232},[1643],{"type":46,"tag":202,"props":1644,"children":1645},{},[1646],{"type":52,"value":1647},"    ImportStateVerify: true,\n",{"type":46,"tag":202,"props":1649,"children":1650},{"class":204,"line":241},[1651],{"type":46,"tag":202,"props":1652,"children":1653},{},[1654],{"type":52,"value":1655},"    ImportStateKind:   resource.ImportBlockWithID,\n",{"type":46,"tag":202,"props":1657,"children":1658},{"class":204,"line":251},[1659],{"type":46,"tag":202,"props":1660,"children":1661},{},[1662],{"type":52,"value":1104},{"type":46,"tag":633,"props":1664,"children":1666},{"id":1665},"disappears-resource-deleted-externally",[1667],{"type":52,"value":1668},"Disappears (resource deleted externally)",{"type":46,"tag":191,"props":1670,"children":1672},{"className":193,"code":1671,"language":195,"meta":196,"style":196},"{\n    Config: testAccExampleConfig_basic(rName),\n    ConfigStateChecks: []statecheck.StateCheck{\n        stateCheckExampleExists(resourceName, &widget),\n        stateCheckExampleDisappears(resourceName),\n    },\n    ExpectNonEmptyPlan: true,\n},\n",[1673],{"type":46,"tag":112,"props":1674,"children":1675},{"__ignoreMap":196},[1676,1683,1691,1699,1707,1715,1722,1730],{"type":46,"tag":202,"props":1677,"children":1678},{"class":204,"line":205},[1679],{"type":46,"tag":202,"props":1680,"children":1681},{},[1682],{"type":52,"value":1623},{"type":46,"tag":202,"props":1684,"children":1685},{"class":204,"line":214},[1686],{"type":46,"tag":202,"props":1687,"children":1688},{},[1689],{"type":52,"value":1690},"    Config: testAccExampleConfig_basic(rName),\n",{"type":46,"tag":202,"props":1692,"children":1693},{"class":204,"line":223},[1694],{"type":46,"tag":202,"props":1695,"children":1696},{},[1697],{"type":52,"value":1698},"    ConfigStateChecks: []statecheck.StateCheck{\n",{"type":46,"tag":202,"props":1700,"children":1701},{"class":204,"line":232},[1702],{"type":46,"tag":202,"props":1703,"children":1704},{},[1705],{"type":52,"value":1706},"        stateCheckExampleExists(resourceName, &widget),\n",{"type":46,"tag":202,"props":1708,"children":1709},{"class":204,"line":241},[1710],{"type":46,"tag":202,"props":1711,"children":1712},{},[1713],{"type":52,"value":1714},"        stateCheckExampleDisappears(resourceName),\n",{"type":46,"tag":202,"props":1716,"children":1717},{"class":204,"line":251},[1718],{"type":46,"tag":202,"props":1719,"children":1720},{},[1721],{"type":52,"value":1525},{"type":46,"tag":202,"props":1723,"children":1724},{"class":204,"line":260},[1725],{"type":46,"tag":202,"props":1726,"children":1727},{},[1728],{"type":52,"value":1729},"    ExpectNonEmptyPlan: true,\n",{"type":46,"tag":202,"props":1731,"children":1732},{"class":204,"line":269},[1733],{"type":46,"tag":202,"props":1734,"children":1735},{},[1736],{"type":52,"value":1104},{"type":46,"tag":633,"props":1738,"children":1740},{"id":1739},"validation-expect-error",[1741],{"type":52,"value":1742},"Validation (expect error)",{"type":46,"tag":191,"props":1744,"children":1746},{"className":193,"code":1745,"language":195,"meta":196,"style":196},"{\n    Config:      testAccExampleConfig_invalidName(\"\"),\n    ExpectError: regexp.MustCompile(`name must not be empty`),\n},\n",[1747],{"type":46,"tag":112,"props":1748,"children":1749},{"__ignoreMap":196},[1750,1757,1765,1773],{"type":46,"tag":202,"props":1751,"children":1752},{"class":204,"line":205},[1753],{"type":46,"tag":202,"props":1754,"children":1755},{},[1756],{"type":52,"value":1623},{"type":46,"tag":202,"props":1758,"children":1759},{"class":204,"line":214},[1760],{"type":46,"tag":202,"props":1761,"children":1762},{},[1763],{"type":52,"value":1764},"    Config:      testAccExampleConfig_invalidName(\"\"),\n",{"type":46,"tag":202,"props":1766,"children":1767},{"class":204,"line":223},[1768],{"type":46,"tag":202,"props":1769,"children":1770},{},[1771],{"type":52,"value":1772},"    ExpectError: regexp.MustCompile(`name must not be empty`),\n",{"type":46,"tag":202,"props":1774,"children":1775},{"class":204,"line":232},[1776],{"type":46,"tag":202,"props":1777,"children":1778},{},[1779],{"type":52,"value":1104},{"type":46,"tag":633,"props":1781,"children":1783},{"id":1782},"regression-two-commit-workflow",[1784],{"type":52,"value":1785},"Regression (two-commit workflow)",{"type":46,"tag":55,"props":1787,"children":1788},{},[1789],{"type":52,"value":1790},"A proper bug fix uses at least two commits: first commit the regression test\n(which fails, confirming the bug), then commit the fix (test passes). This\nlets reviewers independently verify the test reproduces the issue by checking\nout the first commit, then advancing to the fix.",{"type":46,"tag":55,"props":1792,"children":1793},{},[1794],{"type":52,"value":1795},"Name and document regression tests to identify the issue they fix. Include a\nlink to the original bug report when possible.",{"type":46,"tag":191,"props":1797,"children":1799},{"className":193,"code":1798,"language":195,"meta":196,"style":196},"\u002F\u002F TestAccExample_regressionGH1234 verifies fix for https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\u002Fissues\u002F1234\nfunc TestAccExample_regressionGH1234(t *testing.T) {\n    rName := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)\n    resourceName := \"example_widget.test\"\n\n    resource.ParallelTest(t, resource.TestCase{\n        PreCheck:                 func() { testAccPreCheck(t) },\n        ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,\n        CheckDestroy:             testAccCheckExampleDestroy,\n        Steps: []resource.TestStep{\n            {\n                \u002F\u002F Reproduce the issue: this config triggered the bug\n                Config: testAccExampleConfig_regressionGH1234(rName),\n                ConfigStateChecks: []statecheck.StateCheck{\n                    stateCheckExampleExists(resourceName, nil),\n                    statecheck.ExpectKnownValue(resourceName,\n                        tfjsonpath.New(\"computed_field\"), knownvalue.NotNull()),\n                },\n            },\n        },\n    })\n}\n",[1800],{"type":46,"tag":112,"props":1801,"children":1802},{"__ignoreMap":196},[1803,1811,1819,1826,1833,1840,1847,1854,1861,1868,1875,1882,1890,1898,1905,1913,1920,1928,1935,1942,1949,1956],{"type":46,"tag":202,"props":1804,"children":1805},{"class":204,"line":205},[1806],{"type":46,"tag":202,"props":1807,"children":1808},{},[1809],{"type":52,"value":1810},"\u002F\u002F TestAccExample_regressionGH1234 verifies fix for https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\u002Fissues\u002F1234\n",{"type":46,"tag":202,"props":1812,"children":1813},{"class":204,"line":214},[1814],{"type":46,"tag":202,"props":1815,"children":1816},{},[1817],{"type":52,"value":1818},"func TestAccExample_regressionGH1234(t *testing.T) {\n",{"type":46,"tag":202,"props":1820,"children":1821},{"class":204,"line":223},[1822],{"type":46,"tag":202,"props":1823,"children":1824},{},[1825],{"type":52,"value":229},{"type":46,"tag":202,"props":1827,"children":1828},{"class":204,"line":232},[1829],{"type":46,"tag":202,"props":1830,"children":1831},{},[1832],{"type":52,"value":238},{"type":46,"tag":202,"props":1834,"children":1835},{"class":204,"line":241},[1836],{"type":46,"tag":202,"props":1837,"children":1838},{"emptyLinePlaceholder":245},[1839],{"type":52,"value":248},{"type":46,"tag":202,"props":1841,"children":1842},{"class":204,"line":251},[1843],{"type":46,"tag":202,"props":1844,"children":1845},{},[1846],{"type":52,"value":257},{"type":46,"tag":202,"props":1848,"children":1849},{"class":204,"line":260},[1850],{"type":46,"tag":202,"props":1851,"children":1852},{},[1853],{"type":52,"value":266},{"type":46,"tag":202,"props":1855,"children":1856},{"class":204,"line":269},[1857],{"type":46,"tag":202,"props":1858,"children":1859},{},[1860],{"type":52,"value":275},{"type":46,"tag":202,"props":1862,"children":1863},{"class":204,"line":278},[1864],{"type":46,"tag":202,"props":1865,"children":1866},{},[1867],{"type":52,"value":284},{"type":46,"tag":202,"props":1869,"children":1870},{"class":204,"line":287},[1871],{"type":46,"tag":202,"props":1872,"children":1873},{},[1874],{"type":52,"value":293},{"type":46,"tag":202,"props":1876,"children":1877},{"class":204,"line":296},[1878],{"type":46,"tag":202,"props":1879,"children":1880},{},[1881],{"type":52,"value":302},{"type":46,"tag":202,"props":1883,"children":1884},{"class":204,"line":305},[1885],{"type":46,"tag":202,"props":1886,"children":1887},{},[1888],{"type":52,"value":1889},"                \u002F\u002F Reproduce the issue: this config triggered the bug\n",{"type":46,"tag":202,"props":1891,"children":1892},{"class":204,"line":314},[1893],{"type":46,"tag":202,"props":1894,"children":1895},{},[1896],{"type":52,"value":1897},"                Config: testAccExampleConfig_regressionGH1234(rName),\n",{"type":46,"tag":202,"props":1899,"children":1900},{"class":204,"line":323},[1901],{"type":46,"tag":202,"props":1902,"children":1903},{},[1904],{"type":52,"value":320},{"type":46,"tag":202,"props":1906,"children":1907},{"class":204,"line":332},[1908],{"type":46,"tag":202,"props":1909,"children":1910},{},[1911],{"type":52,"value":1912},"                    stateCheckExampleExists(resourceName, nil),\n",{"type":46,"tag":202,"props":1914,"children":1915},{"class":204,"line":341},[1916],{"type":46,"tag":202,"props":1917,"children":1918},{},[1919],{"type":52,"value":338},{"type":46,"tag":202,"props":1921,"children":1922},{"class":204,"line":350},[1923],{"type":46,"tag":202,"props":1924,"children":1925},{},[1926],{"type":52,"value":1927},"                        tfjsonpath.New(\"computed_field\"), knownvalue.NotNull()),\n",{"type":46,"tag":202,"props":1929,"children":1930},{"class":204,"line":358},[1931],{"type":46,"tag":202,"props":1932,"children":1933},{},[1934],{"type":52,"value":373},{"type":46,"tag":202,"props":1936,"children":1937},{"class":204,"line":367},[1938],{"type":46,"tag":202,"props":1939,"children":1940},{},[1941],{"type":52,"value":382},{"type":46,"tag":202,"props":1943,"children":1944},{"class":204,"line":376},[1945],{"type":46,"tag":202,"props":1946,"children":1947},{},[1948],{"type":52,"value":391},{"type":46,"tag":202,"props":1950,"children":1951},{"class":204,"line":385},[1952],{"type":46,"tag":202,"props":1953,"children":1954},{},[1955],{"type":52,"value":400},{"type":46,"tag":202,"props":1957,"children":1958},{"class":204,"line":394},[1959],{"type":46,"tag":202,"props":1960,"children":1961},{},[1962],{"type":52,"value":409},{"type":46,"tag":143,"props":1964,"children":1965},{},[],{"type":46,"tag":147,"props":1967,"children":1969},{"id":1968},"helper-functions",[1970],{"type":52,"value":1971},"Helper Functions",{"type":46,"tag":633,"props":1973,"children":1975},{"id":1974},"custom-statecheck-exists",[1976],{"type":52,"value":1977},"Custom StateCheck: Exists",{"type":46,"tag":55,"props":1979,"children":1980},{},[1981,1983,1988],{"type":52,"value":1982},"Implement ",{"type":46,"tag":112,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":52,"value":1002},{"type":52,"value":1989}," for API existence verification. Separate the\nexists check into its own function for reuse across steps — the source\nrecommends this as a design principle:",{"type":46,"tag":191,"props":1991,"children":1993},{"className":193,"code":1992,"language":195,"meta":196,"style":196},"type exampleExistsCheck struct {\n    resourceAddress string\n    widget          *example.Widget\n}\n\nfunc (e exampleExistsCheck) CheckState(ctx context.Context, req statecheck.CheckStateRequest, resp *statecheck.CheckStateResponse) {\n    r, err := stateResourceAtAddress(req.State, e.resourceAddress)\n    if err != nil {\n        resp.Error = err\n        return\n    }\n\n    id, ok := r.AttributeValues[\"id\"].(string)\n    if !ok {\n        resp.Error = fmt.Errorf(\"no id found for %s\", e.resourceAddress)\n        return\n    }\n\n    conn := testAccAPIClient()\n    widget, err := conn.GetWidget(id)\n    if err != nil {\n        resp.Error = fmt.Errorf(\"%s not found via API: %w\", e.resourceAddress, err)\n        return\n    }\n\n    if e.widget != nil {\n        *e.widget = *widget\n    }\n}\n\nfunc stateCheckExampleExists(name string, widget *example.Widget) statecheck.StateCheck {\n    return exampleExistsCheck{resourceAddress: name, widget: widget}\n}\n",[1994],{"type":46,"tag":112,"props":1995,"children":1996},{"__ignoreMap":196},[1997,2005,2013,2021,2028,2035,2043,2051,2059,2067,2075,2083,2090,2098,2106,2114,2121,2128,2135,2143,2151,2158,2166,2173,2181,2189,2198,2207,2215,2223,2231,2240,2249],{"type":46,"tag":202,"props":1998,"children":1999},{"class":204,"line":205},[2000],{"type":46,"tag":202,"props":2001,"children":2002},{},[2003],{"type":52,"value":2004},"type exampleExistsCheck struct {\n",{"type":46,"tag":202,"props":2006,"children":2007},{"class":204,"line":214},[2008],{"type":46,"tag":202,"props":2009,"children":2010},{},[2011],{"type":52,"value":2012},"    resourceAddress string\n",{"type":46,"tag":202,"props":2014,"children":2015},{"class":204,"line":223},[2016],{"type":46,"tag":202,"props":2017,"children":2018},{},[2019],{"type":52,"value":2020},"    widget          *example.Widget\n",{"type":46,"tag":202,"props":2022,"children":2023},{"class":204,"line":232},[2024],{"type":46,"tag":202,"props":2025,"children":2026},{},[2027],{"type":52,"value":409},{"type":46,"tag":202,"props":2029,"children":2030},{"class":204,"line":241},[2031],{"type":46,"tag":202,"props":2032,"children":2033},{"emptyLinePlaceholder":245},[2034],{"type":52,"value":248},{"type":46,"tag":202,"props":2036,"children":2037},{"class":204,"line":251},[2038],{"type":46,"tag":202,"props":2039,"children":2040},{},[2041],{"type":52,"value":2042},"func (e exampleExistsCheck) CheckState(ctx context.Context, req statecheck.CheckStateRequest, resp *statecheck.CheckStateResponse) {\n",{"type":46,"tag":202,"props":2044,"children":2045},{"class":204,"line":260},[2046],{"type":46,"tag":202,"props":2047,"children":2048},{},[2049],{"type":52,"value":2050},"    r, err := stateResourceAtAddress(req.State, e.resourceAddress)\n",{"type":46,"tag":202,"props":2052,"children":2053},{"class":204,"line":269},[2054],{"type":46,"tag":202,"props":2055,"children":2056},{},[2057],{"type":52,"value":2058},"    if err != nil {\n",{"type":46,"tag":202,"props":2060,"children":2061},{"class":204,"line":278},[2062],{"type":46,"tag":202,"props":2063,"children":2064},{},[2065],{"type":52,"value":2066},"        resp.Error = err\n",{"type":46,"tag":202,"props":2068,"children":2069},{"class":204,"line":287},[2070],{"type":46,"tag":202,"props":2071,"children":2072},{},[2073],{"type":52,"value":2074},"        return\n",{"type":46,"tag":202,"props":2076,"children":2077},{"class":204,"line":296},[2078],{"type":46,"tag":202,"props":2079,"children":2080},{},[2081],{"type":52,"value":2082},"    }\n",{"type":46,"tag":202,"props":2084,"children":2085},{"class":204,"line":305},[2086],{"type":46,"tag":202,"props":2087,"children":2088},{"emptyLinePlaceholder":245},[2089],{"type":52,"value":248},{"type":46,"tag":202,"props":2091,"children":2092},{"class":204,"line":314},[2093],{"type":46,"tag":202,"props":2094,"children":2095},{},[2096],{"type":52,"value":2097},"    id, ok := r.AttributeValues[\"id\"].(string)\n",{"type":46,"tag":202,"props":2099,"children":2100},{"class":204,"line":323},[2101],{"type":46,"tag":202,"props":2102,"children":2103},{},[2104],{"type":52,"value":2105},"    if !ok {\n",{"type":46,"tag":202,"props":2107,"children":2108},{"class":204,"line":332},[2109],{"type":46,"tag":202,"props":2110,"children":2111},{},[2112],{"type":52,"value":2113},"        resp.Error = fmt.Errorf(\"no id found for %s\", e.resourceAddress)\n",{"type":46,"tag":202,"props":2115,"children":2116},{"class":204,"line":341},[2117],{"type":46,"tag":202,"props":2118,"children":2119},{},[2120],{"type":52,"value":2074},{"type":46,"tag":202,"props":2122,"children":2123},{"class":204,"line":350},[2124],{"type":46,"tag":202,"props":2125,"children":2126},{},[2127],{"type":52,"value":2082},{"type":46,"tag":202,"props":2129,"children":2130},{"class":204,"line":358},[2131],{"type":46,"tag":202,"props":2132,"children":2133},{"emptyLinePlaceholder":245},[2134],{"type":52,"value":248},{"type":46,"tag":202,"props":2136,"children":2137},{"class":204,"line":367},[2138],{"type":46,"tag":202,"props":2139,"children":2140},{},[2141],{"type":52,"value":2142},"    conn := testAccAPIClient()\n",{"type":46,"tag":202,"props":2144,"children":2145},{"class":204,"line":376},[2146],{"type":46,"tag":202,"props":2147,"children":2148},{},[2149],{"type":52,"value":2150},"    widget, err := conn.GetWidget(id)\n",{"type":46,"tag":202,"props":2152,"children":2153},{"class":204,"line":385},[2154],{"type":46,"tag":202,"props":2155,"children":2156},{},[2157],{"type":52,"value":2058},{"type":46,"tag":202,"props":2159,"children":2160},{"class":204,"line":394},[2161],{"type":46,"tag":202,"props":2162,"children":2163},{},[2164],{"type":52,"value":2165},"        resp.Error = fmt.Errorf(\"%s not found via API: %w\", e.resourceAddress, err)\n",{"type":46,"tag":202,"props":2167,"children":2168},{"class":204,"line":403},[2169],{"type":46,"tag":202,"props":2170,"children":2171},{},[2172],{"type":52,"value":2074},{"type":46,"tag":202,"props":2174,"children":2176},{"class":204,"line":2175},24,[2177],{"type":46,"tag":202,"props":2178,"children":2179},{},[2180],{"type":52,"value":2082},{"type":46,"tag":202,"props":2182,"children":2184},{"class":204,"line":2183},25,[2185],{"type":46,"tag":202,"props":2186,"children":2187},{"emptyLinePlaceholder":245},[2188],{"type":52,"value":248},{"type":46,"tag":202,"props":2190,"children":2192},{"class":204,"line":2191},26,[2193],{"type":46,"tag":202,"props":2194,"children":2195},{},[2196],{"type":52,"value":2197},"    if e.widget != nil {\n",{"type":46,"tag":202,"props":2199,"children":2201},{"class":204,"line":2200},27,[2202],{"type":46,"tag":202,"props":2203,"children":2204},{},[2205],{"type":52,"value":2206},"        *e.widget = *widget\n",{"type":46,"tag":202,"props":2208,"children":2210},{"class":204,"line":2209},28,[2211],{"type":46,"tag":202,"props":2212,"children":2213},{},[2214],{"type":52,"value":2082},{"type":46,"tag":202,"props":2216,"children":2218},{"class":204,"line":2217},29,[2219],{"type":46,"tag":202,"props":2220,"children":2221},{},[2222],{"type":52,"value":409},{"type":46,"tag":202,"props":2224,"children":2226},{"class":204,"line":2225},30,[2227],{"type":46,"tag":202,"props":2228,"children":2229},{"emptyLinePlaceholder":245},[2230],{"type":52,"value":248},{"type":46,"tag":202,"props":2232,"children":2234},{"class":204,"line":2233},31,[2235],{"type":46,"tag":202,"props":2236,"children":2237},{},[2238],{"type":52,"value":2239},"func stateCheckExampleExists(name string, widget *example.Widget) statecheck.StateCheck {\n",{"type":46,"tag":202,"props":2241,"children":2243},{"class":204,"line":2242},32,[2244],{"type":46,"tag":202,"props":2245,"children":2246},{},[2247],{"type":52,"value":2248},"    return exampleExistsCheck{resourceAddress: name, widget: widget}\n",{"type":46,"tag":202,"props":2250,"children":2252},{"class":204,"line":2251},33,[2253],{"type":46,"tag":202,"props":2254,"children":2255},{},[2256],{"type":52,"value":409},{"type":46,"tag":633,"props":2258,"children":2260},{"id":2259},"custom-statecheck-disappears",[2261],{"type":52,"value":2262},"Custom StateCheck: Disappears",{"type":46,"tag":55,"props":2264,"children":2265},{},[2266],{"type":52,"value":2267},"Delete a resource via API to simulate external deletion:",{"type":46,"tag":191,"props":2269,"children":2271},{"className":193,"code":2270,"language":195,"meta":196,"style":196},"type exampleDisappearsCheck struct {\n    resourceAddress string\n}\n\nfunc (e exampleDisappearsCheck) CheckState(ctx context.Context, req statecheck.CheckStateRequest, resp *statecheck.CheckStateResponse) {\n    r, err := stateResourceAtAddress(req.State, e.resourceAddress)\n    if err != nil {\n        resp.Error = err\n        return\n    }\n\n    id := r.AttributeValues[\"id\"].(string)\n    conn := testAccAPIClient()\n    resp.Error = conn.DeleteWidget(id)\n}\n\nfunc stateCheckExampleDisappears(name string) statecheck.StateCheck {\n    return exampleDisappearsCheck{resourceAddress: name}\n}\n",[2272],{"type":46,"tag":112,"props":2273,"children":2274},{"__ignoreMap":196},[2275,2283,2290,2297,2304,2312,2319,2326,2333,2340,2347,2354,2362,2369,2377,2384,2391,2399,2407],{"type":46,"tag":202,"props":2276,"children":2277},{"class":204,"line":205},[2278],{"type":46,"tag":202,"props":2279,"children":2280},{},[2281],{"type":52,"value":2282},"type exampleDisappearsCheck struct {\n",{"type":46,"tag":202,"props":2284,"children":2285},{"class":204,"line":214},[2286],{"type":46,"tag":202,"props":2287,"children":2288},{},[2289],{"type":52,"value":2012},{"type":46,"tag":202,"props":2291,"children":2292},{"class":204,"line":223},[2293],{"type":46,"tag":202,"props":2294,"children":2295},{},[2296],{"type":52,"value":409},{"type":46,"tag":202,"props":2298,"children":2299},{"class":204,"line":232},[2300],{"type":46,"tag":202,"props":2301,"children":2302},{"emptyLinePlaceholder":245},[2303],{"type":52,"value":248},{"type":46,"tag":202,"props":2305,"children":2306},{"class":204,"line":241},[2307],{"type":46,"tag":202,"props":2308,"children":2309},{},[2310],{"type":52,"value":2311},"func (e exampleDisappearsCheck) CheckState(ctx context.Context, req statecheck.CheckStateRequest, resp *statecheck.CheckStateResponse) {\n",{"type":46,"tag":202,"props":2313,"children":2314},{"class":204,"line":251},[2315],{"type":46,"tag":202,"props":2316,"children":2317},{},[2318],{"type":52,"value":2050},{"type":46,"tag":202,"props":2320,"children":2321},{"class":204,"line":260},[2322],{"type":46,"tag":202,"props":2323,"children":2324},{},[2325],{"type":52,"value":2058},{"type":46,"tag":202,"props":2327,"children":2328},{"class":204,"line":269},[2329],{"type":46,"tag":202,"props":2330,"children":2331},{},[2332],{"type":52,"value":2066},{"type":46,"tag":202,"props":2334,"children":2335},{"class":204,"line":278},[2336],{"type":46,"tag":202,"props":2337,"children":2338},{},[2339],{"type":52,"value":2074},{"type":46,"tag":202,"props":2341,"children":2342},{"class":204,"line":287},[2343],{"type":46,"tag":202,"props":2344,"children":2345},{},[2346],{"type":52,"value":2082},{"type":46,"tag":202,"props":2348,"children":2349},{"class":204,"line":296},[2350],{"type":46,"tag":202,"props":2351,"children":2352},{"emptyLinePlaceholder":245},[2353],{"type":52,"value":248},{"type":46,"tag":202,"props":2355,"children":2356},{"class":204,"line":305},[2357],{"type":46,"tag":202,"props":2358,"children":2359},{},[2360],{"type":52,"value":2361},"    id := r.AttributeValues[\"id\"].(string)\n",{"type":46,"tag":202,"props":2363,"children":2364},{"class":204,"line":314},[2365],{"type":46,"tag":202,"props":2366,"children":2367},{},[2368],{"type":52,"value":2142},{"type":46,"tag":202,"props":2370,"children":2371},{"class":204,"line":323},[2372],{"type":46,"tag":202,"props":2373,"children":2374},{},[2375],{"type":52,"value":2376},"    resp.Error = conn.DeleteWidget(id)\n",{"type":46,"tag":202,"props":2378,"children":2379},{"class":204,"line":332},[2380],{"type":46,"tag":202,"props":2381,"children":2382},{},[2383],{"type":52,"value":409},{"type":46,"tag":202,"props":2385,"children":2386},{"class":204,"line":341},[2387],{"type":46,"tag":202,"props":2388,"children":2389},{"emptyLinePlaceholder":245},[2390],{"type":52,"value":248},{"type":46,"tag":202,"props":2392,"children":2393},{"class":204,"line":350},[2394],{"type":46,"tag":202,"props":2395,"children":2396},{},[2397],{"type":52,"value":2398},"func stateCheckExampleDisappears(name string) statecheck.StateCheck {\n",{"type":46,"tag":202,"props":2400,"children":2401},{"class":204,"line":358},[2402],{"type":46,"tag":202,"props":2403,"children":2404},{},[2405],{"type":52,"value":2406},"    return exampleDisappearsCheck{resourceAddress: name}\n",{"type":46,"tag":202,"props":2408,"children":2409},{"class":204,"line":367},[2410],{"type":46,"tag":202,"props":2411,"children":2412},{},[2413],{"type":52,"value":409},{"type":46,"tag":633,"props":2415,"children":2417},{"id":2416},"state-resource-lookup-shared-utility",[2418],{"type":52,"value":2419},"State Resource Lookup (shared utility)",{"type":46,"tag":191,"props":2421,"children":2423},{"className":193,"code":2422,"language":195,"meta":196,"style":196},"func stateResourceAtAddress(state *tfjson.State, address string) (*tfjson.StateResource, error) {\n    if state == nil || state.Values == nil || state.Values.RootModule == nil {\n        return nil, fmt.Errorf(\"no state available\")\n    }\n    for _, r := range state.Values.RootModule.Resources {\n        if r.Address == address {\n            return r, nil\n        }\n    }\n    return nil, fmt.Errorf(\"not found in state: %s\", address)\n}\n",[2424],{"type":46,"tag":112,"props":2425,"children":2426},{"__ignoreMap":196},[2427,2435,2443,2451,2458,2466,2474,2482,2490,2497,2505],{"type":46,"tag":202,"props":2428,"children":2429},{"class":204,"line":205},[2430],{"type":46,"tag":202,"props":2431,"children":2432},{},[2433],{"type":52,"value":2434},"func stateResourceAtAddress(state *tfjson.State, address string) (*tfjson.StateResource, error) {\n",{"type":46,"tag":202,"props":2436,"children":2437},{"class":204,"line":214},[2438],{"type":46,"tag":202,"props":2439,"children":2440},{},[2441],{"type":52,"value":2442},"    if state == nil || state.Values == nil || state.Values.RootModule == nil {\n",{"type":46,"tag":202,"props":2444,"children":2445},{"class":204,"line":223},[2446],{"type":46,"tag":202,"props":2447,"children":2448},{},[2449],{"type":52,"value":2450},"        return nil, fmt.Errorf(\"no state available\")\n",{"type":46,"tag":202,"props":2452,"children":2453},{"class":204,"line":232},[2454],{"type":46,"tag":202,"props":2455,"children":2456},{},[2457],{"type":52,"value":2082},{"type":46,"tag":202,"props":2459,"children":2460},{"class":204,"line":241},[2461],{"type":46,"tag":202,"props":2462,"children":2463},{},[2464],{"type":52,"value":2465},"    for _, r := range state.Values.RootModule.Resources {\n",{"type":46,"tag":202,"props":2467,"children":2468},{"class":204,"line":251},[2469],{"type":46,"tag":202,"props":2470,"children":2471},{},[2472],{"type":52,"value":2473},"        if r.Address == address {\n",{"type":46,"tag":202,"props":2475,"children":2476},{"class":204,"line":260},[2477],{"type":46,"tag":202,"props":2478,"children":2479},{},[2480],{"type":52,"value":2481},"            return r, nil\n",{"type":46,"tag":202,"props":2483,"children":2484},{"class":204,"line":269},[2485],{"type":46,"tag":202,"props":2486,"children":2487},{},[2488],{"type":52,"value":2489},"        }\n",{"type":46,"tag":202,"props":2491,"children":2492},{"class":204,"line":278},[2493],{"type":46,"tag":202,"props":2494,"children":2495},{},[2496],{"type":52,"value":2082},{"type":46,"tag":202,"props":2498,"children":2499},{"class":204,"line":287},[2500],{"type":46,"tag":202,"props":2501,"children":2502},{},[2503],{"type":52,"value":2504},"    return nil, fmt.Errorf(\"not found in state: %s\", address)\n",{"type":46,"tag":202,"props":2506,"children":2507},{"class":204,"line":296},[2508],{"type":46,"tag":202,"props":2509,"children":2510},{},[2511],{"type":52,"value":409},{"type":46,"tag":633,"props":2513,"children":2515},{"id":2514},"destroy-check-testcheckfunc-required-by-checkdestroy",[2516],{"type":52,"value":2517},"Destroy Check (TestCheckFunc — required by CheckDestroy)",{"type":46,"tag":191,"props":2519,"children":2521},{"className":193,"code":2520,"language":195,"meta":196,"style":196},"func testAccCheckExampleDestroy(s *terraform.State) error {\n    conn := testAccAPIClient()\n    for _, rs := range s.RootModule().Resources {\n        if rs.Type != \"example_widget\" {\n            continue\n        }\n        _, err := conn.GetWidget(rs.Primary.ID)\n        if err == nil {\n            return fmt.Errorf(\"widget %s still exists\", rs.Primary.ID)\n        }\n        if !isNotFoundError(err) {\n            return err\n        }\n    }\n    return nil\n}\n",[2522],{"type":46,"tag":112,"props":2523,"children":2524},{"__ignoreMap":196},[2525,2533,2540,2548,2556,2564,2571,2579,2587,2595,2602,2610,2618,2625,2632,2640],{"type":46,"tag":202,"props":2526,"children":2527},{"class":204,"line":205},[2528],{"type":46,"tag":202,"props":2529,"children":2530},{},[2531],{"type":52,"value":2532},"func testAccCheckExampleDestroy(s *terraform.State) error {\n",{"type":46,"tag":202,"props":2534,"children":2535},{"class":204,"line":214},[2536],{"type":46,"tag":202,"props":2537,"children":2538},{},[2539],{"type":52,"value":2142},{"type":46,"tag":202,"props":2541,"children":2542},{"class":204,"line":223},[2543],{"type":46,"tag":202,"props":2544,"children":2545},{},[2546],{"type":52,"value":2547},"    for _, rs := range s.RootModule().Resources {\n",{"type":46,"tag":202,"props":2549,"children":2550},{"class":204,"line":232},[2551],{"type":46,"tag":202,"props":2552,"children":2553},{},[2554],{"type":52,"value":2555},"        if rs.Type != \"example_widget\" {\n",{"type":46,"tag":202,"props":2557,"children":2558},{"class":204,"line":241},[2559],{"type":46,"tag":202,"props":2560,"children":2561},{},[2562],{"type":52,"value":2563},"            continue\n",{"type":46,"tag":202,"props":2565,"children":2566},{"class":204,"line":251},[2567],{"type":46,"tag":202,"props":2568,"children":2569},{},[2570],{"type":52,"value":2489},{"type":46,"tag":202,"props":2572,"children":2573},{"class":204,"line":260},[2574],{"type":46,"tag":202,"props":2575,"children":2576},{},[2577],{"type":52,"value":2578},"        _, err := conn.GetWidget(rs.Primary.ID)\n",{"type":46,"tag":202,"props":2580,"children":2581},{"class":204,"line":269},[2582],{"type":46,"tag":202,"props":2583,"children":2584},{},[2585],{"type":52,"value":2586},"        if err == nil {\n",{"type":46,"tag":202,"props":2588,"children":2589},{"class":204,"line":278},[2590],{"type":46,"tag":202,"props":2591,"children":2592},{},[2593],{"type":52,"value":2594},"            return fmt.Errorf(\"widget %s still exists\", rs.Primary.ID)\n",{"type":46,"tag":202,"props":2596,"children":2597},{"class":204,"line":287},[2598],{"type":46,"tag":202,"props":2599,"children":2600},{},[2601],{"type":52,"value":2489},{"type":46,"tag":202,"props":2603,"children":2604},{"class":204,"line":296},[2605],{"type":46,"tag":202,"props":2606,"children":2607},{},[2608],{"type":52,"value":2609},"        if !isNotFoundError(err) {\n",{"type":46,"tag":202,"props":2611,"children":2612},{"class":204,"line":305},[2613],{"type":46,"tag":202,"props":2614,"children":2615},{},[2616],{"type":52,"value":2617},"            return err\n",{"type":46,"tag":202,"props":2619,"children":2620},{"class":204,"line":314},[2621],{"type":46,"tag":202,"props":2622,"children":2623},{},[2624],{"type":52,"value":2489},{"type":46,"tag":202,"props":2626,"children":2627},{"class":204,"line":323},[2628],{"type":46,"tag":202,"props":2629,"children":2630},{},[2631],{"type":52,"value":2082},{"type":46,"tag":202,"props":2633,"children":2634},{"class":204,"line":332},[2635],{"type":46,"tag":202,"props":2636,"children":2637},{},[2638],{"type":52,"value":2639},"    return nil\n",{"type":46,"tag":202,"props":2641,"children":2642},{"class":204,"line":341},[2643],{"type":46,"tag":202,"props":2644,"children":2645},{},[2646],{"type":52,"value":409},{"type":46,"tag":633,"props":2648,"children":2650},{"id":2649},"precheck",[2651],{"type":52,"value":526},{"type":46,"tag":191,"props":2653,"children":2655},{"className":193,"code":2654,"language":195,"meta":196,"style":196},"func testAccPreCheck(t *testing.T) {\n    t.Helper()\n    if os.Getenv(\"EXAMPLE_API_KEY\") == \"\" {\n        t.Fatal(\"EXAMPLE_API_KEY must be set for acceptance tests\")\n    }\n}\n",[2656],{"type":46,"tag":112,"props":2657,"children":2658},{"__ignoreMap":196},[2659,2667,2675,2683,2691,2698],{"type":46,"tag":202,"props":2660,"children":2661},{"class":204,"line":205},[2662],{"type":46,"tag":202,"props":2663,"children":2664},{},[2665],{"type":52,"value":2666},"func testAccPreCheck(t *testing.T) {\n",{"type":46,"tag":202,"props":2668,"children":2669},{"class":204,"line":214},[2670],{"type":46,"tag":202,"props":2671,"children":2672},{},[2673],{"type":52,"value":2674},"    t.Helper()\n",{"type":46,"tag":202,"props":2676,"children":2677},{"class":204,"line":223},[2678],{"type":46,"tag":202,"props":2679,"children":2680},{},[2681],{"type":52,"value":2682},"    if os.Getenv(\"EXAMPLE_API_KEY\") == \"\" {\n",{"type":46,"tag":202,"props":2684,"children":2685},{"class":204,"line":232},[2686],{"type":46,"tag":202,"props":2687,"children":2688},{},[2689],{"type":52,"value":2690},"        t.Fatal(\"EXAMPLE_API_KEY must be set for acceptance tests\")\n",{"type":46,"tag":202,"props":2692,"children":2693},{"class":204,"line":241},[2694],{"type":46,"tag":202,"props":2695,"children":2696},{},[2697],{"type":52,"value":2082},{"type":46,"tag":202,"props":2699,"children":2700},{"class":204,"line":251},[2701],{"type":46,"tag":202,"props":2702,"children":2703},{},[2704],{"type":52,"value":409},{"type":46,"tag":2706,"props":2707,"children":2708},"style",{},[2709],{"type":52,"value":2710},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2712,"total":358},[2713,2732,2744,2757,2769,2781,2795,2805,2812,2827,2839,2850],{"slug":2714,"name":2714,"fn":2715,"description":2716,"org":2717,"tags":2718,"stars":25,"repoUrl":26,"updatedAt":2731},"aws-ami-builder","build Amazon Machine Images with Packer","Build Amazon Machine Images (AMIs) with Packer using the amazon-ebs builder. Use when creating custom AMIs for EC2 instances.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2719,2722,2725,2728],{"name":2720,"slug":2721,"type":15},"AWS","aws",{"name":2723,"slug":2724,"type":15},"Deployment","deployment",{"name":2726,"slug":2727,"type":15},"Infrastructure as Code","infrastructure-as-code",{"name":2729,"slug":2730,"type":15},"Packer","packer","2026-04-06T18:25:04.01571",{"slug":2733,"name":2733,"fn":2734,"description":2735,"org":2736,"tags":2737,"stars":25,"repoUrl":26,"updatedAt":2743},"azure-image-builder","build Azure managed images with Packer","Build Azure managed images and Azure Compute Gallery images with Packer. Use when creating custom images for Azure VMs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2738,2741,2742],{"name":2739,"slug":2740,"type":15},"Azure","azure",{"name":2723,"slug":2724,"type":15},{"name":2729,"slug":2730,"type":15},"2026-04-06T18:25:06.590174",{"slug":2745,"name":2745,"fn":2746,"description":2747,"org":2748,"tags":2749,"stars":25,"repoUrl":26,"updatedAt":2756},"azure-verified-modules","develop certified Azure Verified Modules","Azure Verified Modules (AVM) requirements and best practices for developing certified Azure Terraform modules. Use when creating or reviewing Azure modules that need AVM certification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2750,2751,2754,2755],{"name":2739,"slug":2740,"type":15},{"name":2752,"slug":2753,"type":15},"Compliance","compliance",{"name":2726,"slug":2727,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:16.88768",{"slug":2758,"name":2758,"fn":2759,"description":2760,"org":2761,"tags":2762,"stars":25,"repoUrl":26,"updatedAt":2768},"new-terraform-provider","scaffold new Terraform providers","Use this when scaffolding a new Terraform provider.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2763,2764,2767],{"name":17,"slug":18,"type":15},{"name":2765,"slug":2766,"type":15},"Templates","templates",{"name":20,"slug":21,"type":15},"2026-04-06T18:25:11.814973",{"slug":2770,"name":2770,"fn":2771,"description":2772,"org":2773,"tags":2774,"stars":25,"repoUrl":26,"updatedAt":2780},"provider-actions","implement Terraform Provider lifecycle actions","Implement Terraform Provider actions using the Plugin Framework. Use when developing imperative operations that execute at lifecycle events (before\u002Fafter create, update, destroy).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2775,2778,2779],{"name":2776,"slug":2777,"type":15},"API Development","api-development",{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:07.880533",{"slug":2782,"name":2782,"fn":2783,"description":2784,"org":2785,"tags":2786,"stars":25,"repoUrl":26,"updatedAt":2794},"provider-docs","generate and review Terraform provider documentation","Create, update, and review Terraform provider documentation for Terraform Registry using HashiCorp-recommended patterns, tfplugindocs templates, and schema descriptions. Use when adding or changing provider configuration, resources, data sources, ephemeral resources, list resources, functions, or guides; when validating generated docs; and when troubleshooting missing or incorrect Registry documentation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2787,2790,2793],{"name":2788,"slug":2789,"type":15},"Documentation","documentation",{"name":2791,"slug":2792,"type":15},"Technical Writing","technical-writing",{"name":20,"slug":21,"type":15},"2026-04-06T18:25:09.261559",{"slug":2796,"name":2796,"fn":2797,"description":2798,"org":2799,"tags":2800,"stars":25,"repoUrl":26,"updatedAt":2804},"provider-resources","implement Terraform Provider resources and data sources","Implement Terraform Provider resources and data sources using the Plugin Framework. Use when developing CRUD operations, schema design, state management, and acceptance testing for provider resources.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2801,2802,2803],{"name":2776,"slug":2777,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:10.56237",{"slug":4,"name":4,"fn":5,"description":6,"org":2806,"tags":2807,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2808,2809,2810,2811],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"slug":2813,"name":2813,"fn":2814,"description":2815,"org":2816,"tags":2817,"stars":25,"repoUrl":26,"updatedAt":2826},"push-to-registry","push Packer build metadata to HCP registry","Push Packer build metadata to HCP Packer registry for tracking and managing image lifecycle. Use when integrating Packer builds with HCP Packer for version control and governance.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2818,2819,2822,2825],{"name":2723,"slug":2724,"type":15},{"name":2820,"slug":2821,"type":15},"Governance","governance",{"name":2823,"slug":2824,"type":15},"HCP","hcp",{"name":2729,"slug":2730,"type":15},"2026-04-06T18:25:02.749563",{"slug":2828,"name":2828,"fn":2829,"description":2830,"org":2831,"tags":2832,"stars":25,"repoUrl":26,"updatedAt":2838},"refactor-module","refactor Terraform configurations into reusable modules","Transform monolithic Terraform configurations into reusable, maintainable modules following HashiCorp's module design principles and community best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2833,2836,2837],{"name":2834,"slug":2835,"type":15},"Architecture","architecture",{"name":2726,"slug":2727,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:25:20.953737",{"slug":2840,"name":2840,"fn":2841,"description":2842,"org":2843,"tags":2844,"stars":25,"repoUrl":26,"updatedAt":2849},"run-acceptance-tests","run acceptance tests for Terraform providers","Guide for running acceptance tests for a Terraform provider. Use this when asked to run an acceptance test or to run a test with the prefix `TestAcc`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2845,2846,2847,2848],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},"2026-04-06T18:25:13.098191",{"slug":2851,"name":2851,"fn":2852,"description":2853,"org":2854,"tags":2855,"stars":25,"repoUrl":26,"updatedAt":2862},"terraform-policy","write and test Terraform policy files","Write, test, or convert Terraform Policy files (.policy.hcl, .policytest.hcl, Sentinel→tfpolicy). Triggers: policy.hcl, policytest, convert sentinel, tfpolicy, write a policy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2856,2857,2858,2861],{"name":2752,"slug":2753,"type":15},{"name":2726,"slug":2727,"type":15},{"name":2859,"slug":2860,"type":15},"Security","security",{"name":20,"slug":21,"type":15},"2026-07-18T05:48:20.299442",{"items":2864,"total":350},[2865,2872,2878,2885,2891,2897,2903],{"slug":2714,"name":2714,"fn":2715,"description":2716,"org":2866,"tags":2867,"stars":25,"repoUrl":26,"updatedAt":2731},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2868,2869,2870,2871],{"name":2720,"slug":2721,"type":15},{"name":2723,"slug":2724,"type":15},{"name":2726,"slug":2727,"type":15},{"name":2729,"slug":2730,"type":15},{"slug":2733,"name":2733,"fn":2734,"description":2735,"org":2873,"tags":2874,"stars":25,"repoUrl":26,"updatedAt":2743},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2875,2876,2877],{"name":2739,"slug":2740,"type":15},{"name":2723,"slug":2724,"type":15},{"name":2729,"slug":2730,"type":15},{"slug":2745,"name":2745,"fn":2746,"description":2747,"org":2879,"tags":2880,"stars":25,"repoUrl":26,"updatedAt":2756},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2881,2882,2883,2884],{"name":2739,"slug":2740,"type":15},{"name":2752,"slug":2753,"type":15},{"name":2726,"slug":2727,"type":15},{"name":20,"slug":21,"type":15},{"slug":2758,"name":2758,"fn":2759,"description":2760,"org":2886,"tags":2887,"stars":25,"repoUrl":26,"updatedAt":2768},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2888,2889,2890],{"name":17,"slug":18,"type":15},{"name":2765,"slug":2766,"type":15},{"name":20,"slug":21,"type":15},{"slug":2770,"name":2770,"fn":2771,"description":2772,"org":2892,"tags":2893,"stars":25,"repoUrl":26,"updatedAt":2780},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2894,2895,2896],{"name":2776,"slug":2777,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"slug":2782,"name":2782,"fn":2783,"description":2784,"org":2898,"tags":2899,"stars":25,"repoUrl":26,"updatedAt":2794},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2900,2901,2902],{"name":2788,"slug":2789,"type":15},{"name":2791,"slug":2792,"type":15},{"name":20,"slug":21,"type":15},{"slug":2796,"name":2796,"fn":2797,"description":2798,"org":2904,"tags":2905,"stars":25,"repoUrl":26,"updatedAt":2804},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2906,2907,2908],{"name":2776,"slug":2777,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15}]