@@ -392,6 +392,72 @@ func Test_MustEncodeValue(t *testing.T) {
392392 })
393393}
394394
395+ func Test_MustDecodeValue (t * testing.T ) {
396+ t .Run ("success" , func (t * testing.T ) {
397+ encodedValue , err := payload .Encode ("foo" )
398+ require .NoError (t , err )
399+ decodedValue := MustDecodeValue (encodedValue , enumspb .INDEXED_VALUE_TYPE_KEYWORD )
400+ require .Equal (t , "foo" , decodedValue )
401+ })
402+
403+ t .Run ("success with nil value" , func (t * testing.T ) {
404+ encodedValue , err := payload .Encode (nil )
405+ require .NoError (t , err )
406+ decodedValue := MustDecodeValue (encodedValue , enumspb .INDEXED_VALUE_TYPE_KEYWORD )
407+ require .Nil (t , decodedValue )
408+ })
409+
410+ t .Run ("success with metadata type" , func (t * testing.T ) {
411+ encodedValue , err := payload .Encode (int64 (123 ))
412+ require .NoError (t , err )
413+ encodedValue .Metadata [MetadataType ] = []byte (enumspb .INDEXED_VALUE_TYPE_INT .String ())
414+ decodedValue := MustDecodeValue (encodedValue , enumspb .INDEXED_VALUE_TYPE_UNSPECIFIED )
415+ require .Equal (t , int64 (123 ), decodedValue )
416+ })
417+
418+ t .Run ("panic on unspecified type without metadata" , func (t * testing.T ) {
419+ defer func () {
420+ r := recover ()
421+ require .NotNil (t , r )
422+ err , ok := r .(error )
423+ require .True (t , ok )
424+ require .ErrorIs (t , err , ErrInvalidType )
425+ }()
426+ encodedValue , err := payload .Encode (int64 (123 ))
427+ require .NoError (t , err )
428+ _ = MustDecodeValue (encodedValue , enumspb .INDEXED_VALUE_TYPE_UNSPECIFIED )
429+ require .Fail (t , "MustDecodeValue did not panic with unspecified type" )
430+ })
431+
432+ t .Run ("panic on type mismatch" , func (t * testing.T ) {
433+ defer func () {
434+ r := recover ()
435+ require .NotNil (t , r )
436+ err , ok := r .(error )
437+ require .True (t , ok )
438+ require .ErrorIs (t , err , converter .ErrUnableToDecode )
439+ }()
440+ encodedValue , err := payload .Encode (int64 (123 ))
441+ require .NoError (t , err )
442+ _ = MustDecodeValue (encodedValue , enumspb .INDEXED_VALUE_TYPE_KEYWORD )
443+ require .Fail (t , "MustDecodeValue did not panic with type mismatch" )
444+ })
445+
446+ t .Run ("panic on list not allowed" , func (t * testing.T ) {
447+ defer func () {
448+ r := recover ()
449+ require .NotNil (t , r )
450+ err , ok := r .(error )
451+ require .True (t , ok )
452+ require .ErrorIs (t , err , converter .ErrUnableToDecode )
453+ }()
454+ encodedValue , err := payload .Encode ([]int64 {123 , 456 })
455+ require .NoError (t , err )
456+ _ = MustDecodeValue (encodedValue , enumspb .INDEXED_VALUE_TYPE_INT )
457+ require .Fail (t , "MustDecodeValue did not panic with list of values" )
458+ })
459+ }
460+
395461func Test_ValidateStrings (t * testing.T ) {
396462 _ , err := validateStrings ("anything here" , errors .New ("test error" ))
397463 assert .Error (t , err )
0 commit comments