goyave.dev/goyave/v5@v5.0.0-rc9.0.20240517145003-d3f977d0b9f3/validation/min_test.go (about)

     1  package validation
     2  
     3  import (
     4  	"fmt"
     5  	"math"
     6  	"mime/multipart"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"goyave.dev/goyave/v5/util/fsutil"
    11  )
    12  
    13  func TestMinalidator(t *testing.T) {
    14  	t.Run("Constructor", func(t *testing.T) {
    15  		v := Min(123.456)
    16  		assert.NotNil(t, v)
    17  		assert.Equal(t, "min", v.Name())
    18  		assert.False(t, v.IsType())
    19  		assert.True(t, v.IsTypeDependent())
    20  		assert.Equal(t, []string{":min", "123.456"}, v.MessagePlaceholders(&Context{}))
    21  	})
    22  
    23  	file := fsutil.File{Header: &multipart.FileHeader{Size: 2048}}
    24  	largeFile := fsutil.File{Header: &multipart.FileHeader{Size: math.MaxInt64}}
    25  
    26  	cases := []struct {
    27  		value any
    28  		min   float64
    29  		want  bool
    30  	}{
    31  		{value: 2, want: false, min: 3},
    32  		{value: 2.5, want: false, min: 3},
    33  		{value: float32(2.5), want: false, min: 3},
    34  		{value: float64(math.MaxInt64), want: true, min: math.MinInt64},
    35  		{value: float64(math.MinInt64), want: true, min: math.MinInt64},
    36  		{value: int64(math.MaxInt64), want: false, min: math.MinInt64}, // Don't pass because above max int value that can accurately fit in float64
    37  		{value: int64(math.MinInt64), want: false, min: math.MinInt64}, // Don't pass because below min int value that can accurately fit in float64
    38  		{value: 'a', want: false, min: 100},
    39  		{value: "abc", want: false, min: 4},
    40  		{value: []string{"a", "b"}, want: false, min: 3},
    41  		{value: map[string]any{"a": 1, "b": 2}, want: false, min: 3},
    42  		{value: true, want: true, min: 1},
    43  		{value: nil, want: true, min: 1},
    44  		{value: []fsutil.File{file}, want: false, min: 3},
    45  		{value: []fsutil.File{largeFile}, want: false, min: math.MinInt64}, // Don't pass because above max int value that can accurately fit in float64
    46  
    47  		{value: 3, want: true, min: 3},
    48  		{value: 3.5, want: true, min: 3},
    49  		{value: float32(3.5), want: true, min: 3},
    50  		{value: 'a', want: true, min: 97},
    51  		{value: "string", want: true, min: 3},
    52  		{value: []string{"a", "b", "c"}, want: true, min: 3},
    53  		{value: map[string]any{"a": 1, "b": 2, "c": 3}, want: true, min: 3},
    54  		{value: []fsutil.File{file}, want: true, min: 2},
    55  	}
    56  
    57  	for _, c := range cases {
    58  		c := c
    59  		t.Run(fmt.Sprintf("Validate_%v_%f_%t", c.value, c.min, c.want), func(t *testing.T) {
    60  			v := Min(c.min)
    61  			ctx := &Context{
    62  				Value: c.value,
    63  			}
    64  			ok := v.Validate(ctx)
    65  			assert.Equal(t, c.want, ok)
    66  		})
    67  	}
    68  }