test(15-04): complete PHPUnit map, migrations, FormatHTML, and search-gate tests
Named JOURNAL-001/002 fillable, FormatHTML unsafe tags, rollback/remigrate, RSS/categories/tags/media, and TestSearchGateOff with zero Typesense HTTP. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
107
models/fillable_test.go
Normal file
107
models/fillable_test.go
Normal file
@@ -0,0 +1,107 @@
|
||||
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", "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",
|
||||
"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.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": "<script>x</script>",
|
||||
}, 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)
|
||||
}
|
||||
})
|
||||
}
|
||||
58
models/translatable_test.go
Normal file
58
models/translatable_test.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package models_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"git.golem15.com/golem15/sm-journal-plugin/models"
|
||||
)
|
||||
|
||||
type translatable interface {
|
||||
Translatable() []string
|
||||
}
|
||||
|
||||
type translatableIndexed interface {
|
||||
TranslatableIndexes() []string
|
||||
}
|
||||
|
||||
func TestTranslatable(t *testing.T) {
|
||||
post := models.Post{}
|
||||
if post.MorphName() != `Golem15\Journal\Models\Post` {
|
||||
t.Fatalf("Post.MorphName = %q", post.MorphName())
|
||||
}
|
||||
if got := post.Translatable(); !reflect.DeepEqual(got, []string{"title", "content", "content_html", "excerpt", "metadata", "slug"}) {
|
||||
t.Fatalf("Post.Translatable = %#v", got)
|
||||
}
|
||||
if got := post.TranslatableIndexes(); !reflect.DeepEqual(got, []string{"slug"}) {
|
||||
t.Fatalf("Post.TranslatableIndexes = %#v", got)
|
||||
}
|
||||
|
||||
cat := models.Category{}
|
||||
if cat.MorphName() != `Golem15\Journal\Models\Category` {
|
||||
t.Fatalf("Category.MorphName = %q", cat.MorphName())
|
||||
}
|
||||
if got := cat.Translatable(); !reflect.DeepEqual(got, []string{"name", "description", "slug"}) {
|
||||
t.Fatalf("Category.Translatable = %#v", got)
|
||||
}
|
||||
if got := cat.TranslatableIndexes(); !reflect.DeepEqual(got, []string{"slug"}) {
|
||||
t.Fatalf("Category.TranslatableIndexes = %#v", got)
|
||||
}
|
||||
|
||||
tag := models.Tag{}
|
||||
if tag.MorphName() != `Golem15\Journal\Models\Tag` {
|
||||
t.Fatalf("Tag.MorphName = %q", tag.MorphName())
|
||||
}
|
||||
if _, ok := any(tag).(translatable); ok {
|
||||
t.Fatal("Tag must not implement Translatable")
|
||||
}
|
||||
if _, ok := any(tag).(translatableIndexed); ok {
|
||||
t.Fatal("Tag must not implement TranslatableIndexes")
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterScopes(t *testing.T) {
|
||||
got := (models.Post{}).FilterScopes()
|
||||
if !reflect.DeepEqual(got, []string{models.FilterPublished, models.FilterCategories}) {
|
||||
t.Fatalf("FilterScopes = %#v", got)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user