76 lines
2.2 KiB
Go
76 lines
2.2 KiB
Go
package mediaserver
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"io"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"git.netflux.io/rob/octoplex/internal/mediaserver/mocks"
|
|
"github.com/stretchr/testify/mock"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestFetchPath(t *testing.T) {
|
|
const url = "http://localhost:8989/v3/paths/get/live"
|
|
|
|
testCases := []struct {
|
|
name string
|
|
httpResponse *http.Response
|
|
httpError error
|
|
wantPath apiPath
|
|
wantErr error
|
|
}{
|
|
{
|
|
name: "non-200 status",
|
|
httpResponse: &http.Response{StatusCode: http.StatusNotFound},
|
|
wantErr: errors.New("unexpected status code: 404"),
|
|
},
|
|
{
|
|
name: "unparseable response",
|
|
httpResponse: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
Body: io.NopCloser(bytes.NewReader([]byte("invalid json"))),
|
|
},
|
|
wantErr: errors.New("unmarshal: invalid character 'i' looking for beginning of value"),
|
|
},
|
|
{
|
|
name: "successful response, not ready",
|
|
httpResponse: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
Body: io.NopCloser(bytes.NewReader([]byte(`{"name":"live","confName":"live","source":null,"ready":false,"readyTime":null,"tracks":[],"bytesReceived":0,"bytesSent":0,"readers":[]}`))),
|
|
},
|
|
wantPath: apiPath{Name: "live", Ready: false, Tracks: []string{}},
|
|
},
|
|
{
|
|
name: "successful response, ready",
|
|
httpResponse: &http.Response{
|
|
StatusCode: http.StatusOK,
|
|
Body: io.NopCloser(bytes.NewReader([]byte(`{"name":"live","confName":"live","source":{"type":"rtmpConn","id":"fd2d79a8-bab9-4141-a1b5-55bd1a8649df"},"ready":true,"readyTime":"2025-04-18T07:44:53.683627506Z","tracks":["H264"],"bytesReceived":254677,"bytesSent":0,"readers":[]}`))),
|
|
},
|
|
wantPath: apiPath{Name: "live", Ready: true, Tracks: []string{"H264"}},
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
var httpClient mocks.HTTPClient
|
|
httpClient.
|
|
EXPECT().
|
|
Do(mock.MatchedBy(func(req *http.Request) bool {
|
|
return req.URL.String() == url && req.Method == http.MethodGet
|
|
})).
|
|
Return(tc.httpResponse, tc.httpError)
|
|
|
|
path, err := fetchPath(url, &httpClient)
|
|
if tc.wantErr != nil {
|
|
require.EqualError(t, err, tc.wantErr.Error())
|
|
} else {
|
|
require.NoError(t, err)
|
|
require.Equal(t, tc.wantPath, path)
|
|
}
|
|
})
|
|
}
|
|
}
|