0.3.22 - PINs

This commit is contained in:
ponzischeme89
2026-08-25 11:39:55 +12:00
parent 396d35e2f5
commit 0fcc02f57e
2697 changed files with 5360 additions and 50 deletions
+79
View File
@@ -136,6 +136,85 @@ func TestClientCapabilitiesAreNormalizedAndBounded(t *testing.T) {
}
}
func TestValidateSectionDefinitionsRejectsDuplicateIDs(t *testing.T) {
raw := json.RawMessage(`[
{"id":"a","type":"favorites","title":"Favourites","enabled":true,"position":10,"dataSource":"emby.favourites","component":"mediaRow","destination":"home"},
{"id":"a","type":"latest","title":"Recently Added","enabled":true,"position":20,"dataSource":"emby.latest","component":"mediaRow","destination":"home"}
]`)
if err := validateSectionDefinitions("home.sectionDefinitions", raw); err == nil {
t.Fatal("duplicate row id was accepted")
}
}
func TestValidateSectionDefinitionsRejectsDuplicatePositions(t *testing.T) {
raw := json.RawMessage(`[
{"id":"a","type":"favorites","title":"Favourites","enabled":true,"position":10,"dataSource":"emby.favourites","component":"mediaRow","destination":"home"},
{"id":"b","type":"latest","title":"Recently Added","enabled":true,"position":10,"dataSource":"emby.latest","component":"mediaRow","destination":"home"}
]`)
if err := validateSectionDefinitions("home.sectionDefinitions", raw); err == nil {
t.Fatal("duplicate row position was accepted")
}
}
func TestValidateSectionDefinitionsRejectsMissingTitle(t *testing.T) {
raw := json.RawMessage(`[{"id":"a","type":"favorites","title":"","enabled":true,"position":10,"dataSource":"emby.favourites","component":"mediaRow","destination":"home"}]`)
if err := validateSectionDefinitions("home.sectionDefinitions", raw); err == nil {
t.Fatal("missing title was accepted")
}
}
func TestValidateSectionDefinitionsRejectsInvalidMaxItems(t *testing.T) {
raw := json.RawMessage(`[{"id":"a","type":"favorites","title":"Favourites","enabled":true,"position":10,"maxItems":500,"dataSource":"emby.favourites","component":"mediaRow","destination":"home"}]`)
if err := validateSectionDefinitions("home.sectionDefinitions", raw); err == nil {
t.Fatal("out-of-range maxItems was accepted")
}
}
func TestValidateSectionDefinitionsRejectsUnsupportedRowPageCombination(t *testing.T) {
// Genres is a Movies/TV row type; it has no business on Home.
raw := json.RawMessage(`[{"id":"a","type":"genres","title":"Genres","enabled":true,"position":10,"dataSource":"emby.genres","component":"genreBrowser","destination":"movies"}]`)
if err := validateSectionDefinitions("home.sectionDefinitions", raw); err == nil {
t.Fatal("genres row was accepted on the Home page")
}
}
func TestValidateSectionDefinitionsRejectsIncompatibleDataSource(t *testing.T) {
raw := json.RawMessage(`[{"id":"a","type":"favorites","title":"Favourites","enabled":true,"position":10,"dataSource":"emby.latest","component":"mediaRow","destination":"home"}]`)
if err := validateSectionDefinitions("home.sectionDefinitions", raw); err == nil {
t.Fatal("mismatched data source was accepted")
}
}
func TestValidateSectionDefinitionsRejectsDestinationMismatchedToPage(t *testing.T) {
raw := json.RawMessage(`[{"id":"a","type":"genres","title":"Genres","enabled":true,"position":10,"dataSource":"emby.genres","component":"genreBrowser","destination":"tv"}]`)
if err := validateSectionDefinitions("movies.sectionDefinitions", raw); err == nil {
t.Fatal("genres row on Movies pointed at TV was accepted")
}
}
func TestValidateSectionDefinitionsAcceptsTheDefaultDocument(t *testing.T) {
for key, definitions := range map[string][]config.RemoteSectionDefinition{
"home.sectionDefinitions": config.DefaultRemoteConfig().Home.SectionDefinitions,
"movies.sectionDefinitions": config.DefaultRemoteConfig().Movies.SectionDefinitions,
"tv.sectionDefinitions": config.DefaultRemoteConfig().TV.SectionDefinitions,
} {
raw, err := json.Marshal(definitions)
if err != nil {
t.Fatalf("marshal %s: %v", key, err)
}
if err := validateSectionDefinitions(key, raw); err != nil {
t.Fatalf("default %s was rejected: %v", key, err)
}
}
}
func TestValidateSectionDefinitionsAllowsCustomRowsOutsideTheCatalogue(t *testing.T) {
raw := json.RawMessage(`[{"id":"a","type":"custom","title":"Something new","enabled":true,"position":10,"dataSource":"gateway.whatever","component":"mediaRow","destination":"home"}]`)
if err := validateSectionDefinitions("home.sectionDefinitions", raw); err != nil {
t.Fatalf("custom row was rejected: %v", err)
}
}
func TestFeatureAdminRejectsUnknownFlagsBeforeWriting(t *testing.T) {
server := testServer(config.Config{})
req := httptest.NewRequest(http.MethodPost, "/admin/api/features",