From 63a9bffebc7218b59ad48218e77bfa9a99c78b34 Mon Sep 17 00:00:00 2001 From: Venelin Date: Tue, 4 Jun 2024 17:08:42 +0100 Subject: [PATCH 1/5] unknown tests --- pkg/tfbridge/provider_test.go | 1043 +++++++++++++++++++++++++++++++++ 1 file changed, 1043 insertions(+) diff --git a/pkg/tfbridge/provider_test.go b/pkg/tfbridge/provider_test.go index 77ec0ee14..3519a6439 100644 --- a/pkg/tfbridge/provider_test.go +++ b/pkg/tfbridge/provider_test.go @@ -4535,3 +4535,1046 @@ func TestPlanResourceChangeStateUpgrade(t *testing.T) { } }`) } + +func UnknownsSchema() map[string]*schemav2.Resource { + return map[string]*schemav2.Resource{ + "example_resource": { + Schema: map[string]*schemav2.Schema{ + "set_prop": { + Type: schema.TypeSet, + Optional: true, + Elem: &schemav2.Schema{Type: schemav2.TypeString}, + }, + "set_block_prop": { + Type: schema.TypeSet, + Optional: true, + Elem: &schemav2.Resource{ + Schema: map[string]*schemav2.Schema{ + "prop": { + Type: schema.TypeString, + Optional: true, + }, + }, + }, + }, + "string_prop": { + Type: schema.TypeString, + Optional: true, + }, + "list_prop": { + Type: schema.TypeList, + Optional: true, + Elem: &schemav2.Schema{Type: schemav2.TypeString}, + }, + "list_block_prop": { + Type: schema.TypeList, + Optional: true, + Elem: &schemav2.Resource{ + Schema: map[string]*schemav2.Schema{ + "prop": { + Type: schema.TypeString, + Optional: true, + }, + }, + }, + }, + "nested_list_prop": { + Type: schema.TypeList, + Optional: true, + Elem: &schemav2.Schema{ + Type: schema.TypeList, + Optional: true, + Elem: &schemav2.Schema{Type: schemav2.TypeString}, + }, + }, + "nested_list_block_prop": { + Type: schema.TypeList, + Optional: true, + Elem: &schemav2.Resource{ + Schema: map[string]*schemav2.Schema{ + "nested_prop": { + Type: schema.TypeList, + Optional: true, + Elem: &schemav2.Resource{ + Schema: map[string]*schemav2.Schema{ + "prop": { + Type: schema.TypeString, + Optional: true, + }, + }, + }, + }, + }, + }, + }, + "max_items_one_prop": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schemav2.Schema{Type: schemav2.TypeString}, + }, + "max_items_one_block_prop": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schemav2.Resource{ + Schema: map[string]*schemav2.Schema{ + "prop": { + Type: schema.TypeString, + Optional: true, + }, + }, + }, + }, + }, + }, + } +} + +func TestUnknowns(t *testing.T) { + // Related to [pulumi/pulumi-terraform-bridge#1885] + p := &schemav2.Provider{ + Schema: map[string]*schemav2.Schema{}, + ResourcesMap: UnknownsSchema(), + } + shimProv := shimv2.NewProvider(p, shimv2.WithPlanResourceChange(func(tfResourceType string) bool { return false })) + provider := &Provider{ + tf: shimProv, + config: shimv2.NewSchemaMap(p.Schema), + info: ProviderInfo{ + P: shimProv, + ResourcePrefix: "example", + Resources: map[string]*ResourceInfo{ + "example_resource": {Tok: "ExampleResource"}, + }, + }, + } + provider.initResourceMaps() + + t.Run("unknown for string prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "string_prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) + + t.Run("unknown for set prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) + + t.Run("unknown for set block prop subprop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setBlockProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) + + t.Run("unknown for set block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) + + t.Run("unknown for set block prop collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "setBlockProps":[{"prop":""}] + } + } + }`) + }) + + t.Run("unknown for list prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id": "" + } + } + }`) + }) + + t.Run("unknown for list block prop subprop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listBlockProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "listBlockProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + } + } + }`) + }) + + t.Run("unknown for list block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) + + t.Run("unknown for list block prop collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "listBlockProps":[null] + } + } + }`) + }) + + t.Run("unknown for nested list prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListProps":[["04da6b54-80e4-46f7-96ec-b56ff0331ba9"]] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "nestedListProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + } + } + }`) + }) + + t.Run("unknown for nested list block prop nested subprop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":[{"nestedProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}]}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "nestedListBlockProps":[{"nestedProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}]}] + } + } + }`) + }) + + t.Run("unknown for nested list block nested prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":[{"nestedProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"]}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "nestedListBlockProps":[{"nestedProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + } + } + }`) + }) + + t.Run("unknown for nested list block prop nested collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":[{"nestedProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "nestedListBlockProps":[{"nestedProps":[null]}] + } + } + }`) + }) + + t.Run("unknown for nested list block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) + + t.Run("unknown for nested list block prop collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "nestedListBlockProps":[null] + } + } + }`) + }) + + t.Run("unknown for max items one prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "maxItemsOneProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) + + t.Run("unknown for max items one block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "maxItemsOneBlockProp":{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"} + }, + "preview":true + }, + "response": { + "properties":{ + "id":"", + "maxItemsOneBlockProp": {"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"} + } + } + }`) + }) + + t.Run("unknown for max items one block", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "maxItemsOneBlockProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"" + } + } + }`) + }) +} + +func TestPlanResourceChangeUnknowns(t *testing.T) { + // Related to [pulumi/pulumi-terraform-bridge#1885] + p := &schemav2.Provider{ + Schema: map[string]*schemav2.Schema{}, + ResourcesMap: UnknownsSchema(), + } + shimProv := shimv2.NewProvider(p, shimv2.WithPlanResourceChange(func(tfResourceType string) bool { return true })) + provider := &Provider{ + tf: shimProv, + config: shimv2.NewSchemaMap(p.Schema), + info: ProviderInfo{ + P: shimProv, + ResourcePrefix: "example", + Resources: map[string]*ResourceInfo{ + "example_resource": {Tok: "ExampleResource"}, + }, + }, + } + provider.initResourceMaps() + + t.Run("unknown for string prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "string_prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for set prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for set block prop subprop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setBlockProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[{ + "prop": "04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for set block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[{"prop":""}], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for set block prop collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "setBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[{"prop":""}], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for list prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "maxItemsOneProp":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for list block prop subprop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listBlockProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[{ + "prop": "04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for list block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for list block prop collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "listBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[{ "prop": null }], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for nested list prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListProps":[["04da6b54-80e4-46f7-96ec-b56ff0331ba9"]] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "maxItemsOneProp":null, + "nestedListProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"], + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for nested list block prop nested subprop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":[{"nestedProps":[{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}]}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[{ + "nestedProps": [ + {"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"} + ] + }], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for nested list block prop nested prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":[{"nestedProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"]}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[{ + "nestedProps": "04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for nested list block prop nested collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":[{"nestedProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"}] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[{ + "nestedProps": [{"prop":null}] + }], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for nested list block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for nested list block collection", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "nestedListBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[{"nestedProps":null}], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for max items one prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "maxItemsOneProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":null + } + } + }`) + }) + + t.Run("unknown for max items one block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "maxItemsOneBlockProp":{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"} + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":{"prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9"} + } + } + }`) + }) + + t.Run("unknown for max items one block prop", func(t *testing.T) { + testutils.Replay(t, provider, ` + { + "method": "/pulumirpc.ResourceProvider/Create", + "request": { + "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", + "properties":{ + "__defaults":[], + "maxItemsOneBlockProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + }, + "preview":true + }, + "response": { + "properties":{ + "id":"04da6b54-80e4-46f7-96ec-b56ff0331ba9", + "stringProp":null, + "setProps":null, + "listProps":null, + "nestedListProps":null, + "maxItemsOneProp":null, + "setBlockProps":[], + "listBlockProps":[], + "nestedListBlockProps":[], + "maxItemsOneBlockProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + } + } + }`) + }) +} From 1c3797a73e5fc60532da91b055f94cbcd1b3f2c2 Mon Sep 17 00:00:00 2001 From: Venelin Date: Tue, 4 Jun 2024 17:29:06 +0100 Subject: [PATCH 2/5] rename accidentally repeated test name --- pkg/tfbridge/provider_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/tfbridge/provider_test.go b/pkg/tfbridge/provider_test.go index 3519a6439..8d88e64f0 100644 --- a/pkg/tfbridge/provider_test.go +++ b/pkg/tfbridge/provider_test.go @@ -5520,7 +5520,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }`) }) - t.Run("unknown for max items one block prop", func(t *testing.T) { + t.Run("unknown for max items one block subprop", func(t *testing.T) { testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", From 9cca15cb6de1437459fa9f22884d28bf585fb200 Mon Sep 17 00:00:00 2001 From: Venelin Date: Tue, 4 Jun 2024 18:16:47 +0100 Subject: [PATCH 3/5] add description for the tests --- pkg/tfbridge/provider_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pkg/tfbridge/provider_test.go b/pkg/tfbridge/provider_test.go index 8d88e64f0..c893d66ac 100644 --- a/pkg/tfbridge/provider_test.go +++ b/pkg/tfbridge/provider_test.go @@ -4633,6 +4633,19 @@ func UnknownsSchema() map[string]*schemav2.Resource { func TestUnknowns(t *testing.T) { // Related to [pulumi/pulumi-terraform-bridge#1885] + // This test is to ensure that we can handle unknowns in the schema. + // Note that the behaviour here might not match TF and can NOT match TF completely + // as HCL has no way of expressing unknown blocks. + // We currently have a workaround in makeTerraformInputs where we convert unknown blocks + // to blocks of unknown. + // + // The structure is that for each property we inject an unknown at every level. + // For the block tests: + // _subprop is an unknown for the subproperty in the block object + // _prop is an unknown for the whole block + // _collection is an unknown for the whole collection + // The nested match the above convention but also iterate over the nested object. + p := &schemav2.Provider{ Schema: map[string]*schemav2.Schema{}, ResourcesMap: UnknownsSchema(), @@ -5023,6 +5036,19 @@ func TestUnknowns(t *testing.T) { func TestPlanResourceChangeUnknowns(t *testing.T) { // Related to [pulumi/pulumi-terraform-bridge#1885] + // This test is to ensure that we can handle unknowns in the schema. + // Note that the behaviour here might not match TF and can NOT match TF completely + // as HCL has no way of expressing unknown blocks. + // We currently have a workaround in makeTerraformInputs where we convert unknown blocks + // to blocks of unknown. + // + // The structure is that for each property we inject an unknown at every level. + // For the block tests: + // _subprop is an unknown for the subproperty in the block object + // _prop is an unknown for the whole block + // _collection is an unknown for the whole collection + // The nested match the above convention but also iterate over the nested object. + p := &schemav2.Provider{ Schema: map[string]*schemav2.Schema{}, ResourcesMap: UnknownsSchema(), From 989d6f16b95b7e944107e9df55b8fafa9d62b1e5 Mon Sep 17 00:00:00 2001 From: Venelin Date: Wed, 5 Jun 2024 12:09:11 +0100 Subject: [PATCH 4/5] correct test case --- pkg/tfbridge/provider_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/tfbridge/provider_test.go b/pkg/tfbridge/provider_test.go index c893d66ac..4193f392c 100644 --- a/pkg/tfbridge/provider_test.go +++ b/pkg/tfbridge/provider_test.go @@ -5194,7 +5194,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", "properties":{ "__defaults":[], - "setBlockProps":["04da6b54-80e4-46f7-96ec-b56ff0331ba9"] + "setBlockProps":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" }, "preview":true }, From f2a07a8df8236bacfc37d1506bf46c7c4d07bdc1 Mon Sep 17 00:00:00 2001 From: Venelin Date: Wed, 5 Jun 2024 15:06:53 +0100 Subject: [PATCH 5/5] add comments to the tests --- pkg/tfbridge/provider_test.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/tfbridge/provider_test.go b/pkg/tfbridge/provider_test.go index 4193f392c..528397714 100644 --- a/pkg/tfbridge/provider_test.go +++ b/pkg/tfbridge/provider_test.go @@ -4672,7 +4672,7 @@ func TestUnknowns(t *testing.T) { "urn": "urn:pulumi:dev::teststack::ExampleResource::exres", "properties":{ "__defaults":[], - "string_prop":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" + "stringProp":"04da6b54-80e4-46f7-96ec-b56ff0331ba9" }, "preview":true }, @@ -4745,6 +4745,7 @@ func TestUnknowns(t *testing.T) { }) t.Run("unknown for set block prop collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -4827,6 +4828,7 @@ func TestUnknowns(t *testing.T) { }) t.Run("unknown for list block prop collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -4848,6 +4850,7 @@ func TestUnknowns(t *testing.T) { }) t.Run("unknown for nested list prop", func(t *testing.T) { + // The unknownness gets promoted one level up. This seems to be TF behaviour, independent of PRC. testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -4911,6 +4914,7 @@ func TestUnknowns(t *testing.T) { }) t.Run("unknown for nested list block prop nested collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -4952,6 +4956,7 @@ func TestUnknowns(t *testing.T) { }) t.Run("unknown for nested list block prop collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5097,6 +5102,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for set prop", func(t *testing.T) { + // The unknownness gets promoted one level up. This seems to be TF behaviour, independent of PRC. testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5158,6 +5164,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for set block prop", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5187,6 +5194,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for set block prop collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5216,6 +5224,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for list prop", func(t *testing.T) { + // The unknownness gets promoted one level up. This seems to be TF behaviour, independent of PRC. testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5277,6 +5286,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for list block prop", func(t *testing.T) { + // The unknownness gets promoted one level up. This seems to be TF behaviour, independent of PRC. testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5306,6 +5316,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for list block prop collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5335,6 +5346,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for nested list prop", func(t *testing.T) { + // The unknownness gets promoted one level up. This seems to be TF behaviour, independent of PRC. testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5429,6 +5441,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for nested list block prop nested collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5460,6 +5473,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for nested list block prop", func(t *testing.T) { + // The unknownness gets promoted one level up. This seems to be TF behaviour, independent of PRC. testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create", @@ -5489,6 +5503,7 @@ func TestPlanResourceChangeUnknowns(t *testing.T) { }) t.Run("unknown for nested list block collection", func(t *testing.T) { + // TODO[pulumi/pulumi-terraform-bridge#1885] testutils.Replay(t, provider, ` { "method": "/pulumirpc.ResourceProvider/Create",