github.com/avenga/couper@v1.12.2/handler/file_test.go (about)

     1  package handler
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"os"
     7  	"path"
     8  	"testing"
     9  
    10  	"github.com/avenga/couper/config"
    11  	"github.com/avenga/couper/config/runtime/server"
    12  	"github.com/avenga/couper/errors"
    13  )
    14  
    15  func TestFile_ServeHTTP(t *testing.T) {
    16  	type fields struct {
    17  		basePath   string
    18  		errFile    string
    19  		docRootDir string
    20  	}
    21  
    22  	wd, err := os.Getwd()
    23  	if err != nil {
    24  		t.Error(err)
    25  	}
    26  
    27  	tests := []struct {
    28  		name         string
    29  		fields       fields
    30  		req          *http.Request
    31  		expectedCode int
    32  	}{
    33  		{"not found", fields{}, httptest.NewRequest(http.MethodGet, "http://domain.test/", nil), http.StatusNotFound},
    34  		{"index.html", fields{docRootDir: "testdata/file"}, httptest.NewRequest(http.MethodGet, "http://domain.test/", nil), http.StatusOK},
    35  		{"serve file", fields{docRootDir: "testdata/file"}, httptest.NewRequest(http.MethodGet, "http://domain.test/favicon.ico", nil), http.StatusOK},
    36  		{"not found within root dir", fields{docRootDir: "testdata/file"}, httptest.NewRequest(http.MethodGet, "http://domain.test/.git", nil), http.StatusNotFound},
    37  		{"serve file /w basePath", fields{docRootDir: "testdata/file", basePath: "/base"}, httptest.NewRequest(http.MethodGet, "http://domain.test/base/favicon.ico", nil), http.StatusOK},
    38  		{"not found within root dir /w basePath", fields{docRootDir: "testdata/file", basePath: "/base"}, httptest.NewRequest(http.MethodGet, "http://domain.test/base/.git", nil), http.StatusNotFound},
    39  		{"not found /w errorFile", fields{errFile: "testdata/file_err_doc.html"}, httptest.NewRequest(http.MethodGet, "http://domain.test/", nil), http.StatusNotFound},
    40  		{"not found /w errorFile HEAD", fields{errFile: "testdata/file_err_doc.html"}, httptest.NewRequest(http.MethodHead, "http://domain.test/", nil), http.StatusNotFound},
    41  	}
    42  
    43  	srvOpts, _ := server.NewServerOptions(&config.Server{}, nil)
    44  
    45  	for _, tt := range tests {
    46  		t.Run(tt.name, func(subT *testing.T) {
    47  			f, err := NewFile(path.Join(wd, tt.fields.docRootDir), tt.fields.basePath, func(s string) bool {
    48  				return false
    49  			}, errors.DefaultHTML, srvOpts, nil)
    50  			if err != nil {
    51  				subT.Fatal(err)
    52  			}
    53  
    54  			rec := httptest.NewRecorder()
    55  			f.ServeHTTP(rec, tt.req)
    56  
    57  			if !rec.Flushed {
    58  				rec.Flush()
    59  			}
    60  
    61  			if rec.Code != tt.expectedCode {
    62  				subT.Errorf("Expected status %d, got: %d", tt.expectedCode, rec.Code)
    63  			}
    64  		})
    65  	}
    66  }