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  }