From e61d6cd5b8a48c82eab87050d2286339e2178d19 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Mon, 6 Jul 2026 10:17:34 -0400 Subject: [PATCH] fix(platforms): stop platform variants from renaming the parent platform get_supported_platforms built a slug->platform map with a plain dict comprehension. When a folder is mapped as a variant or alias of an existing platform, scanning resolves it to the parent slug, so two platform rows share the same slug. The comprehension let the later row (the variant) overwrite the parent, renaming it in the platform picker and Folder Mappings page. Prefer the canonical platform (fs_slug == slug) when building the map so a variant folder no longer shadows its parent. Fixes #3157 Generated-By: PostHog Code Task-Id: 571866ea-86a0-49c2-b62e-dbea077d0181 --- backend/tests/utils/test_platforms.py | 25 +++++++++++++++++++++++++ backend/utils/platforms.py | 11 ++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 backend/tests/utils/test_platforms.py diff --git a/backend/tests/utils/test_platforms.py b/backend/tests/utils/test_platforms.py new file mode 100644 index 000000000..ee7eccba6 --- /dev/null +++ b/backend/tests/utils/test_platforms.py @@ -0,0 +1,25 @@ +from handler.database import db_platform_handler +from models.platform import Platform +from utils.platforms import get_supported_platforms + + +def test_supported_platform_not_shadowed_by_variant(): + """A variant/alias folder bound to a parent slug must not shadow the parent. + + Regression for the bug where adding an "fbneo" folder as a variant of + "arcade" renamed the Arcade platform to "FBneo" in the platform picker. + """ + # Canonical Arcade platform (folder name matches the slug). + db_platform_handler.add_platform( + Platform(name="Arcade", slug="arcade", fs_slug="arcade") + ) + # Variant folder resolved to the same slug during scan. + db_platform_handler.add_platform( + Platform(name="FBneo", slug="arcade", fs_slug="fbneo") + ) + + supported = get_supported_platforms() + arcade = next(p for p in supported if p.slug == "arcade") + + assert arcade.name == "Arcade" + assert arcade.fs_slug == "arcade" diff --git a/backend/utils/platforms.py b/backend/utils/platforms.py index c58b0b7d0..42b338f43 100644 --- a/backend/utils/platforms.py +++ b/backend/utils/platforms.py @@ -26,7 +26,16 @@ def get_supported_platforms() -> list[PlatformSchema]: Flashpoint, and HowLongToBeat. """ db_platforms = db_platform_handler.get_platforms() - db_platforms_map = {p.slug: p for p in db_platforms} + + # Multiple folders can resolve to the same slug (a folder alias or a + # platform variant bound to a parent platform). When that happens, prefer + # the canonical platform (the one whose fs_slug matches its slug) so a + # variant folder doesn't shadow the parent and rename it in the picker. + db_platforms_map: dict[str, Platform] = {} + for p in db_platforms: + existing = db_platforms_map.get(p.slug) + if existing is None or p.fs_slug == p.slug: + db_platforms_map[p.slug] = p now = datetime.now(timezone.utc) supported_platforms = []