github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/posts/store/sql_db/sql_db_test.go (about) 1 package sql_db_test 2 3 import ( 4 "github.com/k0marov/go-socnet/core/general/core_values" 5 . "github.com/k0marov/go-socnet/core/helpers/test_helpers" 6 "testing" 7 "time" 8 9 "github.com/k0marov/go-socnet/features/posts/domain/models" 10 "github.com/k0marov/go-socnet/features/posts/store/sql_db" 11 profiles_db "github.com/k0marov/go-socnet/features/profiles/store/sql_db" 12 _ "github.com/mattn/go-sqlite3" 13 ) 14 15 func TestSqlDB_ErrorHandling(t *testing.T) { 16 db := OpenSqliteDB(t) 17 sut, err := sql_db.NewSqlDB(db) 18 AssertNoError(t, err) 19 db.Close() // this will force all calls to throw errors 20 t.Run("GetPosts", func(t *testing.T) { 21 _, err := sut.GetPosts(RandomString()) 22 AssertSomeError(t, err) 23 }) 24 t.Run("CreatePost", func(t *testing.T) { 25 _, err := sut.CreatePost(models.PostToCreate{}) 26 AssertSomeError(t, err) 27 }) 28 t.Run("AddPostImages", func(t *testing.T) { 29 err := sut.AddPostImages(RandomString(), RandomPostImageModels()) 30 AssertSomeError(t, err) 31 }) 32 } 33 34 func TestSqlDB(t *testing.T) { 35 createRandomPostWithTime := func(t testing.TB, sut *sql_db.SqlDB, author core_values.UserId, createdAt time.Time) models.PostModel { 36 post := models.PostToCreate{ 37 Author: author, 38 Text: RandomString(), 39 CreatedAt: createdAt, 40 } 41 post1Id, err := sut.CreatePost(post) 42 AssertNoError(t, err) 43 return models.PostModel{ 44 Id: post1Id, 45 AuthorId: author, 46 Text: post.Text, 47 CreatedAt: post.CreatedAt.Unix(), 48 Images: nil, 49 } 50 } 51 createRandomPost := func(t testing.TB, sut *sql_db.SqlDB, author core_values.UserId) models.PostModel { 52 return createRandomPostWithTime(t, sut, author, RandomTime()) 53 } 54 assertPosts := func(t testing.TB, sut *sql_db.SqlDB, author core_values.UserId, posts []models.PostModel) { 55 t.Helper() 56 gotPosts, err := sut.GetPosts(author) 57 AssertNoError(t, err) 58 Assert(t, gotPosts, posts, "the stored posts") 59 } 60 t.Run("creating, reading and deleting posts", func(t *testing.T) { 61 driver := OpenSqliteDB(t) 62 63 sut, err := sql_db.NewSqlDB(driver) 64 AssertNoError(t, err) 65 profiles, err := profiles_db.NewSqlDB(driver) 66 AssertNoError(t, err) 67 68 // create two profiles 69 user1 := RandomProfileModel() 70 user2 := RandomProfileModel() 71 profiles.CreateProfile(user1) 72 profiles.CreateProfile(user2) 73 74 // create a post for the first profile 75 wantPost1 := createRandomPost(t, sut, user1.Id) 76 assertPosts(t, sut, user1.Id, []models.PostModel{wantPost1}) 77 // add images to that post 78 wantPost1.Images = RandomPostImageModels() 79 err = sut.AddPostImages(wantPost1.Id, wantPost1.Images) 80 AssertNoError(t, err) 81 assertPosts(t, sut, user1.Id, []models.PostModel{wantPost1}) 82 // create two posts for the second profile 83 user2Posts := []models.PostModel{ 84 createRandomPost(t, sut, user2.Id), 85 createRandomPost(t, sut, user2.Id), 86 } 87 assertPosts(t, sut, user2.Id, user2Posts) 88 }) 89 t.Run("returning posts ordered by createdAt", func(t *testing.T) { 90 driver := OpenSqliteDB(t) 91 92 sut, err := sql_db.NewSqlDB(driver) 93 AssertNoError(t, err) 94 profiles, err := profiles_db.NewSqlDB(driver) 95 AssertNoError(t, err) 96 97 profile := RandomProfileModel() 98 profiles.CreateProfile(profile) 99 100 // create 3 posts 101 timeInYear := func(year int) time.Time { 102 return time.Date(year, 1, 1, 1, 1, 1, 0, time.UTC) 103 } 104 oldest := createRandomPostWithTime(t, sut, profile.Id, timeInYear(1998)) 105 newest := createRandomPostWithTime(t, sut, profile.Id, timeInYear(2022)) 106 middle := createRandomPostWithTime(t, sut, profile.Id, timeInYear(2006)) 107 // assert they are returned in the right order 108 assertPosts(t, sut, profile.Id, []models.PostModel{newest, middle, oldest}) 109 }) 110 }