From 7c7e58d0d2d2d0da9986b113954bba1856ed4d4a Mon Sep 17 00:00:00 2001 From: xenticore Date: Thu, 27 Mar 2025 14:51:13 -0400 Subject: [PATCH] refactor: move `extractPageTitleFromURL` to module, add tests --- __tests__/url.test.ts | 28 ++++++++++++++++++++++++++++ src/content/content.ts | 10 +--------- src/content/utils/url.ts | 8 ++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 __tests__/url.test.ts create mode 100644 src/content/utils/url.ts diff --git a/__tests__/url.test.ts b/__tests__/url.test.ts new file mode 100644 index 0000000..4129b5d --- /dev/null +++ b/__tests__/url.test.ts @@ -0,0 +1,28 @@ +import { extractPageTitleFromURL } from '../src/content/utils/url'; + +describe('extractPageTitleFromURL', () => { + it('extracts simple title from URL', () => { + const url = 'https://wiki.teamfortress.com/wiki/Scattergun'; + expect(extractPageTitleFromURL(url)).toBe('Scattergun'); + }); + + it('replaces underscores with spaces', () => { + const url = 'https://wiki.teamfortress.com/wiki/Flame_Thrower'; + expect(extractPageTitleFromURL(url)).toBe('Flame Thrower'); + }); + + it('decodes URI components', () => { + const url = 'https://wiki.teamfortress.com/wiki/Dragon%27s_Fury'; + expect(extractPageTitleFromURL(url)).toBe("Dragon's Fury"); + }); + + it('handles special characters', () => { + const url = 'https://wiki.teamfortress.com/wiki/Ze_%C3%9Cbermensch'; + expect(extractPageTitleFromURL(url)).toBe("Ze Übermensch"); + }); + + it('removes language suffix', () => { + const url = 'https://wiki.teamfortress.com/wiki/Ze_%C3%9Cbermensch/pt-br'; + expect(extractPageTitleFromURL(url)).toBe('Ze Übermensch'); + }); +}); diff --git a/src/content/content.ts b/src/content/content.ts index f603810..35bbe5e 100644 --- a/src/content/content.ts +++ b/src/content/content.ts @@ -8,6 +8,7 @@ import { $T, extractLocaleFromURL } from './utils/localization' import { fetchPrice, fetchKeyPrice, ItemPriceData } from './priceService' import { createPriceRow, createStoreButton } from './uiRenderer' import { findFirstElement, findFirstChildElement } from './utils/dom' +import { extractPageTitleFromURL } from './utils/url'; var itemSchema: ItemSchema | null; var pageLocale: string = 'en' @@ -23,15 +24,6 @@ function getKeyByValue(object: any, value: string) { return Object.keys(object).find(key => object[key] === value); } -function extractPageTitleFromURL(url: string): string { - var split = url.substring(url.indexOf("/wiki/") + "/wiki/".length); - if (split.indexOf('/') != -1) { - // Remove language suffix (/es) - split = split.substring(0, split.indexOf('/')); - } - return decodeURIComponent(split.replaceAll('_', ' ')); -} - // Main function async function inject() { const itemInfobox = findFirstElement('.item-infobox'); diff --git a/src/content/utils/url.ts b/src/content/utils/url.ts new file mode 100644 index 0000000..3aa388c --- /dev/null +++ b/src/content/utils/url.ts @@ -0,0 +1,8 @@ +export function extractPageTitleFromURL(url: string): string { + var split = url.substring(url.indexOf("/wiki/") + "/wiki/".length); + if (split.indexOf('/') != -1) { + // Remove language suffix (/es) + split = split.substring(0, split.indexOf('/')); + } + return decodeURIComponent(split.replaceAll('_', ' ')); +}