github.com/raphaelreyna/ez-cgi@v0.7.3/pkg/cgi/handler_test.go (about) 1 package cgi 2 3 import ( 4 "bytes" 5 "crypto/subtle" 6 "io" 7 "io/ioutil" 8 "net/http" 9 "net/http/httptest" 10 "os" 11 "testing" 12 ) 13 14 func TestHandler(t *testing.T) { 15 type test struct { 16 Name string 17 Script string 18 ExpectedStatus int 19 ExpectedHeader http.Header 20 ExpectedBody string 21 Input string 22 OutputHandler OutputHandler 23 } 24 25 tt := []test{ 26 test{ 27 Name: "Default headers default handler", 28 Script: "./noheaders.sh", 29 ExpectedStatus: http.StatusInternalServerError, 30 OutputHandler: DefaultOutputHandler, 31 }, 32 test{ 33 Name: "Default headers", 34 Script: "./noheaders.sh", 35 ExpectedStatus: http.StatusOK, 36 ExpectedHeader: http.Header{ 37 "Content-Type": []string{"text/plain"}, 38 }, 39 ExpectedBody: "./expected_body", 40 OutputHandler: EZOutputHandlerReplacer, 41 }, 42 test{ 43 Name: "Replace Headers", 44 Script: "./headers.sh", 45 ExpectedStatus: http.StatusOK, 46 ExpectedHeader: http.Header{ 47 "Content-Type": []string{"text/html"}, 48 "Test-Header": []string{"PASS"}, 49 }, 50 ExpectedBody: "./expected_body", 51 OutputHandler: EZOutputHandlerReplacer, 52 }, 53 test{ 54 Name: "Headers with no blank line", 55 Script: "./headers_noblank.sh", 56 ExpectedStatus: http.StatusOK, 57 ExpectedHeader: http.Header{ 58 "Content-Type": []string{"text/html"}, 59 "Test-Header": []string{"PASS"}, 60 }, 61 ExpectedBody: "./expected_body", 62 OutputHandler: EZOutputHandlerReplacer, 63 }, 64 test{ 65 Name: "Non-empty request body", 66 Script: "./requestbody.sh", 67 ExpectedStatus: http.StatusOK, 68 ExpectedBody: "./expected_body", 69 Input: "./expected_body", 70 OutputHandler: EZOutputHandlerReplacer, 71 }, 72 } 73 74 err := os.Chdir("../../test-assets") 75 if err != nil { 76 t.Fatalf("error while moving into test-assets directory: %s", err) 77 } 78 79 for _, tc := range tt { 80 t.Run(tc.Name, func(t *testing.T) { 81 h := &Handler{ 82 Path: tc.Script, 83 Dir: ".", 84 OutputHandler: tc.OutputHandler, 85 } 86 87 var body io.Reader 88 if tc.Input != "" { 89 inputBytes, err := ioutil.ReadFile(tc.Input) 90 if err != nil { 91 t.Fatalf("error while opening input file: %s", err) 92 } 93 body = bytes.NewReader(inputBytes) 94 } 95 96 r := httptest.NewRequest("GET", "/", body) 97 w := httptest.NewRecorder() 98 99 h.ServeHTTP(w, r) 100 101 result := w.Result() 102 103 if result.StatusCode != tc.ExpectedStatus { 104 t.Fatalf("wrong status - expected: %d\treceived: %d", tc.ExpectedStatus, result.StatusCode) 105 } 106 107 if tc.ExpectedStatus != http.StatusOK { 108 return 109 } 110 111 for k, _ := range tc.ExpectedHeader { 112 received := result.Header.Get(k) 113 expected := tc.ExpectedHeader.Get(k) 114 if received != expected { 115 t.Fatalf("wrong header: %s - expected: %s\treceived: %s", 116 k, expected, received) 117 } 118 } 119 120 expectedBytes, err := ioutil.ReadFile(tc.ExpectedBody) 121 if err != nil { 122 t.Fatalf("error while opening expected body file: %s", err) 123 } 124 receivedBytes, err := ioutil.ReadAll(result.Body) 125 if err != nil { 126 t.Fatalf("error while opening expected body file: %s", err) 127 } 128 129 bodyDiffs := subtle.ConstantTimeCompare(expectedBytes, receivedBytes) 130 if bodyDiffs != 1 { 131 t.Fatalf("wrong body - expected: %v\treceived: %v", expectedBytes, receivedBytes) 132 } 133 }) 134 } 135 }