github.com/haya14busa/reviewdog@v0.0.0-20180723114510-ffb00ef78fd3/doghouse/server/cookieman/cookieman_test.go (about)

     1  package cookieman
     2  
     3  import (
     4  	"encoding/base64"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"testing"
    10  	"time"
    11  )
    12  
    13  type fakeCipher struct {
    14  	Cipher
    15  	fakeEncrypt func(plaintext []byte) ([]byte, error)
    16  	fakeDecrypt func(ciphertext []byte) ([]byte, error)
    17  }
    18  
    19  func (f *fakeCipher) Encrypt(plaintext []byte) ([]byte, error) {
    20  	if f.fakeEncrypt != nil {
    21  		return f.fakeEncrypt(plaintext)
    22  	}
    23  	return plaintext, nil
    24  }
    25  
    26  func (f *fakeCipher) Decrypt(ciphertext []byte) ([]byte, error) {
    27  	if f.fakeDecrypt != nil {
    28  		return f.fakeDecrypt(ciphertext)
    29  	}
    30  	return ciphertext, nil
    31  }
    32  
    33  func GetRequestWithCookie(w *httptest.ResponseRecorder) *http.Request {
    34  	response := w.Result()
    35  	req, _ := http.NewRequest("", "", nil)
    36  	for _, c := range response.Cookies() {
    37  		req.AddCookie(c)
    38  	}
    39  	return req
    40  }
    41  
    42  func TestCookieStore_Set_Get(t *testing.T) {
    43  	opt := CookieOption{}
    44  	cookieman := New(&fakeCipher{}, opt)
    45  	name := "vim"
    46  	value := "vim vim vim"
    47  	w := httptest.NewRecorder()
    48  
    49  	vimStore := cookieman.NewCookieStore(name, nil)
    50  
    51  	if vimStore.Name() != name {
    52  		t.Errorf("CookieStore.Name() = %q, want %q", vimStore.Name(), name)
    53  	}
    54  
    55  	if err := vimStore.Set(w, []byte(value)); err != nil {
    56  		t.Error(err)
    57  	}
    58  
    59  	response := w.Result()
    60  	gotSetCookie := response.Header.Get("Set-Cookie")
    61  	wantSetCookie := fmt.Sprintf("%s=%s", name, base64.URLEncoding.EncodeToString([]byte(value)))
    62  	if gotSetCookie != wantSetCookie {
    63  		t.Errorf("CookieStore.Get: Set-Cookie value: got %q, want %q", gotSetCookie, wantSetCookie)
    64  	}
    65  
    66  	req := GetRequestWithCookie(w)
    67  	b, err := vimStore.Get(req)
    68  	if err != nil {
    69  		t.Fatal(err)
    70  	}
    71  
    72  	if got := string(b); got != value {
    73  		t.Errorf("CookieStore.Get: got %q, want %q", got, value)
    74  	}
    75  }
    76  
    77  func TestCookieStore_Set_encrypt_failure(t *testing.T) {
    78  	cipher := &fakeCipher{
    79  		fakeEncrypt: func(plaintext []byte) ([]byte, error) {
    80  			return nil, errors.New("test encrypt failure")
    81  		},
    82  	}
    83  
    84  	opt := CookieOption{}
    85  	cookieman := New(cipher, opt)
    86  	w := httptest.NewRecorder()
    87  	store := cookieman.NewCookieStore("n", nil)
    88  	if err := store.Set(w, []byte("v")); err == nil {
    89  		t.Error("got nil, but want error")
    90  	}
    91  }
    92  
    93  func TestCookieStore_Get_decrypt_failure(t *testing.T) {
    94  	cipher := &fakeCipher{
    95  		fakeDecrypt: func(ciphertext []byte) ([]byte, error) {
    96  			return nil, errors.New("test decrypt failure")
    97  		},
    98  	}
    99  
   100  	opt := CookieOption{}
   101  	cookieman := New(cipher, opt)
   102  	w := httptest.NewRecorder()
   103  	store := cookieman.NewCookieStore("n", nil)
   104  	if err := store.Set(w, []byte("v")); err != nil {
   105  		t.Error(err)
   106  	}
   107  
   108  	req := GetRequestWithCookie(w)
   109  	if _, err := store.Get(req); err == nil {
   110  		t.Error("got nil, but want error")
   111  	}
   112  }
   113  
   114  func TestCookieStore_Get_decode_base64_error(t *testing.T) {
   115  	cipher := &fakeCipher{}
   116  	opt := CookieOption{}
   117  	cookieman := New(cipher, opt)
   118  	w := httptest.NewRecorder()
   119  	store := cookieman.NewCookieStore("n", nil)
   120  
   121  	http.SetCookie(w, &http.Cookie{
   122  		Name:  "n",
   123  		Value: "zzz: non base64 encoding",
   124  	})
   125  
   126  	req := GetRequestWithCookie(w)
   127  	if _, err := store.Get(req); err == nil {
   128  		t.Error("got nil, but want error")
   129  	}
   130  }
   131  
   132  func TestCookieStore_Get_not_found(t *testing.T) {
   133  	cipher := &fakeCipher{}
   134  	opt := CookieOption{}
   135  	cookieman := New(cipher, opt)
   136  	store := cookieman.NewCookieStore("n", nil)
   137  	req, _ := http.NewRequest("", "", nil)
   138  	if _, err := store.Get(req); err == nil {
   139  		t.Error("got nil, but want error")
   140  	}
   141  }
   142  
   143  func TestCookieStore_Clear(t *testing.T) {
   144  	opt := CookieOption{}
   145  	cookieman := New(&fakeCipher{}, opt)
   146  	name := "vim"
   147  	w := httptest.NewRecorder()
   148  
   149  	vimStore := cookieman.NewCookieStore(name, nil)
   150  	vimStore.Clear(w)
   151  
   152  	if cookieLen := len(w.Result().Cookies()); cookieLen != 1 {
   153  		t.Fatalf("got %d cookies, want 1 cookie", cookieLen)
   154  	}
   155  	cookie := w.Result().Cookies()[0]
   156  
   157  	if cookie.Name != name {
   158  		t.Errorf("Cookie.Name = %q, want %q", cookie.Name, name)
   159  	}
   160  	if cookie.MaxAge != -1 {
   161  		t.Errorf("Cookie.MaxAge = %d, want -1", cookie.MaxAge)
   162  	}
   163  }
   164  
   165  func TestCookieOption(t *testing.T) {
   166  	defaultOpt := CookieOption{
   167  		http.Cookie{
   168  			Secure: false,
   169  			MaxAge: 30,
   170  		},
   171  	}
   172  	cookieman := New(&fakeCipher{}, defaultOpt)
   173  
   174  	w := httptest.NewRecorder()
   175  	opt := &CookieOption{
   176  		http.Cookie{
   177  			Domain:   "domain",
   178  			Expires:  time.Now(),
   179  			HttpOnly: true,
   180  			MaxAge:   14,
   181  			Path:     "/",
   182  			Secure:   true,
   183  		},
   184  	}
   185  	if err := cookieman.Set(w, "n", []byte(""), opt); err != nil {
   186  		t.Fatal(err)
   187  	}
   188  
   189  	if cookieLen := len(w.Result().Cookies()); cookieLen != 1 {
   190  		t.Fatalf("got %d cookies, want 1 cookie", cookieLen)
   191  	}
   192  	cookie := w.Result().Cookies()[0]
   193  
   194  	if cookie.Domain != opt.Domain {
   195  		t.Errorf("Cookie.Domain = %q, want %q", cookie.Domain, opt.Domain)
   196  	}
   197  	if cookie.Expires.Second() != opt.Expires.Second() {
   198  		t.Errorf("Cookie.Expires = %q, want %q", cookie.Expires, opt.Expires)
   199  	}
   200  	if cookie.HttpOnly != opt.HttpOnly {
   201  		t.Errorf("Cookie.HttpOnly = %v, want %v", cookie.HttpOnly, opt.HttpOnly)
   202  	}
   203  	if cookie.MaxAge != opt.MaxAge {
   204  		t.Errorf("Cookie.MaxAge = %v, want %v", cookie.MaxAge, opt.MaxAge)
   205  	}
   206  	if cookie.Path != opt.Path {
   207  		t.Errorf("Cookie.Path = %q, want %q", cookie.Path, opt.Path)
   208  	}
   209  	if cookie.Secure != opt.Secure {
   210  		t.Errorf("Cookie.Secure = %v, want %v", cookie.Secure, opt.Secure)
   211  	}
   212  }