package models_test import ( "reflect" "testing" "git.golem15.com/golem15/sm-journal-plugin/models" "git.golem15.com/golem15/summercms/modules/lagoon" ) // TestFillable is JOURNAL-001/002 and T-15-04: Tag allow-list is name/slug/ // description only; Category excludes nest_*; extra JSON keys (including // redactor_id and user_id on Post) are dropped by lagoon.Fill. func TestFillable(t *testing.T) { t.Run("tag_allow_list", func(t *testing.T) { if got := (models.Tag{}).Fillable(); !reflect.DeepEqual(got, []string{"name", "slug", "description"}) { t.Fatalf("Tag.Fillable = %#v", got) } tag := models.Tag{} if err := lagoon.Fill(&tag, tag.Fillable(), map[string]any{ "name": "Notes", "slug": "notes", "description": "field notes", "id": 99, "nest_left": 1, "created_at": "2020-01-01", }, true); err != nil { t.Fatal(err) } if tag.Name != "Notes" || tag.Slug != "notes" { t.Fatalf("tag fill = %+v", tag) } if tag.ID != 0 { t.Fatalf("id was mass-assigned: %d", tag.ID) } if tag.Description == nil || *tag.Description != "field notes" { t.Fatalf("description = %#v", tag.Description) } }) t.Run("category_excludes_nest", func(t *testing.T) { if got := (models.Category{}).Fillable(); !reflect.DeepEqual(got, []string{"name", "slug", "code", "description", "content", "parent_id"}) { t.Fatalf("Category.Fillable = %#v", got) } left := 3 cat := models.Category{NestLeft: &left} if err := lagoon.Fill(&cat, cat.Fillable(), map[string]any{ "name": "Essays", "slug": "essays", "code": "ess", "content": "

Essay hub

", "nest_left": 9, "nest_right": 10, "nest_depth": 2, "id": 7, }, true); err != nil { t.Fatal(err) } if cat.Name != "Essays" || cat.Slug != "essays" { t.Fatalf("category fill = %+v", cat) } if cat.Content == nil || *cat.Content != "

Essay hub

" { t.Fatalf("category content fill = %#v", cat.Content) } if cat.ID != 0 { t.Fatalf("id was mass-assigned: %d", cat.ID) } if cat.NestLeft == nil || *cat.NestLeft != 3 { t.Fatalf("nest_left mutated: %#v", cat.NestLeft) } if cat.NestRight != nil || cat.NestDepth != nil { t.Fatalf("nest_* assigned: right=%v depth=%v", cat.NestRight, cat.NestDepth) } }) t.Run("post_redactor_and_user_not_fillable", func(t *testing.T) { post := models.Post{} for _, name := range post.Fillable() { if name == "redactor_id" || name == "user_id" || name == "content_html" { t.Fatalf("Post.Fillable includes %q: %#v", name, post.Fillable()) } } rid := uint(99) uid := uint(7) post.RedactorID = &rid post.UserID = &uid if err := lagoon.Fill(&post, post.Fillable(), map[string]any{ "title": "Hello", "slug": "hello", "excerpt": "ex", "content": "body", "redactor_id": 1, "user_id": 2, "content_html": "", }, true); err != nil { t.Fatal(err) } if post.Title != "Hello" || post.Slug != "hello" { t.Fatalf("post fill = %+v", post) } if post.RedactorID == nil || *post.RedactorID != 99 { t.Fatalf("redactor_id was filled: %#v", post.RedactorID) } if post.UserID == nil || *post.UserID != 7 { t.Fatalf("user_id was filled: %#v", post.UserID) } if post.ContentHTML != "" { t.Fatalf("content_html was filled: %q", post.ContentHTML) } }) }