Live video on the AT Protocol
1package misttriggers
2
3import (
4 "bytes"
5 "context"
6 "fmt"
7 "net/http"
8 "net/http/httptest"
9 "testing"
10
11 "github.com/stretchr/testify/require"
12 "stream.place/streamplace/pkg/config"
13)
14
15var pushRewritePayload = MistTriggerBody(`
16 rtmp://127.0.0.1:1935/live/c447-3l8v-1vmz-ej5t
17 127.0.0.1
18 c447-3l8v-1vmz-ej5t
19`)
20
21var pushRewritePayloadInvalid = MistTriggerBody(`
22 rtmp://127.0.0.1:1935/live/c447-3l8v-1vmz-ej5t
23`)
24
25var pushRewritePayloadBadURL = MistTriggerBody(`
26 http://hostname with spaces.com
27 127.0.0.1
28 c447-3l8v-1vmz-ej5t
29`)
30
31func TestItCanParseAValidPushRewritePayload(t *testing.T) {
32 p, err := ParsePushRewritePayload(pushRewritePayload)
33 require.NoError(t, err)
34 require.Equal(t, p.FullURL, "rtmp://127.0.0.1:1935/live/c447-3l8v-1vmz-ej5t")
35 require.Equal(t, p.URL.String(), "rtmp://127.0.0.1:1935/live/c447-3l8v-1vmz-ej5t")
36 require.Equal(t, p.Hostname, "127.0.0.1")
37 require.Equal(t, p.StreamName, "c447-3l8v-1vmz-ej5t")
38}
39
40func TestItCanRejectABadPushRewritePayload(t *testing.T) {
41 _, err := ParsePushRewritePayload(pushRewritePayloadInvalid)
42 require.Error(t, err)
43 _, err = ParsePushRewritePayload(pushRewritePayloadBadURL)
44 require.Error(t, err)
45}
46
47func doPushRewriteRequest(t *testing.T, payload MistTriggerBody, cb func(ctx context.Context, prp *PushRewritePayload) (string, error)) *httptest.ResponseRecorder {
48 broker := NewTriggerBroker()
49 broker.OnPushRewrite(cb)
50 d := NewMistCallbackHandlersCollection(&config.CLI{}, broker)
51 req, err := http.NewRequest("POST", "/trigger", bytes.NewBuffer([]byte(payload)))
52 require.NoError(t, err)
53 rr := httptest.NewRecorder()
54 d.TriggerPushRewrite(context.Background(), rr, req, payload)
55 return rr
56}
57
58func TestPushRewriteCanHandlePushRewriteRequests(t *testing.T) {
59 rr := doPushRewriteRequest(t, pushRewritePayload, func(ctx context.Context, prp *PushRewritePayload) (string, error) {
60 require.Equal(t, prp.StreamName, "c447-3l8v-1vmz-ej5t")
61 return "funky-stream", nil
62 })
63 require.Equal(t, rr.Result().StatusCode, 200)
64 require.Equal(t, rr.Body.String(), "funky-stream")
65}
66
67func TestPushRewriteCanRejectPushRewriteRequests(t *testing.T) {
68 rr := doPushRewriteRequest(t, pushRewritePayload, func(ctx context.Context, prp *PushRewritePayload) (string, error) {
69 // Proper way to reject Mist
70 return "", nil
71 })
72 require.Equal(t, rr.Result().StatusCode, 200)
73 require.Equal(t, rr.Body.String(), "")
74}
75
76func TestPushRewriteCanHandleFailureToHandle(t *testing.T) {
77 rr := doPushRewriteRequest(t, pushRewritePayload, func(ctx context.Context, prp *PushRewritePayload) (string, error) {
78 return "", fmt.Errorf("something went wrong")
79 })
80 require.Equal(t, rr.Result().StatusCode, 500)
81}
82
83func TestPushRewriteCanErrorPushRewriteRequests(t *testing.T) {
84 rr := doPushRewriteRequest(t, pushRewritePayloadBadURL, func(ctx context.Context, prp *PushRewritePayload) (string, error) {
85 require.Fail(t, "test should be failing before it gets to me")
86 return "", nil
87 })
88 require.Equal(t, rr.Result().StatusCode, 400)
89
90 rr = doPushRewriteRequest(t, pushRewritePayloadInvalid, func(ctx context.Context, prp *PushRewritePayload) (string, error) {
91 require.Fail(t, "test should be failing before it gets to me")
92 return "", nil
93 })
94 require.Equal(t, rr.Result().StatusCode, 400)
95}