226 lines
7.7 KiB
TypeScript
226 lines
7.7 KiB
TypeScript
/**
|
|
* Test fixtures — consistent test data used across integration tests.
|
|
*
|
|
* These mirror the PRD data models and are used to seed/verify API responses.
|
|
* All IDs are prefixed "test-" to distinguish from real data in a shared dev DB.
|
|
*/
|
|
|
|
// ── Auth ────────────────────────────────────────────────────────────
|
|
|
|
export const CREDENTIALS = {
|
|
superAdmin: { username: 'admin', password: 'admin123' },
|
|
staff: { username: 'staff1', password: 'staff123' },
|
|
classTeacher: { username: 'teacher1', password: 'teacher123' },
|
|
student: { username: 'student1', password: 'student123' },
|
|
} as const;
|
|
|
|
// ── Student (PRD §3) ────────────────────────────────────────────────
|
|
|
|
export const SAMPLE_STUDENT = {
|
|
name: '测试学员A',
|
|
phone: '13800000001',
|
|
idCard: '110101200001011234',
|
|
gender: '男',
|
|
ethnicity: '汉族',
|
|
status: 'active',
|
|
emergencyContact: '张三',
|
|
emergencyPhone: '13900000001',
|
|
studentNo: 'TEST-2026-001',
|
|
};
|
|
|
|
export const SAMPLE_STUDENT_B = {
|
|
name: '测试学员B',
|
|
phone: '13800000002',
|
|
idCard: '110101200001011235',
|
|
gender: '女',
|
|
ethnicity: '汉族',
|
|
status: 'active',
|
|
emergencyContact: '李四',
|
|
emergencyPhone: '13900000002',
|
|
studentNo: 'TEST-2026-002',
|
|
};
|
|
|
|
// ── Class (PRD §5) ──────────────────────────────────────────────────
|
|
|
|
export const SAMPLE_CLASS = {
|
|
name: '2026届文化课冲刺1班',
|
|
code: 'TEST-WHK-2026-001',
|
|
classType: '文化课',
|
|
startDate: '2026-03-01',
|
|
endDate: '2026-06-30',
|
|
status: '在读',
|
|
maxStudents: 40,
|
|
};
|
|
|
|
// ── Schedule (PRD §6) ───────────────────────────────────────────────
|
|
|
|
export const SAMPLE_SCHEDULE = {
|
|
weekDay: 1, // 周一
|
|
startTime: '09:00',
|
|
endTime: '10:30',
|
|
subject: '语文',
|
|
scheduleType: 'INTERNAL',
|
|
status: 'active',
|
|
};
|
|
|
|
// Conflicting schedule: same classroom, same weekday, overlapping time
|
|
export const CONFLICT_SCHEDULE = {
|
|
weekDay: 1,
|
|
startTime: '09:30', // overlaps with 09:00-10:30
|
|
endTime: '11:00',
|
|
subject: '数学',
|
|
scheduleType: 'INTERNAL',
|
|
status: 'active',
|
|
};
|
|
|
|
// Non-conflicting: same classroom, same weekday, non-overlapping
|
|
export const NON_CONFLICT_SCHEDULE = {
|
|
weekDay: 1,
|
|
startTime: '10:30', // exactly at boundary — no overlap
|
|
endTime: '12:00',
|
|
subject: '英语',
|
|
scheduleType: 'INTERNAL',
|
|
status: 'active',
|
|
};
|
|
|
|
// ── Room / Dormitory (PRD §7) ───────────────────────────────────────
|
|
|
|
export const SAMPLE_ROOM = {
|
|
roomNumber: 'TEST-401',
|
|
building: '1号楼',
|
|
floor: 4,
|
|
capacity: 6,
|
|
status: 'available',
|
|
gender: '男',
|
|
rentalCategory: 'short',
|
|
roomType: '标准间',
|
|
};
|
|
|
|
export const SAMPLE_LONG_RENT_ROOM = {
|
|
roomNumber: 'TEST-501',
|
|
building: '1号楼',
|
|
floor: 5,
|
|
capacity: 4,
|
|
status: 'available',
|
|
gender: '女',
|
|
rentalCategory: 'long',
|
|
monthlyRate: 800,
|
|
roomType: '标准间',
|
|
};
|
|
|
|
// ── Occupancy (PRD §8) ──────────────────────────────────────────────
|
|
|
|
export const SAMPLE_OCCUPANCY = {
|
|
checkInDate: '2026-03-01',
|
|
billingStartDate: '2026-03-01',
|
|
billingEndDate: '2026-06-30',
|
|
stayType: 'short',
|
|
};
|
|
|
|
// ── Bill / Expense (PRD §9-10) ──────────────────────────────────────
|
|
|
|
export const SAMPLE_EXPENSE = {
|
|
type: 'water',
|
|
amount: 150.0,
|
|
billingMonth: '2026-03',
|
|
description: '3月水费公摊',
|
|
};
|
|
|
|
export const SAMPLE_PERSONAL_EXPENSE = {
|
|
type: 'damage',
|
|
amount: 50.0,
|
|
description: '损坏赔偿-台灯',
|
|
};
|
|
|
|
// ── Deposit (PRD §11) ───────────────────────────────────────────────
|
|
|
|
export const SAMPLE_DEPOSIT = {
|
|
amount: 500.0,
|
|
type: 'collect' as const,
|
|
notes: '入学押金',
|
|
};
|
|
|
|
// ── Attendance (PRD §13) ────────────────────────────────────────────
|
|
|
|
export const SAMPLE_ATTENDANCE = {
|
|
attendanceDate: '2026-03-15',
|
|
session: '上午',
|
|
status: '出勤',
|
|
source: '人工点名',
|
|
courseName: '语文',
|
|
};
|
|
|
|
export const SAMPLE_ATTENDANCE_ABSENT = {
|
|
attendanceDate: '2026-03-16',
|
|
session: '上午',
|
|
status: '缺勤',
|
|
source: '人工点名',
|
|
courseName: '语文',
|
|
};
|
|
|
|
// ── Classroom (PRD §6) ──────────────────────────────────────────────
|
|
|
|
export const SAMPLE_CLASSROOM = {
|
|
name: 'TEST-301教室',
|
|
building: '教学楼A',
|
|
floor: 3,
|
|
capacity: 50,
|
|
roomType: '大',
|
|
status: 'available',
|
|
};
|
|
|
|
// ── Organization (PRD §12) ────────────────────────────────────────────────
|
|
|
|
export const SAMPLE_TENANT = {
|
|
name: '测试合作机构A',
|
|
contact: '王经理',
|
|
phone: '13700000001',
|
|
color: '#1890ff',
|
|
status: 'active',
|
|
};
|
|
|
|
// ── Operation Log expectation (PRD §18) ─────────────────────────────
|
|
|
|
export const LOG_ACTIONS = {
|
|
STUDENT_CREATE: { module: 'students', action: 'create' },
|
|
STUDENT_UPDATE: { module: 'students', action: 'update' },
|
|
STUDENT_DELETE: { module: 'students', action: 'delete' },
|
|
BILL_GENERATE: { module: 'bills', action: 'generate' },
|
|
BILL_CONFIRM: { module: 'bills', action: 'confirm' },
|
|
DEPOSIT_COLLECT: { module: 'deposits', action: 'collect' },
|
|
DEPOSIT_REFUND: { module: 'deposits', action: 'refund' },
|
|
OCCUPANCY_CHECKIN: { module: 'occupancies', action: 'create' },
|
|
OCCUPANCY_CHECKOUT: { module: 'occupancies', action: 'checkout' },
|
|
EXPENSE_CREATE: { module: 'expenses', action: 'create' },
|
|
CLASS_CREATE: { module: 'classes', action: 'create' },
|
|
CLASS_DELETE: { module: 'classes', action: 'delete' },
|
|
SCHEDULE_CREATE: { module: 'schedules', action: 'create' },
|
|
ATTENDANCE_BATCH: { module: 'attendance', action: 'batch' },
|
|
SENSITIVE_VIEW: { module: 'students', action: 'view_sensitive' },
|
|
} as const;
|
|
|
|
// ── Permission nodes (PRD §17) ──────────────────────────────────────
|
|
|
|
export const PERMISSION_NODES = [
|
|
'student:view', 'student:add', 'student:update', 'student:delete',
|
|
'student:import', 'student:export',
|
|
'room:view', 'room:add', 'room:update', 'room:delete',
|
|
'occupancy:view', 'occupancy:add', 'occupancy:update',
|
|
'bill:view', 'bill:generate', 'bill:confirm', 'bill:markPaid', 'bill:export',
|
|
'expense:view', 'expense:add', 'expense:update', 'expense:delete',
|
|
'deposit:view', 'deposit:collect', 'deposit:refund',
|
|
'class:view', 'class:add', 'class:update', 'class:delete',
|
|
'schedule:view', 'schedule:add', 'schedule:update', 'schedule:delete',
|
|
'attendance:view', 'attendance:add', 'attendance:update', 'attendance:delete',
|
|
'attendance:batch',
|
|
'classroom:view', 'classroom:add', 'classroom:update', 'classroom:delete',
|
|
'organization:view', 'organization:create', 'organization:edit', 'organization:delete',
|
|
'rental:view', 'rental:add', 'rental:update', 'rental:delete',
|
|
'archive:view', 'archive:import', 'archive:export',
|
|
'report:generate',
|
|
'log:view',
|
|
'role:view', 'role:add', 'role:update', 'role:delete',
|
|
'user:view', 'user:add', 'user:update',
|
|
'dashboard:view',
|
|
] as const;
|