Skip to content

Commit 7cdee82

Browse files
PF Diff tests for secrets
1 parent 5fbeb0c commit 7cdee82

File tree

1 file changed

+310
-0
lines changed

1 file changed

+310
-0
lines changed

pkg/pf/tests/diff_secret_test.go

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
package tfbridgetests
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
rschema "github.com/hashicorp/terraform-plugin-framework/resource/schema"
8+
"github.com/hashicorp/terraform-plugin-framework/types"
9+
"github.com/hexops/autogold/v2"
10+
"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/pf/tests/internal/providerbuilder"
11+
pb "github.com/pulumi/pulumi-terraform-bridge/v3/pkg/pf/tests/internal/providerbuilder"
12+
"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/pf/tests/pulcheck"
13+
tfbridge0 "github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfbridge"
14+
"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfbridge/info"
15+
"github.com/pulumi/pulumi/sdk/v3/go/auto/optpreview"
16+
"github.com/stretchr/testify/require"
17+
)
18+
19+
func TestSecretBasic(t *testing.T) {
20+
t.Parallel()
21+
provBuilder := providerbuilder.NewProvider(
22+
providerbuilder.NewProviderArgs{
23+
AllResources: []providerbuilder.Resource{
24+
providerbuilder.NewResource(providerbuilder.NewResourceArgs{
25+
ResourceSchema: rschema.Schema{
26+
Attributes: map[string]rschema.Attribute{
27+
"s": rschema.StringAttribute{Optional: true},
28+
},
29+
},
30+
}),
31+
},
32+
})
33+
34+
prov := bridgedProvider(provBuilder)
35+
36+
program := `
37+
name: test
38+
runtime: yaml
39+
resources:
40+
mainRes:
41+
type: testprovider:index:Test
42+
properties:
43+
s:
44+
fn::secret:
45+
%s`
46+
47+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "hello"))
48+
require.NoError(t, err)
49+
pt.Up(t)
50+
51+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "value2"))
52+
res := pt.Preview(t, optpreview.Diff())
53+
autogold.Expect(`Previewing update (test):
54+
pulumi:pulumi:Stack: (same)
55+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
56+
~ testprovider:index/test:Test: (update)
57+
[id=test-id]
58+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
59+
s: [secret]
60+
Resources:
61+
~ 1 to update
62+
1 unchanged
63+
`).Equal(t, res.StdOut)
64+
}
65+
66+
func TestSecretSet(t *testing.T) {
67+
t.Parallel()
68+
69+
provBuilder := pb.NewProvider(pb.NewProviderArgs{
70+
AllResources: []providerbuilder.Resource{
71+
providerbuilder.NewResource(providerbuilder.NewResourceArgs{
72+
ResourceSchema: rschema.Schema{
73+
Attributes: map[string]rschema.Attribute{
74+
"keys": rschema.SetAttribute{
75+
Optional: true,
76+
ElementType: types.StringType,
77+
},
78+
},
79+
},
80+
}),
81+
},
82+
})
83+
84+
prov := bridgedProvider(provBuilder)
85+
86+
program := `
87+
name: test
88+
runtime: yaml
89+
resources:
90+
mainRes:
91+
type: testprovider:index:Test
92+
properties:
93+
keys: %s
94+
`
95+
96+
t.Run("secret collection", func(t *testing.T) {
97+
t.Parallel()
98+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "{fn::secret: [value1, value2]}"))
99+
require.NoError(t, err)
100+
pt.Up(t)
101+
102+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "{fn::secret: [value1, value3]}"))
103+
res := pt.Preview(t, optpreview.Diff())
104+
autogold.Expect(`Previewing update (test):
105+
pulumi:pulumi:Stack: (same)
106+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
107+
~ testprovider:index/test:Test: (update)
108+
[id=test-id]
109+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
110+
keys: [secret]
111+
Resources:
112+
~ 1 to update
113+
1 unchanged
114+
`).Equal(t, res.StdOut)
115+
})
116+
117+
t.Run("secret collection element", func(t *testing.T) {
118+
t.Parallel()
119+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "[{fn::secret: value1}, value2]"))
120+
require.NoError(t, err)
121+
pt.Up(t)
122+
123+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "[{fn::secret: value3}, value2]"))
124+
res := pt.Preview(t, optpreview.Diff())
125+
autogold.Expect(`Previewing update (test):
126+
pulumi:pulumi:Stack: (same)
127+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
128+
~ testprovider:index/test:Test: (update)
129+
[id=test-id]
130+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
131+
keys: [secret]
132+
Resources:
133+
~ 1 to update
134+
1 unchanged
135+
`).Equal(t, res.StdOut)
136+
})
137+
138+
t.Run("secret collection element secret element unchanged", func(t *testing.T) {
139+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "[{fn::secret: value1}, value2]"))
140+
require.NoError(t, err)
141+
pt.Up(t)
142+
143+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "[{fn::secret: value1}, value3]"))
144+
res := pt.Preview(t, optpreview.Diff())
145+
autogold.Expect(`Previewing update (test):
146+
pulumi:pulumi:Stack: (same)
147+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
148+
~ testprovider:index/test:Test: (update)
149+
[id=test-id]
150+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
151+
keys: [secret]
152+
Resources:
153+
~ 1 to update
154+
1 unchanged
155+
`).Equal(t, res.StdOut)
156+
})
157+
}
158+
159+
func TestSecretObjectBlock(t *testing.T) {
160+
t.Parallel()
161+
162+
provBuilder := pb.NewProvider(pb.NewProviderArgs{
163+
AllResources: []providerbuilder.Resource{
164+
providerbuilder.NewResource(providerbuilder.NewResourceArgs{
165+
ResourceSchema: rschema.Schema{
166+
Blocks: map[string]rschema.Block{
167+
"key": rschema.SingleNestedBlock{
168+
Attributes: map[string]rschema.Attribute{
169+
"prop1": rschema.StringAttribute{Optional: true},
170+
"prop2": rschema.StringAttribute{Optional: true},
171+
},
172+
},
173+
},
174+
},
175+
}),
176+
},
177+
})
178+
179+
prov := bridgedProvider(provBuilder)
180+
181+
program := `
182+
name: test
183+
runtime: yaml
184+
resources:
185+
mainRes:
186+
type: testprovider:index:Test
187+
properties:
188+
key: %s`
189+
190+
t.Run("secret object block", func(t *testing.T) {
191+
t.Parallel()
192+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "{fn::secret: {prop1: value1, prop2: value2}}"))
193+
require.NoError(t, err)
194+
pt.Up(t)
195+
196+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "{fn::secret: {prop1: value3, prop2: value2}}"))
197+
res := pt.Preview(t, optpreview.Diff())
198+
autogold.Expect(`Previewing update (test):
199+
pulumi:pulumi:Stack: (same)
200+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
201+
~ testprovider:index/test:Test: (update)
202+
[id=test-id]
203+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
204+
key: [secret]
205+
Resources:
206+
~ 1 to update
207+
1 unchanged
208+
`).Equal(t, res.StdOut)
209+
})
210+
211+
t.Run("secret object block element", func(t *testing.T) {
212+
t.Parallel()
213+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "{prop1: {fn::secret: value1}, prop2: value2}"))
214+
require.NoError(t, err)
215+
pt.Up(t)
216+
217+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "{prop1: {fn::secret: value3}, prop2: value2}"))
218+
res := pt.Preview(t, optpreview.Diff())
219+
autogold.Expect(`Previewing update (test):
220+
pulumi:pulumi:Stack: (same)
221+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
222+
~ testprovider:index/test:Test: (update)
223+
[id=test-id]
224+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
225+
key: {
226+
prop1: [secret]
227+
prop2: "value2"
228+
}
229+
Resources:
230+
~ 1 to update
231+
1 unchanged
232+
`).Equal(t, res.StdOut)
233+
})
234+
235+
t.Run("secret object block element secret element unchanged", func(t *testing.T) {
236+
t.Parallel()
237+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "{prop1: {fn::secret: value1}, prop2: value2}"))
238+
require.NoError(t, err)
239+
pt.Up(t)
240+
241+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "{prop1: {fn::secret: value1}, prop2: value3}"))
242+
res := pt.Preview(t, optpreview.Diff())
243+
autogold.Expect(`Previewing update (test):
244+
pulumi:pulumi:Stack: (same)
245+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
246+
~ testprovider:index/test:Test: (update)
247+
[id=test-id]
248+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
249+
~ key: {
250+
prop1: [secret]
251+
~ prop2: "value2" => "value3"
252+
}
253+
Resources:
254+
~ 1 to update
255+
1 unchanged
256+
`).Equal(t, res.StdOut)
257+
})
258+
}
259+
260+
func TestSecretPulumiSchema(t *testing.T) {
261+
t.Parallel()
262+
263+
provBuilder := pb.NewProvider(pb.NewProviderArgs{
264+
AllResources: []providerbuilder.Resource{
265+
providerbuilder.NewResource(providerbuilder.NewResourceArgs{
266+
ResourceSchema: rschema.Schema{
267+
Attributes: map[string]rschema.Attribute{
268+
"s": rschema.StringAttribute{Optional: true},
269+
},
270+
},
271+
}),
272+
},
273+
})
274+
275+
prov := bridgedProvider(provBuilder)
276+
277+
prov.Resources["testprovider_test"].Fields = map[string]*info.Schema{
278+
"s": {Secret: tfbridge0.True()},
279+
}
280+
281+
program := `
282+
name: test
283+
runtime: yaml
284+
resources:
285+
mainRes:
286+
type: testprovider:index:Test
287+
properties:
288+
s: %s`
289+
290+
t.Run("secret string attribute", func(t *testing.T) {
291+
t.Parallel()
292+
pt, err := pulcheck.PulCheck(t, prov, fmt.Sprintf(program, "value1"))
293+
require.NoError(t, err)
294+
pt.Up(t)
295+
296+
pt.WritePulumiYaml(t, fmt.Sprintf(program, "value2"))
297+
res := pt.Preview(t, optpreview.Diff())
298+
autogold.Expect(`Previewing update (test):
299+
pulumi:pulumi:Stack: (same)
300+
[urn=urn:pulumi:test::test::pulumi:pulumi:Stack::test-test]
301+
~ testprovider:index/test:Test: (update)
302+
[id=test-id]
303+
[urn=urn:pulumi:test::test::testprovider:index/test:Test::mainRes]
304+
s: [secret]
305+
Resources:
306+
~ 1 to update
307+
1 unchanged
308+
`).Equal(t, res.StdOut)
309+
})
310+
}

0 commit comments

Comments
 (0)