package models_test import ( "slices" "testing" "git.golem15.com/golem15/summercms/docs/examples/blog/models" "git.golem15.com/golem15/summercms/modules/lagoon" ) var _ lagoon.HasFillable = models.Post{} func TestPostTableAndFill(t *testing.T) { if got := (models.Post{}).TableName(); got != "acme_blog_posts" { t.Fatalf("TableName = %q, want acme_blog_posts", got) } if got, want := (models.Post{}).Fillable(), []string{"title", "slug", "body"}; !slices.Equal(got, want) { t.Fatalf("Fillable = %v, want %v", got, want) } input := map[string]any{"id": 99, "title": "Hello", "slug": "hello-world", "body": "First post.", "created_at": "2020-01-01"} post, err := models.NewPost(input) if err != nil { t.Fatalf("NewPost: %v", err) } if post.ID != 0 { t.Errorf("ID = %d, want 0: id is not fillable", post.ID) } if !post.CreatedAt.IsZero() { t.Errorf("CreatedAt = %v, want zero: created_at is not fillable", post.CreatedAt) } if post.Title != "Hello" || post.Slug != "hello-world" || post.Body != "First post." { t.Errorf("post = %+v, want the title, slug and body from input", post) } // lagoon.Fill with the same allow-list, as NewPost does, drops id too. var direct models.Post if err := lagoon.Fill(&direct, direct.Fillable(), map[string]any{"id": 7, "title": "Direct"}, true); err != nil { t.Fatalf("Fill: %v", err) } if direct.ID != 0 || direct.Title != "Direct" { t.Errorf("Fill result = %+v, want ID 0 and title Direct", direct) } }