mediamtx/internal/testapidocs/apidocs_test.go

155 lines
2.5 KiB
Go

package main
import (
"os"
"reflect"
"sort"
"strings"
"testing"
"github.com/bluenviron/mediamtx/internal/conf"
"github.com/bluenviron/mediamtx/internal/conf/yaml"
"github.com/bluenviron/mediamtx/internal/defs"
"github.com/stretchr/testify/require"
)
func TestAPIDocs(t *testing.T) {
byts, err := os.ReadFile("../../apidocs/openapi.yaml")
require.NoError(t, err)
var raw map[string]interface{}
err = yaml.Load(byts, &raw)
require.NoError(t, err)
components := raw["components"].(map[string]interface{})
schemas := components["schemas"].(map[string]interface{})
for _, ca := range []struct {
yamlKey string
goStruct interface{}
}{
{
"AuthInternalUser",
conf.AuthInternalUser{},
},
{
"AuthInternalUserPermission",
conf.AuthInternalUserPermission{},
},
{
"GlobalConf",
conf.Conf{},
},
{
"PathConf",
conf.Path{},
},
{
"PathConfList",
defs.APIPathConfList{},
},
{
"Path",
defs.APIPath{},
},
{
"PathList",
defs.APIPathList{},
},
{
"PathSource",
defs.APIPathSourceOrReader{},
},
{
"PathReader",
defs.APIPathSourceOrReader{},
},
{
"HLSMuxer",
defs.APIHLSMuxer{},
},
{
"HLSMuxerList",
defs.APIHLSMuxerList{},
},
{
"Recording",
defs.APIRecording{},
},
{
"RecordingList",
defs.APIRecordingList{},
},
{
"RecordingSegment",
defs.APIRecordingSegment{},
},
{
"RTMPConn",
defs.APIRTMPConn{},
},
{
"RTMPConnList",
defs.APIRTMPConnList{},
},
{
"RTSPConn",
defs.APIRTSPConn{},
},
{
"RTSPConnList",
defs.APIRTSPConnsList{},
},
{
"RTSPSession",
defs.APIRTSPSession{},
},
{
"RTSPSessionList",
defs.APIRTSPSessionList{},
},
{
"SRTConn",
defs.APISRTConn{},
},
{
"SRTConnList",
defs.APISRTConnList{},
},
{
"WebRTCSession",
defs.APIWebRTCSession{},
},
{
"WebRTCSessionList",
defs.APIWebRTCSessionList{},
},
} {
t.Run(ca.yamlKey, func(t *testing.T) {
yamlContent := schemas[ca.yamlKey].(map[string]interface{})
props := yamlContent["properties"].(map[string]interface{})
key1 := make([]string, len(props))
i := 0
for key := range props {
key1[i] = key
i++
}
var key2 []string
ty := reflect.TypeOf(ca.goStruct)
for i := 0; i < ty.NumField(); i++ {
sf := ty.Field(i)
js := sf.Tag.Get("json")
if js != "-" && js != "paths" && js != "pathDefaults" && !strings.Contains(js, ",omitempty") {
key2 = append(key2, js)
}
}
sort.Strings(key1)
sort.Strings(key2)
require.Equal(t, key1, key2)
})
}
}