Live video on the AT Protocol
79
fork

Configure Feed

Select the types of activity you want to include in your feed.

at eli/revert-dev-env 106 lines 3.6 kB view raw
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 userNewPayload = MistTriggerBody(` 16 video+c447r0acdmqhhhpb 17 127.0.0.1 18 2251870645 19 HLS 20 http://localhost:8080/hls/video%20c447r0acdmqhhhpb/index.m3u8?stream=video%2bc447r0acdmqhhhpb 21 073458ebf34cb051d3baea5f82263d0643c4d3aa425b5ac53e08cf9c1e70e7fd 22`) 23 24var userNewPayloadBadLines = MistTriggerBody(` 25 video+c447r0acdmqhhhpb 26`) 27 28var userNewPayloadBadURL = MistTriggerBody(` 29 video+c447r0acdmqhhhpb 30 127.0.0.1 31 2251870645 32 HLS 33 http://hostname with spaces.com 34 073458ebf34cb051d3baea5f82263d0643c4d3aa425b5ac53e08cf9c1e70e7fd 35`) 36 37func TestItCanParseAValidUserNewPayload(t *testing.T) { 38 p, err := ParseUserNewPayload(userNewPayload) 39 require.NoError(t, err) 40 require.Equal(t, p.StreamName, "video+c447r0acdmqhhhpb") 41 require.Equal(t, p.Hostname, "127.0.0.1") 42 require.Equal(t, p.ConnectionID, "2251870645") 43 require.Equal(t, p.Protocol, "HLS") 44 require.Equal(t, p.URL.Scheme, "http") 45 require.Equal(t, p.URL.Host, "localhost:8080") 46 require.Equal(t, p.URL.Path, "/hls/video c447r0acdmqhhhpb/index.m3u8") 47 require.Equal(t, p.URL.Query().Get("stream"), "video+c447r0acdmqhhhpb") 48 require.Equal(t, p.FullURL, "http://localhost:8080/hls/video%20c447r0acdmqhhhpb/index.m3u8?stream=video%2bc447r0acdmqhhhpb") 49 require.Equal(t, p.SessionID, "073458ebf34cb051d3baea5f82263d0643c4d3aa425b5ac53e08cf9c1e70e7fd") 50} 51 52func TestItCanRejectABadUserNewPayload(t *testing.T) { 53 _, err := ParseUserNewPayload(userNewPayloadBadLines) 54 require.Error(t, err) 55 _, err = ParseUserNewPayload(userNewPayloadBadURL) 56 require.Error(t, err) 57} 58 59func doUserNewRequest(t *testing.T, payload MistTriggerBody, cb func(ctx context.Context, p *UserNewPayload) (bool, error)) *httptest.ResponseRecorder { 60 broker := NewTriggerBroker() 61 broker.OnUserNew(cb) 62 d := NewMistCallbackHandlersCollection(&config.CLI{}, broker) 63 req, err := http.NewRequest("POST", "/trigger", bytes.NewBuffer([]byte(payload))) 64 require.NoError(t, err) 65 rr := httptest.NewRecorder() 66 d.TriggerUserNew(context.Background(), rr, req, payload) 67 return rr 68} 69 70func TestItCanHandleUserNewRequests(t *testing.T) { 71 rr := doUserNewRequest(t, userNewPayload, func(ctx context.Context, p *UserNewPayload) (bool, error) { 72 require.Equal(t, p.StreamName, "video+c447r0acdmqhhhpb") 73 return true, nil 74 }) 75 require.Equal(t, rr.Result().StatusCode, 200) 76 require.Equal(t, rr.Body.String(), "true") 77} 78 79func TestItCanRejectUserNewRequests(t *testing.T) { 80 rr := doUserNewRequest(t, userNewPayload, func(ctx context.Context, p *UserNewPayload) (bool, error) { 81 return false, nil 82 }) 83 require.Equal(t, rr.Result().StatusCode, 200) 84 require.Equal(t, rr.Body.String(), "false") 85} 86 87func TestItCanHandleFailureToHandle(t *testing.T) { 88 // should always return false on error no matter what we return 89 for _, state := range []bool{true, false} { 90 rr := doUserNewRequest(t, userNewPayload, func(ctx context.Context, p *UserNewPayload) (bool, error) { 91 return state, fmt.Errorf("something went wrong") 92 }) 93 require.Equal(t, rr.Result().StatusCode, 500) 94 require.Equal(t, rr.Body.String(), "false") 95 } 96} 97 98func TestItCanErrorUserNewRequests(t *testing.T) { 99 for _, testCase := range []MistTriggerBody{userNewPayloadBadLines, userNewPayloadBadURL} { 100 rr := doUserNewRequest(t, testCase, func(ctx context.Context, p *UserNewPayload) (bool, error) { 101 require.Fail(t, "test should be failing before it gets to me") 102 return false, nil 103 }) 104 require.Equal(t, rr.Result().StatusCode, 400) 105 } 106}