github.com/astaxie/beego@v1.12.3/context/param/parsers_test.go (about)

     1  package param
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  type testDefinition struct {
    10  	strValue       string
    11  	expectedValue  interface{}
    12  	expectedParser paramParser
    13  }
    14  
    15  func Test_Parsers(t *testing.T) {
    16  
    17  	//ints
    18  	checkParser(testDefinition{"1", 1, intParser{}}, t)
    19  	checkParser(testDefinition{"-1", int64(-1), intParser{}}, t)
    20  	checkParser(testDefinition{"1", uint64(1), intParser{}}, t)
    21  
    22  	//floats
    23  	checkParser(testDefinition{"1.0", float32(1.0), floatParser{}}, t)
    24  	checkParser(testDefinition{"-1.0", float64(-1.0), floatParser{}}, t)
    25  
    26  	//strings
    27  	checkParser(testDefinition{"AB", "AB", stringParser{}}, t)
    28  	checkParser(testDefinition{"AB", []byte{65, 66}, stringParser{}}, t)
    29  
    30  	//bools
    31  	checkParser(testDefinition{"true", true, boolParser{}}, t)
    32  	checkParser(testDefinition{"0", false, boolParser{}}, t)
    33  
    34  	//timeParser
    35  	checkParser(testDefinition{"2017-05-30T13:54:53Z", time.Date(2017, 5, 30, 13, 54, 53, 0, time.UTC), timeParser{}}, t)
    36  	checkParser(testDefinition{"2017-05-30", time.Date(2017, 5, 30, 0, 0, 0, 0, time.UTC), timeParser{}}, t)
    37  
    38  	//json
    39  	checkParser(testDefinition{`{"X": 5, "Y":"Z"}`, struct {
    40  		X int
    41  		Y string
    42  	}{5, "Z"}, jsonParser{}}, t)
    43  
    44  	//slice in query is parsed as comma delimited
    45  	checkParser(testDefinition{`1,2`, []int{1, 2}, sliceParser(intParser{})}, t)
    46  
    47  	//slice in body is parsed as json
    48  	checkParser(testDefinition{`["a","b"]`, []string{"a", "b"}, jsonParser{}}, t, MethodParam{in: body})
    49  
    50  	//pointers
    51  	var someInt = 1
    52  	checkParser(testDefinition{`1`, &someInt, ptrParser(intParser{})}, t)
    53  
    54  	var someStruct = struct{ X int }{5}
    55  	checkParser(testDefinition{`{"X": 5}`, &someStruct, jsonParser{}}, t)
    56  
    57  }
    58  
    59  func checkParser(def testDefinition, t *testing.T, methodParam ...MethodParam) {
    60  	toType := reflect.TypeOf(def.expectedValue)
    61  	var mp MethodParam
    62  	if len(methodParam) == 0 {
    63  		mp = MethodParam{}
    64  	} else {
    65  		mp = methodParam[0]
    66  	}
    67  	parser := getParser(&mp, toType)
    68  
    69  	if reflect.TypeOf(parser) != reflect.TypeOf(def.expectedParser) {
    70  		t.Errorf("Invalid parser for value %v. Expected: %v, actual: %v", def.strValue, reflect.TypeOf(def.expectedParser).Name(), reflect.TypeOf(parser).Name())
    71  		return
    72  	}
    73  	result, err := parser.parse(def.strValue, toType)
    74  	if err != nil {
    75  		t.Errorf("Parsing error for value %v. Expected result: %v, error: %v", def.strValue, def.expectedValue, err)
    76  		return
    77  	}
    78  	convResult, err := safeConvert(reflect.ValueOf(result), toType)
    79  	if err != nil {
    80  		t.Errorf("Conversion error for %v. from value: %v, toType: %v, error: %v", def.strValue, result, toType, err)
    81  		return
    82  	}
    83  	if !reflect.DeepEqual(convResult.Interface(), def.expectedValue) {
    84  		t.Errorf("Parsing error for value %v. Expected result: %v, actual: %v", def.strValue, def.expectedValue, result)
    85  	}
    86  }