diff --git a/src/services/pull/usePull.test.tsx b/src/services/pull/usePull.test.tsx index 283cc59064..677df437f8 100644 --- a/src/services/pull/usePull.test.tsx +++ b/src/services/pull/usePull.test.tsx @@ -164,7 +164,6 @@ describe('usePull', () => { await waitFor(() => expect(result.current.data).toEqual({ defaultBranch: 'main', - hasAccess: true, pull: { behindBy: 82367894, behindByCommit: '1798hvs8ofhn', diff --git a/src/services/pull/usePull.tsx b/src/services/pull/usePull.tsx index 6bd44dccb4..36a09b487f 100644 --- a/src/services/pull/usePull.tsx +++ b/src/services/pull/usePull.tsx @@ -16,7 +16,6 @@ import { import Api from 'shared/api' import { type NetworkErrorObject } from 'shared/api/helpers' import { UploadTypeEnum } from 'shared/utils/commit' -import { userHasAccess } from 'shared/utils/user' import A from 'ui/A' import { PullCompareWithBaseFragment } from './fragments' @@ -372,10 +371,6 @@ export function usePull({ pull: { ...pull, }, - hasAccess: userHasAccess({ - privateRepo: data?.owner?.repository?.private, - isCurrentUserPartOfOrg: data?.owner?.isCurrentUserPartOfOrg, - }), defaultBranch: data?.owner?.repository?.defaultBranch, } }), diff --git a/src/shared/utils/dates.test.js b/src/shared/utils/dates.test.js deleted file mode 100644 index ef16d1c80b..0000000000 --- a/src/shared/utils/dates.test.js +++ /dev/null @@ -1,92 +0,0 @@ -import { renderHook } from '@testing-library/react' - -import { - formatTimeFromSeconds, - formatTimeToNow, - useDateFormatted, -} from './dates' - -describe('useDateFormatted and formatTimeToNow functions', () => { - let formattedDate - - function setup(date, formatDescription) { - formattedDate = formatTimeToNow(date) - } - - describe('when called with no date', () => { - beforeEach(() => { - setup(null) - }) - - it('returns null', () => { - const { result } = renderHook(() => useDateFormatted(null)) - - expect(result.current).toBe(null) - expect(formattedDate).toBe(null) - }) - }) - - describe('when called with a iso date', () => { - beforeEach(() => { - vi.useFakeTimers().setSystemTime(new Date('2022-09-01')) - setup('2020-09-08T10:45:06Z') - }) - - it('returns the date with the default format', () => { - const { result } = renderHook(() => - useDateFormatted('2020-09-08T10:45:06Z') - ) - - expect(result.current).toBe('September 8th 2020') - expect(formattedDate).toBe('almost 2 years ago') - }) - }) - - describe('when called with an alternative date format', () => { - beforeEach(() => { - vi.useFakeTimers().setSystemTime(new Date('2022-09-01')) - setup('2020-09-08T10:45:06Z', 'MMMM yyyy') - }) - - it('returns the date with the right format', () => { - const { result } = renderHook(() => - useDateFormatted('2020-09-08T10:45:06Z', 'MMMM yyyy') - ) - - expect(result.current).toBe('September 2020') - expect(formattedDate).toBe('almost 2 years ago') - }) - }) - - describe('when called with a unix timestamp', () => { - beforeEach(() => { - vi.useFakeTimers().setSystemTime(new Date('2022-09-01')) - setup(1595270468) - }) - - it('returns the date with the default format', () => { - const { result } = renderHook(() => useDateFormatted(1595270468)) - - expect(result.current).toBe('July 20th 2020') - expect(formattedDate).toBe('about 2 years ago') - }) - }) -}) - -describe('formatTimeFromSeconds', () => { - it('returns "N/A" when totalSeconds is null', () => { - expect(formatTimeFromSeconds(null)).toBe('N/A') - }) - - it('returns "N/A" when totalSeconds is undefined', () => { - expect(formatTimeFromSeconds(undefined)).toBe('N/A') - }) - - it('returns "0s" when totalSeconds is 0', () => { - expect(formatTimeFromSeconds(0)).toBe('0s') - }) - - it('returns the correct time format when totalSeconds is greater than 0', () => { - expect(formatTimeFromSeconds(3661)).toBe('1h 1m 1s') - }) -}) diff --git a/src/shared/utils/dates.test.ts b/src/shared/utils/dates.test.ts new file mode 100644 index 0000000000..0ab5d9564e --- /dev/null +++ b/src/shared/utils/dates.test.ts @@ -0,0 +1,37 @@ +import { formatTimeFromSeconds, formatTimeToNow } from './dates' + +describe('formatTimeToNow', () => { + it('returns null when date is null', () => { + expect(formatTimeToNow(undefined)).toBe(null) + }) + + it('returns the correct time format when date is a unix timestamp', () => { + vi.useFakeTimers().setSystemTime(new Date('2025-01-01')) + expect(formatTimeToNow(1715731200)).toBe('8 months ago') + vi.useRealTimers() + }) + + it('returns the correct time format when date is a iso string', () => { + vi.useFakeTimers().setSystemTime(new Date('2025-01-01')) + expect(formatTimeToNow('2024-09-01')).toBe('4 months ago') + vi.useRealTimers() + }) +}) + +describe('formatTimeFromSeconds', () => { + it('returns "N/A" when totalSeconds is null', () => { + expect(formatTimeFromSeconds(null)).toBe('N/A') + }) + + it('returns "N/A" when totalSeconds is undefined', () => { + expect(formatTimeFromSeconds(undefined)).toBe('N/A') + }) + + it('returns "0s" when totalSeconds is 0', () => { + expect(formatTimeFromSeconds(0)).toBe('0s') + }) + + it('returns the correct time format when totalSeconds is greater than 0', () => { + expect(formatTimeFromSeconds(3661)).toBe('1h 1m 1s') + }) +}) diff --git a/src/shared/utils/dates.js b/src/shared/utils/dates.ts similarity index 61% rename from src/shared/utils/dates.js rename to src/shared/utils/dates.ts index 14245b6e9e..538588c782 100644 --- a/src/shared/utils/dates.js +++ b/src/shared/utils/dates.ts @@ -1,21 +1,11 @@ import { - format, formatDistanceToNow, fromUnixTime, intervalToDuration, parseISO, } from 'date-fns' -import { useMemo } from 'react' -export function useDateFormatted(date, formatDescription = 'MMMM do yyyy') { - return useMemo(() => { - if (!date) return null - const parser = typeof date === 'string' ? parseISO : fromUnixTime - return format(parser(date), formatDescription) - }, [date, formatDescription]) -} - -export function formatTimeToNow(date) { +export function formatTimeToNow(date?: string | number | null) { if (!date) return null const parsedDate = @@ -25,7 +15,7 @@ export function formatTimeToNow(date) { }) } -export const formatTimeFromSeconds = (totalSeconds) => { +export const formatTimeFromSeconds = (totalSeconds?: number | null) => { if (totalSeconds === 0) return '0s' if (!totalSeconds) return 'N/A' diff --git a/src/shared/utils/snakeifyKeys.test.js b/src/shared/utils/snakeifyKeys.test.ts similarity index 90% rename from src/shared/utils/snakeifyKeys.test.js rename to src/shared/utils/snakeifyKeys.test.ts index 50784dbaf4..be7cc13638 100644 --- a/src/shared/utils/snakeifyKeys.test.js +++ b/src/shared/utils/snakeifyKeys.test.ts @@ -10,7 +10,9 @@ describe('snakeifyKeys', () => { it('else passes through', () => { expect(snakeifyKeys([1, 2, 3])).toStrictEqual([1, 2, 3]) + // @ts-expect-error expect(snakeifyKeys(1)).toStrictEqual(1) + // @ts-expect-error expect(snakeifyKeys('test')).toStrictEqual('test') }) }) diff --git a/src/shared/utils/snakeifyKeys.js b/src/shared/utils/snakeifyKeys.ts similarity index 75% rename from src/shared/utils/snakeifyKeys.js rename to src/shared/utils/snakeifyKeys.ts index 6d7e4e7dd2..ae05da0089 100644 --- a/src/shared/utils/snakeifyKeys.js +++ b/src/shared/utils/snakeifyKeys.ts @@ -1,6 +1,8 @@ import snakeCase from 'lodash/snakeCase' -export function snakeifyKeys(obj = {}) { +export function snakeifyKeys( + obj: Record = {} +): Record { if (obj !== null && obj.constructor === Object) { return Object.keys(obj).reduce( (result, key) => ({ diff --git a/src/shared/utils/user.js b/src/shared/utils/user.js deleted file mode 100644 index 9654ba7c61..0000000000 --- a/src/shared/utils/user.js +++ /dev/null @@ -1,10 +0,0 @@ -// Reusable access control utility for deciding if a user has access to a repo. -export function userHasAccess({ privateRepo, isCurrentUserPartOfOrg }) { - if (!privateRepo) { - return true - } - if (privateRepo && isCurrentUserPartOfOrg) { - return true - } - return false -} diff --git a/src/shared/utils/user.test.js b/src/shared/utils/user.test.js deleted file mode 100644 index d03ce712b7..0000000000 --- a/src/shared/utils/user.test.js +++ /dev/null @@ -1,17 +0,0 @@ -import { userHasAccess } from './user' - -describe('user', () => { - describe.each` - privateRepo | isCurrentUserPartOfOrg | expected - ${false} | ${false} | ${true} - ${false} | ${true} | ${true} - ${true} | ${false} | ${false} - ${true} | ${true} | ${true} - `('userHasAccess', ({ privateRepo, isCurrentUserPartOfOrg, expected }) => { - it(`If the current user is part of the org (${isCurrentUserPartOfOrg}) and the repo is private ${privateRepo}`, () => { - expect(userHasAccess({ privateRepo, isCurrentUserPartOfOrg })).toBe( - expected - ) - }) - }) -})