-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathboxedSchema_docs_examples_test.go
More file actions
161 lines (138 loc) · 3.85 KB
/
boxedSchema_docs_examples_test.go
File metadata and controls
161 lines (138 loc) · 3.85 KB
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package zog
import (
"errors"
"testing"
"github.com/stretchr/testify/assert"
)
// Helper function for Example 1
func createValuer(v string) StringValuer {
return myStringValuer{v: v}
}
// Example 3: Omittable pattern types and helpers
type Omittable[T any] interface {
Value() T
IsSet() bool
}
type omittableString struct {
value *string
set bool
}
func (o omittableString) Value() string {
if o.value == nil {
return ""
}
return *o.value
}
func (o omittableString) IsSet() bool {
return o.set
}
func createOmittable(s *string) Omittable[string] {
if s == nil {
return omittableString{value: nil, set: false}
}
return omittableString{value: s, set: true}
}
// ============================================================================
// Tests for documentation examples
// ============================================================================
// TestExample1DriverValuerPattern tests Example 1 from the docs
func TestExample1DriverValuerPattern(t *testing.T) {
// Example 1: driver.Valuer pattern
type StringValuer interface {
Value() (string, error)
}
schema := Boxed(
String().Min(3),
func(b StringValuer, ctx Ctx) (string, error) { return b.Value() },
func(s string, ctx Ctx) (StringValuer, error) { return myStringValuer{v: s}, nil },
)
// Test Parse
var valuer StringValuer
errs := schema.Parse("hello", &valuer)
assert.Empty(t, errs)
val, _ := valuer.Value()
assert.Equal(t, "hello", val)
// Test Validate
valuer = createValuer("hello2")
errs = schema.Validate(&valuer)
assert.Empty(t, errs)
val, _ = valuer.Value()
assert.Equal(t, "hello2", val)
}
// TestExample2NullablePattern tests Example 2 from the docs
func TestExample2NullablePattern(t *testing.T) {
// Example 2: Nullable pattern (like sql.NullString)
type NullString struct {
String string
Valid bool
}
schema := Boxed(
String().Min(3),
func(ns NullString, ctx Ctx) (string, error) {
if !ns.Valid {
return "", errors.New("null string is not valid")
}
return ns.String, nil
},
func(s string, ctx Ctx) (NullString, error) {
return NullString{String: s, Valid: true}, nil
},
)
// Test Parse with valid string
var ns NullString
errs := schema.Parse("hello", &ns)
assert.Empty(t, errs)
assert.Equal(t, "hello", ns.String)
assert.Equal(t, true, ns.Valid)
// Test Validate with valid NullString
ns = NullString{String: "world", Valid: true}
errs = schema.Validate(&ns)
assert.Empty(t, errs)
assert.Equal(t, "world", ns.String)
assert.Equal(t, true, ns.Valid)
}
// TestExample3OmittablePattern tests Example 3 from the docs
func TestExample3OmittablePattern(t *testing.T) {
// Example 3: Omittable pattern
type Omittable[T any] interface {
Value() T
IsSet() bool
}
schema := Boxed(
Ptr(String().Min(3)),
func(o Omittable[string], ctx Ctx) (*string, error) {
if o.IsSet() {
val := o.Value()
return &val, nil
}
return nil, nil
},
func(s *string, ctx Ctx) (Omittable[string], error) {
return createOmittable(s), nil
},
)
// Test Parse with valid string (not pointer - Ptr schema will handle pointer creation)
var omittable Omittable[string]
errs := schema.Parse("hello", &omittable)
assert.Empty(t, errs)
assert.True(t, omittable.IsSet())
val := omittable.Value()
assert.Equal(t, "hello", val)
// Test Parse with nil (omitted)
var omittable2 Omittable[string]
errs = schema.Parse(nil, &omittable2)
assert.Empty(t, errs)
assert.False(t, omittable2.IsSet())
// Test Validate with set value
val2 := "world"
var omittable3 Omittable[string] = createOmittable(&val2)
errs = schema.Validate(&omittable3)
assert.Empty(t, errs)
assert.True(t, omittable3.IsSet())
assert.Equal(t, "world", omittable3.Value())
// Test Validate with IsSet = false (omitted)
var omittable4 Omittable[string] = createOmittable(nil)
errs = schema.Validate(&omittable4)
assert.Empty(t, errs)
assert.False(t, omittable4.IsSet())
}