File: encoder_test.go

package info (click to toggle)
golang-github-aws-aws-sdk-go-v2 1.24.1-2~bpo12%2B1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-backports
  • size: 554,032 kB
  • sloc: java: 15,941; makefile: 419; sh: 175
file content (136 lines) | stat: -rw-r--r-- 3,511 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package query

import (
	"bytes"
	"fmt"
	"testing"

	smithytesting "github.com/aws/smithy-go/testing"
)

func TestEncode(t *testing.T) {
	cases := map[string]struct {
		Encode func(*Encoder) error
		Expect []byte
	}{
		"object": {
			Encode: func(e *Encoder) error {
				e.Object().Key("foo").String("bar")
				return e.Encode()
			},
			Expect: []byte(`foo=bar`),
		},
		"nested object": {
			Encode: func(e *Encoder) error {
				e.Object().Key("foo").Object().Key("bar").String("baz")
				return e.Encode()
			},
			Expect: []byte(`foo.bar=baz`),
		},
		"list": {
			Encode: func(e *Encoder) error {
				list := e.Object().Key("list").Array("spam")
				list.Value().String("spam")
				list.Value().String("eggs")
				return e.Encode()
			},
			Expect: []byte(`list.spam.1=spam&list.spam.2=eggs`),
		},
		"empty list": {
			Encode: func(e *Encoder) error {
				e.Object().Key("list").Array("spam")
				return e.Encode()
			},
			Expect: []byte(`list=`),
		},
		"flat list": {
			Encode: func(e *Encoder) error {
				list := e.Object().FlatKey("list").Array("spam")
				list.Value().String("spam")
				list.Value().String("eggs")
				return e.Encode()
			},
			Expect: []byte(`list.1=spam&list.2=eggs`),
		},
		"empty flat list": {
			Encode: func(e *Encoder) error {
				e.Object().FlatKey("list").Array("spam")
				return e.Encode()
			},
			Expect: []byte(`list=`),
		},
		"map": {
			Encode: func(e *Encoder) error {
				mapValue := e.Object().Key("map").Map("key", "value")
				mapValue.Key("bar").String("baz")
				mapValue.Key("foo").String("bin")
				return e.Encode()
			},
			Expect: []byte(`map.entry.1.key=bar&map.entry.1.value=baz&map.entry.2.key=foo&map.entry.2.value=bin`),
		},
		"flat map": {
			Encode: func(e *Encoder) error {
				mapValue := e.Object().FlatKey("map").Map("key", "value")
				mapValue.Key("bar").String("baz")
				mapValue.Key("foo").String("bin")
				return e.Encode()
			},
			Expect: []byte(`map.1.key=bar&map.1.value=baz&map.2.key=foo&map.2.value=bin`),
		},
	}

	for name, c := range cases {
		t.Run(name, func(t *testing.T) {
			var buff bytes.Buffer
			encoder := NewEncoder(&buff)
			if err := c.Encode(encoder); err != nil {
				t.Fatalf("failed to encode, %v", err)
			}
			smithytesting.AssertURLFormEqual(t, c.Expect, buff.Bytes())
		})
	}
}

// limitedWriter exists to isolate WriteString to ensure that any writer
// can actually be used
type limitedWriter struct {
	writer *bytes.Buffer
}

func (lw limitedWriter) Write(v []byte) (int, error) {
	return lw.writer.Write(v)
}

func TestEncodeHandlesBareIoWriter(t *testing.T) {
	buff := limitedWriter{writer: bytes.NewBuffer(nil)}
	encoder := NewEncoder(buff)
	encoder.Object().Key("foo").String("bar")
	if err := encoder.Encode(); err != nil {
		t.Fatal(err)
	}
	smithytesting.AssertURLFormEqual(t, []byte(`foo=bar`), buff.writer.Bytes())
}

// stringWriter exists to ensure that WriteString is called when
// available.
type stringWriter struct {
	writer *bytes.Buffer
}

func (w stringWriter) Write(v []byte) (int, error) {
	return 0, fmt.Errorf("the WriteString method should be used when available")
}

func (w stringWriter) WriteString(v string) (int, error) {
	return w.writer.WriteString(v)
}

func TestEncodeUsesWriteString(t *testing.T) {
	buff := stringWriter{writer: bytes.NewBuffer(nil)}
	encoder := NewEncoder(buff)
	encoder.Object().Key("foo").String("bar")
	if err := encoder.Encode(); err != nil {
		t.Fatal(err)
	}
	smithytesting.AssertURLFormEqual(t, []byte(`foo=bar`), buff.writer.Bytes())
}