| import { QueryClient, InfiniteData } from '@tanstack/react-query'; |
| import type { TConversation } from 'librechat-data-provider'; |
| import { |
| dateKeys, |
| storeEndpointSettings, |
| addConversationToInfinitePages, |
| updateInfiniteConvoPage, |
| findConversationInInfinite, |
| removeConvoFromInfinitePages, |
| groupConversationsByDate, |
| updateConvoFieldsInfinite, |
| addConvoToAllQueries, |
| updateConvoInAllQueries, |
| removeConvoFromAllQueries, |
| addConversationToAllConversationsQueries, |
| } from './convos'; |
| import { normalizeData } from './collection'; |
|
|
| jest.mock('date-fns', () => { |
| const actual = jest.requireActual('date-fns'); |
| return { |
| ...actual, |
| startOfToday: jest.fn(() => new Date('2023-07-15T00:00:00Z')), |
| }; |
| }); |
|
|
| describe('Conversation Utilities', () => { |
| describe('groupConversationsByDate', () => { |
| it('groups conversations by date correctly', () => { |
| const conversations = [ |
| { conversationId: '1', updatedAt: '2023-04-01T12:00:00Z' }, |
| { conversationId: '2', updatedAt: new Date().toISOString() }, |
| { conversationId: '3', updatedAt: new Date(Date.now() - 86400000).toISOString() }, |
| { conversationId: '4', updatedAt: new Date(Date.now() - 86400000 * 2).toISOString() }, |
| { conversationId: '5', updatedAt: new Date(Date.now() - 86400000 * 8).toISOString() }, |
| ]; |
| const grouped = groupConversationsByDate(conversations as TConversation[]); |
| expect(grouped[0][0]).toBe(dateKeys.today); |
| expect(grouped[0][1]).toHaveLength(1); |
| expect(grouped[1][0]).toBe(dateKeys.yesterday); |
| expect(grouped[1][1]).toHaveLength(1); |
| expect(grouped[2][0]).toBe(dateKeys.previous7Days); |
| expect(grouped[2][1]).toHaveLength(1); |
| expect(grouped[3][0]).toBe(dateKeys.previous30Days); |
| expect(grouped[3][1]).toHaveLength(1); |
| expect(grouped[4][0]).toBe(' 2023'); |
| expect(grouped[4][1]).toHaveLength(1); |
| }); |
|
|
| it('skips conversations with duplicate conversationIds', () => { |
| const conversations = [ |
| { conversationId: '1', updatedAt: '2023-12-01T12:00:00Z' }, |
| { conversationId: '2', updatedAt: '2023-11-25T12:00:00Z' }, |
| { conversationId: '1', updatedAt: '2023-11-20T12:00:00Z' }, |
| { conversationId: '3', updatedAt: '2022-12-01T12:00:00Z' }, |
| ]; |
|
|
| const grouped = groupConversationsByDate(conversations as TConversation[]); |
|
|
| expect(grouped).toEqual( |
| expect.arrayContaining([ |
| [' 2023', expect.arrayContaining([conversations[0], conversations[1]])], |
| [' 2022', expect.arrayContaining([conversations[3]])], |
| ]), |
| ); |
|
|
| |
| const allGroupedIds = grouped.flatMap(([, convs]) => convs.map((c) => c.conversationId)); |
| const uniqueIds = [...new Set(allGroupedIds)]; |
| expect(allGroupedIds.length).toBe(uniqueIds.length); |
| }); |
|
|
| it('sorts conversations by month correctly', () => { |
| const conversations = [ |
| { conversationId: '1', updatedAt: '2023-01-01T12:00:00Z' }, |
| { conversationId: '2', updatedAt: '2023-12-01T12:00:00Z' }, |
| { conversationId: '3', updatedAt: '2023-02-01T12:00:00Z' }, |
| { conversationId: '4', updatedAt: '2023-11-01T12:00:00Z' }, |
| { conversationId: '5', updatedAt: '2022-12-01T12:00:00Z' }, |
| ]; |
|
|
| const grouped = groupConversationsByDate(conversations as TConversation[]); |
|
|
| |
| const expectedGroups = [' 2023', ' 2022']; |
| expect(grouped.map(([key]) => key)).toEqual(expectedGroups); |
|
|
| |
| const conversationsIn2023 = grouped[0][1]; |
| const sorted = [...conversationsIn2023].sort( |
| (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(), |
| ); |
| expect(conversationsIn2023).toEqual(sorted); |
|
|
| |
| expect(grouped[1][1].length).toBe(1); |
| expect(new Date(grouped[1][1][0].updatedAt).getFullYear()).toBe(2022); |
| }); |
|
|
| it('handles conversations from multiple years correctly', () => { |
| const conversations = [ |
| { conversationId: '1', updatedAt: '2023-01-01T12:00:00Z' }, |
| { conversationId: '2', updatedAt: '2022-12-01T12:00:00Z' }, |
| { conversationId: '3', updatedAt: '2021-06-01T12:00:00Z' }, |
| { conversationId: '4', updatedAt: '2023-06-01T12:00:00Z' }, |
| { conversationId: '5', updatedAt: '2021-12-01T12:00:00Z' }, |
| ]; |
|
|
| const grouped = groupConversationsByDate(conversations as TConversation[]); |
|
|
| expect(grouped.map(([key]) => key)).toEqual([' 2023', ' 2022', ' 2021']); |
| expect(grouped[0][1].map((c) => new Date(c.updatedAt).getFullYear())).toEqual([2023, 2023]); |
| expect(grouped[1][1].map((c) => new Date(c.updatedAt).getFullYear())).toEqual([2022]); |
| expect(grouped[2][1].map((c) => new Date(c.updatedAt).getFullYear())).toEqual([2021, 2021]); |
| }); |
|
|
| it('handles conversations from the same month correctly', () => { |
| const conversations = [ |
| { conversationId: '1', updatedAt: '2023-06-01T12:00:00Z' }, |
| { conversationId: '2', updatedAt: '2023-06-15T12:00:00Z' }, |
| { conversationId: '3', updatedAt: '2023-06-30T12:00:00Z' }, |
| ]; |
|
|
| const grouped = groupConversationsByDate(conversations as TConversation[]); |
|
|
| expect(grouped.length).toBe(1); |
| expect(grouped[0][0]).toBe(' 2023'); |
| expect(grouped[0][1].map((c) => c.conversationId)).toEqual(['3', '2', '1']); |
| }); |
|
|
| it('handles conversations with null or undefined updatedAt correctly', () => { |
| const conversations = [ |
| { conversationId: '1', updatedAt: '2023-06-01T12:00:00Z' }, |
| { conversationId: '2', updatedAt: null }, |
| { conversationId: '3', updatedAt: undefined }, |
| ]; |
|
|
| const grouped = groupConversationsByDate(conversations as TConversation[]); |
|
|
| expect(grouped.length).toBe(2); |
| expect(grouped[0][0]).toBe(dateKeys.today); |
| expect(grouped[0][1].length).toBe(2); |
| expect(grouped[1][0]).toBe(' 2023'); |
| expect(grouped[1][1].length).toBe(1); |
| }); |
|
|
| it('correctly groups and sorts conversations for every month of the year', () => { |
| const months = [ |
| 'january', |
| 'february', |
| 'march', |
| 'april', |
| 'may', |
| 'june', |
| 'july', |
| 'august', |
| 'september', |
| 'october', |
| 'november', |
| 'december', |
| ]; |
|
|
| |
| const conversations = months.flatMap((month, index) => [ |
| { |
| conversationId: `2023-${month}`, |
| updatedAt: `2023-${String(index + 1).padStart(2, '0')}-15T12:00:00Z`, |
| }, |
| { |
| conversationId: `2022-${month}`, |
| updatedAt: `2022-${String(index + 1).padStart(2, '0')}-15T12:00:00Z`, |
| }, |
| ]); |
|
|
| const grouped = groupConversationsByDate(conversations as TConversation[]); |
|
|
| |
| const group2023 = grouped.find(([key]) => key === ' 2023'); |
| expect(group2023).toBeDefined(); |
| expect(group2023![1].length).toBe(12); |
|
|
| |
| const group2022 = grouped.find(([key]) => key === ' 2022'); |
| expect(group2022).toBeDefined(); |
| expect(group2022![1].length).toBe(12); |
|
|
| |
| const totalGroupedConversations = grouped.reduce( |
| (total, [_, convos]) => total + convos.length, |
| 0, |
| ); |
| expect(totalGroupedConversations).toBe(conversations.length); |
| }); |
| }); |
|
|
| describe('normalizeConversationData', () => { |
| it('normalizes the number of items on each page after data removal', () => { |
| |
| |
| |
| const conversations = Array.from({ length: 15 }, (_, i) => ({ |
| conversationId: (i + 1).toString(), |
| updatedAt: new Date(Date.now() - 86400000 * i).toISOString(), |
| })); |
|
|
| |
| |
| const pageSize = 5; |
| const totalPageNumber = Math.ceil(conversations.length / pageSize); |
|
|
| const paginatedData = Array.from({ length: totalPageNumber }, (_, index) => ({ |
| conversations: conversations.slice(index * pageSize, (index + 1) * pageSize), |
| pages: totalPageNumber, |
| pageNumber: index + 1, |
| pageSize, |
| })); |
|
|
| const testData = { pages: paginatedData, pageParams: [null, 2, 3] }; |
|
|
| |
| testData.pages[0].conversations.splice(1, 1); |
| expect(testData.pages[0].conversations).toHaveLength(4); |
| expect(testData.pages[1].conversations).toHaveLength(5); |
| expect(testData.pages[2].conversations).toHaveLength(5); |
|
|
| |
| |
| const normalizedData = normalizeData(testData, 'conversations', pageSize); |
|
|
| |
| |
| |
| |
| expect(normalizedData.pages[0].conversations).toHaveLength(5); |
| expect(normalizedData.pages[0].conversations[0].conversationId).toBe('1'); |
| expect(normalizedData.pages[0].conversations[4].conversationId).toBe('6'); |
|
|
| expect(normalizedData.pages[1].conversations).toHaveLength(5); |
| expect(normalizedData.pages[1].conversations[0].conversationId).toBe('7'); |
| expect(normalizedData.pages[1].conversations[4].conversationId).toBe('11'); |
|
|
| expect(normalizedData.pages[2].conversations).toHaveLength(4); |
| expect(normalizedData.pages[2].conversations[0].conversationId).toBe('12'); |
| expect(normalizedData.pages[2].conversations[3].conversationId).toBe('15'); |
| }); |
|
|
| it('normalizes the number of items on each page after data addition', () => { |
| |
| |
| |
| const conversations = Array.from({ length: 15 }, (_, i) => ({ |
| conversationId: (i + 1).toString(), |
| updatedAt: new Date(Date.now() - 86400000 * i).toISOString(), |
| })); |
|
|
| |
| |
| |
| const pageSize = 5; |
| const totalPageNumber = Math.ceil(conversations.length / pageSize); |
|
|
| const paginatedData = Array.from({ length: totalPageNumber }, (_, index) => ({ |
| conversations: conversations.slice(index * pageSize, (index + 1) * pageSize), |
| pages: totalPageNumber, |
| pageNumber: index + 1, |
| pageSize, |
| })); |
|
|
| const testData = { pages: paginatedData, pageParams: [null, 2, 3] }; |
|
|
| |
| testData.pages[0].conversations.unshift({ |
| conversationId: '16', |
| updatedAt: new Date().toISOString(), |
| }); |
|
|
| |
| |
| expect(testData.pages[0].conversations).toHaveLength(6); |
| expect(testData.pages[1].conversations).toHaveLength(5); |
| expect(testData.pages[2].conversations).toHaveLength(5); |
| expect(testData.pages[2].conversations[4].conversationId).toBe('15'); |
| expect(testData.pages).toHaveLength(3); |
|
|
| const normalizedData = normalizeData(testData, 'conversations', pageSize); |
|
|
| |
| |
| expect(normalizedData.pages[0].conversations).toHaveLength(5); |
| expect(normalizedData.pages[1].conversations).toHaveLength(5); |
| expect(normalizedData.pages[2].conversations).toHaveLength(5); |
| expect(normalizedData.pages).toHaveLength(3); |
|
|
| |
|
|
| expect(normalizedData.pages[0].conversations[0].conversationId).toBe('16'); |
| expect(normalizedData.pages[0].conversations[4].conversationId).toBe('4'); |
|
|
| expect(normalizedData.pages[1].conversations[0].conversationId).toBe('5'); |
| expect(normalizedData.pages[1].conversations[4].conversationId).toBe('9'); |
|
|
| expect(normalizedData.pages[2].conversations[0].conversationId).toBe('10'); |
| expect(normalizedData.pages[2].conversations[4].conversationId).toBe('14'); |
| expect(normalizedData.pageParams).toHaveLength(3); |
| }); |
|
|
| it('returns empty data when there is no data', () => { |
| const normalizedData = normalizeData( |
| { pages: [{ conversations: [], pageNumber: 1, pageSize: 5, pages: 1 }], pageParams: [] }, |
| 'conversations', |
| 5, |
| ); |
|
|
| expect(normalizedData.pages[0].conversations).toHaveLength(0); |
| }); |
|
|
| it('does not normalize data when not needed', () => { |
| const normalizedData = normalizeData( |
| { pages: [{ conversations: ['1'], pageNumber: 1, pageSize: 5, pages: 1 }], pageParams: [] }, |
| 'conversations', |
| 5, |
| ); |
|
|
| expect(normalizedData.pages[0].conversations).toHaveLength(1); |
| }); |
|
|
| it('deletes pages that have no data as a result of normalization', () => { |
| const conversations = Array.from({ length: 15 }, (_, i) => ({ |
| conversationId: (i + 1).toString(), |
| updatedAt: new Date(Date.now() - 86400000 * i).toISOString(), |
| })); |
|
|
| const pageSize = 5; |
| const totalPageNumber = Math.ceil(conversations.length / pageSize); |
|
|
| const paginatedData = Array.from({ length: totalPageNumber }, (_, index) => ({ |
| conversations: conversations.slice(index * pageSize, (index + 1) * pageSize), |
| pages: totalPageNumber, |
| pageNumber: index + 1, |
| pageSize, |
| })); |
|
|
| const testData = { pages: paginatedData, pageParams: [null, 2, 3] }; |
|
|
| |
| testData.pages[2].conversations = []; |
| expect(testData.pages[0].conversations).toHaveLength(5); |
| expect(testData.pages[1].conversations).toHaveLength(5); |
| expect(testData.pages[2].conversations).toHaveLength(0); |
| expect(testData.pageParams).toHaveLength(3); |
|
|
| const normalizedData = normalizeData(testData, 'conversations', pageSize); |
|
|
| |
| |
| expect(normalizedData.pages).toHaveLength(2); |
| expect(normalizedData.pages[0].conversations).toHaveLength(5); |
| expect(normalizedData.pages[1].conversations).toHaveLength(5); |
| expect(normalizedData.pageParams).toHaveLength(2); |
| }); |
| }); |
|
|
| describe('InfiniteData helpers', () => { |
| const makeConversation = (id: string, updatedAt?: string) => ({ |
| conversationId: id, |
| updatedAt: updatedAt || new Date().toISOString(), |
| }); |
|
|
| const makePage = (conversations: any[], nextCursor: string | null = null) => ({ |
| conversations, |
| nextCursor, |
| }); |
|
|
| describe('findConversationInInfinite', () => { |
| it('finds a conversation by id in InfiniteData', () => { |
| const data = { |
| pages: [ |
| makePage([makeConversation('1'), makeConversation('2')]), |
| makePage([makeConversation('3')]), |
| ], |
| pageParams: [], |
| }; |
| const found = findConversationInInfinite(data, '2'); |
| expect(found).toBeDefined(); |
| expect(found?.conversationId).toBe('2'); |
| }); |
|
|
| it('returns undefined if conversation not found', () => { |
| const data = { |
| pages: [makePage([makeConversation('1')])], |
| pageParams: [], |
| }; |
| expect(findConversationInInfinite(data, 'notfound')).toBeUndefined(); |
| }); |
|
|
| it('returns undefined if data is undefined', () => { |
| expect(findConversationInInfinite(undefined, '1')).toBeUndefined(); |
| }); |
| }); |
|
|
| describe('updateInfiniteConvoPage', () => { |
| it('updates a conversation in InfiniteData', () => { |
| const data = { |
| pages: [makePage([makeConversation('1', '2023-01-01T00:00:00Z'), makeConversation('2')])], |
| pageParams: [], |
| }; |
| const updater = (c: any) => ({ ...c, updatedAt: '2024-01-01T00:00:00Z' }); |
| const updated = updateInfiniteConvoPage(data, '1', updater); |
| expect(updated?.pages[0].conversations[0].updatedAt).toBe('2024-01-01T00:00:00Z'); |
| }); |
|
|
| it('returns original data if conversation not found', () => { |
| const data = { |
| pages: [makePage([makeConversation('1')])], |
| pageParams: [], |
| }; |
| const updater = (c: any) => ({ ...c, foo: 'bar' }); |
| const updated = updateInfiniteConvoPage(data, 'notfound', updater); |
| expect(updated).toEqual(data); |
| }); |
|
|
| it('returns undefined if data is undefined', () => { |
| expect(updateInfiniteConvoPage(undefined, '1', (c) => c)).toBeUndefined(); |
| }); |
| }); |
|
|
| describe('addConversationToInfinitePages', () => { |
| it('adds a conversation to the first page', () => { |
| const data = { |
| pages: [makePage([makeConversation('1')])], |
| pageParams: [], |
| }; |
| const newConvo = makeConversation('new'); |
| const updated = addConversationToInfinitePages(data, newConvo as TConversation); |
| expect(updated.pages[0].conversations[0].conversationId).toBe('new'); |
| expect(updated.pages[0].conversations[1].conversationId).toBe('1'); |
| }); |
|
|
| it('creates new InfiniteData if data is undefined', () => { |
| const newConvo = makeConversation('new'); |
| const updated = addConversationToInfinitePages(undefined, newConvo as TConversation); |
| expect(updated.pages[0].conversations[0].conversationId).toBe('new'); |
| expect(updated.pageParams).toEqual([undefined]); |
| }); |
| }); |
|
|
| describe('removeConvoFromInfinitePages', () => { |
| it('removes a conversation by id', () => { |
| const data = { |
| pages: [ |
| makePage([makeConversation('1'), makeConversation('2')]), |
| makePage([makeConversation('3')]), |
| ], |
| pageParams: [], |
| }; |
| const updated = removeConvoFromInfinitePages(data, '2'); |
| expect(updated?.pages[0].conversations.map((c) => c.conversationId)).toEqual(['1']); |
| }); |
|
|
| it('removes empty pages after deletion', () => { |
| const data = { |
| pages: [makePage([makeConversation('1')]), makePage([makeConversation('2')])], |
| pageParams: [], |
| }; |
| const updated = removeConvoFromInfinitePages(data, '2'); |
| expect(updated?.pages.length).toBe(1); |
| expect(updated?.pages[0].conversations[0].conversationId).toBe('1'); |
| }); |
|
|
| it('returns original data if data is undefined', () => { |
| expect(removeConvoFromInfinitePages(undefined, '1')).toBeUndefined(); |
| }); |
| }); |
|
|
| describe('updateConvoFieldsInfinite', () => { |
| it('updates fields and bumps to front if keepPosition is false', () => { |
| const data = { |
| pages: [ |
| makePage([makeConversation('1'), makeConversation('2')]), |
| makePage([makeConversation('3')]), |
| ], |
| pageParams: [], |
| }; |
| const updated = updateConvoFieldsInfinite( |
| data, |
| { conversationId: '2', title: 'new' }, |
| false, |
| ); |
| expect(updated?.pages[0].conversations[0].conversationId).toBe('2'); |
| expect(updated?.pages[0].conversations[0].title).toBe('new'); |
| }); |
|
|
| it('updates fields and keeps position if keepPosition is true', () => { |
| const data = { |
| pages: [makePage([makeConversation('1'), makeConversation('2')])], |
| pageParams: [], |
| }; |
| const updated = updateConvoFieldsInfinite( |
| data, |
| { conversationId: '2', title: 'stay' }, |
| true, |
| ); |
| expect(updated?.pages[0].conversations[1].title).toBe('stay'); |
| }); |
|
|
| it('returns original data if conversation not found', () => { |
| const data = { |
| pages: [makePage([makeConversation('1')])], |
| pageParams: [], |
| }; |
| const updated = updateConvoFieldsInfinite( |
| data, |
| { conversationId: 'notfound', title: 'x' }, |
| false, |
| ); |
| expect(updated).toEqual(data); |
| }); |
|
|
| it('returns original data if data is undefined', () => { |
| expect( |
| updateConvoFieldsInfinite(undefined, { conversationId: '1', title: 'x' }, false), |
| ).toBeUndefined(); |
| }); |
| }); |
|
|
| describe('storeEndpointSettings', () => { |
| beforeEach(() => { |
| localStorage.clear(); |
| }); |
|
|
| it('stores model for endpoint', () => { |
| const conversation = { |
| conversationId: '1', |
| endpoint: 'openAI', |
| model: 'gpt-3', |
| }; |
| storeEndpointSettings(conversation as any); |
| const stored = JSON.parse(localStorage.getItem('lastModel') || '{}'); |
| expect([undefined, 'gpt-3']).toContain(stored.openAI); |
| }); |
|
|
| it('stores secondaryModel for gptPlugins endpoint', () => { |
| const conversation = { |
| conversationId: '1', |
| endpoint: 'gptPlugins', |
| model: 'gpt-4', |
| agentOptions: { model: 'plugin-model' }, |
| }; |
| storeEndpointSettings(conversation as any); |
| const stored = JSON.parse(localStorage.getItem('lastModel') || '{}'); |
| expect([undefined, 'gpt-4']).toContain(stored.gptPlugins); |
| expect([undefined, 'plugin-model']).toContain(stored.secondaryModel); |
| }); |
|
|
| it('does nothing if conversation is null', () => { |
| storeEndpointSettings(null); |
| expect(localStorage.getItem('lastModel')).toBeNull(); |
| }); |
|
|
| it('does nothing if endpoint is missing', () => { |
| storeEndpointSettings({ conversationId: '1', model: 'x' } as any); |
| expect(localStorage.getItem('lastModel')).toBeNull(); |
| }); |
| }); |
|
|
| describe('QueryClient helpers', () => { |
| let queryClient: QueryClient; |
| let convoA: TConversation; |
| let convoB: TConversation; |
|
|
| beforeEach(() => { |
| queryClient = new QueryClient(); |
| convoA = { |
| conversationId: 'a', |
| updatedAt: '2024-01-01T12:00:00Z', |
| createdAt: '2024-01-01T10:00:00Z', |
| endpoint: 'openAI', |
| model: 'gpt-3', |
| title: 'Conversation A', |
| } as TConversation; |
| convoB = { |
| conversationId: 'b', |
| updatedAt: '2024-01-02T12:00:00Z', |
| endpoint: 'openAI', |
| model: 'gpt-3', |
| } as TConversation; |
| queryClient.setQueryData(['allConversations'], { |
| pages: [{ conversations: [convoA], nextCursor: null }], |
| pageParams: [], |
| }); |
| }); |
|
|
| it('addConvoToAllQueries adds new on top if not present', () => { |
| addConvoToAllQueries(queryClient, convoB); |
| const data = queryClient.getQueryData<InfiniteData<any>>(['allConversations']); |
| expect(data!.pages[0].conversations[0].conversationId).toBe('b'); |
| expect(data!.pages[0].conversations.length).toBe(2); |
| }); |
|
|
| it('addConvoToAllQueries does not duplicate', () => { |
| addConvoToAllQueries(queryClient, convoA); |
| const data = queryClient.getQueryData<InfiniteData<any>>(['allConversations']); |
| expect(data!.pages[0].conversations.filter((c) => c.conversationId === 'a').length).toBe(1); |
| }); |
|
|
| it('updateConvoInAllQueries updates correct convo', () => { |
| updateConvoInAllQueries(queryClient, 'a', (c) => ({ ...c, model: 'gpt-4' })); |
| const data = queryClient.getQueryData<InfiniteData<any>>(['allConversations']); |
| expect(data!.pages[0].conversations[0].model).toBe('gpt-4'); |
| }); |
|
|
| it('removeConvoFromAllQueries deletes conversation', () => { |
| removeConvoFromAllQueries(queryClient, 'a'); |
| const data = queryClient.getQueryData<InfiniteData<any>>(['allConversations']); |
| expect(data!.pages.length).toBe(0); |
| }); |
|
|
| it('addConversationToAllConversationsQueries works with multiple pages', () => { |
| queryClient.setQueryData(['allConversations', 'other'], { |
| pages: [{ conversations: [], nextCursor: null }], |
| pageParams: [], |
| }); |
| addConversationToAllConversationsQueries(queryClient, convoB); |
|
|
| const mainData = queryClient.getQueryData<InfiniteData<any>>(['allConversations']); |
| const otherData = queryClient.getQueryData<InfiniteData<any>>([ |
| 'allConversations', |
| 'other', |
| ]); |
| expect(mainData!.pages[0].conversations[0].conversationId).toBe('b'); |
| expect(otherData!.pages[0].conversations[0].conversationId).toBe('b'); |
| }); |
| }); |
| }); |
| }); |
|
|