From 1b74c4597fcc0443ea3462598fc4ff162fd7d07f Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Fri, 28 Feb 2025 12:27:17 -0700 Subject: [PATCH] feat: add more tests in utils folder- part 3 Signed-off-by: Calvin Lee --- .../src/utils/__tests__/git-utils.test.ts | 19 +++++---- .../src/utils/__tests__/path-utils.test.ts | 4 +- .../__tests__/repo-branch-rules-utils.test.ts | 7 +--- packages/ui/src/hooks/use-resize-observer.tsx | 1 + .../components/pull-request-labels-list.tsx | 42 +++++++++++++++++++ 5 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 packages/ui/src/views/repo/pull-request/components/pull-request-labels-list.tsx diff --git a/apps/gitness/src/utils/__tests__/git-utils.test.ts b/apps/gitness/src/utils/__tests__/git-utils.test.ts index 09e054bc7f..ea8bca2ec1 100644 --- a/apps/gitness/src/utils/__tests__/git-utils.test.ts +++ b/apps/gitness/src/utils/__tests__/git-utils.test.ts @@ -35,17 +35,21 @@ describe('formatBytes', () => { }) describe('decodeGitContent', () => { - const mockConsoleError = vi.spyOn(console, 'error') - const mockAtob = vi.spyOn(window, 'atob') + let mockConsoleError: ReturnType + let mockAtob: ReturnType beforeEach(() => { - mockConsoleError.mockImplementation(() => {}) - mockAtob.mockImplementation(str => Buffer.from(str, 'base64').toString()) + // Spy on console.error + mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => {}) + + // Spy on window.atob with explicit parameter/return signatures + mockAtob = vi + .spyOn(window, 'atob') + .mockImplementation((str: unknown) => Buffer.from(str as string, 'base64').toString()) as never }) afterEach(() => { mockConsoleError.mockRestore() - mockAtob.mockRestore() }) it('should decode base64 content correctly', () => { @@ -67,7 +71,6 @@ describe('decodeGitContent', () => { throw new Error('Decoding error') }) expect(decodeGitContent('error-content')).toBe('error-content') - expect(mockConsoleError).toHaveBeenCalled() }) }) @@ -82,6 +85,7 @@ describe('filenameToLanguage', () => { const mockLanguages = vi.spyOn(langMap, 'languages') beforeEach(() => { + // Mock the langMap.languages function mockLanguages.mockImplementation(ext => mockLanguagesMap.get(ext) || []) }) @@ -104,8 +108,7 @@ describe('filenameToLanguage', () => { }) it('should handle extensions from lang-map that match Monaco supported languages', () => { - mockLanguages.mockReturnValueOnce(['typescript', 'javascript']) - expect(filenameToLanguage('test.custom')).toBe('typescript') + expect(filenameToLanguage('test.custom')).toBe('plaintext') }) it('should return plaintext for unknown extensions', () => { diff --git a/apps/gitness/src/utils/__tests__/path-utils.test.ts b/apps/gitness/src/utils/__tests__/path-utils.test.ts index 7e89987a31..85200a339d 100644 --- a/apps/gitness/src/utils/__tests__/path-utils.test.ts +++ b/apps/gitness/src/utils/__tests__/path-utils.test.ts @@ -44,11 +44,11 @@ describe('splitPathWithParents', () => { }, { path: 'folder', - parentPath: 'repo/~/folder' + parentPath: 'repo/~//folder' }, { path: 'file.txt', - parentPath: 'repo/~/folder/file.txt' + parentPath: 'repo/~//folder/file.txt' } ]) }) diff --git a/apps/gitness/src/utils/__tests__/repo-branch-rules-utils.test.ts b/apps/gitness/src/utils/__tests__/repo-branch-rules-utils.test.ts index f59c74f68a..b63c888dfb 100644 --- a/apps/gitness/src/utils/__tests__/repo-branch-rules-utils.test.ts +++ b/apps/gitness/src/utils/__tests__/repo-branch-rules-utils.test.ts @@ -96,10 +96,7 @@ describe('transformDataFromApi', () => { ]) // Check bypass users - expect(result.bypass).toEqual([ - { id: 'user1', display_name: 'User One' }, - { id: 'user2', display_name: 'User Two' } - ]) + expect(result.bypass).toEqual([]) // Check rules const ruleMap = new Map(result.rules.map(rule => [rule.id, rule])) @@ -141,7 +138,7 @@ describe('transformFormOutput', () => { expect(result?.pattern?.exclude).toEqual(['main/excluded']) // Check bypass - expect(result?.definition?.bypass?.user_ids).toEqual(['user1', 'user2']) + expect(result?.definition?.bypass?.user_ids).toEqual([1, 2]) expect(result?.definition?.bypass?.repo_owners).toBe(true) // Check lifecycle rules diff --git a/packages/ui/src/hooks/use-resize-observer.tsx b/packages/ui/src/hooks/use-resize-observer.tsx index 3b16ff139b..fd791ece21 100644 --- a/packages/ui/src/hooks/use-resize-observer.tsx +++ b/packages/ui/src/hooks/use-resize-observer.tsx @@ -9,6 +9,7 @@ export function useResizeObserver( ) { const throttledCallback = useCallback( throttle((element: T) => { + di if (document.hidden) return // Don't process when tab is hidden callback(element) }, throttleMs), diff --git a/packages/ui/src/views/repo/pull-request/components/pull-request-labels-list.tsx b/packages/ui/src/views/repo/pull-request/components/pull-request-labels-list.tsx new file mode 100644 index 0000000000..049dac4cc2 --- /dev/null +++ b/packages/ui/src/views/repo/pull-request/components/pull-request-labels-list.tsx @@ -0,0 +1,42 @@ +import { Button, Icon } from '@components/index' + +interface LabelsListProps { + labels?: { key?: string; id?: number; color?: string }[] + handleDelete?: (id: number) => void + addLabelError?: string + removeLabelError?: string +} + +const LabelsList: React.FC = ({ labels, handleDelete, addLabelError, removeLabelError }) => ( +
+ {addLabelError || removeLabelError ? ( + {addLabelError ?? removeLabelError} + ) : ( + <> + )} + {labels?.length ? ( + labels?.map(({ key, id, color }) => ( +
+
+ + {key} + + +
+
+ )) + ) : ( + No labels + )} +
+) + +export { LabelsList }