github.com/blp1526/goa@v1.4.0/goagen/codegen/finalizer_test.go (about)

     1  package codegen_test
     2  
     3  import (
     4  	"github.com/goadesign/goa/design"
     5  	"github.com/goadesign/goa/goagen/codegen"
     6  	. "github.com/onsi/ginkgo"
     7  	. "github.com/onsi/gomega"
     8  )
     9  
    10  var _ = Describe("Struct finalize code generation", func() {
    11  	var (
    12  		att       *design.AttributeDefinition
    13  		target    string
    14  		finalizer *codegen.Finalizer
    15  	)
    16  
    17  	BeforeEach(func() {
    18  		finalizer = codegen.NewFinalizer()
    19  	})
    20  
    21  	Context("given an object with a primitive field", func() {
    22  		BeforeEach(func() {
    23  			att = &design.AttributeDefinition{
    24  				Type: &design.Object{
    25  					"foo": &design.AttributeDefinition{
    26  						Type:         design.String,
    27  						DefaultValue: "bar",
    28  					},
    29  				},
    30  			}
    31  			target = "ut"
    32  		})
    33  		It("finalizes the fields", func() {
    34  			code := finalizer.Code(att, target, 0)
    35  			Ω(code).Should(Equal(primitiveAssignmentCode))
    36  		})
    37  	})
    38  
    39  	Context("given an object with a primitive Number field", func() {
    40  		BeforeEach(func() {
    41  			att = &design.AttributeDefinition{
    42  				Type: &design.Object{
    43  					"foo": &design.AttributeDefinition{
    44  						Type:         design.Number,
    45  						DefaultValue: 0.0,
    46  					},
    47  				},
    48  			}
    49  			target = "ut"
    50  		})
    51  		It("finalizes the fields", func() {
    52  			code := finalizer.Code(att, target, 0)
    53  			Ω(code).Should(Equal(numberAssignmentCode))
    54  		})
    55  	})
    56  
    57  	Context("given an object with a primitive Number field with a int default value", func() {
    58  		BeforeEach(func() {
    59  			att = &design.AttributeDefinition{
    60  				Type: &design.Object{
    61  					"foo": &design.AttributeDefinition{
    62  						Type:         design.Number,
    63  						DefaultValue: 50,
    64  					},
    65  				},
    66  			}
    67  			target = "ut"
    68  		})
    69  		It("finalizes the fields", func() {
    70  			code := finalizer.Code(att, target, 0)
    71  			Ω(code).Should(Equal(numberAssignmentCodeIntDefault))
    72  		})
    73  	})
    74  
    75  	Context("given an array field", func() {
    76  		BeforeEach(func() {
    77  			att = &design.AttributeDefinition{
    78  				Type: &design.Object{
    79  					"foo": &design.AttributeDefinition{
    80  						Type: &design.Array{
    81  							ElemType: &design.AttributeDefinition{
    82  								Type: design.String,
    83  							},
    84  						},
    85  						DefaultValue: []interface{}{"bar", "baz"},
    86  					},
    87  				},
    88  			}
    89  			target = "ut"
    90  		})
    91  		It("finalizes the array fields", func() {
    92  			code := finalizer.Code(att, target, 0)
    93  			Ω(code).Should(Equal(arrayAssignmentCode))
    94  		})
    95  	})
    96  
    97  	Context("given a hash field", func() {
    98  		BeforeEach(func() {
    99  			att = &design.AttributeDefinition{
   100  				Type: &design.Object{
   101  					"foo": &design.AttributeDefinition{
   102  						Type: &design.Hash{
   103  							KeyType: &design.AttributeDefinition{
   104  								Type: design.String,
   105  							},
   106  							ElemType: &design.AttributeDefinition{
   107  								Type: design.String,
   108  							},
   109  						},
   110  						DefaultValue: map[interface{}]interface{}{"bar": "baz"},
   111  					},
   112  				},
   113  			}
   114  			target = "ut"
   115  		})
   116  		Context("given a datetime field", func() {
   117  			BeforeEach(func() {
   118  				att = &design.AttributeDefinition{
   119  					Type: &design.Object{
   120  						"foo": &design.AttributeDefinition{
   121  							Type:         design.DateTime,
   122  							DefaultValue: interface{}("1978-06-30T10:00:00+09:00"),
   123  						},
   124  					},
   125  				}
   126  				target = "ut"
   127  			})
   128  			It("finalizes the hash fields", func() {
   129  				code := finalizer.Code(att, target, 0)
   130  				Ω(code).Should(Equal(datetimeAssignmentCode))
   131  			})
   132  		})
   133  
   134  		It("finalizes the recursive type fields", func() {
   135  			code := finalizer.Code(att, target, 0)
   136  			Ω(code).Should(Equal(recursiveAssignmentCodeA))
   137  		})
   138  	})
   139  
   140  	Context("given a recursive user type with an array attribute", func() {
   141  		BeforeEach(func() {
   142  			var (
   143  				rt  = &design.UserTypeDefinition{TypeName: "recursive"}
   144  				ar  = &design.Array{ElemType: &design.AttributeDefinition{Type: rt}}
   145  				obj = &design.Object{
   146  					"elems": &design.AttributeDefinition{Type: ar},
   147  					"other": &design.AttributeDefinition{
   148  						Type:         design.String,
   149  						DefaultValue: "foo",
   150  					},
   151  				}
   152  			)
   153  			rt.AttributeDefinition = &design.AttributeDefinition{Type: obj}
   154  
   155  			att = &design.AttributeDefinition{Type: rt}
   156  			target = "ut"
   157  		})
   158  		It("finalizes the recursive type fields", func() {
   159  			code := finalizer.Code(att, target, 0)
   160  			Ω(code).Should(Equal(recursiveAssignmentCodeB))
   161  		})
   162  	})
   163  })
   164  
   165  const (
   166  	primitiveAssignmentCode = `var defaultFoo = "bar"
   167  if ut.Foo == nil {
   168  	ut.Foo = &defaultFoo
   169  }`
   170  
   171  	numberAssignmentCodeIntDefault = `var defaultFoo = 50.000000
   172  if ut.Foo == nil {
   173  	ut.Foo = &defaultFoo
   174  }`
   175  
   176  	numberAssignmentCode = `var defaultFoo = 0.000000
   177  if ut.Foo == nil {
   178  	ut.Foo = &defaultFoo
   179  }`
   180  
   181  	arrayAssignmentCode = `if ut.Foo == nil {
   182  	ut.Foo = []string{"bar", "baz"}
   183  }`
   184  
   185  	hashAssignmentCode = `if ut.Foo == nil {
   186  	ut.Foo = map[string]string{"bar": "baz"}
   187  }`
   188  	datetimeAssignmentCode = `var defaultFoo, _ = time.Parse(time.RFC3339, "1978-06-30T10:00:00+09:00")
   189  if ut.Foo == nil {
   190  	ut.Foo = &defaultFoo
   191  }`
   192  
   193  	recursiveAssignmentCodeA = `if ut.Foo == nil {
   194  	ut.Foo = map[string]string{"bar": "baz"}
   195  }`
   196  
   197  	recursiveAssignmentCodeB = `	for _, e := range ut.Elems {
   198  		var defaultOther = "foo"
   199  		if e.Other == nil {
   200  			e.Other = &defaultOther
   201  }
   202  	}
   203  var defaultOther = "foo"
   204  if ut.Other == nil {
   205  	ut.Other = &defaultOther
   206  }`
   207  )