Skip to content

Commit 8032732

Browse files
authored
TFECO-9157: Add tests for identity_data.go and switch to multiple field reader (#1453)
* Start writing tests for identity_data.go * Switch to using multiple field readers in `IdentityData` This resembles the behaviour in `ResourceData` more closely. Specifically, this makes it possible to have number values in the source identity sent by Terraform that are encoded as strings. Before this commit this failed as the field writer does not allow to write strings for fields that are typed as integers in the schema, which is what we did to initialize the result. * add remaining test cases for GetOk and Set * address review feedback
1 parent e45d23a commit 8032732

File tree

3 files changed

+694
-18
lines changed

3 files changed

+694
-18
lines changed

helper/schema/identity_data.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ type IdentityData struct {
1616
schema map[string]*Schema
1717

1818
// Don't set
19-
once sync.Once
20-
writer *MapFieldWriter
21-
reader *MapFieldReader
19+
once sync.Once
20+
multiReader *MultiLevelFieldReader
21+
setWriter *MapFieldWriter
2222

2323
panicOnError bool
2424
}
@@ -68,33 +68,37 @@ func (d *IdentityData) Set(key string, value interface{}) error {
6868
}
6969
}
7070

71-
err := d.writer.WriteField(strings.Split(key, "."), value)
71+
err := d.setWriter.WriteField(strings.Split(key, "."), value)
7272
if err != nil {
7373
if d.panicOnError {
7474
panic(err)
7575
} else {
76-
log.Printf("[ERROR] setting state: %s", err)
76+
log.Printf("[ERROR] setting identity state: %s", err)
7777
}
7878
}
7979
return err
8080
}
8181

8282
func (d *IdentityData) init() {
83-
// re-use writers and readers to handle storing in flat map data structure
84-
d.writer = &MapFieldWriter{Schema: d.schema}
85-
for key, value := range d.raw {
86-
err := d.writer.WriteField(strings.Split(key, "."), value)
87-
if err != nil {
88-
if d.panicOnError {
89-
panic(err)
90-
} else {
91-
log.Printf("[ERROR] setting identity state: %s", err)
92-
}
83+
// Initialize the map for storing data set by the user
84+
d.setWriter = &MapFieldWriter{Schema: d.schema}
85+
86+
// Initialize the reader for getting data from the
87+
// underlying sources (config, diff, etc.)
88+
readers := make(map[string]FieldReader)
89+
if d.raw != nil {
90+
readers["raw"] = &MapFieldReader{
91+
Schema: d.schema,
92+
Map: BasicMapReader(d.raw),
9393
}
9494
}
95-
d.reader = &MapFieldReader{
95+
readers["set"] = &MapFieldReader{
9696
Schema: d.schema,
97-
Map: BasicMapReader(d.writer.Map()),
97+
Map: BasicMapReader(d.setWriter.Map()),
98+
}
99+
d.multiReader = &MultiLevelFieldReader{
100+
Levels: []string{"raw", "set"},
101+
Readers: readers,
98102
}
99103
}
100104

@@ -110,7 +114,7 @@ func (d *IdentityData) getRaw(key string) getResult {
110114
func (d *IdentityData) get(addr []string) getResult {
111115
d.once.Do(d.init)
112116

113-
result, err := d.reader.ReadField(addr)
117+
result, err := d.multiReader.ReadFieldMerge(addr, "set")
114118

115119
if err != nil {
116120
panic(err)

0 commit comments

Comments
 (0)