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  }