feat(goctl): Support gateway sample generation (#3049)

This commit is contained in:
anqiansong
2023-03-29 17:06:23 +08:00
committed by GitHub
parent 95b85336d6
commit 1904af2323
32 changed files with 1399 additions and 513 deletions

86
tools/goctl/test/test.go Normal file
View File

@@ -0,0 +1,86 @@
package test
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/assert"
)
type Data[T, Y any] struct {
Name string
Input T
Want Y
E error
}
type Option[T, Y any] func(*Executor[T, Y])
type assertFn[Y any] func(t *testing.T, expected, actual Y) bool
func WithComparison[T, Y any](comparisonFn assertFn[Y]) Option[T, Y] {
return func(e *Executor[T, Y]) {
e.equalFn = comparisonFn
}
}
type Executor[T, Y any] struct {
list []Data[T, Y]
equalFn assertFn[Y]
}
func NewExecutor[T, Y any](opt ...Option[T, Y]) *Executor[T, Y] {
e := &Executor[T, Y]{}
opt = append(opt, WithComparison[T, Y](func(t *testing.T, expected, actual Y) bool {
gotBytes, err := json.Marshal(actual)
if err != nil {
t.Fatal(err)
return false
}
wantBytes, err := json.Marshal(expected)
if err != nil {
t.Fatal(err)
return false
}
return assert.JSONEq(t, string(wantBytes), string(gotBytes))
}))
for _, o := range opt {
o(e)
}
return e
}
func (e *Executor[T, Y]) Add(data ...Data[T, Y]) {
e.list = append(e.list, data...)
}
func (e *Executor[T, Y]) Run(t *testing.T, do func(T) Y) {
if do == nil {
panic("execution body is nil")
return
}
for _, v := range e.list {
t.Run(v.Name, func(t *testing.T) {
inner := do
e.equalFn(t, v.Want, inner(v.Input))
})
}
}
func (e *Executor[T, Y]) RunE(t *testing.T, do func(T) (Y, error)) {
if do == nil {
panic("execution body is nil")
return
}
for _, v := range e.list {
t.Run(v.Name, func(t *testing.T) {
inner := do
got, err := inner(v.Input)
if v.E != nil {
assert.Equal(t, v.E, err)
return
}
e.equalFn(t, v.Want, got)
})
}
}

View File

@@ -0,0 +1,101 @@
package test
import (
"errors"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestExecutor_Run(t *testing.T) {
executor := NewExecutor[string, string]()
executor.Add([]Data[string, string]{
{
Name: "empty",
},
{
Name: "snake_case",
input: "A_B_C",
want: "a_b_c",
},
{
Name: "camel_case",
input: "AaBbCc",
want: "aabbcc",
},
}...)
executor.Run(t, func(s string) string {
return strings.ToLower(s)
})
}
func TestExecutor_RunE(t *testing.T) {
var dummyError = errors.New("dummy error")
executor := NewExecutor[string, string]()
executor.Add([]Data[string, string]{
{
Name: "empty",
},
{
Name: "snake_case",
input: "A_B_C",
want: "a_b_c",
},
{
Name: "camel_case",
input: "AaBbCc",
want: "aabbcc",
},
{
Name: "invalid_input",
input: "😄",
E: dummyError,
},
}...)
executor.RunE(t, func(s string) (string, error) {
for _, r := range s {
if r == '_' || r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z' {
continue
}
return "", dummyError
}
return strings.ToLower(s), nil
})
}
func TestWithComparison(t *testing.T) {
var dummyError = errors.New("dummy error")
executor := NewExecutor[string, string](WithComparison[string, string](func(t *testing.T, expected, actual string) bool {
return assert.Equal(t, expected, actual)
}))
executor.Add([]Data[string, string]{
{
Name: "empty",
},
{
Name: "snake_case",
input: "A_B_C",
want: "a_b_c",
},
{
Name: "camel_case",
input: "AaBbCc",
want: "aabbcc",
},
{
Name: "invalid_input",
input: "😄",
E: dummyError,
},
}...)
executor.RunE(t, func(s string) (string, error) {
for _, r := range s {
if r == '_' || r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z' {
continue
}
return "", dummyError
}
return strings.ToLower(s), nil
})
}