166 lines
3.9 KiB
Go
166 lines
3.9 KiB
Go
package via
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/andybalholm/brotli"
|
|
"github.com/go-via/via/h"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestCompressionBrotli(t *testing.T) {
|
|
v := New()
|
|
v.Page("/", func(c *Context) {
|
|
c.View(func() h.H {
|
|
return h.Div(h.Text(strings.Repeat("Hello Via! ", 200)))
|
|
})
|
|
})
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set("Accept-Encoding", "br")
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Equal(t, "br", w.Header().Get("Content-Encoding"))
|
|
|
|
reader := brotli.NewReader(w.Body)
|
|
decompressed, err := io.ReadAll(reader)
|
|
assert.NoError(t, err)
|
|
assert.Contains(t, string(decompressed), "Hello Via!")
|
|
}
|
|
|
|
func TestCompressionGzip(t *testing.T) {
|
|
v := New()
|
|
v.Page("/", func(c *Context) {
|
|
c.View(func() h.H {
|
|
return h.Div(h.Text(strings.Repeat("Hello Via! ", 200)))
|
|
})
|
|
})
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set("Accept-Encoding", "gzip")
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Equal(t, "gzip", w.Header().Get("Content-Encoding"))
|
|
|
|
reader, err := gzip.NewReader(w.Body)
|
|
assert.NoError(t, err)
|
|
decompressed, err := io.ReadAll(reader)
|
|
assert.NoError(t, err)
|
|
assert.Contains(t, string(decompressed), "Hello Via!")
|
|
}
|
|
|
|
func TestCompressionNone(t *testing.T) {
|
|
v := New()
|
|
v.Page("/", func(c *Context) {
|
|
c.View(func() h.H {
|
|
return h.Div(h.Text(strings.Repeat("Hello Via! ", 200)))
|
|
})
|
|
})
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Empty(t, w.Header().Get("Content-Encoding"))
|
|
assert.Contains(t, w.Body.String(), "Hello Via!")
|
|
}
|
|
|
|
func TestCompressionMinSize(t *testing.T) {
|
|
v := New()
|
|
v.Page("/", func(c *Context) {
|
|
c.View(func() h.H {
|
|
return h.Div(h.Text("Small"))
|
|
})
|
|
})
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set("Accept-Encoding", "br")
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Empty(t, w.Header().Get("Content-Encoding"))
|
|
}
|
|
|
|
func TestCompressionLargeResponse(t *testing.T) {
|
|
v := New()
|
|
v.Page("/", func(c *Context) {
|
|
c.View(func() h.H {
|
|
return h.Div(h.Text(strings.Repeat("A", 2000)))
|
|
})
|
|
})
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set("Accept-Encoding", "br")
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Equal(t, "br", w.Header().Get("Content-Encoding"))
|
|
}
|
|
|
|
func TestCompressionDatastarJS(t *testing.T) {
|
|
v := New()
|
|
|
|
req := httptest.NewRequest("GET", "/_datastar.js", nil)
|
|
req.Header.Set("Accept-Encoding", "br")
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Equal(t, "br", w.Header().Get("Content-Encoding"))
|
|
}
|
|
|
|
func TestCompressionBrotliPreferred(t *testing.T) {
|
|
v := New()
|
|
v.Page("/", func(c *Context) {
|
|
c.View(func() h.H {
|
|
return h.Div(h.Text(strings.Repeat("Hello Via! ", 200)))
|
|
})
|
|
})
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set("Accept-Encoding", "gzip, br")
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Equal(t, "br", w.Header().Get("Content-Encoding"))
|
|
}
|
|
|
|
func TestCompressionZstdDisabled(t *testing.T) {
|
|
v := New()
|
|
v.Page("/", func(c *Context) {
|
|
c.View(func() h.H {
|
|
return h.Div(h.Text(strings.Repeat("Hello Via! ", 200)))
|
|
})
|
|
})
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set("Accept-Encoding", "zstd, br, gzip")
|
|
w := httptest.NewRecorder()
|
|
|
|
v.handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Equal(t, "br", w.Header().Get("Content-Encoding"), "Should use Brotli, not zstd")
|
|
assert.NotEqual(t, "zstd", w.Header().Get("Content-Encoding"))
|
|
}
|