go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/projects/chirp/pkg/model/manager_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package model
     9  
    10  import (
    11  	"context"
    12  	"testing"
    13  	"time"
    14  
    15  	"go.charczuk.com/sdk/apputil"
    16  	"go.charczuk.com/sdk/assert"
    17  	"go.charczuk.com/sdk/uuid"
    18  )
    19  
    20  func Test_Manager_User(t *testing.T) {
    21  	appMgr, done := apputil.NewTest(t)
    22  	defer done()
    23  
    24  	mgr := &Manager{BaseManager: appMgr.BaseManager}
    25  	testData := seedTestData(t, mgr)
    26  
    27  	user, found, err := mgr.User(context.Background(), testData.users[0].ID, testData.users[1].ID)
    28  	assert.ItsNil(t, err)
    29  	assert.ItsTrue(t, found)
    30  	assert.ItsEqual(t, testData.users[1].ID, user.ID)
    31  	assert.ItsEqual(t, false, user.Status.IsSelf)
    32  	assert.ItsEqual(t, true, user.Status.IsFollowing)
    33  }
    34  
    35  func Test_Manager_User_self(t *testing.T) {
    36  	appMgr, done := apputil.NewTest(t)
    37  	defer done()
    38  
    39  	mgr := &Manager{BaseManager: appMgr.BaseManager}
    40  	testData := seedTestData(t, mgr)
    41  
    42  	user, found, err := mgr.User(context.Background(), testData.users[0].ID, testData.users[0].ID)
    43  	assert.ItsNil(t, err)
    44  	assert.ItsTrue(t, found)
    45  	assert.ItsEqual(t, testData.users[0].ID, user.ID)
    46  	assert.ItsEqual(t, true, user.Status.IsSelf)
    47  	assert.ItsEqual(t, false, user.Status.IsFollowing)
    48  }
    49  
    50  func Test_Manager_User_notFound(t *testing.T) {
    51  	appMgr, done := apputil.NewTest(t)
    52  	defer done()
    53  
    54  	mgr := &Manager{BaseManager: appMgr.BaseManager}
    55  	seedTestData(t, mgr)
    56  
    57  	user, found, err := mgr.User(context.Background(), uuid.V4(), uuid.V4())
    58  	assert.ItsNil(t, err)
    59  	assert.ItsFalse(t, found)
    60  	assert.ItsTrue(t, user.ID.IsZero())
    61  }
    62  
    63  func Test_Manager_Chirp(t *testing.T) {
    64  	appMgr, done := apputil.NewTest(t)
    65  	defer done()
    66  
    67  	mgr := &Manager{BaseManager: appMgr.BaseManager}
    68  	testData := seedTestData(t, mgr)
    69  
    70  	chirp, found, err := mgr.Chirp(context.Background(), testData.users[0].ID, testData.userChirps[0][0])
    71  	assert.ItsNil(t, err)
    72  	assert.ItsTrue(t, found)
    73  	assert.ItsEqual(t, testData.userChirps[0][0], chirp.Chirp.ID)
    74  	assert.ItsEqual(t, testData.users[0].ID, chirp.Chirp.UserID)
    75  }
    76  
    77  func Test_Manager_Chirp_notFound(t *testing.T) {
    78  	appMgr, done := apputil.NewTest(t)
    79  	defer done()
    80  
    81  	mgr := &Manager{BaseManager: appMgr.BaseManager}
    82  	testData := seedTestData(t, mgr)
    83  
    84  	chirp, found, err := mgr.Chirp(context.Background(), testData.users[0].ID, uuid.V4())
    85  	assert.ItsNil(t, err)
    86  	assert.ItsFalse(t, found)
    87  	assert.ItsTrue(t, chirp.Chirp.ID.IsZero())
    88  }
    89  
    90  func Test_Manager_SearchUsers(t *testing.T) {
    91  	appMgr, done := apputil.NewTest(t)
    92  	defer done()
    93  
    94  	mgr := &Manager{BaseManager: appMgr.BaseManager}
    95  	testData := seedTestData(t, mgr)
    96  
    97  	users, err := mgr.SearchUsers(context.Background(), testData.users[0].ID, "user")
    98  	assert.ItsNil(t, err)
    99  	assert.ItsNotEmpty(t, users)
   100  }
   101  
   102  func Test_Manager_FeedForUserID(t *testing.T) {
   103  	appMgr, done := apputil.NewTest(t)
   104  	defer done()
   105  
   106  	mgr := &Manager{BaseManager: appMgr.BaseManager}
   107  	testData := seedTestData(t, mgr)
   108  
   109  	userID := testData.users[0].ID
   110  	feed, err := mgr.FeedForUserID(context.Background(), userID, 8, nil)
   111  	assert.ItsNil(t, err)
   112  	assert.ItsNotEmpty(t, feed)
   113  
   114  	assert.ItsAll(t, feed, func(c ChirpFull) bool {
   115  		return c.User.PictureURL != ""
   116  	})
   117  }
   118  
   119  func Test_Manager_FeedForUserID_after(t *testing.T) {
   120  	appMgr, done := apputil.NewTest(t)
   121  	defer done()
   122  
   123  	mgr := &Manager{BaseManager: appMgr.BaseManager}
   124  	testData := seedTestData(t, mgr)
   125  
   126  	userID := testData.users[0].ID
   127  	after := testData.userChirps[1][16]
   128  	feed, err := mgr.FeedForUserID(context.Background(), userID, 8, &after)
   129  	assert.ItsNil(t, err)
   130  	assert.ItsNotEmpty(t, feed)
   131  
   132  	assert.ItsAny(t, feed, func(c ChirpFull) bool {
   133  		return c.Chirp.ID == testData.userChirps[1][15]
   134  	})
   135  	assert.ItsEqual(t, testData.userChirps[1][15], feed[0].Chirp.ID)
   136  }
   137  
   138  func Test_Manager_ProfileLikes(t *testing.T) {
   139  	ctx := context.TODO()
   140  	appMgr, done := apputil.NewTest(t)
   141  	defer done()
   142  
   143  	mgr := &Manager{BaseManager: appMgr.BaseManager}
   144  	u0 := createTestUser(t, mgr, 0)
   145  	u1 := createTestUser(t, mgr, 1)
   146  
   147  	u0Chirps := createTestChirps(t, mgr, u0.Username(), u0.ID, time.Duration(0)*time.Minute)
   148  	u1Chirps := createTestChirps(t, mgr, u1.Username(), u1.ID, time.Duration(0)*time.Minute)
   149  
   150  	u0liked0 := u1Chirps[0]
   151  	u0liked1 := u1Chirps[1]
   152  	u1liked0 := u0Chirps[0]
   153  
   154  	var err error
   155  	err = mgr.LikeChirp(ctx, u0.ID, Chirp{ID: u0liked0, UserID: u0.ID})
   156  	assert.ItsNil(t, err)
   157  	err = mgr.LikeChirp(ctx, u0.ID, Chirp{ID: u0liked1, UserID: u0.ID})
   158  	assert.ItsNil(t, err)
   159  	err = mgr.LikeChirp(ctx, u1.ID, Chirp{ID: u1liked0, UserID: u1.ID})
   160  	assert.ItsNil(t, err)
   161  
   162  	u0likes, err := mgr.ProfileLikes(ctx, u0.ID, u0.ID, 10, nil)
   163  	assert.ItsNil(t, err)
   164  	assert.ItsNotEmpty(t, u0likes)
   165  	assert.ItsLen(t, u0likes, 2)
   166  
   167  	assert.ItsEqual(t, u0liked0, u0likes[1].ID)
   168  	assert.ItsEqual(t, u0liked1, u0likes[0].ID)
   169  }
   170  
   171  func Test_ChirpReplies(t *testing.T) {
   172  	ctx := context.TODO()
   173  	appMgr, done := apputil.NewTest(t)
   174  	defer done()
   175  
   176  	mgr := &Manager{BaseManager: appMgr.BaseManager}
   177  	u0 := createTestUser(t, mgr, 0)
   178  	u1 := createTestUser(t, mgr, 1)
   179  	u2 := createTestUser(t, mgr, 2)
   180  
   181  	u0Chirps := createTestChirps(t, mgr, u0.Username(), u0.ID, time.Duration(0)*time.Minute)
   182  
   183  	// create a reply to a u0 chirp by u1 and u2
   184  	replyTo(t, mgr, u1.ID, u0Chirps[0])
   185  	replyTo(t, mgr, u2.ID, u0Chirps[0])
   186  
   187  	replies, err := mgr.ChirpReplies(ctx, u0.ID, u0Chirps[0])
   188  	assert.ItsNil(t, err)
   189  	assert.ItsLen(t, replies, 2)
   190  }