Files
go-zero/tools/goctl/api/spec/fn_test.go
2026-07-31 17:19:17 +00:00

168 lines
3.9 KiB
Go

package spec
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestMember_IsTagMember(t *testing.T) {
t.Run("non-inline member with matching tag returns true", func(t *testing.T) {
m := Member{Tag: `header:"Authorization"`}
assert.True(t, m.IsTagMember("header"))
})
t.Run("non-inline member without matching tag returns false", func(t *testing.T) {
m := Member{Tag: `json:"username"`}
assert.False(t, m.IsTagMember("header"))
assert.False(t, m.IsTagMember("path"))
assert.False(t, m.IsTagMember("form"))
})
t.Run("non-inline member without any tag returns false", func(t *testing.T) {
m := Member{}
assert.False(t, m.IsTagMember("header"))
})
t.Run("inline struct without matching child tag returns false (#4800)", func(t *testing.T) {
m := Member{
Name: "Pagination",
IsInline: true,
Type: DefineStruct{
RawName: "Pagination",
Members: []Member{
{Name: "Page", Tag: `json:"page"`},
{Name: "PageSize", Tag: `json:"pageSize"`},
},
},
}
assert.False(t, m.IsTagMember("header"))
assert.False(t, m.IsTagMember("path"))
assert.False(t, m.IsTagMember("form"))
})
t.Run("inline struct whose child has matching tag returns true", func(t *testing.T) {
m := Member{
Name: "Auth",
IsInline: true,
Type: DefineStruct{
RawName: "Auth",
Members: []Member{
{Name: "Token", Tag: `header:"Authorization"`},
},
},
}
assert.True(t, m.IsTagMember("header"))
})
t.Run("nested inline structs are recursed", func(t *testing.T) {
m := Member{
Name: "Outer",
IsInline: true,
Type: DefineStruct{
RawName: "Outer",
Members: []Member{
{
Name: "Inner",
IsInline: true,
Type: DefineStruct{
RawName: "Inner",
Members: []Member{
{Name: "Token", Tag: `header:"X-Token"`},
},
},
},
},
},
}
assert.True(t, m.IsTagMember("header"))
})
t.Run("nested inline structs without matching child return false", func(t *testing.T) {
m := Member{
Name: "Outer",
IsInline: true,
Type: DefineStruct{
RawName: "Outer",
Members: []Member{
{
Name: "Inner",
IsInline: true,
Type: DefineStruct{
RawName: "Inner",
Members: []Member{
{Name: "Page", Tag: `json:"page"`},
},
},
},
},
},
}
assert.False(t, m.IsTagMember("header"))
})
t.Run("inline NestedStruct whose child has matching tag returns true", func(t *testing.T) {
m := Member{
Name: "Auth",
IsInline: true,
Type: NestedStruct{
RawName: "Auth",
Members: []Member{
{Name: "Token", Tag: `header:"Authorization"`},
},
},
}
assert.True(t, m.IsTagMember("header"))
})
t.Run("inline PointerType whose child has matching tag returns true", func(t *testing.T) {
m := Member{
Name: "Auth",
IsInline: true,
Type: PointerType{
RawName: "*Auth",
Type: DefineStruct{
RawName: "Auth",
Members: []Member{
{Name: "Token", Tag: `header:"Authorization"`},
},
},
},
}
assert.True(t, m.IsTagMember("header"))
assert.False(t, m.IsTagMember("path"))
})
t.Run("empty inline struct returns false", func(t *testing.T) {
m := Member{
Name: "Empty",
IsInline: true,
Type: DefineStruct{RawName: "Empty"},
}
assert.False(t, m.IsTagMember("header"))
})
}
func TestDefineStruct_GetTagMembers_InlineRegression(t *testing.T) {
s := DefineStruct{
RawName: "QueryUserListReq",
Members: []Member{
{Name: "Username", Tag: `json:"username,optional"`},
{
Name: "Pagination",
IsInline: true,
Type: DefineStruct{
RawName: "Pagination",
Members: []Member{
{Name: "Page", Tag: `json:"page"`},
{Name: "PageSize", Tag: `json:"pageSize"`},
},
},
},
},
}
assert.Empty(t, s.GetTagMembers("header"),
"inline struct without header-tagged children must not match header (#4800)")
assert.Empty(t, s.GetTagMembers("path"))
}