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 web
import (
"errors"
"io"
"net/http"
"os"
"strings"
"testing"
"testing/fstest"
)
func TestSharePageRenderer_Render(t *testing.T) {
t.Run("injects marshaled metadata", func(t *testing.T) {
fs := fstest.MapFS{
"share.html": {Data: []byte(`<script><!--SHARE_MEDIA--></script>`)},
}
r := NewSharePageRenderer(http.FS(fs))
page, err := r.Render(map[string]string{"stream_url": "/s/abc/stream"})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if !strings.Contains(page.HTML, `"stream_url":"/s/abc/stream"`) {
t.Fatalf("expected injected JSON, got %q", page.HTML)
}
if page.Name != "share.html" {
t.Fatalf("expected name share.html, got %q", page.Name)
}
})
t.Run("returns marshal error", func(t *testing.T) {
fs := fstest.MapFS{
"share.html": {Data: []byte(`<script><!--SHARE_MEDIA--></script>`)},
}
r := NewSharePageRenderer(http.FS(fs))
_, err := r.Render(map[string]any{"bad": make(chan int)})
if err == nil {
t.Fatal("expected marshal error")
}
if !strings.Contains(err.Error(), "marshal share metadata") {
t.Fatalf("expected wrapped marshal error, got %v", err)
}
})
t.Run("nil renderer", func(t *testing.T) {
var r *SharePageRenderer
if _, err := r.Render(nil); err == nil {
t.Fatal("expected error from nil renderer")
}
})
t.Run("missing template", func(t *testing.T) {
r := NewSharePageRenderer(http.FS(fstest.MapFS{}))
_, err := r.Render(nil)
if err == nil {
t.Fatal("expected open error")
}
})
t.Run("stat error propagates", func(t *testing.T) {
r := NewSharePageRenderer(statErrorFS{})
_, err := r.Render(nil)
if err == nil {
t.Fatal("expected stat error")
}
})
}
func TestInjectShareMedia(t *testing.T) {
html, err := injectShareMedia(`a <!--X--> b`, "<!--X-->", "v")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if html != `a "v" b` {
t.Fatalf("unexpected result: %q", html)
}
}
// statErrorFS returns a file whose Stat() fails — used to cover the
// rare error path in Render where the template is openable but cannot
// be stat'd.
type statErrorFS struct{}
func (statErrorFS) Open(string) (http.File, error) { return statErrorFile{}, nil }
type statErrorFile struct{}
func (statErrorFile) Close() error { return nil }
func (statErrorFile) Read([]byte) (int, error) { return 0, io.EOF }
func (statErrorFile) Seek(int64, int) (int64, error) { return 0, nil }
func (statErrorFile) Readdir(int) ([]os.FileInfo, error) { return nil, nil }
func (statErrorFile) Stat() (os.FileInfo, error) { return nil, errors.New("stat failed") }
|