Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug fix] Issue 301: Metadata() is not reflected when setting the Default() in goa design. #304

Merged
merged 1 commit into from
May 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions _integration_tests/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,49 @@ func TestIssue161(t *testing.T) {
}
}

func TestIssue301(t *testing.T) {
defer cleanup("./issue301/*")
if err := goagen("./issue301", "bootstrap", "-d", "github.com/shogo82148/goa-v1/_integration_tests/issue301/design"); err != nil {
t.Error(err.Error())
}
if err := gobuild("./issue301"); err != nil {
t.Error(err.Error())
}
b, err := os.ReadFile("./issue301/app/user_types.go")
if err != nil {
t.Fatal("failed to load user_types.go")
}

// include user definition type: "github.com/shogo82148/goa-v1/design"
expectedImport := `import (
goa "github.com/shogo82148/goa-v1"
"github.com/shogo82148/goa-v1/design"
"time"
)`

expectedFinalize := `func (ut *issue301Type) Finalize() {
var defaultPrimitiveTypeNumber float64 = 3.140000
if ut.PrimitiveTypeNumber == nil {
ut.PrimitiveTypeNumber = &defaultPrimitiveTypeNumber
}
var defaultPrimitiveTypeTime, _ = time.Parse(time.RFC3339, "2006-01-02T15:04:05Z")
if ut.PrimitiveTypeTime == nil {
ut.PrimitiveTypeTime = &defaultPrimitiveTypeTime
}
var defaultUserDefinitionType design.SecuritySchemeKind = 10
if ut.UserDefinitionType == nil {
ut.UserDefinitionType = &defaultUserDefinitionType
}
}`
if !strings.Contains(string(b), expectedImport) {
t.Errorf("Failed to generate 'import' block code that sets default values for user-defined types. Generated context:\n%s", string(b))
}

if !strings.Contains(string(b), expectedFinalize) {
t.Errorf("Failed to generate 'Finalize' function code that sets default values for user-defined types. Generated context:\n%s", string(b))
}
}

func goagen(dir, command string, args ...string) error {
pkg, err := build.Import("github.com/shogo82148/goa-v1/goagen", "", 0)
if err != nil {
Expand Down
39 changes: 39 additions & 0 deletions _integration_tests/issue301/design/design.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package design

import (
. "github.com/shogo82148/goa-v1/design"
. "github.com/shogo82148/goa-v1/design/apidsl"
)

var _ = API("issue301", func() {
Title("This API has user definition type default values")
Host("localhost:8080")
Scheme("https")
})

var _ = Resource("issue301", func() {
Action("test", func() {
Routing(GET("user-definition"))
Payload(Issue301Payload)
Response(OK)
})
})

var Issue301Payload = Type("Issue301Type", func() {
Attribute("user-definition-type", Integer, func() {
Default(10)
Metadata("struct:field:type", "design.SecuritySchemeKind", "github.com/shogo82148/goa-v1/design")
})

Attribute("primitive-type-number", Number, func() {
Default(3.14)
})

Attribute("primitive-type-time", DateTime, func() {
Default("2006-01-02T15:04:05Z")
})

Required("user-definition-type")
Required("primitive-type-number")
Required("primitive-type-time")
})
3 changes: 2 additions & 1 deletion goagen/codegen/finalizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ func NewFinalizer() *Finalizer {
"tabs": Tabs,
"goify": Goify,
"gotyperef": GoTypeRef,
"gotypedef": GoTypeDef,
"add": Add,
"finalizeCode": f.Code,
}
Expand Down Expand Up @@ -163,7 +164,7 @@ func PrintVal(t design.DataType, val interface{}) string {

const (
assignmentTmpl = `{{ if .catt.Type.IsPrimitive }}{{ $defaultName := (print "default" (goify .field true)) }}{{/*
*/}}{{ tabs .depth }}var {{ $defaultName }}{{if .isDatetime}}, _{{end}} = {{ .defaultVal }}
*/}}{{ tabs .depth }}{{if .isDatetime}}var {{ $defaultName }}, _ = {{ .defaultVal }}{{ else }}var {{ $defaultName }} {{ gotypedef .catt 0 false false }} = {{ .defaultVal }}{{end}}
{{ tabs .depth }}if {{ .target }}.{{ goify .field true }} == nil {
{{ tabs .depth }} {{ .target }}.{{ goify .field true }} = &{{ $defaultName }}
}{{ else }}{{ tabs .depth }}if {{ .target }}.{{ goify .field true }} == nil {
Expand Down
40 changes: 35 additions & 5 deletions goagen/codegen/finalizer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/shogo82148/goa-v1/design"
"github.com/shogo82148/goa-v1/dslengine"
"github.com/shogo82148/goa-v1/goagen/codegen"
)

Expand Down Expand Up @@ -160,20 +161,44 @@ var _ = Describe("Struct finalize code generation", func() {
Ω(code).Should(Equal(recursiveAssignmentCodeB))
})
})

Context("given an object with a user definition type", func() {
BeforeEach(func() {
att = &design.AttributeDefinition{
Type: &design.Object{
"foo": &design.AttributeDefinition{
Type: design.String,
Metadata: dslengine.MetadataDefinition{
"struct:field:type": []string{"UserDefinitionType", "github.com/shogo82148/goa-v1/goagen/codegen_test"},
},
DefaultValue: UserDefinitionType("bar"),
},
},
}
target = "ut"
})
It("finalizes the fields", func() {
code := finalizer.Code(att, target, 0)
Ω(code).Should(Equal(userTypeAssignmentCode))
})
})
})

// UserDefinitionType is a user defined type used in the unit tests.
type UserDefinitionType string

const (
primitiveAssignmentCode = `var defaultFoo = "bar"
primitiveAssignmentCode = `var defaultFoo string = "bar"
if ut.Foo == nil {
ut.Foo = &defaultFoo
}`

numberAssignmentCodeIntDefault = `var defaultFoo = 50.000000
numberAssignmentCodeIntDefault = `var defaultFoo float64 = 50.000000
if ut.Foo == nil {
ut.Foo = &defaultFoo
}`

numberAssignmentCode = `var defaultFoo = 0.000000
numberAssignmentCode = `var defaultFoo float64 = 0.000000
if ut.Foo == nil {
ut.Foo = &defaultFoo
}`
Expand All @@ -192,13 +217,18 @@ if ut.Foo == nil {
}`

recursiveAssignmentCodeB = ` for _, e := range ut.Elems {
var defaultOther = "foo"
var defaultOther string = "foo"
if e.Other == nil {
e.Other = &defaultOther
}
}
var defaultOther = "foo"
var defaultOther string = "foo"
if ut.Other == nil {
ut.Other = &defaultOther
}`

userTypeAssignmentCode = `var defaultFoo UserDefinitionType = "bar"
if ut.Foo == nil {
ut.Foo = &defaultFoo
}`
)
Loading