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 }