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  }