@@ -2,21 +2,24 @@ package stackerr
22
33import (
44 "bytes"
5+ "errors"
6+ "io"
57 "log"
8+ "net/http"
69 "os"
710 "testing"
811
912 "github.com/stretchr/testify/assert"
1013)
1114
1215func f1 () * Err {
13- err := Error ("message" )
16+ err := New ("message" )
1417 return err .Stack ()
1518}
1619
1720func f2 () * Err {
1821 err := f1 ()
19- return err .Stack ( )
22+ return err .StackWithContext ( "context" )
2023}
2124
2225type t1 struct {}
@@ -25,44 +28,50 @@ func (t *t1) f3() *Err {
2528 err := f2 ()
2629 return err .Stack ()
2730}
31+
2832func TestStackTrace (t * testing.T ) {
2933 ts := t1 {}
3034 err := ts .f3 ()
3135
3236 assert .NotNil (t , err )
33- assert .Equal (t , err .Error (), "message" )
34- assert .Equal (t , err . Sprint (),
37+ assert .Equal (t , "message" , err .Error ())
38+ assert .Equal (t ,
3539 `Error Stacktrace:
36- -> github.com/efimovalex/stackerr/goerr_test.go:30 (stackerr.TestStackTrace)
37- -> github.com/efimovalex/stackerr/goerr_test.go:25 (stackerr.(*t1).f3)
38- -> github.com/efimovalex/stackerr/goerr_test.go:18 (stackerr.f2)
39- -> github.com/efimovalex/stackerr/goerr_test.go:13 (stackerr.f1)
40- ` )
40+ -> github.com/efimovalex/stackerr/goerr_test.go:33 (stackerr.TestStackTrace)
41+ -> github.com/efimovalex/stackerr/goerr_test.go:27 (stackerr.(*t1).f3)
42+ -> github.com/efimovalex/stackerr/goerr_test.go:20 (stackerr.f2) context
43+ -> github.com/efimovalex/stackerr/goerr_test.go:15 (stackerr.f1)
44+ ` , err . Sprint () )
4145}
4246
43- func TestError (t * testing.T ) {
44- err := Error ("message" )
47+ func TestNew (t * testing.T ) {
48+ err := New ("message" )
4549
4650 assert .NotNil (t , err )
47- assert .Equal (t , err .Error (), "message" )
48- expected := Err {
49- Message : "message" ,
50- }
51+ assert .Equal (t , "message" , err .Error ())
52+ assert .Equal (t , http .StatusInternalServerError , err .StatusCode )
53+ }
54+
55+ func TestNewFromError (t * testing.T ) {
56+ e := errors .New ("message" )
57+ err := NewFromError (e )
5158
52- assert .Equal (t , err .Error (), expected .Error ())
59+ assert .NotNil (t , err )
60+ assert .Equal (t , "message" , err .Error ())
61+ assert .Equal (t , http .StatusInternalServerError , err .StatusCode )
62+
63+ errErr := NewFromError (err )
64+ assert .NotNil (t , errErr )
65+ assert .Equal (t , "message" , errErr .Error ())
66+ assert .Equal (t , http .StatusInternalServerError , errErr .StatusCode )
5367}
54- func TestErrorWS (t * testing.T ) {
55- err := ErrorWS ("message" , 200 )
68+
69+ func TestNewWithStatusCode (t * testing.T ) {
70+ err := NewWithStatusCode ("message" , http .StatusOK )
5671
5772 assert .NotNil (t , err )
58- assert .Equal (t , err .Error (), "message" )
59- expected := Err {
60- Message : "message" ,
61- StatusCode : 200 ,
62- }
63-
64- assert .Equal (t , err .Error (), expected .Error ())
65- assert .Equal (t , err .StatusCode , expected .StatusCode )
73+ assert .Equal (t , "message" , err .Error ())
74+ assert .Equal (t , http .StatusOK , err .StatusCode )
6675}
6776func TestLog (t * testing.T ) {
6877 var buf bytes.Buffer
@@ -72,8 +81,45 @@ func TestLog(t *testing.T) {
7281 log .SetOutput (os .Stderr )
7382 assert .Contains (t , buf .String (),
7483 `Error Stacktrace:
75- -> github.com/efimovalex/stackerr/goerr_test.go:70 (stackerr.TestLog)
76- -> github.com/efimovalex/stackerr/goerr_test.go:18 (stackerr.f2)
77- -> github.com/efimovalex/stackerr/goerr_test.go:13 (stackerr.f1)
84+ -> github.com/efimovalex/stackerr/goerr_test.go:79 (stackerr.TestLog)
85+ -> github.com/efimovalex/stackerr/goerr_test.go:20 (stackerr.f2) context
86+ -> github.com/efimovalex/stackerr/goerr_test.go:15 (stackerr.f1)
87+ ` )
88+ }
89+
90+ func TestIsNotFound (t * testing.T ) {
91+ err := NewWithStatusCode ("message" , http .StatusOK )
92+
93+ assert .False (t , err .IsNotFound ())
94+
95+ errNotFound := NewWithStatusCode ("message" , http .StatusNotFound )
96+
97+ assert .True (t , errNotFound .IsNotFound ())
98+ }
99+
100+ func TestPrint (t * testing.T ) {
101+ old := os .Stdout // keep backup of the real stdout
102+ r , w , _ := os .Pipe ()
103+ os .Stdout = w
104+
105+ outC := make (chan string )
106+ // copy the output in a separate goroutine so printing can't block indefinitely
107+ go func () {
108+ var buf bytes.Buffer
109+ io .Copy (& buf , r )
110+ outC <- buf .String ()
111+ }()
112+ err := f2 ()
113+ err .Print ()
114+
115+ w .Close ()
116+ os .Stdout = old // restoring the real stdout
117+ out := <- outC
118+
119+ assert .Equal (t , out ,
120+ `Error Stacktrace:
121+ -> github.com/efimovalex/stackerr/goerr_test.go:112 (stackerr.TestPrint)
122+ -> github.com/efimovalex/stackerr/goerr_test.go:21 (stackerr.f2) context
123+ -> github.com/efimovalex/stackerr/goerr_test.go:16 (stackerr.f1)
78124` )
79125}
0 commit comments