From a42c440006e7b9e0b8287a222219af3d1f2dba67 Mon Sep 17 00:00:00 2001 From: jesperkha Date: Sun, 29 Jun 2025 21:07:27 +0200 Subject: [PATCH 1/2] Add tests for database --- api/database/database_test.go | 151 ++++++++++++++++++++++++++++++++++ api/database/query.go | 6 +- 2 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 api/database/database_test.go diff --git a/api/database/database_test.go b/api/database/database_test.go new file mode 100644 index 0000000..074b4e4 --- /dev/null +++ b/api/database/database_test.go @@ -0,0 +1,151 @@ +package database + +import ( + "os" + "testing" +) + +func assert(t *testing.T, v bool, msg string, args ...any) { + if !v { + t.Errorf(msg, args...) + } +} + +func assertNoErr(t *testing.T, err error) { + if err != nil { + t.Error(err) + } +} + +func TestDatabase(t *testing.T) { + filename := "test.db" + db := NewSQLite(filename) + defer os.Remove(filename) + + t.Run("Create and get user", func(t *testing.T) { + id, err := db.CreateUser(User{ + DisplayName: "John", + GithubUsername: "johnpork_", + }) + assertNoErr(t, err) + + user, err := db.GetUserById(id) + assertNoErr(t, err) + + assert(t, user.ID == id, "id does not match") + assert(t, user.DisplayName == "John", "incorrect display name, got %s", user.DisplayName) + assert(t, user.GithubUsername == "johnpork_", "incorrect github name, got %s", user.GithubUsername) + }) + + t.Run("Create board and add items", func(t *testing.T) { + userID, err := db.CreateUser(User{ + DisplayName: "Alice", + GithubUsername: "alicehub", + }) + assertNoErr(t, err) + + board := Board{} + assertNoErr(t, db.db.Create(&board).Error) + + item := Item{ + BoardID: board.ID, + RepoName: "example-repo", + RepoURL: "https://github.com/example/repo", + Title: "Initial Task", + Description: "Setup project", + ConnectedBranch: "main", + List: 1, + CreatorID: userID, + AssigneeID: userID, + } + _, err = db.CreateItem(item) + assertNoErr(t, err) + + items, err := db.GetAllItems() + assertNoErr(t, err) + assert(t, len(items) == 1, "expected 1 item, got %d", len(items)) + + itemFromDB, err := db.GetItemById(items[0].ID) + assertNoErr(t, err) + assert(t, itemFromDB.Title == "Initial Task", "unexpected title, got %s", itemFromDB.Title) + }) + + t.Run("Get all users", func(t *testing.T) { + users, err := db.GetAllUsers() + assertNoErr(t, err) + assert(t, len(users) >= 2, "expected at least 2 users, got %d", len(users)) + }) + + t.Run("Get all items from list", func(t *testing.T) { + board := Board{} + assertNoErr(t, db.db.Create(&board).Error) + + item := Item{ + BoardID: board.ID, + Title: "List Test", + List: 2, + } + _, err := db.CreateItem(item) + assertNoErr(t, err) + + items, err := db.GetAllItemsFromList(board.ID, 2) + assertNoErr(t, err) + assert(t, len(items) > 0, "expected at least 1 item in list 2") + }) + + t.Run("Move item to list", func(t *testing.T) { + items, _ := db.GetAllItems() + item := items[0] + + err := db.MoveItemToList(item.ID, 3) + assertNoErr(t, err) + + movedItem, err := db.GetItemById(item.ID) + assertNoErr(t, err) + assert(t, movedItem.List == 3, "item was not moved to list 3") + }) + + t.Run("Change item title", func(t *testing.T) { + items, _ := db.GetAllItems() + item := items[0] + + err := db.ChangeItemTitle(item.ID, "Updated Title") + assertNoErr(t, err) + + updatedItem, err := db.GetItemById(item.ID) + assertNoErr(t, err) + assert(t, updatedItem.Title == "Updated Title", "title not updated correctly") + }) + + t.Run("Change item description", func(t *testing.T) { + items, _ := db.GetAllItems() + item := items[0] + + err := db.ChangeItemDescription(item.ID, "New Description") + assertNoErr(t, err) + + updatedItem, err := db.GetItemById(item.ID) + assertNoErr(t, err) + assert(t, updatedItem.Description == "New Description", "description not updated correctly") + }) + + t.Run("Delete item", func(t *testing.T) { + id, _ := db.CreateItem(Item{}) + + err := db.DeleteItemByID(id) + assertNoErr(t, err) + + _, err = db.GetItemById(id) + assert(t, err != nil, "item should have been deleted") + }) + + t.Run("Delete user", func(t *testing.T) { + id, err := db.CreateUser(User{}) + + err = db.DeleteUserById(id) + assertNoErr(t, err) + + _, err = db.GetUserById(id) + assert(t, err != nil, "user should have been deleted") + }) +} diff --git a/api/database/query.go b/api/database/query.go index 1526f98..52a1b61 100644 --- a/api/database/query.go +++ b/api/database/query.go @@ -42,11 +42,11 @@ func (db *Database) GetItemById(id uint) (Item, error) { return item, nil } -func (db *Database) CreateItem(item Item) error { +func (db *Database) CreateItem(item Item) (id uint, err error) { if res := db.db.Create(&item); res.Error != nil { - return errors.New("could not create item") + return id, errors.New("could not create item") } - return nil + return item.ID, nil } func (db *Database) GetAllItems() ([]Item, error) { From 1dfe4fb3f108102edb08fcdcc32074249cb40f70 Mon Sep 17 00:00:00 2001 From: jesperkha Date: Sun, 29 Jun 2025 21:14:56 +0200 Subject: [PATCH 2/2] Silent gorm logging --- api/database/database.go | 9 +++++++-- api/database/database_test.go | 10 ++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/api/database/database.go b/api/database/database.go index 8aebd5e..5def376 100644 --- a/api/database/database.go +++ b/api/database/database.go @@ -8,6 +8,7 @@ import ( _ "github.com/tursodatabase/libsql-client-go/libsql" "gorm.io/driver/sqlite" "gorm.io/gorm" + "gorm.io/gorm/logger" ) type Database struct { @@ -23,7 +24,9 @@ func newDatabase(db *gorm.DB) *Database { func NewTurso(url, token string) *Database { dbUrl := url + token - db, err := gorm.Open(sqlite.Open(dbUrl), &gorm.Config{}) + db, err := gorm.Open(sqlite.Open(dbUrl), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Silent), + }) if err != nil { log.Fatalf("failed to connect to database: %v", err) } @@ -36,7 +39,9 @@ func NewSQLite(filename string) *Database { filename = "file:" + filename } - db, err := gorm.Open(sqlite.Open(filename), &gorm.Config{}) + db, err := gorm.Open(sqlite.Open(filename), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Silent), + }) if err != nil { log.Fatalf("failed to connect to database: %v", err) } diff --git a/api/database/database_test.go b/api/database/database_test.go index 074b4e4..f1508eb 100644 --- a/api/database/database_test.go +++ b/api/database/database_test.go @@ -7,13 +7,13 @@ import ( func assert(t *testing.T, v bool, msg string, args ...any) { if !v { - t.Errorf(msg, args...) + t.Fatalf(msg, args...) } } func assertNoErr(t *testing.T, err error) { if err != nil { - t.Error(err) + t.Fatal(err) } } @@ -130,9 +130,10 @@ func TestDatabase(t *testing.T) { }) t.Run("Delete item", func(t *testing.T) { - id, _ := db.CreateItem(Item{}) + id, err := db.CreateItem(Item{}) + assertNoErr(t, err) - err := db.DeleteItemByID(id) + err = db.DeleteItemByID(id) assertNoErr(t, err) _, err = db.GetItemById(id) @@ -141,6 +142,7 @@ func TestDatabase(t *testing.T) { t.Run("Delete user", func(t *testing.T) { id, err := db.CreateUser(User{}) + assertNoErr(t, err) err = db.DeleteUserById(id) assertNoErr(t, err)