chore(server): fix copilot unstable tests (#13076)

#### PR Dependency Tree


* **PR #13076** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Tests**
* Improved test isolation by using unique prompt names and randomized
user emails for each test run.
* Optimized test setup by initializing the testing database once
globally.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
fengmk2
2025-07-08 10:39:29 +08:00
committed by GitHub
parent 7dc103ffe6
commit b9b336f728

View File

@@ -160,15 +160,19 @@ test.before(async t => {
html: module.get(CopilotCheckHtmlExecutor), html: module.get(CopilotCheckHtmlExecutor),
json: module.get(CopilotCheckJsonExecutor), json: module.get(CopilotCheckJsonExecutor),
}; };
await module.initTestingDB();
}); });
let promptName = 'prompt';
test.beforeEach(async t => { test.beforeEach(async t => {
Sinon.restore(); Sinon.restore();
const { module, auth, prompt } = t.context; const { auth, prompt } = t.context;
await module.initTestingDB();
await prompt.onApplicationBootstrap(); await prompt.onApplicationBootstrap();
const user = await auth.signUp('test@affine.pro', '123456'); const user = await auth.signUp(`test-${randomUUID()}@affine.pro`, '123456');
userId = user.id; userId = user.id;
promptName = randomUUID().replaceAll('-', '');
}); });
test.after.always(async t => { test.after.always(async t => {
@@ -183,7 +187,7 @@ test('should be able to manage prompt', async t => {
const internalPromptCount = (await prompt.listNames()).length; const internalPromptCount = (await prompt.listNames()).length;
t.is(internalPromptCount, prompts.length, 'should list names'); t.is(internalPromptCount, prompts.length, 'should list names');
await prompt.set('test', 'test', [ await prompt.set(promptName, 'test', [
{ role: 'system', content: 'hello' }, { role: 'system', content: 'hello' },
{ role: 'user', content: 'hello' }, { role: 'user', content: 'hello' },
]); ]);
@@ -193,25 +197,25 @@ test('should be able to manage prompt', async t => {
'should have one prompt' 'should have one prompt'
); );
t.is( t.is(
(await prompt.get('test'))!.finish({}).length, (await prompt.get(promptName))!.finish({}).length,
2, 2,
'should have two messages' 'should have two messages'
); );
await prompt.update('test', [{ role: 'system', content: 'hello' }]); await prompt.update(promptName, [{ role: 'system', content: 'hello' }]);
t.is( t.is(
(await prompt.get('test'))!.finish({}).length, (await prompt.get(promptName))!.finish({}).length,
1, 1,
'should have one message' 'should have one message'
); );
await prompt.delete('test'); await prompt.delete(promptName);
t.is( t.is(
(await prompt.listNames()).length, (await prompt.listNames()).length,
internalPromptCount, internalPromptCount,
'should be delete prompt' 'should be delete prompt'
); );
t.is(await prompt.get('test'), null, 'should not have the prompt'); t.is(await prompt.get(promptName), null, 'should not have the prompt');
}); });
test('should be able to render prompt', async t => { test('should be able to render prompt', async t => {
@@ -228,8 +232,8 @@ test('should be able to render prompt', async t => {
content: 'hello world', content: 'hello world',
}; };
await prompt.set('test', 'test', [msg]); await prompt.set(promptName, 'test', [msg]);
const testPrompt = await prompt.get('test'); const testPrompt = await prompt.get(promptName);
t.assert(testPrompt, 'should have prompt'); t.assert(testPrompt, 'should have prompt');
t.is( t.is(
testPrompt?.finish(params).pop()?.content, testPrompt?.finish(params).pop()?.content,
@@ -263,8 +267,8 @@ test('should be able to render listed prompt', async t => {
links: ['https://affine.pro', 'https://github.com/toeverything/affine'], links: ['https://affine.pro', 'https://github.com/toeverything/affine'],
}; };
await prompt.set('test', 'test', [msg]); await prompt.set(promptName, 'test', [msg]);
const testPrompt = await prompt.get('test'); const testPrompt = await prompt.get(promptName);
t.is( t.is(
testPrompt?.finish(params).pop()?.content, testPrompt?.finish(params).pop()?.content,
@@ -278,7 +282,7 @@ test('should be able to render listed prompt', async t => {
test('should be able to manage chat session', async t => { test('should be able to manage chat session', async t => {
const { prompt, session } = t.context; const { prompt, session } = t.context;
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
@@ -287,14 +291,14 @@ test('should be able to manage chat session', async t => {
const sessionId = await session.create({ const sessionId = await session.create({
userId, userId,
promptName: 'prompt', promptName,
...commonParams, ...commonParams,
}); });
t.truthy(sessionId, 'should create session'); t.truthy(sessionId, 'should create session');
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
t.is(s.config.sessionId, sessionId, 'should get session'); t.is(s.config.sessionId, sessionId, 'should get session');
t.is(s.config.promptName, 'prompt', 'should have prompt name'); t.is(s.config.promptName, promptName, 'should have prompt name');
t.is(s.model, 'model', 'should have model'); t.is(s.model, 'model', 'should have model');
const cleanObject = (obj: any[]) => const cleanObject = (obj: any[]) =>
@@ -329,7 +333,7 @@ test('should be able to manage chat session', async t => {
{ {
const newSessionId = await session.create({ const newSessionId = await session.create({
userId, userId,
promptName: 'prompt', promptName,
...commonParams, ...commonParams,
}); });
t.is(newSessionId, sessionId, 'should get same session id'); t.is(newSessionId, sessionId, 'should get same session id');
@@ -340,13 +344,13 @@ test('should be able to update chat session prompt', async t => {
const { prompt, session } = t.context; const { prompt, session } = t.context;
// Set up a prompt to be used in the session // Set up a prompt to be used in the session
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
// Create a session // Create a session
const sessionId = await session.create({ const sessionId = await session.create({
promptName: 'prompt', promptName,
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
@@ -375,7 +379,7 @@ test('should be able to update chat session prompt', async t => {
test('should be able to fork chat session', async t => { test('should be able to fork chat session', async t => {
const { auth, prompt, session } = t.context; const { auth, prompt, session } = t.context;
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
@@ -384,7 +388,7 @@ test('should be able to fork chat session', async t => {
// create session // create session
const sessionId = await session.create({ const sessionId = await session.create({
userId, userId,
promptName: 'prompt', promptName,
...commonParams, ...commonParams,
}); });
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
@@ -484,7 +488,7 @@ test('should be able to fork chat session', async t => {
{ {
const newSessionId = await session.create({ const newSessionId = await session.create({
userId, userId,
promptName: 'prompt', promptName,
...commonParams, ...commonParams,
}); });
t.is(newSessionId, sessionId, 'should get same session id'); t.is(newSessionId, sessionId, 'should get same session id');
@@ -494,7 +498,7 @@ test('should be able to fork chat session', async t => {
test('should be able to process message id', async t => { test('should be able to process message id', async t => {
const { prompt, session } = t.context; const { prompt, session } = t.context;
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
@@ -502,7 +506,7 @@ test('should be able to process message id', async t => {
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
@@ -536,7 +540,7 @@ test('should be able to process message id', async t => {
test('should be able to generate with message id', async t => { test('should be able to generate with message id', async t => {
const { prompt, session } = t.context; const { prompt, session } = t.context;
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
@@ -546,7 +550,7 @@ test('should be able to generate with message id', async t => {
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
@@ -569,7 +573,7 @@ test('should be able to generate with message id', async t => {
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
@@ -597,7 +601,7 @@ test('should be able to generate with message id', async t => {
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
@@ -618,7 +622,7 @@ test('should be able to generate with message id', async t => {
test('should save message correctly', async t => { test('should save message correctly', async t => {
const { prompt, session } = t.context; const { prompt, session } = t.context;
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
@@ -626,7 +630,7 @@ test('should save message correctly', async t => {
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
@@ -648,7 +652,7 @@ test('should revert message correctly', async t => {
// init session // init session
let sessionId: string; let sessionId: string;
{ {
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
@@ -656,7 +660,7 @@ test('should revert message correctly', async t => {
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
const s = (await session.get(sessionId))!; const s = (await session.get(sessionId))!;
@@ -748,7 +752,7 @@ test('should revert message correctly', async t => {
test('should handle params correctly in chat session', async t => { test('should handle params correctly in chat session', async t => {
const { prompt, session } = t.context; const { prompt, session } = t.context;
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
@@ -756,7 +760,7 @@ test('should handle params correctly in chat session', async t => {
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
@@ -1033,7 +1037,7 @@ test('should be able to run text executor', async t => {
executors.text.register(); executors.text.register();
const executor = getWorkflowExecutor(executors.text.type); const executor = getWorkflowExecutor(executors.text.type);
await prompt.set('test', 'test', [ await prompt.set(promptName, 'test', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
// mock provider // mock provider
@@ -1045,7 +1049,7 @@ test('should be able to run text executor', async t => {
id: 'basic', id: 'basic',
name: 'basic', name: 'basic',
nodeType: WorkflowNodeType.Basic, nodeType: WorkflowNodeType.Basic,
promptName: 'test', promptName,
type: NodeExecutorType.ChatText, type: NodeExecutorType.ChatText,
}; };
@@ -1099,7 +1103,7 @@ test('should be able to run image executor', async t => {
executors.image.register(); executors.image.register();
const executor = getWorkflowExecutor(executors.image.type); const executor = getWorkflowExecutor(executors.image.type);
await prompt.set('test', 'test-image', [ await prompt.set(promptName, 'test-image', [
{ role: 'user', content: 'tag1, tag2, tag3, {{#tags}}{{.}}, {{/tags}}' }, { role: 'user', content: 'tag1, tag2, tag3, {{#tags}}{{.}}, {{/tags}}' },
]); ]);
// mock provider // mock provider
@@ -1111,7 +1115,7 @@ test('should be able to run image executor', async t => {
id: 'basic', id: 'basic',
name: 'basic', name: 'basic',
nodeType: WorkflowNodeType.Basic, nodeType: WorkflowNodeType.Basic,
promptName: 'test', promptName,
type: NodeExecutorType.ChatText, type: NodeExecutorType.ChatText,
}; };
@@ -1514,14 +1518,14 @@ test('TextStreamParser should process a sequence of message chunks', t => {
test('should be able to manage context', async t => { test('should be able to manage context', async t => {
const { context, prompt, session, event, jobs, storage } = t.context; const { context, prompt, session, event, jobs, storage } = t.context;
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
const chatSession = await session.create({ const chatSession = await session.create({
docId: 'test', docId: 'test',
workspaceId: 'test', workspaceId: 'test',
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
@@ -1738,14 +1742,14 @@ test('should be able to manage workspace embedding', async t => {
// should create workspace embedding with file // should create workspace embedding with file
{ {
await prompt.set('prompt', 'model', [ await prompt.set(promptName, 'model', [
{ role: 'system', content: 'hello {{word}}' }, { role: 'system', content: 'hello {{word}}' },
]); ]);
const sessionId = await session.create({ const sessionId = await session.create({
docId: 'test', docId: 'test',
workspaceId: ws.id, workspaceId: ws.id,
userId, userId,
promptName: 'prompt', promptName,
pinned: false, pinned: false,
}); });
const contextSession = await context.create(sessionId); const contextSession = await context.create(sessionId);
@@ -1764,7 +1768,9 @@ test('should be able to manage workspace embedding', async t => {
test('should handle generateSessionTitle correctly under various conditions', async t => { test('should handle generateSessionTitle correctly under various conditions', async t => {
const { prompt, session, workspace, copilotSession } = t.context; const { prompt, session, workspace, copilotSession } = t.context;
await prompt.set('test', 'model', [{ role: 'user', content: '{{content}}' }]); await prompt.set(promptName, 'model', [
{ role: 'user', content: '{{content}}' },
]);
const createSession = async ( const createSession = async (
options: { options: {
userMessage?: string; userMessage?: string;
@@ -1777,7 +1783,7 @@ test('should handle generateSessionTitle correctly under various conditions', as
docId: 'test-doc', docId: 'test-doc',
workspaceId: ws.id, workspaceId: ws.id,
userId, userId,
promptName: 'test', promptName,
pinned: false, pinned: false,
}); });