Stop Matrix refresh loop when login is unavailable

This commit is contained in:
jjbrunton committed 2026-08-08 15:41:02 +01:00
1 parent 674cd89cd7
commit 4db6de8bf5
2 files changed
+73 -3

No files matched your search

+52 -2
View File
@@ -1,4 +1,4 @@
import { describe, it, expect } from 'vitest';
import { describe, it, expect, vi } from 'vitest';
import os from 'os';
import path from 'path';
import Database from 'better-sqlite3';
@@ -6,7 +6,7 @@ import { runMigrations } from '../src/database/client.js';
import { RedditUsersRepository } from '../src/database/repositories.js';
import { ChatService } from '../src/services/chat/service.js';
import { ChatCache } from '../src/services/chat/cache.js';
import { MatrixClient } from '../src/services/chat/matrix/client.js';
import { MatrixAuthError, MatrixClient } from '../src/services/chat/matrix/client.js';
import { createMockLogger } from './mockLogger.js';
const creds = {
@@ -103,4 +103,54 @@ describe('ChatService username persistence', () => {
expect(chats[0].roomName).toBe('alice');
db.close();
});
it('aborts username enrichment after one failed token refresh', async () => {
const logger = createMockLogger();
const cache = tmpCache(logger);
cache.set([
{
username: 'unknown',
roomName: 'unknown',
lastMessageTime: Date.now(),
lastMessageSnippet: '',
isFromUs: false,
unread: false,
roomId: '!first:reddit.com',
messages: [],
},
{
username: 'unknown',
roomName: 'unknown',
lastMessageTime: Date.now(),
lastMessageSnippet: '',
isFromUs: false,
unread: false,
roomId: '!second:reddit.com',
messages: [],
},
]);
const matrix = buildMatrix();
matrix.getRoomFullState = vi.fn().mockRejectedValue(new MatrixAuthError('expired'));
matrix.getRoomMessages = vi.fn().mockRejectedValue(new MatrixAuthError('expired'));
const tokenRefresher = {
refresh: vi.fn().mockRejectedValue(new Error('interactive login required')),
};
const usernameResolver = { resolveT2Ids: vi.fn().mockResolvedValue({}) };
const svc = new ChatService(
matrix,
logger,
undefined,
undefined,
tokenRefresher,
usernameResolver,
cache,
);
await svc.enrichUsernames();
expect(tokenRefresher.refresh).toHaveBeenCalledOnce();
expect(matrix.getRoomFullState).toHaveBeenCalledOnce();
expect(matrix.getRoomMessages).not.toHaveBeenCalled();
});
});