...

Source file src/github.com/go-kivik/kivik/v4/couchdb/json_test.go

Documentation: github.com/go-kivik/kivik/v4/couchdb

     1  // Licensed under the Apache License, Version 2.0 (the "License"); you may not
     2  // use this file except in compliance with the License. You may obtain a copy of
     3  // the License at
     4  //
     5  //  http://www.apache.org/licenses/LICENSE-2.0
     6  //
     7  // Unless required by applicable law or agreed to in writing, software
     8  // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     9  // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    10  // License for the specific language governing permissions and limitations under
    11  // the License.
    12  
    13  package couchdb
    14  
    15  import (
    16  	"encoding/json"
    17  	"net/http"
    18  	"testing"
    19  
    20  	"gitlab.com/flimzy/testy"
    21  
    22  	internal "github.com/go-kivik/kivik/v4/int/errors"
    23  )
    24  
    25  func TestEncodeKey(t *testing.T) {
    26  	type tst struct {
    27  		input    interface{}
    28  		expected string
    29  		status   int
    30  		err      string
    31  	}
    32  	tests := testy.NewTable()
    33  	tests.Add("string", tst{
    34  		input:    "foo",
    35  		expected: `"foo"`,
    36  	})
    37  	tests.Add("chan", tst{
    38  		input:  make(chan int),
    39  		status: http.StatusBadRequest,
    40  		err:    "json: unsupported type: chan int",
    41  	})
    42  	tests.Add("[]byte", tst{
    43  		input:    []byte("foo"),
    44  		expected: `"Zm9v"`,
    45  	})
    46  	tests.Add("json.RawMessage", tst{
    47  		input:    json.RawMessage(`"foo"`),
    48  		expected: `"foo"`,
    49  	})
    50  
    51  	tests.Run(t, func(t *testing.T, test tst) {
    52  		result, err := encodeKey(test.input)
    53  		if d := internal.StatusErrorDiff(test.err, test.status, err); d != "" {
    54  			t.Error(d)
    55  		}
    56  		if d := testy.DiffJSON([]byte(test.expected), []byte(result)); d != nil {
    57  			t.Error(d)
    58  		}
    59  	})
    60  }
    61  
    62  func TestEncodeKeys(t *testing.T) {
    63  	type tst struct {
    64  		input    map[string]interface{}
    65  		expected map[string]interface{}
    66  		status   int
    67  		err      string
    68  	}
    69  	type keyStruct struct {
    70  		Foo string
    71  		Bar interface{} `json:",omitempty"`
    72  	}
    73  	tests := testy.NewTable()
    74  	tests.Add("nil", tst{
    75  		input:    nil,
    76  		expected: nil,
    77  	})
    78  	tests.Add("unmarshalable", tst{
    79  		input: map[string]interface{}{
    80  			"key": make(chan int),
    81  		},
    82  		status: http.StatusBadRequest,
    83  		err:    "json: unsupported type: chan int",
    84  	})
    85  	tests.Add("unaltered", tst{
    86  		input: map[string]interface{}{
    87  			"foo": 123,
    88  		},
    89  		expected: map[string]interface{}{
    90  			"foo": 123,
    91  		},
    92  	})
    93  	tests.Add("key", tst{
    94  		input: map[string]interface{}{
    95  			"key": 123,
    96  		},
    97  		expected: map[string]interface{}{
    98  			"key": "123",
    99  		},
   100  	})
   101  	tests.Add("keys []interface{}", tst{
   102  		input: map[string]interface{}{
   103  			"foo":  123,
   104  			"keys": []interface{}{"foo", 123},
   105  		},
   106  		expected: map[string]interface{}{
   107  			"foo":  123,
   108  			"keys": `["foo",123]`,
   109  		},
   110  	})
   111  	tests.Add("keys []interface{} invalid", tst{
   112  		input: map[string]interface{}{
   113  			"foo":  123,
   114  			"keys": []interface{}{"foo", 123, make(chan int)},
   115  		},
   116  		status: http.StatusBadRequest,
   117  		err:    "json: unsupported type: chan int",
   118  	})
   119  	tests.Add("keys string", tst{
   120  		input: map[string]interface{}{
   121  			"foo":  123,
   122  			"keys": []string{"foo", "123"},
   123  		},
   124  		expected: map[string]interface{}{
   125  			"foo":  123,
   126  			"keys": `["foo","123"]`,
   127  		},
   128  	})
   129  	tests.Add("keys structs", tst{
   130  		input: map[string]interface{}{
   131  			"keys": []keyStruct{
   132  				{Foo: "abc"},
   133  				{Foo: "xyz"},
   134  			},
   135  		},
   136  		expected: map[string]interface{}{
   137  			"keys": `[{"Foo":"abc"},{"Foo":"xyz"}]`,
   138  		},
   139  	})
   140  	tests.Add("keys structs invalid", tst{
   141  		input: map[string]interface{}{
   142  			"keys": []keyStruct{
   143  				{Foo: "abc", Bar: make(chan int)},
   144  				{Foo: "xyz"},
   145  			},
   146  		},
   147  		status: http.StatusBadRequest,
   148  		err:    "json: unsupported type: chan int",
   149  	})
   150  
   151  	tests.Run(t, func(t *testing.T, test tst) {
   152  		err := encodeKeys(test.input)
   153  		if d := internal.StatusErrorDiff(test.err, test.status, err); d != "" {
   154  			t.Error(d)
   155  		}
   156  		if err != nil {
   157  			return
   158  		}
   159  		if d := testy.DiffInterface(test.expected, test.input); d != nil {
   160  			t.Error(d)
   161  		}
   162  	})
   163  }
   164  

View as plain text