code.gitea.io/gitea@v1.22.3/modules/httpcache/httpcache_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package httpcache 5 6 import ( 7 "net/http" 8 "net/http/httptest" 9 "strings" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func countFormalHeaders(h http.Header) (c int) { 16 for k := range h { 17 // ignore our headers for internal usage 18 if strings.HasPrefix(k, "X-Gitea-") { 19 continue 20 } 21 c++ 22 } 23 return c 24 } 25 26 func TestHandleGenericETagCache(t *testing.T) { 27 etag := `"test"` 28 29 t.Run("No_If-None-Match", func(t *testing.T) { 30 req := &http.Request{Header: make(http.Header)} 31 w := httptest.NewRecorder() 32 33 handled := HandleGenericETagCache(req, w, etag) 34 35 assert.False(t, handled) 36 assert.Equal(t, 2, countFormalHeaders(w.Header())) 37 assert.Contains(t, w.Header(), "Cache-Control") 38 assert.Contains(t, w.Header(), "Etag") 39 assert.Equal(t, etag, w.Header().Get("Etag")) 40 }) 41 t.Run("Wrong_If-None-Match", func(t *testing.T) { 42 req := &http.Request{Header: make(http.Header)} 43 w := httptest.NewRecorder() 44 45 req.Header.Set("If-None-Match", `"wrong etag"`) 46 47 handled := HandleGenericETagCache(req, w, etag) 48 49 assert.False(t, handled) 50 assert.Equal(t, 2, countFormalHeaders(w.Header())) 51 assert.Contains(t, w.Header(), "Cache-Control") 52 assert.Contains(t, w.Header(), "Etag") 53 assert.Equal(t, etag, w.Header().Get("Etag")) 54 }) 55 t.Run("Correct_If-None-Match", func(t *testing.T) { 56 req := &http.Request{Header: make(http.Header)} 57 w := httptest.NewRecorder() 58 59 req.Header.Set("If-None-Match", etag) 60 61 handled := HandleGenericETagCache(req, w, etag) 62 63 assert.True(t, handled) 64 assert.Equal(t, 1, countFormalHeaders(w.Header())) 65 assert.Contains(t, w.Header(), "Etag") 66 assert.Equal(t, etag, w.Header().Get("Etag")) 67 assert.Equal(t, http.StatusNotModified, w.Code) 68 }) 69 t.Run("Multiple_Wrong_If-None-Match", func(t *testing.T) { 70 req := &http.Request{Header: make(http.Header)} 71 w := httptest.NewRecorder() 72 73 req.Header.Set("If-None-Match", `"wrong etag", "wrong etag "`) 74 75 handled := HandleGenericETagCache(req, w, etag) 76 77 assert.False(t, handled) 78 assert.Equal(t, 2, countFormalHeaders(w.Header())) 79 assert.Contains(t, w.Header(), "Cache-Control") 80 assert.Contains(t, w.Header(), "Etag") 81 assert.Equal(t, etag, w.Header().Get("Etag")) 82 }) 83 t.Run("Multiple_Correct_If-None-Match", func(t *testing.T) { 84 req := &http.Request{Header: make(http.Header)} 85 w := httptest.NewRecorder() 86 87 req.Header.Set("If-None-Match", `"wrong etag", `+etag) 88 89 handled := HandleGenericETagCache(req, w, etag) 90 91 assert.True(t, handled) 92 assert.Equal(t, 1, countFormalHeaders(w.Header())) 93 assert.Contains(t, w.Header(), "Etag") 94 assert.Equal(t, etag, w.Header().Get("Etag")) 95 assert.Equal(t, http.StatusNotModified, w.Code) 96 }) 97 }