@@ -5,8 +5,10 @@ package task
55
66import (
77 "errors"
8+ "strings"
89 "testing"
910
11+ "github.com/larksuite/cli/errs"
1012 "github.com/larksuite/cli/internal/output"
1113 "github.com/spf13/cobra"
1214
@@ -19,33 +21,25 @@ func TestBuildTaskCreateBody_StructuredErrors(t *testing.T) {
1921 data string
2022 summary string
2123 due string
22- wantCode int
23- wantType string
2424 wantSubstr string
2525 }{
2626 {
27- name : "invalid JSON data returns ErrValidation " ,
27+ name : "invalid JSON data returns validation error " ,
2828 data : "not-json" ,
2929 summary : "test" ,
30- wantCode : output .ExitValidation ,
31- wantType : "validation" ,
3230 wantSubstr : "--data must be a valid JSON object" ,
3331 },
3432 {
35- name : "missing summary returns ErrValidation " ,
33+ name : "missing summary returns validation error " ,
3634 data : "" ,
3735 summary : "" ,
38- wantCode : output .ExitValidation ,
39- wantType : "validation" ,
4036 wantSubstr : "task summary is required" ,
4137 },
4238 {
43- name : "invalid due time returns ErrValidation " ,
39+ name : "invalid due time returns validation error " ,
4440 data : "" ,
4541 summary : "test task" ,
4642 due : "not-a-valid-time" ,
47- wantCode : output .ExitValidation ,
48- wantType : "validation" ,
4943 wantSubstr : "failed to parse due time" ,
5044 },
5145 }
@@ -68,18 +62,22 @@ func TestBuildTaskCreateBody_StructuredErrors(t *testing.T) {
6862 t .Fatal ("expected error, got nil" )
6963 }
7064
71- var exitErr * output. ExitError
72- if ! errors .As (err , & exitErr ) {
73- t .Fatalf ("error type = %T, want *output.ExitError ; error = %v" , err , err )
65+ var ve * errs. ValidationError
66+ if ! errors .As (err , & ve ) {
67+ t .Fatalf ("error type = %T, want *errs.ValidationError ; error = %v" , err , err )
7468 }
75- if exitErr .Code != tt .wantCode {
76- t .Errorf ("exit code = %d, want %d" , exitErr .Code , tt .wantCode )
69+ p , ok := errs .ProblemOf (err )
70+ if ! ok {
71+ t .Fatalf ("ProblemOf(%T) returned !ok" , err )
7772 }
78- if exitErr . Detail == nil {
79- t .Fatal ( "expected non-nil error detail" )
73+ if p . Subtype != errs . SubtypeInvalidArgument {
74+ t .Errorf ( "subtype = %q, want %q" , p . Subtype , errs . SubtypeInvalidArgument )
8075 }
81- if exitErr .Detail .Type != tt .wantType {
82- t .Errorf ("error type = %q, want %q" , exitErr .Detail .Type , tt .wantType )
76+ if got := output .ExitCodeOf (err ); got != output .ExitValidation {
77+ t .Errorf ("exit code = %d, want %d" , got , output .ExitValidation )
78+ }
79+ if ! strings .Contains (err .Error (), tt .wantSubstr ) {
80+ t .Errorf ("message = %q, want substring %q" , err .Error (), tt .wantSubstr )
8381 }
8482 })
8583 }
@@ -91,35 +89,27 @@ func TestBuildTaskUpdateBody_StructuredErrors(t *testing.T) {
9189 data string
9290 summary string
9391 due string
94- wantCode int
95- wantType string
9692 wantSubstr string
9793 }{
9894 {
99- name : "invalid JSON data returns ErrValidation " ,
95+ name : "invalid JSON data returns validation error " ,
10096 data : "not-json" ,
10197 summary : "" ,
10298 due : "" ,
103- wantCode : output .ExitValidation ,
104- wantType : "validation" ,
10599 wantSubstr : "--data must be a valid JSON object" ,
106100 },
107101 {
108- name : "no fields to update returns ErrValidation " ,
102+ name : "no fields to update returns validation error " ,
109103 data : "" ,
110104 summary : "" ,
111105 due : "" ,
112- wantCode : output .ExitValidation ,
113- wantType : "validation" ,
114106 wantSubstr : "no fields to update" ,
115107 },
116108 {
117- name : "invalid due time returns ErrValidation " ,
109+ name : "invalid due time returns validation error " ,
118110 data : "" ,
119111 summary : "" ,
120112 due : "not-a-valid-time" ,
121- wantCode : output .ExitValidation ,
122- wantType : "validation" ,
123113 wantSubstr : "failed to parse due time" ,
124114 },
125115 }
@@ -138,18 +128,22 @@ func TestBuildTaskUpdateBody_StructuredErrors(t *testing.T) {
138128 t .Fatal ("expected error, got nil" )
139129 }
140130
141- var exitErr * output.ExitError
142- if ! errors .As (err , & exitErr ) {
143- t .Fatalf ("error type = %T, want *output.ExitError; error = %v" , err , err )
131+ var ve * errs.ValidationError
132+ if ! errors .As (err , & ve ) {
133+ t .Fatalf ("error type = %T, want *errs.ValidationError; error = %v" , err , err )
134+ }
135+ p , ok := errs .ProblemOf (err )
136+ if ! ok {
137+ t .Fatalf ("ProblemOf(%T) returned !ok" , err )
144138 }
145- if exitErr . Code != tt . wantCode {
146- t .Errorf ("exit code = %d , want %d " , exitErr . Code , tt . wantCode )
139+ if p . Subtype != errs . SubtypeInvalidArgument {
140+ t .Errorf ("subtype = %q , want %q " , p . Subtype , errs . SubtypeInvalidArgument )
147141 }
148- if exitErr . Detail == nil {
149- t .Fatal ( "expected non-nil error detail" )
142+ if got := output . ExitCodeOf ( err ); got != output . ExitValidation {
143+ t .Errorf ( "exit code = %d, want %d" , got , output . ExitValidation )
150144 }
151- if exitErr . Detail . Type != tt .wantType {
152- t .Errorf ("error type = %q, want %q" , exitErr . Detail . Type , tt .wantType )
145+ if ! strings . Contains ( err . Error (), tt .wantSubstr ) {
146+ t .Errorf ("message = %q, want substring %q" , err . Error () , tt .wantSubstr )
153147 }
154148 })
155149 }
0 commit comments