From b8e805f0b756ee54738a547e6fa4460baa714ada Mon Sep 17 00:00:00 2001 From: Sarthak Doshi Date: Sun, 10 May 2026 23:53:28 +0530 Subject: [PATCH 1/2] feat: add isSupportedPlatform helper and URL function unit tests - Add isSupportedPlatform(id) boolean helper to platforms.ts - Write platforms.test.ts covering known/unknown/empty/case-sensitive IDs - Write platforms-url.test.ts covering getProfileUrl, getWebViewUrl, getDeepLinkUrl - Add vitest devDependency and test script to shared package.json Closes #9 Closes #10 --- packages/shared/package.json | 6 ++-- .../src/__tests__/platforms-url.test.ts | 36 +++++++++++++++++++ .../shared/src/__tests__/platforms.test.ts | 24 +++++++++++++ packages/shared/src/platforms.ts | 5 +++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 packages/shared/src/__tests__/platforms-url.test.ts create mode 100644 packages/shared/src/__tests__/platforms.test.ts diff --git a/packages/shared/package.json b/packages/shared/package.json index a15ef6d..bb26d4e 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -7,9 +7,11 @@ "types": "./src/index.ts", "scripts": { "lint": "eslint src/", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "test": "vitest run" }, "devDependencies": { - "typescript": "^5.4.0" + "typescript": "^5.4.0", + "vitest": "^1.6.0" } } diff --git a/packages/shared/src/__tests__/platforms-url.test.ts b/packages/shared/src/__tests__/platforms-url.test.ts new file mode 100644 index 0000000..6a75772 --- /dev/null +++ b/packages/shared/src/__tests__/platforms-url.test.ts @@ -0,0 +1,36 @@ +import { describe, it, expect } from 'vitest'; +import { getProfileUrl, getWebViewUrl, getDeepLinkUrl } from '../platforms'; + +describe('getProfileUrl', () => { + it('returns the correct GitHub profile URL', () => { + expect(getProfileUrl('github', 'octocat')).toBe('https://github.com/octocat'); + }); + + it('returns the correct LinkedIn profile URL', () => { + expect(getProfileUrl('linkedin', 'johndoe')).toBe('https://www.linkedin.com/in/johndoe'); + }); + + it('returns empty string for an unknown platform', () => { + expect(getProfileUrl('unknown', 'x')).toBe(''); + }); +}); + +describe('getWebViewUrl', () => { + it('returns the LinkedIn webview URL', () => { + expect(getWebViewUrl('linkedin', 'johndoe')).toBe('https://www.linkedin.com/in/johndoe'); + }); + + it('returns null for github (no webview URL)', () => { + expect(getWebViewUrl('github', 'octocat')).toBeNull(); + }); +}); + +describe('getDeepLinkUrl', () => { + it('returns the Twitter deep link URL', () => { + expect(getDeepLinkUrl('twitter', 'elonmusk')).toBe('twitter://user?screen_name=elonmusk'); + }); + + it('returns null for github (no deep link)', () => { + expect(getDeepLinkUrl('github', 'octocat')).toBeNull(); + }); +}); diff --git a/packages/shared/src/__tests__/platforms.test.ts b/packages/shared/src/__tests__/platforms.test.ts new file mode 100644 index 0000000..098db8c --- /dev/null +++ b/packages/shared/src/__tests__/platforms.test.ts @@ -0,0 +1,24 @@ +import { describe, it, expect } from 'vitest'; +import { isSupportedPlatform } from '../platforms'; + +describe('isSupportedPlatform', () => { + it('returns true for github', () => { + expect(isSupportedPlatform('github')).toBe(true); + }); + + it('returns true for linkedin', () => { + expect(isSupportedPlatform('linkedin')).toBe(true); + }); + + it('returns false for myspace (unknown platform)', () => { + expect(isSupportedPlatform('myspace')).toBe(false); + }); + + it('returns false for empty string', () => { + expect(isSupportedPlatform('')).toBe(false); + }); + + it('returns false for GITHUB (case-sensitive check)', () => { + expect(isSupportedPlatform('GITHUB')).toBe(false); + }); +}); diff --git a/packages/shared/src/platforms.ts b/packages/shared/src/platforms.ts index 52b07aa..0257153 100644 --- a/packages/shared/src/platforms.ts +++ b/packages/shared/src/platforms.ts @@ -274,3 +274,8 @@ export function getDeepLinkUrl(platformId: string, username: string): string | n if (!platform?.deepLinkPattern) return null; return platform.deepLinkPattern.replace(/{username}/g, username); } + +/** Returns true if the given id corresponds to a registered platform */ +export function isSupportedPlatform(id: string): boolean { + return PLATFORMS[id] !== undefined; +} From 1a05046060a1eef371026437e016827d61f372e0 Mon Sep 17 00:00:00 2001 From: Sarthak Doshi Date: Mon, 11 May 2026 00:15:20 +0530 Subject: [PATCH 2/2] fix: use hasOwnProperty in isSupportedPlatform, align vitest to ^2.0.0, add prototype key test --- packages/shared/package.json | 2 +- packages/shared/src/__tests__/platforms.test.ts | 6 ++++++ packages/shared/src/platforms.ts | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/shared/package.json b/packages/shared/package.json index bb26d4e..b3b3ac7 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -12,6 +12,6 @@ }, "devDependencies": { "typescript": "^5.4.0", - "vitest": "^1.6.0" + "vitest": "^2.0.0" } } diff --git a/packages/shared/src/__tests__/platforms.test.ts b/packages/shared/src/__tests__/platforms.test.ts index 098db8c..9db5b9f 100644 --- a/packages/shared/src/__tests__/platforms.test.ts +++ b/packages/shared/src/__tests__/platforms.test.ts @@ -21,4 +21,10 @@ describe('isSupportedPlatform', () => { it('returns false for GITHUB (case-sensitive check)', () => { expect(isSupportedPlatform('GITHUB')).toBe(false); }); + + it('returns false for inherited Object prototype keys like toString', () => { + expect(isSupportedPlatform('toString')).toBe(false); + expect(isSupportedPlatform('constructor')).toBe(false); + expect(isSupportedPlatform('__proto__')).toBe(false); + }); }); diff --git a/packages/shared/src/platforms.ts b/packages/shared/src/platforms.ts index 0257153..bf2274c 100644 --- a/packages/shared/src/platforms.ts +++ b/packages/shared/src/platforms.ts @@ -277,5 +277,5 @@ export function getDeepLinkUrl(platformId: string, username: string): string | n /** Returns true if the given id corresponds to a registered platform */ export function isSupportedPlatform(id: string): boolean { - return PLATFORMS[id] !== undefined; + return Object.prototype.hasOwnProperty.call(PLATFORMS, id); }