schema_test.gno

4.30 Kb ยท 210 lines
  1package datastore
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/demo/uassert"
  7	"gno.land/p/demo/urequire"
  8)
  9
 10func TestSchemaNew(t *testing.T) {
 11	cases := []struct {
 12		name    string
 13		options []SchemaOption
 14		fields  []string
 15		strict  bool
 16	}{
 17		{
 18			name: "default",
 19		},
 20		{
 21			name:    "strict",
 22			options: []SchemaOption{Strict()},
 23			strict:  true,
 24		},
 25		{
 26			name: "with fields",
 27			options: []SchemaOption{
 28				WithField("foo"),
 29				WithField("bar"),
 30				WithDefaultField("baz", 42),
 31			},
 32			fields: []string{"foo", "bar", "baz"},
 33		},
 34	}
 35
 36	for _, tc := range cases {
 37		t.Run(tc.name, func(t *testing.T) {
 38			s := NewSchema("Foo", tc.options...)
 39
 40			uassert.Equal(t, "Foo", s.Name())
 41			uassert.Equal(t, tc.strict, s.IsStrict())
 42			urequire.Equal(t, len(tc.fields), s.Size(), "field count")
 43
 44			for i, name := range s.Fields() {
 45				uassert.Equal(t, tc.fields[i], name)
 46				uassert.True(t, s.HasField(name))
 47			}
 48		})
 49	}
 50}
 51
 52func TestSchemaAddField(t *testing.T) {
 53	cases := []struct {
 54		name       string
 55		options    []SchemaOption
 56		fieldName  string
 57		fieldIndex int
 58		fields     []string
 59		success    bool
 60	}{
 61		{
 62			name:       "new only field",
 63			fieldName:  "foo",
 64			fieldIndex: 0,
 65			fields:     []string{"foo"},
 66			success:    true,
 67		},
 68		{
 69			name: "new existing fields",
 70			options: []SchemaOption{
 71				WithField("foo"),
 72				WithField("bar"),
 73			},
 74			fieldName:  "baz",
 75			fieldIndex: 2,
 76			fields:     []string{"foo", "bar", "baz"},
 77			success:    true,
 78		},
 79		{
 80			name:       "duplicated field",
 81			options:    []SchemaOption{WithField("foo")},
 82			fieldName:  "foo",
 83			fieldIndex: -1,
 84			fields:     []string{"foo"},
 85		},
 86	}
 87
 88	for _, tc := range cases {
 89		t.Run(tc.name, func(t *testing.T) {
 90			s := NewSchema("Foo", tc.options...)
 91
 92			index, added := s.AddField(tc.fieldName, nil)
 93
 94			if tc.success {
 95				uassert.Equal(t, tc.fieldIndex, index)
 96				uassert.True(t, added)
 97			} else {
 98				uassert.Equal(t, -1, index)
 99				uassert.False(t, added)
100			}
101
102			urequire.Equal(t, len(tc.fields), s.Size(), "field count")
103
104			for i, name := range s.Fields() {
105				uassert.Equal(t, tc.fields[i], name)
106				uassert.True(t, s.HasField(name))
107			}
108		})
109	}
110}
111
112func TestSchemaGetFieldIndex(t *testing.T) {
113	s := NewSchema("Foo")
114	s.AddField("foo", nil)
115	s.AddField("bar", nil)
116	s.AddField("baz", nil)
117
118	uassert.Equal(t, 0, s.GetFieldIndex("foo"))
119	uassert.Equal(t, 1, s.GetFieldIndex("bar"))
120	uassert.Equal(t, 2, s.GetFieldIndex("baz"))
121
122	uassert.Equal(t, -1, s.GetFieldIndex(""))
123	uassert.Equal(t, -1, s.GetFieldIndex("unknown"))
124}
125
126func TestSchemaGetFieldName(t *testing.T) {
127	s := NewSchema("Foo")
128	s.AddField("foo", nil)
129	s.AddField("bar", nil)
130	s.AddField("baz", nil)
131
132	name, found := s.GetFieldName(0)
133	uassert.Equal(t, "foo", name)
134	uassert.True(t, found)
135
136	name, found = s.GetFieldName(1)
137	uassert.Equal(t, "bar", name)
138	uassert.True(t, found)
139
140	name, found = s.GetFieldName(2)
141	uassert.Equal(t, "baz", name)
142	uassert.True(t, found)
143
144	name, found = s.GetFieldName(404)
145	uassert.Equal(t, "", name)
146	uassert.False(t, found)
147}
148
149func TestSchemaGetDefault(t *testing.T) {
150	s := NewSchema("Foo")
151	s.AddField("foo", nil)
152	s.AddField("bar", 42)
153
154	_, found := s.GetDefault("foo")
155	uassert.False(t, found)
156
157	v, found := s.GetDefault("bar")
158	uassert.True(t, found)
159
160	got, ok := v.(int)
161	urequire.True(t, ok, "default field value")
162	uassert.Equal(t, 42, got)
163}
164
165func TestSchemaGetDefaultByIndex(t *testing.T) {
166	s := NewSchema("Foo")
167	s.AddField("foo", nil)
168	s.AddField("bar", 42)
169
170	_, found := s.GetDefaultByIndex(0)
171	uassert.False(t, found)
172
173	_, found = s.GetDefaultByIndex(404)
174	uassert.False(t, found)
175
176	v, found := s.GetDefaultByIndex(1)
177	uassert.True(t, found)
178
179	got, ok := v.(int)
180	urequire.True(t, ok, "default field value")
181	uassert.Equal(t, 42, got)
182}
183
184func TestSchemaRenameField(t *testing.T) {
185	s := NewSchema("Foo")
186	s.AddField("foo", nil)
187	s.AddField("bar", nil)
188
189	renamed := s.RenameField("foo", "bar")
190	uassert.False(t, renamed)
191
192	renamed = s.RenameField("", "baz")
193	uassert.False(t, renamed)
194
195	renamed = s.RenameField("foo", "")
196	uassert.True(t, renamed)
197
198	renamed = s.RenameField("", "foo")
199	uassert.True(t, renamed)
200
201	renamed = s.RenameField("foo", "foobar")
202	uassert.True(t, renamed)
203
204	urequire.Equal(t, 2, s.Size(), "field count")
205	fields := []string{"foobar", "bar"}
206	for i, name := range s.Fields() {
207		uassert.Equal(t, fields[i], name)
208		uassert.True(t, s.HasField(name))
209	}
210}