github.com/blend/go-sdk@v1.20240719.1/ex/multi_test.go (about) 1 /* 2 3 Copyright (c) 2024 - Present. Blend Labs, Inc. All rights reserved 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file. 5 6 */ 7 8 package ex 9 10 import ( 11 "errors" 12 "fmt" 13 "strings" 14 "testing" 15 16 "github.com/blend/go-sdk/assert" 17 ) 18 19 func TestMultiAppend(t *testing.T) { 20 it := assert.New(t) 21 22 ex0 := New(New("hi0")) 23 ex1 := New(fmt.Errorf("hi1")) 24 ex2 := New("hi2") 25 26 m := Append(ex0, ex1, ex2) 27 28 it.True(strings.HasPrefix(m.Error(), `3 errors occurred:`), m.Error()) 29 30 it.Equal([]error{ex0, ex1, ex2}, m.(Multi)) 31 32 m = nil 33 m = Append(m, ex0) 34 m = Append(m, ex1) 35 m = Append(m, ex2) 36 37 it.True(strings.HasPrefix(m.Error(), `3 errors occurred:`), m.Error()) 38 39 it.Equal([]error{ex0, ex1, ex2}, m.(Multi)) 40 } 41 42 func TestMultiUnwrap(t *testing.T) { 43 it := assert.New(t) 44 m := Multi{New("hi0"), New("hi1"), New("hi2")} 45 it.Equal(m, m.Unwrap()) 46 } 47 48 func TestMultiIsCompatibility(t *testing.T) { 49 it := assert.New(t) 50 m1 := Multi{New("hi0"), New("hi1"), New("hi2")} 51 m2 := Multi{New("hi0"), New("hi1"), New("hi2")} 52 53 it.True(errors.Is(m1, New("hi1"))) 54 it.False(errors.Is(m1, New("hi3"))) 55 it.False(errors.Is(m1, append(m2, New("hi3")))) 56 it.False(errors.Is(Multi(append(m1, New("hi3"))), m2)) 57 58 // Multi to Multi comparisons always return false (Golang can't do slice comparison) 59 it.False(errors.Is(m1, m1)) 60 it.False(errors.Is(m1, m2)) 61 } 62 63 func TestMultiError(t *testing.T) { 64 it := assert.New(t) 65 66 err := Multi{ 67 New("hi0"), 68 Multi{ 69 New("hi1.0"), 70 }, 71 Multi{ 72 New("hi2.0"), 73 New("hi2.1").WithMessagef("message2.1"), 74 New("hi2.3").WithInner(Multi{ 75 New("hi2.3.0"), 76 errors.New("hi2.3.1"), 77 }), 78 Multi{ 79 New("hi2.4.0"), 80 errors.New("hi2.4.1"), 81 }, 82 }, 83 errors.New("hi3"), 84 } 85 86 fullError := strings.Join([]string{ 87 "8 errors occurred:", 88 "\t* hi0", 89 "\t* 1 error occurred:", 90 "\t\t\t* hi1.0", 91 "\t* 5 errors occurred:", 92 "\t\t\t* hi2.0", 93 "\t\t\t* hi2.1", 94 "\t\t\t* hi2.3", 95 "\t\t\t* 2 errors occurred:", 96 "\t\t\t\t\t* hi2.4.0", 97 "\t\t\t\t\t* hi2.4.1", 98 "\t* hi3", 99 }, "\n") 100 101 // Default error format 102 it.Equal(fullError, err.Error()) 103 104 // With length and depth limits 105 formatted, total := err.errorString(2, 1, 0) 106 it.Equal(strings.Join([]string{ 107 "8 errors occurred:", 108 "\t* hi0", 109 "\t* 1 error occurred:", 110 "\t\t\t... depth limit reached ...", 111 "\t... and 6 more", 112 }, "\n"), formatted) 113 it.Equal(8, total) 114 115 // Length and depth limits don't consider Multi errors wrapped in other kinds 116 // of errors. 117 wrapped := Multi{ 118 New(err), 119 } 120 formatted, total = wrapped.errorString(2, 1, 0) 121 it.Equal(fmt.Sprintf("1 error occurred:\n\t* %s", indent("\t\t", fullError)), formatted) 122 it.Equal(1, total) 123 124 // Unlimited cases 125 it.Equal(fullError, err.FullError()) 126 formatted, total = err.errorString(-1, -1, 0) 127 it.Equal(fullError, formatted) 128 it.Equal(8, total) 129 formatted, total = err.errorString(5555, 9999, 0) 130 it.Equal(fullError, formatted) 131 it.Equal(8, total) 132 133 // Edge cases for the limits 134 formatted, total = err.errorString(-1, 0, 0) 135 it.Equal("8 errors occurred:\n\t... depth limit reached ...", formatted) 136 it.Equal(8, total) 137 formatted, total = err.errorString(0, -1, 0) 138 it.Equal("8 errors occurred:\n\t... and 8 more", formatted) 139 it.Equal(8, total) 140 141 // Empty Multi 142 it.Equal("", Multi{}.Error()) 143 }