feat: enforce student avatar presets

This commit is contained in:
Codex
2026-06-30 15:56:01 +08:00
parent ddad2ac04d
commit d94b20b8ed
13 changed files with 110 additions and 28 deletions

View File

@@ -9145,15 +9145,62 @@ async function testTenantStudentOperations() {
name: 'Integration Bulk Missing Region',
regionId: '00000000-0000-0000-0000-ffffffffffff',
},
{
username: 'integration_bulk_student_avatar',
phone: '13800000020',
name: 'Integration Bulk Student Avatar',
regionId: ids.region,
avatarUrl: 'https://example.test/not-allowed-student-avatar.png',
},
],
},
});
assert.equal(bulk.total, 2, 'bulk student upsert should report total');
assert.equal(bulk.total, 3, 'bulk student upsert should report total');
assert.equal(bulk.successCount, 1, 'bulk student upsert should import valid student');
assert.equal(bulk.errorCount, 1, 'bulk student upsert should report invalid rows');
assert.equal(bulk.errorCount, 2, 'bulk student upsert should report invalid rows');
bulkStudentUserId = bulk.items?.find(item => item.status === 'active')?.userId || '';
assert.ok(bulkStudentUserId, 'bulk result should include created student id');
assert.ok(bulk.errors?.some(item => item.code === 'REGION_NOT_FOUND'), 'bulk result should include row-level validation error');
assert.ok(
bulk.errors?.some(item => item.code === 'STUDENT_AVATAR_URL_UNSUPPORTED'),
'bulk student upsert should reject row-level avatar URLs',
);
const singleAvatarDenied = await request('/api/tenant-admin/students', {
userId: TENANT_ADMIN_USER_ID,
method: 'PUT',
body: {
username: 'integration_avatar_denied',
phone: '13800000021',
name: 'Integration Avatar Denied',
regionId: ids.region,
avatarUrl: 'https://example.test/direct-student-avatar.png',
},
expectStatus: 400,
});
assert.equal(
singleAvatarDenied.code,
'STUDENT_AVATAR_URL_UNSUPPORTED',
'tenant student upsert must reject direct avatar URLs',
);
const primaryRoleDenied = await request('/api/tenant-admin/students', {
userId: TENANT_ADMIN_USER_ID,
method: 'PUT',
body: {
username: 'integration_primary_role_denied',
phone: '13800000022',
name: 'Integration Primary Role Denied',
regionId: ids.region,
primaryRole: 'platform_admin',
},
expectStatus: 400,
});
assert.equal(
primaryRoleDenied.code,
'STUDENT_PRIMARY_ROLE_UNSUPPORTED',
'tenant student upsert must not allow platform primary role changes',
);
const bulkLimitDenied = await request('/api/tenant-admin/students/bulk-upsert', {
userId: TENANT_ADMIN_USER_ID,