github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/profiles/store/store_test.go (about) 1 package store_test 2 3 import ( 4 "fmt" 5 "github.com/k0marov/go-socnet/core/general/core_values" 6 "github.com/k0marov/go-socnet/core/general/core_values/ref" 7 "github.com/k0marov/go-socnet/core/general/static_store" 8 . "github.com/k0marov/go-socnet/core/helpers/test_helpers" 9 "reflect" 10 "testing" 11 12 "github.com/k0marov/go-socnet/features/profiles/domain/models" 13 14 "github.com/k0marov/go-socnet/features/profiles/domain/entities" 15 "github.com/k0marov/go-socnet/features/profiles/domain/values" 16 "github.com/k0marov/go-socnet/features/profiles/store" 17 ) 18 19 func TestStoreProfileUpdater(t *testing.T) { 20 target := RandomId() 21 testUpdData := values.ProfileUpdateData{About: RandomString()} 22 testDBUpdData := store.DBUpdateData{About: testUpdData.About} 23 t.Run("happy case", func(t *testing.T) { 24 updaterCalled := false 25 dbUpdater := func(id string, updData store.DBUpdateData) error { 26 if id == target && updData == testDBUpdData { 27 updaterCalled = true 28 return nil 29 } 30 panic(fmt.Sprintf("called with unexpected arguments, id=%v, updData=%v", id, updData)) 31 } 32 sut := store.NewStoreProfileUpdater(dbUpdater) 33 34 err := sut(target, testUpdData) 35 AssertNoError(t, err) 36 Assert(t, updaterCalled, true, "db updater called") 37 }) 38 t.Run("error case - updater returns an error", func(t *testing.T) { 39 dbUpdater := func(string, store.DBUpdateData) error { 40 return RandomError() 41 } 42 sut := store.NewStoreProfileUpdater(dbUpdater) 43 err := sut(target, testUpdData) 44 AssertSomeError(t, err) 45 }) 46 } 47 48 func TestStoreAvatarUpdater(t *testing.T) { 49 t.Run("should store avatar using file storage", func(t *testing.T) { 50 randomFile := []byte(RandomString()) 51 randomFileRef, _ := ref.NewRef(&randomFile) 52 avatar := values.AvatarData{ 53 Data: randomFileRef, 54 } 55 userId := RandomString() 56 t.Run("happy case", func(t *testing.T) { 57 wantPath := RandomString() 58 storeFile := func(file ref.Ref[[]byte], belongsToUser string) (string, error) { 59 if reflect.DeepEqual(file, randomFileRef) && belongsToUser == userId { 60 return wantPath, nil 61 } 62 panic(fmt.Sprintf("StoreFile called with unexpected arguments, file=%v, belongsToUser=%v", file, belongsToUser)) 63 } 64 65 t.Run("should store avatarPath in DB", func(t *testing.T) { 66 t.Run("happy case", func(t *testing.T) { 67 updateProfile := func(string, store.DBUpdateData) error { 68 return nil 69 } 70 sut := store.NewStoreAvatarUpdater(storeFile, updateProfile) 71 gotAvatarUrl, err := sut(userId, avatar) 72 AssertNoError(t, err) 73 Assert(t, gotAvatarUrl, wantPath, "returned avatar url") 74 }) 75 t.Run("error case - db returns an error", func(t *testing.T) { 76 wantUpdData := store.DBUpdateData{AvatarPath: wantPath} 77 updateProfile := func(gotUserId string, data store.DBUpdateData) error { 78 if gotUserId == userId && data == wantUpdData { 79 return RandomError() 80 } 81 panic(fmt.Sprintf("called with unexpected arguments, gotUserId=%v, avatar=%v", gotUserId, avatar)) 82 } 83 sut := store.NewStoreAvatarUpdater(storeFile, updateProfile) 84 85 _, err := sut(userId, avatar) 86 AssertSomeError(t, err) 87 }) 88 }) 89 90 }) 91 t.Run("error case - fileStore returns an error", func(t *testing.T) { 92 storeFile := func(ref.Ref[[]byte], string) (string, error) { 93 return "", RandomError() 94 } 95 sut := store.NewStoreAvatarUpdater(storeFile, nil) // nil, because db shouldn't be called 96 97 _, err := sut(userId, avatar) 98 AssertSomeError(t, err) 99 }) 100 }) 101 } 102 103 func TestStoreProfileGetter(t *testing.T) { 104 profileId := RandomId() 105 model := RandomProfileModel() 106 follows := RandomInt() 107 followers := RandomInt() 108 109 dbGetter := func(id core_values.UserId) (models.ProfileModel, error) { 110 if id == profileId { 111 return model, nil 112 } 113 panic("unexpected args") 114 } 115 t.Run("error case - getting model from db throws", func(t *testing.T) { 116 dbGetter := func(core_values.UserId) (models.ProfileModel, error) { 117 return models.ProfileModel{}, RandomError() 118 } 119 _, err := store.NewStoreProfileGetter(dbGetter, nil, nil)(profileId) 120 AssertSomeError(t, err) 121 }) 122 followersGetter := func(targetId core_values.UserId) (int, error) { 123 if targetId == profileId { 124 return followers, nil 125 } 126 panic("unexpected args") 127 } 128 t.Run("error case - getting followers throws", func(t *testing.T) { 129 wantErr := RandomError() 130 followersGetter := func(core_values.UserId) (int, error) { 131 return 0, wantErr 132 } 133 _, err := store.NewStoreProfileGetter(dbGetter, followersGetter, nil)(profileId) 134 AssertError(t, err, wantErr) 135 }) 136 followsGetter := func(targetId core_values.UserId) (int, error) { 137 if targetId == profileId { 138 return follows, nil 139 } 140 panic("unexpected args") 141 } 142 t.Run("error case - getting follows throws", func(t *testing.T) { 143 wantErr := RandomError() 144 followsGetter := func(id core_values.UserId) (int, error) { 145 return 0, wantErr 146 } 147 _, err := store.NewStoreProfileGetter(dbGetter, followersGetter, followsGetter)(profileId) 148 AssertError(t, err, wantErr) 149 }) 150 151 sut := store.NewStoreProfileGetter(dbGetter, followersGetter, followsGetter) 152 gotProfile, err := sut(profileId) 153 AssertNoError(t, err) 154 wantProfile := entities.Profile{ 155 ProfileModel: model, 156 AvatarURL: static_store.PathToURL(model.AvatarPath), 157 Follows: follows, 158 Followers: followers, 159 } 160 Assert(t, gotProfile, wantProfile, "returned profile entity") 161 }