github.com/k0marov/go-socnet@v0.0.0-20220715154813-90d07867c782/features/posts/domain/validators/validators_test.go (about)

     1  package validators_test
     2  
     3  import (
     4  	"github.com/k0marov/go-socnet/core/general/client_errors"
     5  	"github.com/k0marov/go-socnet/core/general/image_decoder"
     6  	. "github.com/k0marov/go-socnet/core/helpers/test_helpers"
     7  	"reflect"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/k0marov/go-socnet/features/posts/domain/validators"
    12  	"github.com/k0marov/go-socnet/features/posts/domain/values"
    13  )
    14  
    15  func TestPostValidator(t *testing.T) {
    16  	t.Run("Text validation", func(t *testing.T) {
    17  		decoder := func([]byte) (image_decoder.Image, error) {
    18  			return image_decoder.Image{Height: 123, Width: 345}, nil
    19  		}
    20  		cases := []struct {
    21  			text        string
    22  			expectedErr error
    23  		}{
    24  			{"", nil},
    25  			{"some short text", nil},
    26  			{strings.Repeat("looong", 300), client_errors.TextTooLong},
    27  		}
    28  		for _, testCase := range cases {
    29  			t.Run(testCase.text, func(t *testing.T) {
    30  				newPost := values.NewPostData{
    31  					Author: RandomString(),
    32  					Text:   testCase.text,
    33  					Images: nil,
    34  				}
    35  				gotErr, ok := validators.NewPostValidator(decoder)(newPost)
    36  				if testCase.expectedErr == nil {
    37  					AssertError(t, gotErr, client_errors.ClientError{})
    38  					Assert(t, ok, true, "returned 'ok' value")
    39  				} else {
    40  					AssertError(t, gotErr, testCase.expectedErr)
    41  					Assert(t, ok, false, "returned 'ok' value")
    42  				}
    43  			})
    44  		}
    45  	})
    46  	t.Run("Images validation", func(t *testing.T) {
    47  		newPost := values.NewPostData{
    48  			Author: RandomString(),
    49  			Text:   "",
    50  			Images: []values.PostImageFile{{RandomFileData(), 1}, {RandomFileData(), 2}},
    51  		}
    52  		isCorrectImage := func(image []byte) bool {
    53  			for _, postImage := range newPost.Images {
    54  				if reflect.DeepEqual(postImage.File.Value(), image) {
    55  					return true
    56  				}
    57  			}
    58  			return false
    59  		}
    60  		t.Run("happy case", func(t *testing.T) {
    61  			imagesChecked := 0
    62  			decoder := func(image []byte) (image_decoder.Image, error) {
    63  				if isCorrectImage(image) {
    64  					imagesChecked++
    65  					return image_decoder.Image{Height: 420, Width: 840}, nil
    66  				}
    67  				panic("unexpected args")
    68  			}
    69  			clientErr, ok := validators.NewPostValidator(decoder)(newPost)
    70  			Assert(t, ok, true, "ok is true")
    71  			AssertError(t, clientErr, client_errors.ClientError{})
    72  			Assert(t, imagesChecked, len(newPost.Images), "amount of checked images")
    73  		})
    74  		t.Run("error case", func(t *testing.T) {
    75  			decoder := func([]byte) (image_decoder.Image, error) {
    76  				return image_decoder.Image{}, RandomError()
    77  			}
    78  			clientErr, ok := validators.NewPostValidator(decoder)(newPost)
    79  			Assert(t, ok, false, "ok is false")
    80  			AssertError(t, clientErr, client_errors.InvalidImage)
    81  		})
    82  	})
    83  }