@@ -0,0 +1,105 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"gardomatic.kleiax.de/internal/storage"
|
||||
)
|
||||
|
||||
func TestJournalModelPersistsEntriesTagsAndAttachmentsWithinGarden(t *testing.T) {
|
||||
dsn := os.Getenv("GARDOMATIC_TEST_DB_DSN")
|
||||
if dsn == "" {
|
||||
t.Skip("set GARDOMATIC_TEST_DB_DSN to run PostgreSQL integration tests")
|
||||
}
|
||||
db, err := sql.Open("postgres", dsn)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { _ = db.Close() })
|
||||
if err = db.Ping(); err != nil {
|
||||
t.Fatalf("connect to PostgreSQL: %v", err)
|
||||
}
|
||||
|
||||
var userID, gardenID, foreignGardenID int
|
||||
if err = db.QueryRow(`INSERT INTO users(name,email,password_hash,activated) VALUES('Journal integration',$1,'hash',true) RETURNING id`, "journal-integration-"+t.Name()+"@example.com").Scan(&userID); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = db.QueryRow(`INSERT INTO gardens(name) VALUES('Journal integration A') RETURNING id`).Scan(&gardenID); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = db.QueryRow(`INSERT INTO gardens(name) VALUES('Journal integration B') RETURNING id`).Scan(&foreignGardenID); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() {
|
||||
_, _ = db.Exec(`DELETE FROM gardens WHERE id IN ($1,$2)`, gardenID, foreignGardenID)
|
||||
_, _ = db.Exec(`DELETE FROM users WHERE id=$1`, userID)
|
||||
})
|
||||
|
||||
model := JournalModel{DB: db}
|
||||
entry, err := model.Insert(storage.JournalEntry{GardenID: gardenID, AuthorID: userID, Title: "Ernte", Body: "**Drei** Tomaten"})
|
||||
if err != nil {
|
||||
t.Fatalf("insert entry: %v", err)
|
||||
}
|
||||
foreign, err := model.Insert(storage.JournalEntry{GardenID: foreignGardenID, AuthorID: userID, Title: "Fremd"})
|
||||
if err != nil {
|
||||
t.Fatalf("insert foreign entry: %v", err)
|
||||
}
|
||||
if _, err = model.Get(gardenID, foreign.ID); !errors.Is(err, storage.ErrRecordNotFound) {
|
||||
t.Fatalf("foreign lookup: %v", err)
|
||||
}
|
||||
pinboardEntry, err := model.Insert(storage.JournalEntry{GardenID: gardenID, AuthorID: userID, EntryType: storage.JournalEntryTypePinboard, Title: "Sitzecke"})
|
||||
if err != nil {
|
||||
t.Fatalf("insert pinboard entry: %v", err)
|
||||
}
|
||||
|
||||
tags := TagModel{DB: db}
|
||||
storedTags, err := tags.Set(gardenID, storage.TagEntityJournal, entry.ID, []string{"Tomaten", "ernte"})
|
||||
if err != nil || len(storedTags) != 2 {
|
||||
t.Fatalf("set tags: %#v, %v", storedTags, err)
|
||||
}
|
||||
attachment, err := model.InsertAttachment(gardenID, entry.ID, storage.JournalAttachment{FileName: "foto.jpg", MediaType: "image/jpeg", Data: []byte("jpeg")})
|
||||
if err != nil {
|
||||
t.Fatalf("insert attachment: %v", err)
|
||||
}
|
||||
pinboardAttachment, err := model.InsertAttachment(gardenID, pinboardEntry.ID, storage.JournalAttachment{FileName: "idee.jpg", MediaType: "image/jpeg", Data: []byte("pinboard-jpeg")})
|
||||
if err != nil {
|
||||
t.Fatalf("insert pinboard attachment: %v", err)
|
||||
}
|
||||
if pinboardAttachment.ImageID == nil {
|
||||
t.Fatal("pinboard image was not added to the shared image library")
|
||||
}
|
||||
pinboardImage, err := (ImageModel{DB: db}).Get(gardenID, *pinboardAttachment.ImageID)
|
||||
if err != nil || pinboardImage.Source != string(storage.JournalEntryTypePinboard) {
|
||||
t.Fatalf("pinboard image source: %#v, %v", pinboardImage, err)
|
||||
}
|
||||
loaded, err := model.GetAttachment(gardenID, entry.ID, attachment.ID)
|
||||
if err != nil || string(loaded.Data) != "jpeg" {
|
||||
t.Fatalf("load attachment: %#v, %v", loaded, err)
|
||||
}
|
||||
if _, err = model.GetAttachment(foreignGardenID, entry.ID, attachment.ID); !errors.Is(err, storage.ErrRecordNotFound) {
|
||||
t.Fatalf("foreign attachment lookup: %v", err)
|
||||
}
|
||||
|
||||
entry.Title = "Große Ernte"
|
||||
updated, err := model.Update(gardenID, entry)
|
||||
if err != nil || updated.Version != 2 {
|
||||
t.Fatalf("update entry: %#v, %v", updated, err)
|
||||
}
|
||||
listed, err := model.GetAllForGarden(gardenID, storage.JournalEntryTypeJournal)
|
||||
if err != nil || len(listed) != 1 || len(listed[0].Attachments) != 1 || listed[0].AuthorName != "Journal integration" {
|
||||
t.Fatalf("list entries: %#v, %v", listed, err)
|
||||
}
|
||||
pinboardEntries, err := model.GetAllForGarden(gardenID, storage.JournalEntryTypePinboard)
|
||||
if err != nil || len(pinboardEntries) != 1 || pinboardEntries[0].ID != pinboardEntry.ID || len(pinboardEntries[0].Attachments) != 1 {
|
||||
t.Fatalf("list pinboard entries: %#v, %v", pinboardEntries, err)
|
||||
}
|
||||
if err = model.DeleteAttachment(gardenID, entry.ID, attachment.ID); err != nil {
|
||||
t.Fatalf("delete attachment: %v", err)
|
||||
}
|
||||
if err = model.Delete(gardenID, entry.ID); err != nil {
|
||||
t.Fatalf("delete entry: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user