Files
gongxue-base/apps/admin/src/test/fixtures.ts
wangziqi 375c7ec60b feat: refine admin forms, attendance and finance workflows
Squash merge PR #23.

Included changes:
- complete occupancy check-in required fields/default payload
- improve responsive admin management pages
- fix attendance edge cases and attendance period config
- refine wallet/finance-related workflow handling

Checks:
- npm run typecheck -w apps/admin
- npm run typecheck -w apps/server
2026-07-18 12:54:10 +00:00

269 lines
7.8 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;