mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-11-02 02:19:43 +00:00
perf(app): reduce redundant data fetching
Share bounded database pools across API repositories, consolidate sync and chat queries, and make mobile refreshes cache-aware and foreground-aware. Add focused regression coverage, client freshness documentation, and repository agent role configuration.
This commit is contained in:
1 parent
9957fa43f2
commit
c7ee8a4851
81 files changed
+4456
-1400
No files matched your search
@@ -0,0 +1,36 @@
|
||||
import { AppState } from 'react-native';
|
||||
import { isForeground, isForegroundState, subscribeToForeground } from '@/lib/appForeground';
|
||||
|
||||
describe('appForeground', () => {
|
||||
afterEach(() => jest.restoreAllMocks());
|
||||
|
||||
it('treats only background and inactive as away', () => {
|
||||
expect(isForegroundState('active')).toBe(true);
|
||||
expect(isForegroundState('background')).toBe(false);
|
||||
expect(isForegroundState('inactive')).toBe(false);
|
||||
// Unknown states — including whatever a test harness leaves behind — must
|
||||
// fail towards running, never towards disabling recurring work forever.
|
||||
expect(isForegroundState(undefined)).toBe(true);
|
||||
expect(isForegroundState('extension')).toBe(true);
|
||||
});
|
||||
|
||||
it('reads the current state and reports transitions until unsubscribed', () => {
|
||||
let emit: (state: string) => void = () => undefined;
|
||||
const remove = jest.fn();
|
||||
jest.spyOn(AppState, 'addEventListener').mockImplementation(((_: string, handler: (state: string) => void) => {
|
||||
emit = handler;
|
||||
return { remove } as never;
|
||||
}) as never);
|
||||
|
||||
expect(isForeground()).toBe(isForegroundState(AppState.currentState));
|
||||
|
||||
const seen: boolean[] = [];
|
||||
const unsubscribe = subscribeToForeground(value => seen.push(value));
|
||||
emit('background');
|
||||
emit('active');
|
||||
expect(seen).toEqual([false, true]);
|
||||
|
||||
unsubscribe();
|
||||
expect(remove).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@@ -24,6 +24,18 @@ describe('chatApi', () => {
|
||||
expect(apiClient.get).toHaveBeenNthCalledWith(2, '/v1/matches/match%2Fid/typing');
|
||||
});
|
||||
|
||||
it('encodes the delta cursor and folded typing request into the message query', async () => {
|
||||
(apiClient.get as jest.Mock).mockResolvedValue({ messages: [], removed_ids: [], server_time: 'now', complete: false });
|
||||
|
||||
await chatApi.listMessages('match1', { typing: true });
|
||||
await chatApi.listMessages('match1', { since: '2026-08-27T12:00:00.000+01:00' });
|
||||
await chatApi.listMessages('match1', { since: '2026-08-27T12:00:00.000Z', typing: true });
|
||||
|
||||
expect(apiClient.get).toHaveBeenNthCalledWith(1, '/v1/matches/match1/messages?typing=true');
|
||||
expect(apiClient.get).toHaveBeenNthCalledWith(2, '/v1/matches/match1/messages?since=2026-08-27T12%3A00%3A00.000%2B01%3A00');
|
||||
expect(apiClient.get).toHaveBeenNthCalledWith(3, '/v1/matches/match1/messages?since=2026-08-27T12%3A00%3A00.000Z&typing=true');
|
||||
});
|
||||
|
||||
it('uses authenticated unread, receipt, deletion and reporting routes', async () => {
|
||||
(apiClient.get as jest.Mock).mockResolvedValue({ total: 0, by_match: {} });
|
||||
(apiClient.post as jest.Mock).mockResolvedValue({});
|
||||
|
||||
Reference in new issue
Block a user