From e1924e3858d59a2611312f8a469f3921003b2f78 Mon Sep 17 00:00:00 2001 From: Mark Sagi-Kazar Date: Fri, 16 Jul 2021 01:47:03 +0200 Subject: [PATCH] test(encoding): add tests for existing encoding implementations Signed-off-by: Mark Sagi-Kazar --- internal/encoding/hcl/codec_test.go | 140 +++++++++++++++++++++++++++ internal/encoding/json/codec_test.go | 95 ++++++++++++++++++ internal/encoding/toml/codec_test.go | 106 ++++++++++++++++++++ internal/encoding/yaml/codec_test.go | 136 ++++++++++++++++++++++++++ 4 files changed, 477 insertions(+) create mode 100644 internal/encoding/hcl/codec_test.go create mode 100644 internal/encoding/json/codec_test.go create mode 100644 internal/encoding/toml/codec_test.go create mode 100644 internal/encoding/yaml/codec_test.go diff --git a/internal/encoding/hcl/codec_test.go b/internal/encoding/hcl/codec_test.go new file mode 100644 index 0000000..7e48057 --- /dev/null +++ b/internal/encoding/hcl/codec_test.go @@ -0,0 +1,140 @@ +package hcl + +import ( + "reflect" + "testing" +) + +// original form of the data +const original = `# key-value pair +"key" = "value" + +// list +"list" = ["item1", "item2", "item3"] + +/* map */ +"map" = { + "key" = "value" +} + +/* +nested map +*/ +"nested_map" "map" { + "key" = "value" + + "list" = ["item1", "item2", "item3"] +}` + +// encoded form of the data +const encoded = `"key" = "value" + +"list" = ["item1", "item2", "item3"] + +"map" = { + "key" = "value" +} + +"nested_map" "map" { + "key" = "value" + + "list" = ["item1", "item2", "item3"] +}` + +// decoded form of the data +// +// in case of HCL it's slightly different from Viper's internal representation +// (eg. map is decoded into a list of maps) +var decoded = map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + "map": []map[string]interface{}{ + { + "key": "value", + }, + }, + "nested_map": []map[string]interface{}{ + { + "map": []map[string]interface{}{ + { + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + }, + }, + }, + }, +} + +// Viper's internal representation +var data = map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + "map": map[string]interface{}{ + "key": "value", + }, + "nested_map": map[string]interface{}{ + "map": map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + }, + }, +} + +func TestCodec_Encode(t *testing.T) { + codec := Codec{} + + b, err := codec.Encode(data) + if err != nil { + t.Fatal(err) + } + + if encoded != string(b) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", string(b), encoded) + } +} + +func TestCodec_Decode(t *testing.T) { + t.Run("OK", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(original), v) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(decoded, v) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", v, decoded) + } + }) + + t.Run("InvalidData", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(`invalid data`), v) + if err == nil { + t.Fatal("expected decoding to fail") + } + + t.Logf("decoding failed as expected: %s", err) + }) +} diff --git a/internal/encoding/json/codec_test.go b/internal/encoding/json/codec_test.go new file mode 100644 index 0000000..f4a71df --- /dev/null +++ b/internal/encoding/json/codec_test.go @@ -0,0 +1,95 @@ +package json + +import ( + "reflect" + "testing" +) + +// encoded form of the data +const encoded = `{ + "key": "value", + "list": [ + "item1", + "item2", + "item3" + ], + "map": { + "key": "value" + }, + "nested_map": { + "map": { + "key": "value", + "list": [ + "item1", + "item2", + "item3" + ] + } + } +}` + +// Viper's internal representation +var data = map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + "map": map[string]interface{}{ + "key": "value", + }, + "nested_map": map[string]interface{}{ + "map": map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + }, + }, +} + +func TestCodec_Encode(t *testing.T) { + codec := Codec{} + + b, err := codec.Encode(data) + if err != nil { + t.Fatal(err) + } + + if encoded != string(b) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", string(b), encoded) + } +} + +func TestCodec_Decode(t *testing.T) { + t.Run("OK", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(encoded), v) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(data, v) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", v, data) + } + }) + + t.Run("InvalidData", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(`invalid data`), v) + if err == nil { + t.Fatal("expected decoding to fail") + } + + t.Logf("decoding failed as expected: %s", err) + }) +} diff --git a/internal/encoding/toml/codec_test.go b/internal/encoding/toml/codec_test.go new file mode 100644 index 0000000..33435e6 --- /dev/null +++ b/internal/encoding/toml/codec_test.go @@ -0,0 +1,106 @@ +package toml + +import ( + "reflect" + "testing" +) + +// original form of the data +const original = `# key-value pair +key = "value" +list = ["item1", "item2", "item3"] + +[map] +key = "value" + +# nested +# map +[nested_map] +[nested_map.map] +key = "value" +list = [ + "item1", + "item2", + "item3", +] +` + +// encoded form of the data +const encoded = `key = "value" +list = ["item1", "item2", "item3"] + +[map] + key = "value" + +[nested_map] + + [nested_map.map] + key = "value" + list = ["item1", "item2", "item3"] +` + +// Viper's internal representation +var data = map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + "map": map[string]interface{}{ + "key": "value", + }, + "nested_map": map[string]interface{}{ + "map": map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + }, + }, +} + +func TestCodec_Encode(t *testing.T) { + codec := Codec{} + + b, err := codec.Encode(data) + if err != nil { + t.Fatal(err) + } + + if encoded != string(b) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", string(b), encoded) + } +} + +func TestCodec_Decode(t *testing.T) { + t.Run("OK", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(original), v) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(data, v) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", v, data) + } + }) + + t.Run("InvalidData", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(`invalid data`), v) + if err == nil { + t.Fatal("expected decoding to fail") + } + + t.Logf("decoding failed as expected: %s", err) + }) +} diff --git a/internal/encoding/yaml/codec_test.go b/internal/encoding/yaml/codec_test.go new file mode 100644 index 0000000..d76a6c6 --- /dev/null +++ b/internal/encoding/yaml/codec_test.go @@ -0,0 +1,136 @@ +package yaml + +import ( + "reflect" + "testing" +) + +// original form of the data +const original = `# key-value pair +key: value +list: +- item1 +- item2 +- item3 +map: + key: value + +# nested +# map +nested_map: + map: + key: value + list: + - item1 + - item2 + - item3 +` + +// encoded form of the data +const encoded = `key: value +list: +- item1 +- item2 +- item3 +map: + key: value +nested_map: + map: + key: value + list: + - item1 + - item2 + - item3 +` + +// decoded form of the data +// +// in case of YAML it's slightly different from Viper's internal representation +// (eg. map is decoded into a map with interface key) +var decoded = map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + "map": map[interface{}]interface{}{ + "key": "value", + }, + "nested_map": map[interface{}]interface{}{ + "map": map[interface{}]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + }, + }, +} + +// Viper's internal representation +var data = map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + "map": map[string]interface{}{ + "key": "value", + }, + "nested_map": map[string]interface{}{ + "map": map[string]interface{}{ + "key": "value", + "list": []interface{}{ + "item1", + "item2", + "item3", + }, + }, + }, +} + +func TestCodec_Encode(t *testing.T) { + codec := Codec{} + + b, err := codec.Encode(data) + if err != nil { + t.Fatal(err) + } + + if encoded != string(b) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", string(b), encoded) + } +} + +func TestCodec_Decode(t *testing.T) { + t.Run("OK", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(original), v) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(decoded, v) { + t.Fatalf("decoded value does not match the expected one\nactual: %#v\nexpected: %#v", v, decoded) + } + }) + + t.Run("InvalidData", func(t *testing.T) { + codec := Codec{} + + v := map[string]interface{}{} + + err := codec.Decode([]byte(`invalid data`), v) + if err == nil { + t.Fatal("expected decoding to fail") + } + + t.Logf("decoding failed as expected: %s", err) + }) +}