Skip to content

Commit 08330b4

Browse files
committed
chore: test HCLString edge cases
1 parent 1998a47 commit 08330b4

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

types/value.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import (
99
"github.com/zclconf/go-cty/cty"
1010
)
1111

12+
const (
13+
UnknownStringValue = "??"
14+
)
15+
1216
type NullHCLString struct {
1317
Value string `json:"value"`
1418
Valid bool `json:"valid"`
@@ -94,7 +98,7 @@ func (s HCLString) AsString() string {
9498
return *s.Source
9599
}
96100

97-
return "??"
101+
return UnknownStringValue
98102
}
99103

100104
func (s HCLString) IsKnown() bool {

types/value_test.go

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package types_test
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
"github.com/zclconf/go-cty/cty"
9+
10+
"github.com/coder/preview/types"
11+
)
12+
13+
func TestSafeHCLString(t *testing.T) {
14+
t.Parallel()
15+
16+
cases := []struct {
17+
name string
18+
input types.HCLString
19+
20+
asString string
21+
known bool
22+
valid bool
23+
}{
24+
{
25+
name: "empty",
26+
asString: types.UnknownStringValue,
27+
},
28+
{
29+
name: "string_literal",
30+
input: types.StringLiteral("hello world"),
31+
asString: "hello world",
32+
known: true,
33+
valid: true,
34+
},
35+
{
36+
name: "number",
37+
input: types.HCLString{
38+
Value: cty.NumberIntVal(1),
39+
},
40+
asString: "1",
41+
known: true,
42+
valid: true,
43+
},
44+
{
45+
name: "bool",
46+
input: types.HCLString{
47+
Value: cty.BoolVal(true),
48+
},
49+
asString: "true",
50+
known: true,
51+
valid: true,
52+
},
53+
// Crazy ideas
54+
{
55+
name: "null",
56+
input: types.HCLString{
57+
Value: cty.NullVal(cty.NilType),
58+
},
59+
asString: types.UnknownStringValue,
60+
known: false,
61+
valid: false,
62+
},
63+
{
64+
name: "empty_string_list",
65+
input: types.HCLString{
66+
Value: cty.ListValEmpty(cty.String),
67+
},
68+
asString: types.UnknownStringValue,
69+
known: false,
70+
valid: false,
71+
},
72+
{
73+
name: "dynamic",
74+
input: types.HCLString{
75+
Value: cty.DynamicVal,
76+
},
77+
asString: types.UnknownStringValue,
78+
known: false,
79+
valid: false,
80+
},
81+
}
82+
83+
for _, tc := range cases {
84+
t.Run(tc.name, func(t *testing.T) {
85+
require.Equal(t, tc.asString, tc.input.AsString())
86+
require.Equal(t, tc.known, tc.input.IsKnown(), "known")
87+
require.Equal(t, tc.valid, tc.input.Valid(), "valid")
88+
89+
_, err := json.Marshal(tc.input)
90+
require.NoError(t, err)
91+
})
92+
}
93+
}

0 commit comments

Comments
 (0)