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  }