goyave.dev/goyave/v4@v4.4.11/validation/numeric_test.go (about)

     1  package validation
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestValidateNumeric(t *testing.T) {
    10  	assert.True(t, validateNumeric(newTestContext("field", 1, []string{}, map[string]interface{}{"field": 1})))
    11  	assert.True(t, validateNumeric(newTestContext("field", 1.2, []string{}, map[string]interface{}{"field": 1.2})))
    12  	assert.True(t, validateNumeric(newTestContext("field", uint(1), []string{}, map[string]interface{}{"field": uint(1)})))
    13  	assert.True(t, validateNumeric(newTestContext("field", uint8(1), []string{}, map[string]interface{}{"field": uint8(1)})))
    14  	assert.True(t, validateNumeric(newTestContext("field", uint16(1), []string{}, map[string]interface{}{"field": uint16(1)})))
    15  	assert.True(t, validateNumeric(newTestContext("field", float32(1.3), []string{}, map[string]interface{}{"field": float32(1.3)})))
    16  	assert.True(t, validateNumeric(newTestContext("field", "2", []string{}, map[string]interface{}{"field": "2"})))
    17  	assert.True(t, validateNumeric(newTestContext("field", "1.2", []string{}, map[string]interface{}{"field": "1.2"})))
    18  	assert.True(t, validateNumeric(newTestContext("field", "-1", []string{}, map[string]interface{}{"field": "-1"})))
    19  	assert.True(t, validateNumeric(newTestContext("field", "-1.3", []string{}, map[string]interface{}{"field": "1.3"})))
    20  	assert.False(t, validateNumeric(newTestContext("field", uintptr(1), []string{}, map[string]interface{}{"field": uintptr(1)})))
    21  	assert.False(t, validateNumeric(newTestContext("field", []string{}, []string{}, map[string]interface{}{"field": []string{}})))
    22  	assert.False(t, validateNumeric(newTestContext("field", map[string]string{}, []string{}, map[string]interface{}{"field": map[string]string{}})))
    23  	assert.False(t, validateNumeric(newTestContext("field", "test", []string{}, map[string]interface{}{"field": "test"})))
    24  }
    25  
    26  func TestValidateNumericConvertString(t *testing.T) {
    27  	form1 := map[string]interface{}{"field": "1.2"}
    28  	ctx1 := newTestContext("field", form1["field"], []string{}, form1)
    29  	validateNumeric(ctx1)
    30  	assert.Equal(t, 1.2, ctx1.Value)
    31  
    32  	form2 := map[string]interface{}{"field": "-1.3"}
    33  	ctx2 := newTestContext("field", form2["field"], []string{}, form2)
    34  	validateNumeric(ctx2)
    35  	assert.Equal(t, -1.3, ctx2.Value)
    36  
    37  	form3 := map[string]interface{}{"field": "2"}
    38  	ctx3 := newTestContext("field", form3["field"], []string{}, form3)
    39  	validateNumeric(ctx3)
    40  	assert.Equal(t, float64(2), ctx3.Value)
    41  }
    42  
    43  func TestValidateNumericConvertInObject(t *testing.T) {
    44  	data := map[string]interface{}{
    45  		"object": map[string]interface{}{
    46  			"numeric": "1",
    47  		},
    48  	}
    49  
    50  	set := RuleSet{
    51  		"object":         List{"required", "object"},
    52  		"object.numeric": List{"required", "numeric"},
    53  	}
    54  
    55  	errors := Validate(data, set, true, "en-US")
    56  	assert.Empty(t, errors)
    57  	_, ok := data["object"].(map[string]interface{})["numeric"].(float64)
    58  	assert.True(t, ok)
    59  }
    60  
    61  func TestValidateInteger(t *testing.T) {
    62  	assert.True(t, validateInteger(newTestContext("field", 1, []string{}, map[string]interface{}{"field": 1})))
    63  	assert.True(t, validateInteger(newTestContext("field", float64(2), []string{}, map[string]interface{}{"field": float64(2)})))
    64  	assert.True(t, validateInteger(newTestContext("field", float32(3), []string{}, map[string]interface{}{"field": float32(3)})))
    65  	assert.True(t, validateInteger(newTestContext("field", uint(1), []string{}, map[string]interface{}{"field": uint(1)})))
    66  	assert.True(t, validateInteger(newTestContext("field", uint8(1), []string{}, map[string]interface{}{"field": uint8(1)})))
    67  	assert.True(t, validateInteger(newTestContext("field", uint16(1), []string{}, map[string]interface{}{"field": uint16(1)})))
    68  	assert.True(t, validateInteger(newTestContext("field", "2", []string{}, map[string]interface{}{"field": "2"})))
    69  	assert.True(t, validateInteger(newTestContext("field", "-1", []string{}, map[string]interface{}{"field": "-1"})))
    70  	assert.False(t, validateInteger(newTestContext("field", 2.2, []string{}, map[string]interface{}{"field": 2.2})))
    71  	assert.False(t, validateInteger(newTestContext("field", float32(3.2), []string{}, map[string]interface{}{"field": float32(3.2)})))
    72  	assert.False(t, validateInteger(newTestContext("field", "1.2", []string{}, map[string]interface{}{"field": "1.2"})))
    73  	assert.False(t, validateInteger(newTestContext("field", "-1.3", []string{}, map[string]interface{}{"field": "1.3"})))
    74  	assert.False(t, validateInteger(newTestContext("field", uintptr(1), []string{}, map[string]interface{}{"field": uintptr(1)})))
    75  	assert.False(t, validateInteger(newTestContext("field", []string{}, []string{}, map[string]interface{}{"field": []string{}})))
    76  	assert.False(t, validateInteger(newTestContext("field", map[string]string{}, []string{}, map[string]interface{}{"field": map[string]string{}})))
    77  	assert.False(t, validateInteger(newTestContext("field", "test", []string{}, map[string]interface{}{"field": "test"})))
    78  }
    79  
    80  func TestValidateIntegerConvert(t *testing.T) {
    81  	form1 := map[string]interface{}{"field": "1"}
    82  	ctx1 := newTestContext("field", form1["field"], []string{}, form1)
    83  	validateInteger(ctx1)
    84  	assert.Equal(t, 1, ctx1.Value)
    85  
    86  	form2 := map[string]interface{}{"field": "-2"}
    87  	ctx2 := newTestContext("field", form2["field"], []string{}, form2)
    88  	validateInteger(ctx2)
    89  	assert.Equal(t, -2, ctx2.Value)
    90  
    91  	form3 := map[string]interface{}{"field": float64(3)}
    92  	ctx3 := newTestContext("field", form3["field"], []string{}, form3)
    93  	validateInteger(ctx3)
    94  	assert.Equal(t, 3, ctx3.Value)
    95  }
    96  
    97  func TestValidateIntegerConvertInObject(t *testing.T) {
    98  	data := map[string]interface{}{
    99  		"object": map[string]interface{}{
   100  			"integer": "1",
   101  		},
   102  	}
   103  
   104  	set := RuleSet{
   105  		"object":         List{"required", "object"},
   106  		"object.integer": List{"required", "integer"},
   107  	}
   108  
   109  	errors := Validate(data, set, true, "en-US")
   110  	assert.Empty(t, errors)
   111  	_, ok := data["object"].(map[string]interface{})["integer"].(int)
   112  	assert.True(t, ok)
   113  }