From 7e1c51d6983a50cc8959311dcf5b33a2b08b3d29 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Sun, 28 Jan 2024 19:23:51 -0600 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20Test=20json.Marshaler=20implemen?= =?UTF-8?q?tation=20for=20Entry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/entry.go | 4 ++++ models/entry_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/models/entry.go b/models/entry.go index 7516628..90b682d 100644 --- a/models/entry.go +++ b/models/entry.go @@ -155,3 +155,7 @@ func (e *Entry) getFieldUnarshalChan(in []byte) chan Meta { }() return ch } + +func (e Entry) MarshalJSON() ([]byte, error) { + return []byte(`{}`), nil +} diff --git a/models/entry_test.go b/models/entry_test.go index 0e1e4ec..dc4d152 100644 --- a/models/entry_test.go +++ b/models/entry_test.go @@ -14,6 +14,7 @@ import ( // Type assertions var _ encoding.TextMarshaler = Entry{} var _ encoding.TextUnmarshaler = new(Entry) +var _ json.Marshaler = Entry{} func TestEntryMarshal(t *testing.T) { when := time.Now() @@ -187,3 +188,44 @@ func TestScan(t *testing.T) { assert.Equal(t, "@bar 42@nobody", scan.Text()) assert.False(t, scan.Scan()) } + +func TestEntryJsonMarshal(t *testing.T) { + when := time.Now() + whens := when.Format(DateFormat) + simple := []Meta{} + tests := []struct { + name string + title string + date time.Time + fields []Meta + out string + err error + }{ + {"simple", "A Title", when, simple, `{"title":"A Title","date":"` + whens + `"}`, nil}, + {"one-field", "A Title 2", when, []Meta{{"age", 41}}, `{"title":"A Title 2","date":"` + whens + `","age":41}`, nil}, + {"skip-title-field", "A Title", when, []Meta{{"title", "Different title"}}, `{"title":"A Title","date":"` + whens + `"}`, nil}, + {"skip-date-field", "A Title", when, []Meta{{"date", when.Add(time.Hour)}}, `{"title":"A Title","date":"` + whens + `"}`, nil}, + {"skip-dupe-field", "A Title", when, []Meta{{"foo", "bar"}, {"foo", "baz"}}, `{"title":"A Title","date":"` + whens + `","foo": "bar"}`, nil}, + {"two-fields", "A Title", when, []Meta{{"foo", "bar"}, {"baz", 42}}, `{"title":"A Title","date":"` + whens + `","foo": "bar","baz":42}`, nil}, + {"empty-title", "", when, simple, "", ErrorMissingTitle}, + {"empty-date", "A Title", time.Time{}, simple, "", ErrorMissingDate}, + {"obj-field", "A Title", when, []Meta{{"obj", json.RawMessage(`{"foo":"bar","title":"Sub-title"}`)}}, `{"title":"A Title","date":"` + whens + `","obj":{"foo":"bar","title":"Sub-title"}}`, nil}, + } + + for _, tt := range tests { + t.Run(tt.name, getEntryJsonMarshalTestRunner(tt.title, tt.date, tt.fields, tt.out, tt.err)) + } +} + +func getEntryJsonMarshalTestRunner(title string, date time.Time, fields []Meta, out string, err error) func(t *testing.T) { + return func(t *testing.T) { + e := Entry{title, date, fields} + o, er := json.Marshal(e) + if err == nil { + assert.JSONEq(t, out, string(o)) + + } else { + assert.ErrorIs(t, er, err) + } + } +}