github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/posts/domain/service/service_test.go (about) 1 package service_test 2 3 import ( 4 "github.com/k0marov/go-socnet/core/general/client_errors" 5 "github.com/k0marov/go-socnet/core/general/core_values" 6 . "github.com/k0marov/go-socnet/core/helpers/test_helpers" 7 "reflect" 8 "testing" 9 "time" 10 11 "github.com/k0marov/go-socnet/features/posts/domain/entities" 12 13 "github.com/k0marov/go-socnet/features/posts/domain/service" 14 "github.com/k0marov/go-socnet/features/posts/domain/values" 15 ) 16 17 func TestPostsGetter(t *testing.T) { 18 author := RandomId() 19 caller := RandomString() 20 posts := []entities.Post{RandomPost()} 21 ctxPosts := []entities.ContextedPost{RandomContextedPost()} 22 23 storePostsGetter := func(authorId core_values.UserId) ([]entities.Post, error) { 24 if authorId == author { 25 return posts, nil 26 } 27 panic("unexpected args") 28 } 29 t.Run("error case - store throws an error", func(t *testing.T) { 30 storeGetter := func(core_values.UserId) ([]entities.Post, error) { 31 return []entities.Post{}, RandomError() 32 } 33 _, err := service.NewPostsGetter(storeGetter, nil)(author, caller) 34 AssertSomeError(t, err) 35 }) 36 contextAdder := func(postsList []entities.Post, callerId core_values.UserId) ([]entities.ContextedPost, error) { 37 if reflect.DeepEqual(postsList, posts) && callerId == caller { 38 return ctxPosts, nil 39 } 40 panic("unexpected args") 41 } 42 t.Run("error case - context adder throws an error", func(t *testing.T) { 43 contextAdder := func([]entities.Post, core_values.UserId) ([]entities.ContextedPost, error) { 44 return nil, RandomError() 45 } 46 _, err := service.NewPostsGetter(storePostsGetter, contextAdder)(author, caller) 47 AssertSomeError(t, err) 48 }) 49 gotPosts, err := service.NewPostsGetter(storePostsGetter, contextAdder)(author, caller) 50 AssertNoError(t, err) 51 Assert(t, gotPosts, ctxPosts, "returned posts") 52 } 53 54 func TestPostDeleter(t *testing.T) { 55 t.Run("happy case", func(t *testing.T) { 56 post := RandomString() 57 caller := RandomString() 58 postAuthor := caller 59 authorGetter := func(postId values.PostId) (core_values.UserId, error) { 60 if postId == post { 61 return postAuthor, nil 62 } 63 panic("unexpected args") 64 } 65 deleted := false 66 postDeleter := func(postId values.PostId, authorId core_values.UserId) error { 67 if postId == post && authorId == postAuthor { 68 deleted = true 69 return nil 70 } 71 panic("unexpected args") 72 } 73 sut := service.NewPostDeleter(authorGetter, postDeleter) 74 err := sut(post, caller) 75 AssertNoError(t, err) 76 Assert(t, deleted, true, "post was deleted") 77 }) 78 t.Run("error case - the calling user is not the post author", func(t *testing.T) { 79 getAuthor := func(values.PostId) (core_values.UserId, error) { 80 return RandomString(), nil 81 } 82 sut := service.NewPostDeleter(getAuthor, nil) 83 err := sut(RandomString(), RandomString()) 84 AssertError(t, err, client_errors.InsufficientPermissions) 85 }) 86 t.Run("error case - getting author returns some error", func(t *testing.T) { 87 getAuthor := func(values.PostId) (core_values.UserId, error) { 88 return "", RandomError() 89 } 90 err := service.NewPostDeleter(getAuthor, nil)(RandomString(), RandomString()) 91 AssertSomeError(t, err) 92 }) 93 t.Run("error case - deleting post returns error", func(t *testing.T) { 94 caller := "42" 95 getAuthor := func(values.PostId) (core_values.UserId, error) { 96 return caller, nil 97 } 98 deletePost := func(values.PostId, core_values.UserId) error { 99 return RandomError() 100 } 101 err := service.NewPostDeleter(getAuthor, deletePost)("33", caller) 102 AssertSomeError(t, err) 103 }) 104 } 105 106 func TestPostCreator(t *testing.T) { 107 tNewPost := RandomNewPostData() 108 t.Run("happy case", func(t *testing.T) { 109 validator := func(newPost values.NewPostData) (client_errors.ClientError, bool) { 110 if reflect.DeepEqual(newPost, tNewPost) { 111 return client_errors.ClientError{}, true 112 } 113 panic("unexpected args") 114 } 115 storeCreator := func(newPost values.NewPostData, createdAt time.Time) error { 116 if reflect.DeepEqual(newPost, tNewPost) && TimeAlmostNow(createdAt) { 117 return nil 118 } 119 panic("unexpected args") 120 } 121 err := service.NewPostCreator(validator, storeCreator)(tNewPost) 122 AssertNoError(t, err) 123 }) 124 t.Run("error case - validation fails", func(t *testing.T) { 125 wantErr := RandomClientError() 126 validator := func(values.NewPostData) (client_errors.ClientError, bool) { 127 return wantErr, false 128 } 129 err := service.NewPostCreator(validator, nil)(tNewPost) 130 AssertError(t, err, wantErr) 131 }) 132 t.Run("error case - store returns error", func(t *testing.T) { 133 validator := func(values.NewPostData) (client_errors.ClientError, bool) { 134 return client_errors.ClientError{}, true 135 } 136 storeCreator := func(values.NewPostData, time.Time) error { 137 return RandomError() 138 } 139 err := service.NewPostCreator(validator, storeCreator)(tNewPost) 140 AssertSomeError(t, err) 141 }) 142 }