package mysqldriver import ( "context" "git.aiterp.net/stufflog/server/internal/xlerrors" "git.aiterp.net/stufflog/server/models" "github.com/stretchr/testify/assert" "testing" "time" ) var item1ImageURL = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" var item1 = models.Item{ Name: "Salmon Fillet - 500g", Description: "Best fish", Tags: []string{"Groceries"}, ImageURL: &item1ImageURL, } var item1Updated = models.Item{ Name: "Salmon Fillet - 450g", Description: "Do not handle under suspicious circumstances.", Tags: []string{"Groceries"}, ImageURL: nil, } var item2 = models.Item{ Name: "Tape - Basic", Description: "", Tags: []string{"Groceries", "Hardware", "Office Supplies"}, ImageURL: nil, } var item3 = models.Item{ Name: "Flour - Wheat - 1kg", Description: "For bread and stuff", Tags: []string{"Groceries"}, ImageURL: nil, } var item4 = models.Item{ Name: "Flour - Wheat - 2kg", Description: "For more bread and stuff", Tags: []string{"Groceries"}, ImageURL: nil, } func TestItemRepository(t *testing.T) { items := testDB.items ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() assert.NoError(t, clearTable("item")) assert.NoError(t, clearTable("item_tag")) // INSERT // IDs are random, so test data needs to be changed before comparison. result, err := items.Insert(ctx, item1) assert.NoError(t, err) if result != nil { item1.ID = result.ID item1Updated.ID = result.ID } assert.Equal(t, item1, *result) result, err = items.Insert(ctx, item2) assert.NoError(t, err) if result != nil { item2.ID = result.ID } assert.Equal(t, item2, *result) result, err = items.Insert(ctx, item3) assert.NoError(t, err) if result != nil { item3.ID = result.ID } assert.Equal(t, item3, *result) result, err = items.Insert(ctx, item4) assert.NoError(t, err) if result != nil { item4.ID = result.ID } assert.Equal(t, item4, *result) if t.Failed() { return } // FIND result, err = items.Find(ctx, item1.ID) assert.NoError(t, err) assert.Equal(t, &item1, result) result, err = items.Find(ctx, item2.ID) assert.NoError(t, err) assert.Equal(t, &item2, result) // FIND't result, err = items.Find(ctx, "Iobviouslyinvalidid") assert.Error(t, err) assert.True(t, xlerrors.IsNotFound(err)) assert.Nil(t, result) // LIST results, err := items.List(ctx, models.ItemFilter{}) assert.NoError(t, err) assert.Equal(t, []*models.Item{&item3, &item4, &item1, &item2}, results) results, err = items.List(ctx, models.ItemFilter{ Tags: []string{"Hardware"}, }) assert.NoError(t, err) assert.Equal(t, []*models.Item{&item2}, results) results, err = items.List(ctx, models.ItemFilter{ ItemIDs: []string{item1.ID, item2.ID}, }) assert.NoError(t, err) assert.Equal(t, []*models.Item{&item1, &item2}, results) // UPDATE err = items.Save(ctx, item1Updated) assert.NoError(t, err) // FIND after UPDATE result, err = items.Find(ctx, item1.ID) assert.NoError(t, err) assert.NotEqual(t, &item1, result) assert.Equal(t, &item1Updated, result) // TAGS allTags, err := items.GetTags(ctx) assert.NoError(t, err) assert.Equal(t, item2.Tags, allTags) // DELETE err = items.Delete(ctx, item2) assert.NoError(t, err) // LIST after DELETE results, err = items.List(ctx, models.ItemFilter{}) assert.NoError(t, err) assert.Equal(t, []*models.Item{&item3, &item4, &item1Updated}, results) // TAGS after DELETE allTags, err = items.GetTags(ctx) assert.NoError(t, err) assert.Equal(t, item1.Tags, allTags) }