github.com/diamondo25/ghz@v0.12.0/data_test.go (about)

     1  package ghz
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/bojand/ghz/protodesc"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func TestData_isArrayData(t *testing.T) {
    12  	t.Run("false when nil", func(t *testing.T) {
    13  		res := isArrayData(nil)
    14  		assert.False(t, res)
    15  	})
    16  
    17  	t.Run("false when a string", func(t *testing.T) {
    18  		res := isArrayData("asdf")
    19  		assert.False(t, res)
    20  	})
    21  
    22  	t.Run("false when a number", func(t *testing.T) {
    23  		res := isArrayData(5)
    24  		assert.False(t, res)
    25  	})
    26  
    27  	t.Run("false when an empty map", func(t *testing.T) {
    28  		m := make(map[string]interface{})
    29  		res := isArrayData(m)
    30  		assert.False(t, res)
    31  	})
    32  
    33  	t.Run("false when a map", func(t *testing.T) {
    34  		m := make(map[string]interface{})
    35  		m["name"] = "bob"
    36  		res := isArrayData(m)
    37  		assert.False(t, res)
    38  	})
    39  
    40  	t.Run("false when an empty slice", func(t *testing.T) {
    41  		res := isArrayData([]string{})
    42  		assert.False(t, res)
    43  	})
    44  
    45  	t.Run("false when a slice of strings", func(t *testing.T) {
    46  		res := isArrayData([]string{"foo", "bar"})
    47  		assert.False(t, res)
    48  	})
    49  
    50  	t.Run("false when a slice of maps as we require slice of ifaces which are maps", func(t *testing.T) {
    51  		m1 := make(map[string]interface{})
    52  		m1["name"] = "bob"
    53  		m1["foo"] = "far"
    54  
    55  		m2 := make(map[string]interface{})
    56  		m2["foo"] = 1
    57  		m2["bar"] = 2
    58  
    59  		s := []map[string]interface{}{m1, m2}
    60  		res := isArrayData(s)
    61  		assert.False(t, res)
    62  	})
    63  
    64  	t.Run("true when a slice of correct maps as interfaces", func(t *testing.T) {
    65  		m1 := make(map[string]interface{})
    66  		m1["name"] = "bob"
    67  		m1["foo"] = "far"
    68  
    69  		m2 := make(map[string]interface{})
    70  		m2["foo"] = 1
    71  		m2["bar"] = 2
    72  
    73  		s := []interface{}{m1, m2}
    74  		res := isArrayData(s)
    75  		assert.True(t, res)
    76  	})
    77  
    78  	t.Run("false when a slice of containing incorrect element", func(t *testing.T) {
    79  		m1 := make(map[string]interface{})
    80  		m1["name"] = "bob"
    81  		m1["foo"] = "far"
    82  
    83  		m2 := make(map[string]interface{})
    84  		m2["foo"] = 1
    85  		m2["bar"] = 2
    86  
    87  		s := []interface{}{m1, m2, "some string"}
    88  		res := isArrayData(s)
    89  		assert.False(t, res)
    90  	})
    91  
    92  	t.Run("false when a slice of containing incorrect map element", func(t *testing.T) {
    93  		m1 := make(map[string]interface{})
    94  		m1["name"] = "bob"
    95  		m1["foo"] = "far"
    96  
    97  		m2 := make(map[string]interface{})
    98  		m2["foo"] = 1
    99  		m2["bar"] = 2
   100  
   101  		m3 := make(map[int]interface{})
   102  		m3[5] = "foo"
   103  		m3[7] = "bar"
   104  
   105  		s := []interface{}{m1, m2, m3}
   106  		res := isArrayData(s)
   107  		assert.False(t, res)
   108  	})
   109  }
   110  
   111  func TestData_isMapData(t *testing.T) {
   112  	t.Run("false when nil", func(t *testing.T) {
   113  		res := isMapData(nil)
   114  		assert.False(t, res)
   115  	})
   116  
   117  	t.Run("false when a string", func(t *testing.T) {
   118  		res := isMapData("asdf")
   119  		assert.False(t, res)
   120  	})
   121  
   122  	t.Run("false when a number", func(t *testing.T) {
   123  		res := isMapData(5)
   124  		assert.False(t, res)
   125  	})
   126  
   127  	t.Run("false when a map of invalid keys", func(t *testing.T) {
   128  		m := make(map[int]interface{})
   129  		res := isMapData(m)
   130  		assert.False(t, res)
   131  	})
   132  
   133  	t.Run("true when a valid map", func(t *testing.T) {
   134  		m := make(map[string]interface{})
   135  		m["name"] = "bob"
   136  		res := isMapData(m)
   137  		assert.True(t, res)
   138  	})
   139  
   140  	t.Run("true when a valid empty map", func(t *testing.T) {
   141  		m := make(map[string]interface{})
   142  		res := isMapData(m)
   143  		assert.True(t, res)
   144  	})
   145  
   146  	t.Run("false when a slice of valid maps", func(t *testing.T) {
   147  		m1 := make(map[string]interface{})
   148  		m1["name"] = "bob"
   149  		m1["foo"] = "far"
   150  
   151  		m2 := make(map[string]interface{})
   152  		m2["foo"] = 1
   153  		m2["bar"] = 2
   154  
   155  		s := []map[string]interface{}{m1, m2}
   156  		res := isMapData(s)
   157  		assert.False(t, res)
   158  	})
   159  }
   160  
   161  func TestData_createPayloads(t *testing.T) {
   162  	mtdUnary, err := protodesc.GetMethodDescFromProto(
   163  		"helloworld.Greeter.SayHello",
   164  		"./testdata/greeter.proto",
   165  		nil)
   166  
   167  	assert.NoError(t, err)
   168  	assert.NotNil(t, mtdUnary)
   169  
   170  	mtdClientStreaming, err := protodesc.GetMethodDescFromProto(
   171  		"helloworld.Greeter.SayHelloCS",
   172  		"./testdata/greeter.proto",
   173  		nil)
   174  
   175  	assert.NoError(t, err)
   176  	assert.NotNil(t, mtdClientStreaming)
   177  
   178  	mtdTestUnary, err := protodesc.GetMethodDescFromProto(
   179  		"data.DataTestService.TestCall",
   180  		"./testdata/data.proto",
   181  		nil)
   182  
   183  	assert.NoError(t, err)
   184  	assert.NotNil(t, mtdTestUnary)
   185  
   186  	mtdTestUnaryTwo, err := protodesc.GetMethodDescFromProto(
   187  		"data.DataTestService.TestCallTwo",
   188  		"./testdata/data.proto",
   189  		nil)
   190  
   191  	assert.NoError(t, err)
   192  	assert.NotNil(t, mtdTestUnaryTwo)
   193  
   194  	t.Run("fail when nil", func(t *testing.T) {
   195  		single, streaming, err := createPayloads(nil, mtdUnary)
   196  		assert.Error(t, err)
   197  		assert.Nil(t, single)
   198  		assert.Nil(t, streaming)
   199  	})
   200  
   201  	t.Run("fail for invalid data shape", func(t *testing.T) {
   202  		m1 := make(map[string]interface{})
   203  		m1["name"] = "bob"
   204  		m1["unknown"] = "field"
   205  
   206  		single, streaming, err := createPayloads(m1, mtdUnary)
   207  		assert.Error(t, err)
   208  		assert.Nil(t, single)
   209  		assert.Nil(t, streaming)
   210  	})
   211  
   212  	t.Run("create single object from map for unary", func(t *testing.T) {
   213  		m1 := make(map[string]interface{})
   214  		m1["name"] = "bob"
   215  
   216  		single, streaming, err := createPayloads(m1, mtdUnary)
   217  		assert.NoError(t, err)
   218  		assert.NotNil(t, single)
   219  		assert.Empty(t, streaming)
   220  	})
   221  
   222  	t.Run("create array from map for client streaming", func(t *testing.T) {
   223  		m1 := make(map[string]interface{})
   224  		m1["name"] = "bob"
   225  
   226  		single, streaming, err := createPayloads(m1, mtdClientStreaming)
   227  		assert.NoError(t, err)
   228  		assert.Nil(t, single)
   229  		assert.NotNil(t, streaming)
   230  		assert.Len(t, *streaming, 1)
   231  	})
   232  
   233  	t.Run("create slice of messages from slice for client streaming", func(t *testing.T) {
   234  		m1 := make(map[string]interface{})
   235  		m1["name"] = "bob"
   236  
   237  		m2 := make(map[string]interface{})
   238  		m2["name"] = "kate"
   239  
   240  		s := []interface{}{m1, m2}
   241  
   242  		single, streaming, err := createPayloads(s, mtdClientStreaming)
   243  		assert.NoError(t, err)
   244  		assert.Nil(t, single)
   245  		assert.NotNil(t, streaming)
   246  		assert.Len(t, *streaming, 2)
   247  	})
   248  
   249  	t.Run("fail on invalid shape of data in slice for client streaming", func(t *testing.T) {
   250  		m1 := make(map[string]interface{})
   251  		m1["name"] = "bob"
   252  
   253  		m2 := make(map[string]interface{})
   254  		m2["name"] = "kate"
   255  
   256  		m3 := make(map[string]interface{})
   257  		m3["name"] = "Jim"
   258  		m3["foo"] = "bar"
   259  
   260  		s := []interface{}{m1, m2, m3}
   261  
   262  		single, streaming, err := createPayloads(s, mtdClientStreaming)
   263  		assert.Error(t, err)
   264  		assert.Nil(t, single)
   265  		assert.Nil(t, streaming)
   266  	})
   267  
   268  	t.Run("get object for slice and unary", func(t *testing.T) {
   269  		m1 := make(map[string]interface{})
   270  		m1["name"] = "bob"
   271  
   272  		m2 := make(map[string]interface{})
   273  		m2["name"] = "kate"
   274  
   275  		m3 := make(map[string]interface{})
   276  		m3["name"] = "Jim"
   277  
   278  		s := []interface{}{m1, m2, m3}
   279  
   280  		single, streaming, err := createPayloads(s, mtdUnary)
   281  		assert.NoError(t, err)
   282  		assert.NotNil(t, single)
   283  		assert.Empty(t, streaming)
   284  	})
   285  
   286  	t.Run("create single object from map for unary with camelCase property", func(t *testing.T) {
   287  		m1 := make(map[string]interface{})
   288  		m1["paramOne"] = "bob"
   289  
   290  		single, streaming, err := createPayloads(m1, mtdTestUnary)
   291  		assert.NoError(t, err)
   292  		assert.NotNil(t, single)
   293  		assert.Empty(t, streaming)
   294  	})
   295  
   296  	t.Run("create single object from map for unary with snake_case property", func(t *testing.T) {
   297  		m1 := make(map[string]interface{})
   298  		m1["param_one"] = "bob"
   299  
   300  		single, streaming, err := createPayloads(m1, mtdTestUnary)
   301  		assert.NoError(t, err)
   302  		assert.NotNil(t, single)
   303  		assert.Empty(t, streaming)
   304  	})
   305  
   306  	t.Run("create single object from map for unary with nested camelCase property", func(t *testing.T) {
   307  		inner := make(map[string]interface{})
   308  		inner["paramOne"] = "bob"
   309  
   310  		m1 := make(map[string]interface{})
   311  		m1["nestedProp"] = inner
   312  
   313  		single, streaming, err := createPayloads(m1, mtdTestUnaryTwo)
   314  		assert.NoError(t, err)
   315  		assert.NotNil(t, single)
   316  		assert.Empty(t, streaming)
   317  	})
   318  
   319  	t.Run("create single object from map for unary with nested snake_case property", func(t *testing.T) {
   320  		inner := make(map[string]interface{})
   321  		inner["param_one"] = "bob"
   322  
   323  		m1 := make(map[string]interface{})
   324  		m1["nested_prop"] = inner
   325  
   326  		single, streaming, err := createPayloads(m1, mtdTestUnaryTwo)
   327  		assert.NoError(t, err)
   328  		assert.NotNil(t, single)
   329  		assert.Empty(t, streaming)
   330  	})
   331  }