@@ -326,3 +326,61 @@ func TestEmbeddedTagSetting(t *testing.T) {
326
326
t .Errorf ("embedded struct's primary field should be rewritten" )
327
327
}
328
328
}
329
+
330
+ func TestZeroValueEmbeddedStruct (t * testing.T ) {
331
+ type Address struct {
332
+ City string
333
+ State string
334
+ }
335
+ type User struct {
336
+ ID uint
337
+ Address Address `gorm:"embedded"`
338
+ }
339
+
340
+ DB .Migrator ().DropTable (& User {})
341
+ err := DB .Migrator ().AutoMigrate (& User {})
342
+ tests .AssertEqual (t , err , nil )
343
+
344
+ user := User {}
345
+ err = DB .Save (& user ).Error
346
+ tests .AssertEqual (t , err , nil )
347
+
348
+ var loaded User
349
+ err = DB .First (& loaded , user .ID ).Error
350
+ tests .AssertEqual (t , err , nil )
351
+
352
+ if loaded .Address .City != "" || loaded .Address .State != "" {
353
+ t .Errorf ("expected zero values for embedded struct fields, got: %+v" , loaded .Address )
354
+ }
355
+ }
356
+
357
+ func TestUpdateEmbeddedFields (t * testing.T ) {
358
+ type Address struct {
359
+ City string
360
+ State string
361
+ }
362
+ type User struct {
363
+ ID uint
364
+ Address Address `gorm:"embedded"`
365
+ }
366
+
367
+ DB .Migrator ().DropTable (& User {})
368
+ err := DB .Migrator ().AutoMigrate (& User {})
369
+ tests .AssertEqual (t , err , nil )
370
+
371
+ user := User {Address : Address {City : "Austin" , State : "TX" }}
372
+ err = DB .Save (& user ).Error
373
+ tests .AssertEqual (t , err , nil )
374
+
375
+ // Update embedded field only
376
+ err = DB .Model (& user ).Updates (User {Address : Address {City : "Houston" }}).Error
377
+ tests .AssertEqual (t , err , nil )
378
+
379
+ var loaded User
380
+ err = DB .First (& loaded , user .ID ).Error
381
+ tests .AssertEqual (t , err , nil )
382
+
383
+ if loaded .Address .City != "Houston" {
384
+ t .Errorf ("embedded field not updated: expected Houston, got %s" , loaded .Address .City )
385
+ }
386
+ }
0 commit comments