@@ -23,8 +23,9 @@ type doneHttpMsg struct {
2323}
2424
2525type startHttpMsg struct {
26- url string
27- method string
26+ url string
27+ method string
28+ responseVariables []api.ResponseVariable
2829}
2930
3031type resolveHttpMsg struct {
@@ -33,11 +34,12 @@ type resolveHttpMsg struct {
3334 results * checks.HttpTestResult
3435}
3536type httpReqModel struct {
36- request string
37- passed * bool
38- results * checks.HttpTestResult
39- finished bool
40- tests []testModel
37+ responseVariables []api.ResponseVariable
38+ request string
39+ passed * bool
40+ results * checks.HttpTestResult
41+ finished bool
42+ tests []testModel
4143}
4244
4345type httpRootModel struct {
@@ -78,7 +80,11 @@ func (m httpRootModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
7880 return m , tea .Quit
7981
8082 case startHttpMsg :
81- m .reqs = append (m .reqs , httpReqModel {request : fmt .Sprintf ("%s %s" , msg .method , msg .url ), tests : []testModel {}})
83+ m .reqs = append (m .reqs , httpReqModel {
84+ request : fmt .Sprintf ("%s %s" , msg .method , msg .url ),
85+ tests : []testModel {},
86+ responseVariables : msg .responseVariables ,
87+ })
8288 return m , nil
8389
8490 case resolveHttpMsg :
@@ -115,6 +121,7 @@ func (m httpRootModel) View() string {
115121 for _ , req := range m .reqs {
116122 str += renderTestHeader (req .request , m .spinner , req .finished , m .isSubmit , req .passed )
117123 str += renderTests (req .tests , s )
124+ str += renderTestResponseVars (req .responseVariables )
118125 if req .results != nil && m .finalized {
119126 str += printHTTPResult (* req .results )
120127 }
@@ -129,37 +136,63 @@ func (m httpRootModel) View() string {
129136}
130137
131138func printHTTPResult (result checks.HttpTestResult ) string {
132- str := ""
133139 if result .Err != "" {
134- str += fmt .Sprintf (" Err: %v\n " , result .Err )
135- } else {
136- if len (result .RequestHeaders ) > 0 {
137- str += " Request Headers: \n "
138- for k , v := range result .RequestHeaders {
139- str += fmt .Sprintf (" - %v: %v\n " , k , v [0 ])
140+ return fmt .Sprintf (" Err: %v\n \n " , result .Err )
141+ }
142+
143+ str := ""
144+
145+ str += fmt .Sprintf (" Response Status Code: %v\n " , result .StatusCode )
146+
147+ filteredHeaders := make (map [string ]string )
148+ for respK , respV := range result .ResponseHeaders {
149+ for reqK := range result .Request .Request .Headers {
150+ if strings .ToLower (respK ) == strings .ToLower (reqK ) {
151+ filteredHeaders [respK ] = respV
140152 }
141153 }
142- str += fmt .Sprintf (" Response Status Code: %v\n " , result .StatusCode )
143- str += " Response Body: \n "
144- unmarshalled := map [string ]interface {}{}
145- bytes := []byte (result .BodyString )
154+ }
155+
156+ if len (filteredHeaders ) > 0 {
157+ str += " Response Headers: \n "
158+ for k , v := range filteredHeaders {
159+ str += fmt .Sprintf (" - %v: %v\n " , k , v )
160+ }
161+ }
146162
147- contentType := http .DetectContentType (bytes )
148- if contentType == "application/json" || strings .HasPrefix (contentType , "text/" ) {
149- err := json .Unmarshal ([]byte (result .BodyString ), & unmarshalled )
163+ str += " Response Body: \n "
164+ bytes := []byte (result .BodyString )
165+ contentType := http .DetectContentType (bytes )
166+ if contentType == "application/json" || strings .HasPrefix (contentType , "text/" ) {
167+ var unmarshalled interface {}
168+ err := json .Unmarshal ([]byte (result .BodyString ), & unmarshalled )
169+ if err == nil {
170+ pretty , err := json .MarshalIndent (unmarshalled , "" , " " )
150171 if err == nil {
151- pretty , err := json .MarshalIndent (unmarshalled , "" , " " )
152- if err == nil {
153- str += string (pretty )
154- }
172+ str += string (pretty )
155173 } else {
156174 str += result .BodyString
157175 }
158176 } else {
159- str += fmt .Sprintf ("Binary %s file" , contentType )
177+ str += result .BodyString
178+ }
179+ } else {
180+ str += fmt .Sprintf ("Binary %s file" , contentType )
181+ }
182+ str += "\n "
183+
184+ if len (result .Variables ) > 0 {
185+ str += " Variables available: \n "
186+ for k , v := range result .Variables {
187+ if v != "" {
188+ str += fmt .Sprintf (" - %v: %v\n " , k , v )
189+ } else {
190+ str += fmt .Sprintf (" - %v: [not found]\n " , k )
191+ }
160192 }
161193 }
162194 str += "\n "
195+
163196 return str
164197}
165198
@@ -215,11 +248,14 @@ func httpRenderer(
215248 url = req .Request .FullURL
216249 }
217250 ch <- startHttpMsg {
218- url : checks .InterpolateVariables (url , results [i ].Variables ),
219- method : req .Request .Method ,
251+ url : checks .InterpolateVariables (url , results [i ].Variables ),
252+ method : req .Request .Method ,
253+ responseVariables : req .ResponseVariables ,
220254 }
221255 for _ , test := range req .Tests {
222- ch <- startTestMsg {text : prettyPrintHTTPTest (test , results [i ].Variables )}
256+ ch <- startTestMsg {
257+ text : prettyPrintHTTPTest (test , results [i ].Variables ),
258+ }
223259 }
224260 time .Sleep (500 * time .Millisecond )
225261 for j := range req .Tests {
@@ -267,7 +303,7 @@ func prettyPrintHTTPTest(test api.HTTPTest, variables map[string]string) string
267303 if test .HeadersContain != nil {
268304 interpolatedKey := checks .InterpolateVariables (test .HeadersContain .Key , variables )
269305 interpolatedValue := checks .InterpolateVariables (test .HeadersContain .Value , variables )
270- return fmt .Sprintf ("Expecting header to contain: '%s: %v'" , interpolatedKey , interpolatedValue )
306+ return fmt .Sprintf ("Expecting headers to contain: '%s: %v'" , interpolatedKey , interpolatedValue )
271307 }
272308 if test .JSONValue != nil {
273309 var val any
0 commit comments