From 47bd84a8076e58c54e380f9f841f0a6d3edc3601 Mon Sep 17 00:00:00 2001 From: Oliver Lazoroski Date: Tue, 24 Mar 2026 14:41:48 +0100 Subject: [PATCH 01/31] chore: migrate mock-builders and simple tests to TypeScript MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Install @total-typescript/shoehorn for pragmatic test typing - Update tsconfig.test.json: broaden include, add jest-dom/vitest types - Update eslint.config.mjs: relax no-explicit-any and no-non-null-assertion for tests and mock-builders - Add @vitest/expect module augmentation for jest-dom + vitest-axe matchers (vitest 4.x moved Assertion interface to @vitest/expect) Phase 1 — Mock-builders (45 JS → TS): - Generators: typed with UserResponse, Attachment, ReactionResponse, ChannelMemberResponse, MessageResponse, PollResponse from stream-chat - API mocks: typed with StreamChat, MockedApiResponse interface - Event dispatchers: typed with StreamChat, Event types - Browser mocks: typed class properties and method signatures - Root files (index, utils, translator): typed with StreamChat, UserResponse Phase 2 Tier 1 — Simple tests (19 files): - 9 JSX → TSX: Avatar, Tooltip, EmptyStateIndicator, SafeAnchor, LoadingChannel, LoadingIndicator, LoadingChannels, InfiniteScroll, LoadMorePaginator - 10 JS → TS: DialogsManager, BehaviorSubject, Subject, useIsMounted, NotificationTranslationBuilder, TranslationBuilder, audioSampling, Attachment/utils, AudioPlayerPool, AudioPlayerNotificationsPlugin - Fixed type errors with pragmatic as-any casts for partial mocks, private property access, and missing required props --- .gitignore | 2 +- eslint.config.mjs | 4 +- package.json | 1 + src/@types/vitest-axe.d.ts | 9 + ...Sampling.test.js => audioSampling.test.ts} | 2 +- .../{utils.test.js => utils.test.ts} | 0 ...erPool.test.js => AudioPlayerPool.test.ts} | 6 +- ...=> AudioPlayerNotificationsPlugin.test.ts} | 27 +- .../{Avatar.test.jsx => Avatar.test.tsx} | 0 ...IsMounted.test.js => useIsMounted.test.ts} | 0 ...Manager.test.js => DialogsManager.test.ts} | 2 +- ....test.jsx => EmptyStateIndicator.test.tsx} | 0 ...croll.test.jsx => InfiniteScroll.test.tsx} | 18 +- ...or.test.jsx => LoadMorePaginator.test.tsx} | 7 +- ...annel.test.jsx => LoadingChannel.test.tsx} | 0 ...nels.test.jsx => LoadingChannels.test.tsx} | 0 ...tor.test.jsx => LoadingIndicator.test.tsx} | 0 .../LoadingChannel.test.tsx.snap | 98 +++++++ .../LoadingChannels.test.tsx.snap | 120 +++++++++ .../LoadingIndicator.test.tsx.snap | 26 ++ ...ubject.test.js => BehaviorSubject.test.ts} | 6 +- .../{Subject.test.js => Subject.test.ts} | 0 ...afeAnchor.test.jsx => SafeAnchor.test.tsx} | 2 +- .../{Tooltip.test.jsx => Tooltip.test.tsx} | 0 ...=> NotificationTranslationBuilder.test.ts} | 36 +-- ...der.test.js => TranslationBuilder.test.ts} | 39 +-- ...{translator.test.js => translator.test.ts} | 0 src/mock-builders/api/{error.js => error.ts} | 18 +- ...CreateChannel.js => getOrCreateChannel.ts} | 17 +- src/mock-builders/api/{index.js => index.ts} | 13 +- .../api/{markRead.js => markRead.ts} | 8 +- .../{queryChannels.js => queryChannels.ts} | 6 +- src/mock-builders/api/queryMembers.js | 16 -- src/mock-builders/api/queryMembers.ts | 16 ++ src/mock-builders/api/queryUsers.js | 16 -- src/mock-builders/api/queryUsers.ts | 16 ++ src/mock-builders/api/sendMessage.js | 16 -- src/mock-builders/api/sendMessage.ts | 18 ++ .../{threadReplies.js => threadReplies.ts} | 8 +- src/mock-builders/api/utils.js | 7 - src/mock-builders/api/utils.ts | 21 ++ .../{AnalyserNode.js => AnalyserNode.ts} | 0 .../{AudioContext.js => AudioContext.ts} | 3 - .../{EventEmitter.js => EventEmitter.ts} | 10 +- ...TMLMediaElement.js => HTMLMediaElement.ts} | 2 +- .../{MediaRecorder.js => MediaRecorder.ts} | 10 +- .../{ResizeObserver.js => ResizeObserver.ts} | 8 +- .../{dataavailable.js => dataavailable.ts} | 9 +- .../browser/{index.js => index.ts} | 0 src/mock-builders/event/channelDeleted.js | 7 - src/mock-builders/event/channelDeleted.ts | 9 + src/mock-builders/event/channelHidden.js | 7 - src/mock-builders/event/channelHidden.ts | 9 + src/mock-builders/event/channelTruncated.js | 7 - src/mock-builders/event/channelTruncated.ts | 9 + src/mock-builders/event/channelUpdated.js | 7 - src/mock-builders/event/channelUpdated.ts | 9 + src/mock-builders/event/channelVisible.js | 9 - src/mock-builders/event/channelVisible.ts | 11 + src/mock-builders/event/connectionChanged.js | 6 - src/mock-builders/event/connectionChanged.ts | 8 + .../event/connectionRecovered.js | 5 - .../event/connectionRecovered.ts | 7 + .../event/{index.js => index.ts} | 0 src/mock-builders/event/messageDeleted.js | 8 - src/mock-builders/event/messageDeleted.ts | 14 + src/mock-builders/event/messageNew.js | 11 - src/mock-builders/event/messageNew.ts | 17 ++ src/mock-builders/event/messageRead.js | 13 - src/mock-builders/event/messageRead.ts | 20 ++ src/mock-builders/event/messageUndeleted.js | 10 - src/mock-builders/event/messageUndeleted.ts | 16 ++ src/mock-builders/event/messageUpdated.js | 12 - src/mock-builders/event/messageUpdated.ts | 24 ++ .../event/notificationAddedToChannel.js | 7 - .../event/notificationAddedToChannel.ts | 9 + ...ionMarkRead.js => notificationMarkRead.ts} | 16 +- ...arkUnread.js => notificationMarkUnread.ts} | 16 +- .../event/notificationMessageNew.js | 7 - .../event/notificationMessageNew.ts | 9 + ...Updated.js => notificationMutesUpdated.ts} | 6 +- .../event/notificationRemovedFromChannel.js | 7 - .../event/notificationRemovedFromChannel.ts | 9 + src/mock-builders/event/userUpdated.js | 7 - src/mock-builders/event/userUpdated.ts | 9 + src/mock-builders/generator/attachment.js | 231 ---------------- src/mock-builders/generator/attachment.ts | 248 ++++++++++++++++++ .../generator/{index.js => index.ts} | 0 src/mock-builders/generator/member.js | 8 - src/mock-builders/generator/member.ts | 11 + .../generator/{message.js => message.ts} | 10 +- .../generator/{poll.js => poll.ts} | 64 +++-- .../generator/{reaction.js => reaction.ts} | 25 +- src/mock-builders/generator/reminder.ts | 2 +- src/mock-builders/generator/user.js | 13 - src/mock-builders/generator/user.ts | 15 ++ src/mock-builders/{index.js => index.ts} | 19 +- .../{translator.js => translator.ts} | 7 +- src/mock-builders/{utils.js => utils.ts} | 58 ++-- tsconfig.test.json | 13 +- yarn.lock | 5 + 101 files changed, 1110 insertions(+), 619 deletions(-) create mode 100644 src/@types/vitest-axe.d.ts rename src/components/Attachment/__tests__/{audioSampling.test.js => audioSampling.test.ts} (97%) rename src/components/Attachment/__tests__/{utils.test.js => utils.test.ts} (100%) rename src/components/AudioPlayback/__tests__/{AudioPlayerPool.test.js => AudioPlayerPool.test.ts} (97%) rename src/components/AudioPlayback/plugins/__tests__/{AudioPlayerNotificationsPlugin.test.js => AudioPlayerNotificationsPlugin.test.ts} (70%) rename src/components/Avatar/__tests__/{Avatar.test.jsx => Avatar.test.tsx} (100%) rename src/components/Channel/__tests__/{useIsMounted.test.js => useIsMounted.test.ts} (100%) rename src/components/Dialog/__tests__/{DialogsManager.test.js => DialogsManager.test.ts} (99%) rename src/components/EmptyStateIndicator/__tests__/{EmptyStateIndicator.test.jsx => EmptyStateIndicator.test.tsx} (100%) rename src/components/InfiniteScrollPaginator/__tests__/{InfiniteScroll.test.jsx => InfiniteScroll.test.tsx} (94%) rename src/components/LoadMore/__tests__/{LoadMorePaginator.test.jsx => LoadMorePaginator.test.tsx} (96%) rename src/components/Loading/__tests__/{LoadingChannel.test.jsx => LoadingChannel.test.tsx} (100%) rename src/components/Loading/__tests__/{LoadingChannels.test.jsx => LoadingChannels.test.tsx} (100%) rename src/components/Loading/__tests__/{LoadingIndicator.test.jsx => LoadingIndicator.test.tsx} (100%) create mode 100644 src/components/Loading/__tests__/__snapshots__/LoadingChannel.test.tsx.snap create mode 100644 src/components/Loading/__tests__/__snapshots__/LoadingChannels.test.tsx.snap create mode 100644 src/components/Loading/__tests__/__snapshots__/LoadingIndicator.test.tsx.snap rename src/components/MediaRecorder/observable/__tests__/{BehaviorSubject.test.js => BehaviorSubject.test.ts} (96%) rename src/components/MediaRecorder/observable/__tests__/{Subject.test.js => Subject.test.ts} (100%) rename src/components/SafeAnchor/__tests__/{SafeAnchor.test.jsx => SafeAnchor.test.tsx} (90%) rename src/components/Tooltip/__tests__/{Tooltip.test.jsx => Tooltip.test.tsx} (100%) rename src/i18n/__tests__/{NotificationTranslationBuilder.test.js => NotificationTranslationBuilder.test.ts} (86%) rename src/i18n/__tests__/{TranslationBuilder.test.js => TranslationBuilder.test.ts} (73%) rename src/mock-builders/__test__/{translator.test.js => translator.test.ts} (100%) rename src/mock-builders/api/{error.js => error.ts} (55%) rename src/mock-builders/api/{getOrCreateChannel.js => getOrCreateChannel.ts} (66%) rename src/mock-builders/api/{index.js => index.ts} (64%) rename src/mock-builders/api/{markRead.js => markRead.ts} (71%) rename src/mock-builders/api/{queryChannels.js => queryChannels.ts} (55%) delete mode 100644 src/mock-builders/api/queryMembers.js create mode 100644 src/mock-builders/api/queryMembers.ts delete mode 100644 src/mock-builders/api/queryUsers.js create mode 100644 src/mock-builders/api/queryUsers.ts delete mode 100644 src/mock-builders/api/sendMessage.js create mode 100644 src/mock-builders/api/sendMessage.ts rename src/mock-builders/api/{threadReplies.js => threadReplies.ts} (53%) delete mode 100644 src/mock-builders/api/utils.js create mode 100644 src/mock-builders/api/utils.ts rename src/mock-builders/browser/{AnalyserNode.js => AnalyserNode.ts} (100%) rename src/mock-builders/browser/{AudioContext.js => AudioContext.ts} (72%) rename src/mock-builders/browser/{EventEmitter.js => EventEmitter.ts} (58%) rename src/mock-builders/browser/{HTMLMediaElement.js => HTMLMediaElement.ts} (77%) rename src/mock-builders/browser/{MediaRecorder.js => MediaRecorder.ts} (76%) rename src/mock-builders/browser/{ResizeObserver.js => ResizeObserver.ts} (57%) rename src/mock-builders/browser/events/{dataavailable.js => dataavailable.ts} (65%) rename src/mock-builders/browser/{index.js => index.ts} (100%) delete mode 100644 src/mock-builders/event/channelDeleted.js create mode 100644 src/mock-builders/event/channelDeleted.ts delete mode 100644 src/mock-builders/event/channelHidden.js create mode 100644 src/mock-builders/event/channelHidden.ts delete mode 100644 src/mock-builders/event/channelTruncated.js create mode 100644 src/mock-builders/event/channelTruncated.ts delete mode 100644 src/mock-builders/event/channelUpdated.js create mode 100644 src/mock-builders/event/channelUpdated.ts delete mode 100644 src/mock-builders/event/channelVisible.js create mode 100644 src/mock-builders/event/channelVisible.ts delete mode 100644 src/mock-builders/event/connectionChanged.js create mode 100644 src/mock-builders/event/connectionChanged.ts delete mode 100644 src/mock-builders/event/connectionRecovered.js create mode 100644 src/mock-builders/event/connectionRecovered.ts rename src/mock-builders/event/{index.js => index.ts} (100%) delete mode 100644 src/mock-builders/event/messageDeleted.js create mode 100644 src/mock-builders/event/messageDeleted.ts delete mode 100644 src/mock-builders/event/messageNew.js create mode 100644 src/mock-builders/event/messageNew.ts delete mode 100644 src/mock-builders/event/messageRead.js create mode 100644 src/mock-builders/event/messageRead.ts delete mode 100644 src/mock-builders/event/messageUndeleted.js create mode 100644 src/mock-builders/event/messageUndeleted.ts delete mode 100644 src/mock-builders/event/messageUpdated.js create mode 100644 src/mock-builders/event/messageUpdated.ts delete mode 100644 src/mock-builders/event/notificationAddedToChannel.js create mode 100644 src/mock-builders/event/notificationAddedToChannel.ts rename src/mock-builders/event/{notificationMarkRead.js => notificationMarkRead.ts} (63%) rename src/mock-builders/event/{notificationMarkUnread.js => notificationMarkUnread.ts} (79%) delete mode 100644 src/mock-builders/event/notificationMessageNew.js create mode 100644 src/mock-builders/event/notificationMessageNew.ts rename src/mock-builders/event/{notificationMutesUpdated.js => notificationMutesUpdated.ts} (60%) delete mode 100644 src/mock-builders/event/notificationRemovedFromChannel.js create mode 100644 src/mock-builders/event/notificationRemovedFromChannel.ts delete mode 100644 src/mock-builders/event/userUpdated.js create mode 100644 src/mock-builders/event/userUpdated.ts delete mode 100644 src/mock-builders/generator/attachment.js create mode 100644 src/mock-builders/generator/attachment.ts rename src/mock-builders/generator/{index.js => index.ts} (100%) delete mode 100644 src/mock-builders/generator/member.js create mode 100644 src/mock-builders/generator/member.ts rename src/mock-builders/generator/{message.js => message.ts} (56%) rename src/mock-builders/generator/{poll.js => poll.ts} (82%) rename src/mock-builders/generator/{reaction.js => reaction.ts} (51%) delete mode 100644 src/mock-builders/generator/user.js create mode 100644 src/mock-builders/generator/user.ts rename src/mock-builders/{index.js => index.ts} (71%) rename src/mock-builders/{translator.js => translator.ts} (70%) rename src/mock-builders/{utils.js => utils.ts} (55%) diff --git a/.gitignore b/.gitignore index 3511449e03..c71f96e8d9 100644 --- a/.gitignore +++ b/.gitignore @@ -78,4 +78,4 @@ coverage.out # stream-chat-css/docusaurus files docusaurus/docs/React/theming docusaurus/docs/React/assets/stream-chat-css* -shared \ No newline at end of file +sharedtsconfig.test.tsbuildinfo diff --git a/eslint.config.mjs b/eslint.config.mjs index df77bd650c..860bd7d685 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -116,7 +116,7 @@ export default tseslint.config( }, { name: 'vitest', - files: ['src/**/__tests__/**'], + files: ['src/**/__tests__/**', 'src/mock-builders/**'], plugins: { vitest: vitestPlugin }, languageOptions: { globals: vitestPlugin.environments.env.globals, @@ -130,6 +130,8 @@ export default tseslint.config( 'vitest/no-hooks': 'off', 'vitest/prefer-spy-on': 'warn', '@typescript-eslint/no-empty-function': 'off', // explicitly disable for tests + '@typescript-eslint/no-explicit-any': 'off', // test mocks frequently need any + '@typescript-eslint/no-non-null-assertion': 'off', // DOM queries in tests commonly use ! }, }, ); diff --git a/package.json b/package.json index dcc03906b7..afdd3d1822 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,7 @@ "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", + "@total-typescript/shoehorn": "^0.1.2", "@types/hast": "^2.3.4", "@types/jsdom": "^21.1.5", "@types/linkifyjs": "^2.1.7", diff --git a/src/@types/vitest-axe.d.ts b/src/@types/vitest-axe.d.ts new file mode 100644 index 0000000000..9364d99168 --- /dev/null +++ b/src/@types/vitest-axe.d.ts @@ -0,0 +1,9 @@ +import type { TestingLibraryMatchers } from '@testing-library/jest-dom/matchers'; + +declare module '@vitest/expect' { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + interface Assertion + extends TestingLibraryMatchers { + toHaveNoViolations(): void; + } +} diff --git a/src/components/Attachment/__tests__/audioSampling.test.js b/src/components/Attachment/__tests__/audioSampling.test.ts similarity index 97% rename from src/components/Attachment/__tests__/audioSampling.test.js rename to src/components/Attachment/__tests__/audioSampling.test.ts index 3c0eaedbdb..5daf95556f 100644 --- a/src/components/Attachment/__tests__/audioSampling.test.js +++ b/src/components/Attachment/__tests__/audioSampling.test.ts @@ -1,6 +1,6 @@ import { downSample, upSample } from '../audioSampling'; -vi.spyOn(console, 'warn').mockImplementation(); +vi.spyOn(console, 'warn').mockImplementation(() => {}); const originalSample = Array.from({ length: 10 }, (_, i) => i); describe('amplitude sampling', () => { diff --git a/src/components/Attachment/__tests__/utils.test.js b/src/components/Attachment/__tests__/utils.test.ts similarity index 100% rename from src/components/Attachment/__tests__/utils.test.js rename to src/components/Attachment/__tests__/utils.test.ts diff --git a/src/components/AudioPlayback/__tests__/AudioPlayerPool.test.js b/src/components/AudioPlayback/__tests__/AudioPlayerPool.test.ts similarity index 97% rename from src/components/AudioPlayback/__tests__/AudioPlayerPool.test.js rename to src/components/AudioPlayback/__tests__/AudioPlayerPool.test.ts index 290c50d4eb..310ec2d5d7 100644 --- a/src/components/AudioPlayback/__tests__/AudioPlayerPool.test.js +++ b/src/components/AudioPlayback/__tests__/AudioPlayerPool.test.ts @@ -172,7 +172,7 @@ describe('AudioPlayerPool', () => { const player = makePlayer(pool, { id: 'o1', src: 'https://example.com/a.mp3' }); pool.acquireElement({ ownerId: player.id, src: player.src }); expect(pool.players).toHaveLength(1); - expect(Object.keys(pool.audios)).toHaveLength(0); + expect(Object.keys((pool as any).audios)).toHaveLength(0); pool.remove(player.id); expect(pool.players).toHaveLength(0); }); @@ -182,10 +182,10 @@ describe('AudioPlayerPool', () => { const player = makePlayer(pool, { id: 'o1', src: 'https://example.com/a.mp3' }); const element = pool.acquireElement({ ownerId: player.id, src: player.src }); expect(pool.players).toHaveLength(1); - expect(pool.audios.get(player.id)).toBe(element); + expect((pool as any).audios.get(player.id)).toBe(element); pool.remove(player.id); expect(pool.players).toHaveLength(0); - expect(Object.keys(pool.audios)).toHaveLength(0); + expect(Object.keys((pool as any).audios)).toHaveLength(0); }); it('sets active player only in single-playback mode', () => { diff --git a/src/components/AudioPlayback/plugins/__tests__/AudioPlayerNotificationsPlugin.test.js b/src/components/AudioPlayback/plugins/__tests__/AudioPlayerNotificationsPlugin.test.ts similarity index 70% rename from src/components/AudioPlayback/plugins/__tests__/AudioPlayerNotificationsPlugin.test.js rename to src/components/AudioPlayback/plugins/__tests__/AudioPlayerNotificationsPlugin.test.ts index 5245641161..a3d99c8503 100644 --- a/src/components/AudioPlayback/plugins/__tests__/AudioPlayerNotificationsPlugin.test.js +++ b/src/components/AudioPlayback/plugins/__tests__/AudioPlayerNotificationsPlugin.test.ts @@ -1,7 +1,7 @@ import { audioPlayerNotificationsPluginFactory } from '../AudioPlayerNotificationsPlugin'; describe('audioPlayerNotificationsPluginFactory', () => { - const t = (s) => s; + const t = (s: any) => s; const makeClient = () => { const addError = vi.fn(); @@ -13,10 +13,13 @@ describe('audioPlayerNotificationsPluginFactory', () => { it('reports mapped error messages for known errCodes', () => { const { addError, client } = makeClient(); - const plugin = audioPlayerNotificationsPluginFactory({ client, t }); + const plugin = audioPlayerNotificationsPluginFactory({ + client: client as any, + t: t as any, + }); // simulate failed-to-start - plugin.onError?.({ errCode: 'failed-to-start', player: {} }); + plugin.onError?.({ errCode: 'failed-to-start', player: {} as any }); expect(addError).toHaveBeenCalledTimes(1); let call = addError.mock.calls[0][0]; @@ -25,23 +28,26 @@ describe('audioPlayerNotificationsPluginFactory', () => { expect(call.origin.emitter).toBe('AudioPlayer'); // simulate not-playable - plugin.onError?.({ errCode: 'not-playable', player: {} }); + plugin.onError?.({ errCode: 'not-playable', player: {} as any }); call = addError.mock.calls[1][0]; expect(call.message).toBe( 'Recording format is not supported and cannot be reproduced', ); // simulate seek-not-supported - plugin.onError?.({ errCode: 'seek-not-supported', player: {} }); + plugin.onError?.({ errCode: 'seek-not-supported', player: {} as any }); call = addError.mock.calls[2][0]; expect(call.message).toBe('Cannot seek in the recording'); }); it('falls back to provided Error if no errCode', () => { const { addError, client } = makeClient(); - const plugin = audioPlayerNotificationsPluginFactory({ client, t }); + const plugin = audioPlayerNotificationsPluginFactory({ + client: client as any, + t: t as any, + }); - plugin.onError?.({ error: new Error('X-Error'), player: {} }); + plugin.onError?.({ error: new Error('X-Error'), player: {} as any }); const call = addError.mock.calls[0][0]; expect(call.message).toBe('X-Error'); @@ -49,9 +55,12 @@ describe('audioPlayerNotificationsPluginFactory', () => { it('falls back to generic message if no errCode and no Error', () => { const { addError, client } = makeClient(); - const plugin = audioPlayerNotificationsPluginFactory({ client, t }); + const plugin = audioPlayerNotificationsPluginFactory({ + client: client as any, + t: t as any, + }); - plugin.onError?.({ player: {} }); + plugin.onError?.({ player: {} as any }); const call = addError.mock.calls[0][0]; expect(call.message).toBe('Error reproducing the recording'); diff --git a/src/components/Avatar/__tests__/Avatar.test.jsx b/src/components/Avatar/__tests__/Avatar.test.tsx similarity index 100% rename from src/components/Avatar/__tests__/Avatar.test.jsx rename to src/components/Avatar/__tests__/Avatar.test.tsx diff --git a/src/components/Channel/__tests__/useIsMounted.test.js b/src/components/Channel/__tests__/useIsMounted.test.ts similarity index 100% rename from src/components/Channel/__tests__/useIsMounted.test.js rename to src/components/Channel/__tests__/useIsMounted.test.ts diff --git a/src/components/Dialog/__tests__/DialogsManager.test.js b/src/components/Dialog/__tests__/DialogsManager.test.ts similarity index 99% rename from src/components/Dialog/__tests__/DialogsManager.test.js rename to src/components/Dialog/__tests__/DialogsManager.test.ts index edb74bc814..d9d478260a 100644 --- a/src/components/Dialog/__tests__/DialogsManager.test.js +++ b/src/components/Dialog/__tests__/DialogsManager.test.ts @@ -38,7 +38,7 @@ describe('DialogManager', () => { it('retrieves an existing dialog', () => { const dialogManager = new DialogManager(); - dialogManager.state.next((current) => ({ + (dialogManager.state as any).next((current: any) => ({ ...current, dialogsById: { ...current.dialogsById, [dialogId]: { id: dialogId, isOpen: true } }, })); diff --git a/src/components/EmptyStateIndicator/__tests__/EmptyStateIndicator.test.jsx b/src/components/EmptyStateIndicator/__tests__/EmptyStateIndicator.test.tsx similarity index 100% rename from src/components/EmptyStateIndicator/__tests__/EmptyStateIndicator.test.jsx rename to src/components/EmptyStateIndicator/__tests__/EmptyStateIndicator.test.tsx diff --git a/src/components/InfiniteScrollPaginator/__tests__/InfiniteScroll.test.jsx b/src/components/InfiniteScrollPaginator/__tests__/InfiniteScroll.test.tsx similarity index 94% rename from src/components/InfiniteScrollPaginator/__tests__/InfiniteScroll.test.jsx rename to src/components/InfiniteScrollPaginator/__tests__/InfiniteScroll.test.tsx index 47ff8191e8..ff82f10944 100644 --- a/src/components/InfiniteScrollPaginator/__tests__/InfiniteScroll.test.jsx +++ b/src/components/InfiniteScrollPaginator/__tests__/InfiniteScroll.test.tsx @@ -122,16 +122,14 @@ describe('InfiniteScroll', () => { ); describe('Rendering loader', () => { - const getRenderResult = () => - render( - loader} - loadPreviousPage={loadPreviousPage} - > - Content - , - ); + const getRenderResult = () => { + const props = { + isLoading: true, + loader:
loader
, + loadPreviousPage, + } as any; + return render(Content); + }; it('should render the loader in the right place if queryInProgress is true', () => { const { container } = getRenderResult(); expect(container).toMatchInlineSnapshot(` diff --git a/src/components/LoadMore/__tests__/LoadMorePaginator.test.jsx b/src/components/LoadMore/__tests__/LoadMorePaginator.test.tsx similarity index 96% rename from src/components/LoadMore/__tests__/LoadMorePaginator.test.jsx rename to src/components/LoadMore/__tests__/LoadMorePaginator.test.tsx index 3b2f1aac3f..a38a288653 100644 --- a/src/components/LoadMore/__tests__/LoadMorePaginator.test.jsx +++ b/src/components/LoadMore/__tests__/LoadMorePaginator.test.tsx @@ -103,11 +103,8 @@ describe('LoadMorePaginator', () => { it('should pass undefined props to LoadMoreButton if missing', async () => { const LoadMoreButton = vi.fn(() =>
); - render( - - children - , - ); + const props = { hasNextPage: true, LoadMoreButton } as any; + render(children); await waitFor(() => { expect(LoadMoreButton).toHaveBeenCalledWith( diff --git a/src/components/Loading/__tests__/LoadingChannel.test.jsx b/src/components/Loading/__tests__/LoadingChannel.test.tsx similarity index 100% rename from src/components/Loading/__tests__/LoadingChannel.test.jsx rename to src/components/Loading/__tests__/LoadingChannel.test.tsx diff --git a/src/components/Loading/__tests__/LoadingChannels.test.jsx b/src/components/Loading/__tests__/LoadingChannels.test.tsx similarity index 100% rename from src/components/Loading/__tests__/LoadingChannels.test.jsx rename to src/components/Loading/__tests__/LoadingChannels.test.tsx diff --git a/src/components/Loading/__tests__/LoadingIndicator.test.jsx b/src/components/Loading/__tests__/LoadingIndicator.test.tsx similarity index 100% rename from src/components/Loading/__tests__/LoadingIndicator.test.jsx rename to src/components/Loading/__tests__/LoadingIndicator.test.tsx diff --git a/src/components/Loading/__tests__/__snapshots__/LoadingChannel.test.tsx.snap b/src/components/Loading/__tests__/__snapshots__/LoadingChannel.test.tsx.snap new file mode 100644 index 0000000000..cd382f2286 --- /dev/null +++ b/src/components/Loading/__tests__/__snapshots__/LoadingChannel.test.tsx.snap @@ -0,0 +1,98 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`LoadingChannel > should render component with default props 1`] = ` +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+`; diff --git a/src/components/Loading/__tests__/__snapshots__/LoadingChannels.test.tsx.snap b/src/components/Loading/__tests__/__snapshots__/LoadingChannels.test.tsx.snap new file mode 100644 index 0000000000..0211c030d1 --- /dev/null +++ b/src/components/Loading/__tests__/__snapshots__/LoadingChannels.test.tsx.snap @@ -0,0 +1,120 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`LoadingChannels > should render component with default props 1`] = ` +
+
+
+