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  }