github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/comments/domain/service/service_test.go (about) 1 package service_test 2 3 import ( 4 likeable_contexters "github.com/k0marov/go-socnet/core/abstract/ownable_likeable/contexters" 5 "github.com/k0marov/go-socnet/core/general/client_errors" 6 "github.com/k0marov/go-socnet/core/general/core_values" 7 . "github.com/k0marov/go-socnet/core/helpers/test_helpers" 8 "reflect" 9 "testing" 10 "time" 11 12 "github.com/k0marov/go-socnet/features/comments/domain/entities" 13 "github.com/k0marov/go-socnet/features/comments/domain/models" 14 "github.com/k0marov/go-socnet/features/comments/domain/service" 15 "github.com/k0marov/go-socnet/features/comments/domain/values" 16 post_values "github.com/k0marov/go-socnet/features/posts/domain/values" 17 profile_entities "github.com/k0marov/go-socnet/features/profiles/domain/entities" 18 ) 19 20 func TestCommentCreator(t *testing.T) { 21 newComment := RandomNewComment() 22 createdId := RandomString() 23 author := RandomContextedProfile() 24 createdComment := entities.ContextedComment{ 25 Comment: entities.Comment{ 26 CommentModel: models.CommentModel{ 27 Id: createdId, 28 AuthorId: newComment.Author, 29 Text: newComment.Text, 30 CreatedAt: time.Now().Unix(), 31 }, 32 Likes: 0, 33 }, 34 OwnLikeContext: likeable_contexters.OwnLikeContext{ 35 IsLiked: false, 36 IsMine: true, 37 }, 38 Author: author, 39 } 40 validator := func(gotComment values.NewCommentValue) (client_errors.ClientError, bool) { 41 if gotComment == newComment { 42 return client_errors.ClientError{}, true 43 } 44 panic("unexpected args") 45 } 46 t.Run("validator throws a client error", func(t *testing.T) { 47 clientErr := RandomClientError() 48 validator := func(value values.NewCommentValue) (client_errors.ClientError, bool) { 49 return clientErr, false 50 } 51 _, err := service.NewCommentCreator(validator, nil, nil)(newComment) 52 AssertError(t, err, clientErr) 53 }) 54 profileGetter := func(target, caller core_values.UserId) (profile_entities.ContextedProfile, error) { 55 if target == newComment.Author && caller == newComment.Author { 56 return author, nil 57 } 58 panic("unexpected args") 59 } 60 t.Run("profile getter throws", func(t *testing.T) { 61 profileGetter := func(target, caller core_values.UserId) (profile_entities.ContextedProfile, error) { 62 return profile_entities.ContextedProfile{}, RandomError() 63 } 64 _, err := service.NewCommentCreator(validator, profileGetter, nil)(newComment) 65 AssertSomeError(t, err) 66 }) 67 68 creator := func(gotComment values.NewCommentValue, createdAt time.Time) (values.CommentId, error) { 69 if gotComment == newComment && TimeAlmostNow(createdAt) { 70 return createdId, nil 71 } 72 panic("unexpected args") 73 } 74 t.Run("creator throws", func(t *testing.T) { 75 creator := func(values.NewCommentValue, time.Time) (values.CommentId, error) { 76 return "", RandomError() 77 } 78 _, err := service.NewCommentCreator(validator, profileGetter, creator)(newComment) 79 AssertSomeError(t, err) 80 }) 81 sut := service.NewCommentCreator(validator, profileGetter, creator) 82 gotCreated, err := sut(newComment) 83 AssertNoError(t, err) 84 Assert(t, TimeAlmostNow(time.Unix(gotCreated.CreatedAt, 0)), true, "createdAt is time.Now()") 85 gotCreated.CreatedAt = createdComment.CreatedAt 86 Assert(t, gotCreated, createdComment, "the returned created comment") 87 } 88 func TestPostCommentsGetter(t *testing.T) { 89 post := RandomString() 90 caller := RandomId() 91 comments := []entities.Comment{RandomComment()} 92 contextedComments := []entities.ContextedComment{RandomContextedComment()} 93 94 commentsGetter := func(postId post_values.PostId) ([]entities.Comment, error) { 95 if postId == post { 96 return comments, nil 97 } 98 panic("unexpected args") 99 } 100 t.Run("error case - getting the comments returns some error", func(t *testing.T) { 101 commentsGetter := func(post_values.PostId) ([]entities.Comment, error) { 102 return []entities.Comment{}, RandomError() 103 } 104 _, err := service.NewPostCommentsGetter(commentsGetter, nil)(post, caller) 105 AssertSomeError(t, err) 106 }) 107 contextAdder := func(commentList []entities.Comment, callerId core_values.UserId) ([]entities.ContextedComment, error) { 108 if reflect.DeepEqual(commentList, comments) && callerId == caller { 109 return contextedComments, nil 110 } 111 panic("unexpected args") 112 } 113 t.Run("error case - context adder returns some error", func(t *testing.T) { 114 contextAdder := func([]entities.Comment, core_values.UserId) ([]entities.ContextedComment, error) { 115 return nil, RandomError() 116 } 117 _, err := service.NewPostCommentsGetter(commentsGetter, contextAdder)(post, caller) 118 AssertSomeError(t, err) 119 }) 120 gotComments, err := service.NewPostCommentsGetter(commentsGetter, contextAdder)(post, caller) 121 AssertNoError(t, err) 122 Assert(t, gotComments, contextedComments, "returned comments") 123 }