feat: add public bank sync failure ops

This commit is contained in:
Codex
2026-06-30 09:12:45 +08:00
parent d1cb341351
commit 959e612211
14 changed files with 484 additions and 44 deletions

View File

@@ -1184,6 +1184,14 @@ async function testPlatformAdminPermissions() {
expectStatus: 403,
});
assert.equal(paymentDenied.code, 'PLATFORM_PERMISSION_REQUIRED', 'manual service-fee payment must require billing payment permission');
const publicBankOpsDenied = await request('/api/platform-admin/question-bank-sync-status', {
tenantId: false,
userId: false,
headers: restrictedHeaders,
expectStatus: 403,
});
assert.equal(publicBankOpsDenied.code, 'PLATFORM_PERMISSION_REQUIRED', 'public bank sync ops should require dedicated platform question bank ops permission');
}
async function testPlatformStaffManagement() {
@@ -6841,6 +6849,22 @@ async function testPublicQuestionBankAdoption() {
'public bank sync should insert newly published source questions',
);
const platformSyncStatus = await request('/api/platform-admin/question-bank-sync-status', {
userId: false,
headers: { 'x-platform-admin-key': 'local-platform-admin-key' },
query: { tenantId: PARTNER_TENANT_ID, sourceQuestionBankId: ids.questionBank },
});
const platformSyncStatusItem = platformSyncStatus.items?.find(item => item.id === adopted.item.id);
assert.equal(platformSyncStatusItem?.syncStatus, 'synced', 'platform admin should inspect public bank sync status across tenants');
assert.equal(platformSyncStatus.summary?.synced >= 1, true, 'platform sync status should include summary counts');
assert.ok(!JSON.stringify(platformSyncStatusItem).includes('新增公共题应同步到已采纳租户'), 'platform sync status must not leak source question explanations');
const studentPlatformSyncStatusDenied = await request('/api/platform-admin/question-bank-sync-status', {
query: { tenantId: PARTNER_TENANT_ID },
expectStatus: 403,
});
assert.equal(studentPlatformSyncStatusDenied.code, 'PLATFORM_ADMIN_REQUIRED', 'public bank sync ops endpoint must require platform admin access');
const syncNotifications = await request('/api/tenant-content/notifications', {
tenantId: PARTNER_TENANT_ID,
userId: PARTNER_TENANT_ADMIN_USER_ID,
@@ -6945,6 +6969,15 @@ async function testPublicQuestionBankAdoption() {
'public bank sync should identify the source question that conflicts with tenant edits',
);
const failedPlatformSyncStatus = await request('/api/platform-admin/question-bank-sync-status', {
userId: false,
headers: { 'x-platform-admin-key': 'local-platform-admin-key' },
query: { tenantId: PARTNER_TENANT_ID, syncStatus: 'failed', onlyOpenIssues: 'true' },
});
const failedPlatformSyncStatusItem = failedPlatformSyncStatus.items?.find(item => item.id === adopted.item.id);
assert.equal(failedPlatformSyncStatusItem?.syncStatus, 'failed', 'platform sync ops should expose failed public bank adoptions');
assert.equal(failedPlatformSyncStatusItem?.openConflictNotificationCount >= 1, true, 'platform sync ops should expose open conflict notification count');
const conflictNotifications = await request('/api/tenant-content/notifications', {
tenantId: PARTNER_TENANT_ID,
userId: PARTNER_TENANT_ADMIN_USER_ID,