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  }