github.com/goravel/framework@v1.13.9/validation/validator_test.go (about)

     1  package validation
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"mime/multipart"
     7  	"net/http"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/gookit/validate"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func TestBind(t *testing.T) {
    17  	type Data struct {
    18  		A    string
    19  		B    int
    20  		C    string
    21  		File *multipart.FileHeader
    22  	}
    23  
    24  	request := buildRequest(t)
    25  
    26  	tests := []struct {
    27  		name       string
    28  		data       validate.DataFace
    29  		rules      map[string]string
    30  		expectData Data
    31  		expectErr  error
    32  	}{
    33  		{
    34  			name:  "success when data is map and key is lowercase",
    35  			data:  validate.FromMap(map[string]any{"a": "aa"}),
    36  			rules: map[string]string{"a": "required"},
    37  			expectData: Data{
    38  				A: "aa",
    39  			},
    40  		},
    41  		{
    42  			name:  "success when data is map, key is lowercase and has errors",
    43  			data:  validate.FromMap(map[string]any{"a": "aa", "c": "cc"}),
    44  			rules: map[string]string{"a": "required", "b": "required"},
    45  			expectData: Data{
    46  				A: "aa",
    47  				C: "cc",
    48  			},
    49  		},
    50  		{
    51  			name:  "success when data is map and key is uppercase",
    52  			data:  validate.FromMap(map[string]any{"A": "aa"}),
    53  			rules: map[string]string{"A": "required"},
    54  			expectData: Data{
    55  				A: "aa",
    56  			},
    57  		},
    58  		{
    59  			name: "success when data is struct and key is uppercase",
    60  			data: func() validate.DataFace {
    61  				data, err := validate.FromStruct(struct {
    62  					A string
    63  				}{
    64  					A: "aa",
    65  				})
    66  				assert.Nil(t, err)
    67  
    68  				return data
    69  			}(),
    70  			rules: map[string]string{"A": "required"},
    71  			expectData: Data{
    72  				A: "aa",
    73  			},
    74  		},
    75  		{
    76  			name: "empty when data is struct and key is lowercase",
    77  			data: func() validate.DataFace {
    78  				data, err := validate.FromStruct(struct {
    79  					a string
    80  				}{
    81  					a: "aa",
    82  				})
    83  				assert.Nil(t, err)
    84  
    85  				return data
    86  			}(),
    87  			rules:      map[string]string{"a": "required"},
    88  			expectData: Data{},
    89  		},
    90  		{
    91  			name: "success when data is get request",
    92  			data: func() validate.DataFace {
    93  				request, err := http.NewRequest(http.MethodGet, "/?a=aa", nil)
    94  				assert.Nil(t, err)
    95  				data, err := validate.FromRequest(request)
    96  				assert.Nil(t, err)
    97  
    98  				return data
    99  			}(),
   100  			rules: map[string]string{"A": "required"},
   101  			expectData: Data{
   102  				A: "aa",
   103  			},
   104  		},
   105  		{
   106  			name: "success when data is post request",
   107  			data: func() validate.DataFace {
   108  				request, err := http.NewRequest(http.MethodGet, "/?a=aa", nil)
   109  				assert.Nil(t, err)
   110  				data, err := validate.FromRequest(request)
   111  				assert.Nil(t, err)
   112  
   113  				return data
   114  			}(),
   115  			rules: map[string]string{"A": "required"},
   116  			expectData: Data{
   117  				A: "aa",
   118  			},
   119  		},
   120  		{
   121  			name: "success when data is post request with body",
   122  			data: func() validate.DataFace {
   123  				data, err := validate.FromRequest(request, 1)
   124  				assert.Nil(t, err)
   125  
   126  				return data
   127  			}(),
   128  			rules: map[string]string{"A": "required", "File": "required"},
   129  			expectData: func() Data {
   130  				_, fileHeader, _ := request.FormFile("file")
   131  				data := Data{
   132  					A:    "aa",
   133  					File: fileHeader,
   134  				}
   135  
   136  				return data
   137  			}(),
   138  		},
   139  	}
   140  
   141  	for _, test := range tests {
   142  		t.Run(test.name, func(t *testing.T) {
   143  			validator := &Validator{data: test.data}
   144  
   145  			var data Data
   146  			err := validator.Bind(&data)
   147  			assert.Nil(t, test.expectErr, err)
   148  			assert.Equal(t, test.expectData.A, data.A)
   149  			assert.Equal(t, test.expectData.B, data.B)
   150  			assert.Equal(t, test.expectData.C, data.C)
   151  			assert.Equal(t, test.expectData.File == nil, data.File == nil)
   152  		})
   153  	}
   154  }
   155  
   156  func TestFails(t *testing.T) {
   157  	var maker *Validation
   158  	tests := []struct {
   159  		describe  string
   160  		data      any
   161  		rules     map[string]string
   162  		expectRes bool
   163  	}{
   164  		{
   165  			describe: "false",
   166  			data:     map[string]any{"a": "aa"},
   167  			rules:    map[string]string{"a": "required"},
   168  		},
   169  		{
   170  			describe:  "true",
   171  			data:      map[string]any{"b": "bb"},
   172  			rules:     map[string]string{"a": "required"},
   173  			expectRes: true,
   174  		},
   175  	}
   176  
   177  	for _, test := range tests {
   178  		maker = NewValidation()
   179  		validator, err := maker.Make(
   180  			test.data,
   181  			test.rules,
   182  		)
   183  		assert.Nil(t, err)
   184  		assert.Equal(t, test.expectRes, validator.Fails(), test.describe)
   185  	}
   186  }
   187  
   188  func buildRequest(t *testing.T) *http.Request {
   189  	payload := &bytes.Buffer{}
   190  	writer := multipart.NewWriter(payload)
   191  
   192  	err := writer.WriteField("a", "aa")
   193  	assert.Nil(t, err)
   194  
   195  	logo, err := os.Open("../logo.png")
   196  	assert.Nil(t, err)
   197  
   198  	defer logo.Close()
   199  	part1, err := writer.CreateFormFile("file", filepath.Base("../logo.png"))
   200  	assert.Nil(t, err)
   201  
   202  	_, err = io.Copy(part1, logo)
   203  	assert.Nil(t, err)
   204  	assert.Nil(t, writer.Close())
   205  
   206  	request, err := http.NewRequest(http.MethodPost, "/", payload)
   207  	assert.Nil(t, err)
   208  	request.Header.Set("Content-Type", writer.FormDataContentType())
   209  
   210  	return request
   211  }