-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathhtmx_test.go
More file actions
92 lines (73 loc) · 2.37 KB
/
Copy pathhtmx_test.go
File metadata and controls
92 lines (73 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package hime_test
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
"github.com/moonrhythm/hime"
)
func newHTMXContext(htmx bool) (*hime.Context, *httptest.ResponseRecorder) {
r := httptest.NewRequest(http.MethodGet, "/", nil)
if htmx {
r.Header.Set("HX-Request", "true")
}
w := httptest.NewRecorder()
return hime.NewAppContext(hime.New(), w, r), w
}
func TestContextIsHTMX(t *testing.T) {
t.Parallel()
ctx, _ := newHTMXContext(true)
assert.True(t, ctx.IsHTMX())
ctx, _ = newHTMXContext(false)
assert.False(t, ctx.IsHTMX())
}
func TestContextHTMXRedirect(t *testing.T) {
t.Parallel()
ctx, w := newHTMXContext(true)
assert.NoError(t, ctx.HTMXRedirect("/dashboard"))
assert.Equal(t, "/dashboard", w.Header().Get("HX-Redirect"))
// params are applied like Redirect
ctx, w = newHTMXContext(true)
assert.NoError(t, ctx.HTMXRedirect("/items", &hime.Param{Name: "page", Value: 2}))
assert.Equal(t, "/items?page=2", w.Header().Get("HX-Redirect"))
}
func TestContextHTMXRefresh(t *testing.T) {
t.Parallel()
ctx, w := newHTMXContext(true)
assert.NoError(t, ctx.HTMXRefresh())
assert.Equal(t, "true", w.Header().Get("HX-Refresh"))
}
func TestContextHTMXReswapRetarget(t *testing.T) {
t.Parallel()
ctx, w := newHTMXContext(true)
// chainable, composing with a render method
assert.NoError(t, ctx.HTMXRetarget("#list").HTMXReswap("outerHTML").String("ok"))
assert.Equal(t, "#list", w.Header().Get("HX-Retarget"))
assert.Equal(t, "outerHTML", w.Header().Get("HX-Reswap"))
assert.Equal(t, "ok", w.Body.String())
}
func TestContextHTMXTrigger(t *testing.T) {
t.Parallel()
t.Run("bare event name", func(t *testing.T) {
t.Parallel()
ctx, w := newHTMXContext(true)
ctx.HTMXTrigger("itemAdded")
assert.Equal(t, "itemAdded", w.Header().Get("HX-Trigger"))
})
t.Run("event with detail as json", func(t *testing.T) {
t.Parallel()
ctx, w := newHTMXContext(true)
ctx.HTMXTrigger("itemAdded", map[string]any{"id": 7})
assert.JSONEq(t, `{"itemAdded":{"id":7}}`, w.Header().Get("HX-Trigger"))
})
t.Run("too many detail args panics", func(t *testing.T) {
t.Parallel()
ctx, _ := newHTMXContext(true)
assert.Panics(t, func() { ctx.HTMXTrigger("e", 1, 2) })
})
t.Run("unmarshalable detail panics", func(t *testing.T) {
t.Parallel()
ctx, _ := newHTMXContext(true)
assert.Panics(t, func() { ctx.HTMXTrigger("e", make(chan int)) })
})
}