diff --git a/changelog.d/theme-index-html-fallback.fix b/changelog.d/theme-index-html-fallback.fix new file mode 100644 index 000000000..90a23cacc --- /dev/null +++ b/changelog.d/theme-index-html-fallback.fix @@ -0,0 +1 @@ +Fix theme lists failing to load when custom resource indexes are unavailable diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index 6c289590e..5acd124b4 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -348,7 +348,11 @@ export const getResourcesIndex = async (url, parser = noop) => { } try { - const { data: builtinData } = await promisedRequest({ url, cache }) + const { data: builtinData } = await promisedRequest({ + url, + cache, + forceContentType: 'application/json', + }) builtin = resourceTransform(builtinData) } catch { builtin = [] @@ -359,6 +363,7 @@ export const getResourcesIndex = async (url, parser = noop) => { const { data: customData } = await promisedRequest({ url: customUrl, cache, + forceContentType: 'application/json', }) custom = resourceTransform(customData) } catch { diff --git a/test/unit/specs/services/style_setter/style_setter.spec.js b/test/unit/specs/services/style_setter/style_setter.spec.js index c1bacdfa1..ff8e11dce 100644 --- a/test/unit/specs/services/style_setter/style_setter.spec.js +++ b/test/unit/specs/services/style_setter/style_setter.spec.js @@ -1,4 +1,38 @@ -import { hasInvalidCachedThemeRules } from 'src/services/style_setter/style_setter.js' +import { + getResourcesIndex, + hasInvalidCachedThemeRules, +} from 'src/services/style_setter/style_setter.js' + +describe('resource index', () => { + afterEach(() => { + vi.restoreAllMocks() + vi.unstubAllGlobals() + }) + + it('ignores an HTML fallback returned for a missing custom index', async () => { + vi.spyOn(console, 'warn').mockImplementation(() => undefined) + vi.stubGlobal( + 'fetch', + vi + .fn() + .mockResolvedValueOnce( + new Response(JSON.stringify({ builtin: { version: 1 } }), { + headers: { 'Content-Type': 'application/json' }, + }), + ) + .mockResolvedValueOnce( + new Response('Pleroma', { + headers: { 'Content-Type': 'text/html' }, + }), + ), + ) + + const resources = await getResourcesIndex('/static/styles.json') + + expect(Object.keys(resources)).to.deep.equal(['builtin']) + expect(resources.builtin()).to.deep.equal({ version: 1 }) + }) +}) describe('style setter cache', () => { it('rejects cached rules containing serialized objects', () => {