mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-12 17:12:06 +08:00
81 lines
2.4 KiB
JavaScript
81 lines
2.4 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { mkdtemp, rm } from 'node:fs/promises';
|
|
import { tmpdir } from 'node:os';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
|
|
import webPush from 'web-push';
|
|
|
|
import {
|
|
closeConnection,
|
|
initializeDatabase,
|
|
notificationPreferencesDb,
|
|
pushSubscriptionsDb,
|
|
sessionsDb,
|
|
userDb,
|
|
} from '../modules/database/index.js';
|
|
|
|
import { notifyRunStopped } from './notification-orchestrator.js';
|
|
|
|
async function withIsolatedDatabase(runTest) {
|
|
const previousDatabasePath = process.env.DATABASE_PATH;
|
|
const tempDirectory = await mkdtemp(path.join(tmpdir(), 'notification-orchestrator-'));
|
|
const databasePath = path.join(tempDirectory, 'auth.db');
|
|
|
|
closeConnection();
|
|
process.env.DATABASE_PATH = databasePath;
|
|
await initializeDatabase();
|
|
|
|
try {
|
|
await runTest();
|
|
} finally {
|
|
closeConnection();
|
|
if (previousDatabasePath === undefined) {
|
|
delete process.env.DATABASE_PATH;
|
|
} else {
|
|
process.env.DATABASE_PATH = previousDatabasePath;
|
|
}
|
|
await rm(tempDirectory, { recursive: true, force: true });
|
|
}
|
|
}
|
|
|
|
test('push payload uses the app session id when notified with a provider session id', async () => {
|
|
const originalSendNotification = webPush.sendNotification;
|
|
const sentPayloads = [];
|
|
|
|
webPush.sendNotification = async (_subscription, payload) => {
|
|
sentPayloads.push(JSON.parse(payload));
|
|
return {};
|
|
};
|
|
|
|
try {
|
|
await withIsolatedDatabase(async () => {
|
|
const user = userDb.createUser('notify-user', 'hash');
|
|
const userId = Number(user.id);
|
|
|
|
notificationPreferencesDb.updatePreferences(userId, {
|
|
channels: { webPush: true },
|
|
events: { actionRequired: true, stop: true, error: true },
|
|
});
|
|
pushSubscriptionsDb.saveSubscription(userId, 'https://example.test/push', 'p256dh', 'auth');
|
|
sessionsDb.createAppSession('app-session-1', 'claude', '/workspace/demo');
|
|
sessionsDb.assignProviderSessionId('app-session-1', 'claude-native-1');
|
|
|
|
notifyRunStopped({
|
|
userId,
|
|
provider: 'claude',
|
|
sessionId: 'claude-native-1',
|
|
stopReason: 'completed',
|
|
});
|
|
|
|
await new Promise((resolve) => setImmediate(resolve));
|
|
|
|
assert.equal(sentPayloads.length, 1);
|
|
assert.equal(sentPayloads[0]?.data?.sessionId, 'app-session-1');
|
|
assert.match(sentPayloads[0]?.data?.tag, /app-session-1/);
|
|
});
|
|
} finally {
|
|
webPush.sendNotification = originalSendNotification;
|
|
}
|
|
});
|