fix(datastore): stop INTERNET_RADIO from being re-added on service restart

initializeDefaultSources() called GetDefaultSources(), which includes
the legacy INTERNET_RADIO stub (ID 10002). On every service start it
would re-add that entry to any device whose Sources.xml had it removed
— including devices where the stale_internet_radio health-check quick
fix was applied — silently undoing the clean-up.

getAccountSources() in marge.go had the same issue: it passed the full
default list into the /full cloud response, causing a phantom
"sources_xml_diff" Info finding after a clean-up.

Fix: export the existing private getInitialSources() as
GetInitialSources() (excludes INTERNET_RADIO) and use it in both call
sites instead of GetDefaultSources().

Existing devices that still have INTERNET_RADIO in their Sources.xml
are unaffected: the merge loop only appends entries that are missing,
so a present entry is preserved (the token is refreshed as before).

Update unit and integration test expectations accordingly: the no-device
fallback now returns 3 cloud sources (LOCAL_INTERNET_RADIO, TUNEIN,
RADIO_BROWSER) instead of 4 (dropping INTERNET_RADIO / ID 10002).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tobias Gesellchen
2026-05-26 22:51:35 +02:00
co-authored by Claude Sonnet 4.6
parent 6c4c420b29
commit aafc5ba3f9
6 changed files with 37 additions and 16 deletions
@@ -25,7 +25,10 @@ Authorization: Bearer dummy-token
// the speaker enumerates AUX from its own hardware via isLocal=true
// in :8090/sources. See pkg/service/marge/marge.go getAccountSources
// and commit 2b40481 (#195/#269).
const expectedIds = ["10002", "10003", "10004"];
// INTERNET_RADIO (id=10002) is also excluded — it is a legacy stub
// that AfterTouch no longer adds to new or existing devices. See
// GetInitialSources() in pkg/service/datastore/datastore.go.
const expectedIds = ["10003", "10004", "10005"];
for (let i = 0; i < sourceList.length; i++) {
const source = sourceList.item(i);
const sourceId = source.getAttribute("id");
@@ -52,7 +52,10 @@ Authorization: Bearer {{token}}
// AUX from its own hardware via isLocal=true in :8090/sources. See
// pkg/service/marge/marge.go getAccountSources for the reasoning and
// commit 2b40481 for the fix that closed #195/#269.
client.assert(sourceCount === 5, "Expected 5 cloud sources (INTERNET_RADIO, LOCAL_INTERNET_RADIO, TUNEIN, RADIO_BROWSER, Spotify; AUX is hardware-local) but got " + sourceCount);
// INTERNET_RADIO (id=10002) is also excluded — it is a legacy stub
// that AfterTouch no longer adds to new or existing devices. See
// GetInitialSources() in pkg/service/datastore/datastore.go.
client.assert(sourceCount === 4, "Expected 4 cloud sources (LOCAL_INTERNET_RADIO, TUNEIN, RADIO_BROWSER, Spotify; AUX and INTERNET_RADIO are excluded) but got " + sourceCount);
// Explicit negative assertion: AUX must not appear in /full.
var sourceList = sources.getElementsByTagName("source");