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  }