|  | package gophercloud | 
|  |  | 
|  | import ( | 
|  | "net/url" | 
|  | "reflect" | 
|  | "testing" | 
|  | "time" | 
|  |  | 
|  | th "github.com/rackspace/gophercloud/testhelper" | 
|  | ) | 
|  |  | 
|  | func TestMaybeString(t *testing.T) { | 
|  | testString := "" | 
|  | var expected *string | 
|  | actual := MaybeString(testString) | 
|  | th.CheckDeepEquals(t, expected, actual) | 
|  |  | 
|  | testString = "carol" | 
|  | expected = &testString | 
|  | actual = MaybeString(testString) | 
|  | th.CheckDeepEquals(t, expected, actual) | 
|  | } | 
|  |  | 
|  | func TestMaybeInt(t *testing.T) { | 
|  | testInt := 0 | 
|  | var expected *int | 
|  | actual := MaybeInt(testInt) | 
|  | th.CheckDeepEquals(t, expected, actual) | 
|  |  | 
|  | testInt = 4 | 
|  | expected = &testInt | 
|  | actual = MaybeInt(testInt) | 
|  | th.CheckDeepEquals(t, expected, actual) | 
|  | } | 
|  |  | 
|  | func TestBuildQueryString(t *testing.T) { | 
|  | opts := struct { | 
|  | J int    `q:"j"` | 
|  | R string `q:"r,required"` | 
|  | C bool   `q:"c"` | 
|  | }{ | 
|  | J: 2, | 
|  | R: "red", | 
|  | C: true, | 
|  | } | 
|  | expected := &url.URL{RawQuery: "j=2&r=red&c=true"} | 
|  | actual, err := BuildQueryString(&opts) | 
|  | if err != nil { | 
|  | t.Errorf("Error building query string: %v", err) | 
|  | } | 
|  | th.CheckDeepEquals(t, expected, actual) | 
|  |  | 
|  | opts = struct { | 
|  | J int    `q:"j"` | 
|  | R string `q:"r,required"` | 
|  | C bool   `q:"c"` | 
|  | }{ | 
|  | J: 2, | 
|  | C: true, | 
|  | } | 
|  | _, err = BuildQueryString(&opts) | 
|  | if err == nil { | 
|  | t.Errorf("Expected error: 'Required field not set'") | 
|  | } | 
|  | th.CheckDeepEquals(t, expected, actual) | 
|  |  | 
|  | _, err = BuildQueryString(map[string]interface{}{"Number": 4}) | 
|  | if err == nil { | 
|  | t.Errorf("Expected error: 'Options type is not a struct'") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestBuildHeaders(t *testing.T) { | 
|  | testStruct := struct { | 
|  | Accept string `h:"Accept"` | 
|  | Num    int    `h:"Number,required"` | 
|  | Style  bool   `h:"Style"` | 
|  | }{ | 
|  | Accept: "application/json", | 
|  | Num:    4, | 
|  | Style:  true, | 
|  | } | 
|  | expected := map[string]string{"Accept": "application/json", "Number": "4", "Style": "true"} | 
|  | actual, err := BuildHeaders(&testStruct) | 
|  | th.CheckNoErr(t, err) | 
|  | th.CheckDeepEquals(t, expected, actual) | 
|  |  | 
|  | testStruct.Num = 0 | 
|  | _, err = BuildHeaders(&testStruct) | 
|  | if err == nil { | 
|  | t.Errorf("Expected error: 'Required header not set'") | 
|  | } | 
|  |  | 
|  | _, err = BuildHeaders(map[string]interface{}{"Number": 4}) | 
|  | if err == nil { | 
|  | t.Errorf("Expected error: 'Options type is not a struct'") | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestIsZero(t *testing.T) { | 
|  | var testMap map[string]interface{} | 
|  | testMapValue := reflect.ValueOf(testMap) | 
|  | expected := true | 
|  | actual := isZero(testMapValue) | 
|  | th.CheckEquals(t, expected, actual) | 
|  | testMap = map[string]interface{}{"empty": false} | 
|  | testMapValue = reflect.ValueOf(testMap) | 
|  | expected = false | 
|  | actual = isZero(testMapValue) | 
|  | th.CheckEquals(t, expected, actual) | 
|  |  | 
|  | var testArray [2]string | 
|  | testArrayValue := reflect.ValueOf(testArray) | 
|  | expected = true | 
|  | actual = isZero(testArrayValue) | 
|  | th.CheckEquals(t, expected, actual) | 
|  | testArray = [2]string{"one", "two"} | 
|  | testArrayValue = reflect.ValueOf(testArray) | 
|  | expected = false | 
|  | actual = isZero(testArrayValue) | 
|  | th.CheckEquals(t, expected, actual) | 
|  |  | 
|  | var testStruct struct { | 
|  | A string | 
|  | B time.Time | 
|  | } | 
|  | testStructValue := reflect.ValueOf(testStruct) | 
|  | expected = true | 
|  | actual = isZero(testStructValue) | 
|  | th.CheckEquals(t, expected, actual) | 
|  | testStruct = struct { | 
|  | A string | 
|  | B time.Time | 
|  | }{ | 
|  | B: time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC), | 
|  | } | 
|  | testStructValue = reflect.ValueOf(testStruct) | 
|  | expected = false | 
|  | actual = isZero(testStructValue) | 
|  | th.CheckEquals(t, expected, actual) | 
|  |  | 
|  | } |