summaryrefslogtreecommitdiff
path: root/player-server/internal/web/sharepage_test.go
blob: 7a8913151d2a8ec71f14ae87227806b9b9e3f223 (plain)
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") }