stretchr/objx

View on GitHub
conversions_test.go

Summary

Maintainability
A
0 mins
Test Coverage
package objx_test

import (
    "net/url"
    "testing"

    "github.com/stretchr/objx"
    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/require"
)

func TestConversionJSON(t *testing.T) {
    jsonString := `{"name":"Mat"}`
    o := objx.MustFromJSON(jsonString)

    result, err := o.JSON()

    require.NoError(t, err)
    assert.Equal(t, jsonString, result)
    assert.Equal(t, jsonString, o.MustJSON())

    i := objx.Map{
        "a": map[interface{}]interface{}{"b": objx.Map{"c": map[interface{}]interface{}{"d": "e"}},
            "f": []objx.Map{{"g": map[interface{}]interface{}{"h": "i"}}},
            "j": []map[string]interface{}{{"k": map[interface{}]interface{}{"l": "m"}}},
            "n": []interface{}{objx.Map{"o": "p"}},
        },
    }

    jsonString = `{"a":{"b":{"c":{"d":"e"}},"f":[{"g":{"h":"i"}}],"j":[{"k":{"l":"m"}}],"n":[{"o":"p"}]}}`
    result, err = i.JSON()
    require.NoError(t, err)
    assert.Equal(t, jsonString, result)
    assert.Equal(t, jsonString, i.MustJSON())
}

func TestConversionJSONWithError(t *testing.T) {
    o := objx.MSI()
    o["test"] = func() {}

    assert.Panics(t, func() {
        o.MustJSON()
    })

    _, err := o.JSON()

    assert.Error(t, err)
}

func TestConversionBase64(t *testing.T) {
    o := objx.Map{"name": "Mat"}

    result, err := o.Base64()

    require.NoError(t, err)
    assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", result)
    assert.Equal(t, "eyJuYW1lIjoiTWF0In0=", o.MustBase64())
}

func TestConversionBase64WithError(t *testing.T) {
    o := objx.MSI()
    o["test"] = func() {}

    assert.Panics(t, func() {
        o.MustBase64()
    })

    _, err := o.Base64()

    assert.Error(t, err)
}

func TestConversionSignedBase64(t *testing.T) {
    o := objx.Map{"name": "Mat"}

    result, err := o.SignedBase64("key")

    require.NoError(t, err)
    assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", result)
    assert.Equal(t, "eyJuYW1lIjoiTWF0In0=_67ee82916f90b2c0d68c903266e8998c9ef0c3d6", o.MustSignedBase64("key"))
}

func TestConversionSignedBase64WithError(t *testing.T) {
    o := objx.MSI()
    o["test"] = func() {}

    assert.Panics(t, func() {
        o.MustSignedBase64("key")
    })

    _, err := o.SignedBase64("key")

    assert.Error(t, err)
}

func TestConversionURLValues(t *testing.T) {
    m := getURLQueryMap()
    u := m.URLValues()

    assert.Equal(t, url.Values{
        "abc":                []string{"123"},
        "name":               []string{"Mat"},
        "data[age]":          []string{"30"},
        "data[height]":       []string{"162"},
        "data[arr][]":        []string{"1", "2"},
        "stats[]":            []string{"1", "2"},
        "bools[]":            []string{"true", "false"},
        "mapSlice[][age]":    []string{"40"},
        "mapSlice[][height]": []string{"152"},
        "msiData[age]":       []string{"30"},
        "msiData[height]":    []string{"162"},
        "msiData[arr][]":     []string{"1", "2"},
        "msiSlice[][age]":    []string{"40"},
        "msiSlice[][height]": []string{"152"},
    }, u)
}

func TestConversionURLQuery(t *testing.T) {
    m := getURLQueryMap()
    u, err := m.URLQuery()

    assert.Nil(t, err)
    require.NotNil(t, u)

    ue, err := url.QueryUnescape(u)
    assert.Nil(t, err)
    require.NotNil(t, ue)

    assert.Equal(t, "abc=123&bools[]=true&bools[]=false&data[age]=30&data[arr][]=1&data[arr][]=2&data[height]=162&mapSlice[][age]=40&mapSlice[][height]=152&msiData[age]=30&msiData[arr][]=1&msiData[arr][]=2&msiData[height]=162&msiSlice[][age]=40&msiSlice[][height]=152&name=Mat&stats[]=1&stats[]=2", ue)
}

func TestConversionURLQueryNoSliceKeySuffix(t *testing.T) {
    m := getURLQueryMap()
    err := objx.SetURLValuesSliceKeySuffix(objx.URLValuesSliceKeySuffixEmpty)
    require.Nil(t, err)
    u, err := m.URLQuery()

    assert.Nil(t, err)
    require.NotNil(t, u)

    ue, err := url.QueryUnescape(u)
    assert.Nil(t, err)
    require.NotNil(t, ue)

    assert.Equal(t, "abc=123&bools=true&bools=false&data[age]=30&data[arr]=1&data[arr]=2&data[height]=162&mapSlice[age]=40&mapSlice[height]=152&msiData[age]=30&msiData[arr]=1&msiData[arr]=2&msiData[height]=162&msiSlice[age]=40&msiSlice[height]=152&name=Mat&stats=1&stats=2", ue)
}

func TestConversionURLQueryIndexSliceKeySuffix(t *testing.T) {
    m := getURLQueryMap()
    m.Set("mapSlice", []objx.Map{{"age": 40, "sex": "male"}, {"height": 152}})
    err := objx.SetURLValuesSliceKeySuffix(objx.URLValuesSliceKeySuffixIndex)
    require.Nil(t, err)
    u, err := m.URLQuery()

    assert.Nil(t, err)
    require.NotNil(t, u)

    ue, err := url.QueryUnescape(u)
    assert.Nil(t, err)
    require.NotNil(t, ue)

    assert.Equal(t, "abc=123&bools[0]=true&bools[1]=false&data[age]=30&data[arr][0]=1&data[arr][1]=2&data[height]=162&mapSlice[0][age]=40&mapSlice[0][sex]=male&mapSlice[1][height]=152&msiData[age]=30&msiData[arr][0]=1&msiData[arr][1]=2&msiData[height]=162&msiSlice[0][age]=40&msiSlice[1][height]=152&name=Mat&stats[0]=1&stats[1]=2", ue)
}

func TestValidityURLQuerySliceKeySuffix(t *testing.T) {
    err := objx.SetURLValuesSliceKeySuffix("")
    assert.Nil(t, err)
    err = objx.SetURLValuesSliceKeySuffix("[]")
    assert.Nil(t, err)
    err = objx.SetURLValuesSliceKeySuffix("[i]")
    assert.Nil(t, err)
    err = objx.SetURLValuesSliceKeySuffix("{}")
    assert.Error(t, err)
}

func getURLQueryMap() objx.Map {
    return objx.Map{
        "abc":      123,
        "name":     "Mat",
        "data":     objx.Map{"age": 30, "height": 162, "arr": []int{1, 2}},
        "mapSlice": []objx.Map{{"age": 40}, {"height": 152}},
        "msiData":  map[string]interface{}{"age": 30, "height": 162, "arr": []int{1, 2}},
        "msiSlice": []map[string]interface{}{{"age": 40}, {"height": 152}},
        "stats":    []string{"1", "2"},
        "bools":    []bool{true, false},
    }
}