StudentResourceTest.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <?php
  2. namespace Tests\Feature;
  3. use App\Models\Student;
  4. use App\Models\User;
  5. use App\Models\Teacher;
  6. use App\Services\StudentIdService;
  7. use Illuminate\Foundation\Testing\WithFaker;
  8. use Tests\TestCase;
  9. class StudentResourceTest extends TestCase
  10. {
  11. use WithFaker;
  12. private User $adminUser;
  13. private Teacher $teacher;
  14. protected function setUp(): void
  15. {
  16. parent::setUp();
  17. // 手动创建管理员用户(避免RefreshDatabase的问题)
  18. $this->adminUser = User::create([
  19. 'user_id' => 'test_admin_' . uniqid(),
  20. 'username' => 'admin_' . uniqid(),
  21. 'full_name' => 'Admin User',
  22. 'email' => 'admin' . uniqid() . '@test.com',
  23. 'password_hash' => \Hash::make('password'),
  24. 'role' => 'admin',
  25. 'is_active' => 1,
  26. ]);
  27. // 手动创建老师用户和老师记录
  28. $teacherUser = User::create([
  29. 'user_id' => 'test_teacher_user_' . uniqid(),
  30. 'username' => 'teacher_' . uniqid(),
  31. 'full_name' => 'Test Teacher',
  32. 'email' => 'teacher' . uniqid() . '@test.com',
  33. 'password_hash' => \Hash::make('password'),
  34. 'role' => 'teacher',
  35. 'is_active' => 1,
  36. ]);
  37. $this->teacher = Teacher::create([
  38. 'teacher_id' => 'test_teacher_' . uniqid(),
  39. 'user_id' => $teacherUser->user_id,
  40. 'name' => 'Test Teacher',
  41. 'subject' => '数学',
  42. ]);
  43. }
  44. /**
  45. * 测试学生ID生成服务
  46. */
  47. public function test_student_id_generation(): void
  48. {
  49. $studentId1 = StudentIdService::generateStudentId();
  50. $studentId2 = StudentIdService::generateStudentId();
  51. // 验证格式
  52. $this->assertTrue(StudentIdService::validateStudentIdFormat($studentId1));
  53. $this->assertTrue(StudentIdService::validateStudentIdFormat($studentId2));
  54. // 验证唯一性
  55. $this->assertNotEquals($studentId1, $studentId2);
  56. // 验证格式模式
  57. $this->assertMatchesRegularExpression('/^stu_\d+_\d+$/', $studentId1);
  58. }
  59. /**
  60. * 测试学生创建功能
  61. */
  62. public function test_create_student(): void
  63. {
  64. $studentData = [
  65. 'name' => '测试学生',
  66. 'grade' => '高一',
  67. 'class_name' => '1班',
  68. 'teacher_id' => $this->teacher->teacher_id,
  69. 'remark' => '测试备注',
  70. ];
  71. $student = new Student();
  72. $student->fill($studentData);
  73. $student->save();
  74. // 验证学生记录
  75. $this->assertDatabaseHas('students', [
  76. 'name' => '测试学生',
  77. 'grade' => '高一',
  78. 'class_name' => '1班',
  79. 'teacher_id' => $this->teacher->teacher_id,
  80. ]);
  81. // 验证学生ID自动生成
  82. $this->assertNotNull($student->student_id);
  83. $this->assertTrue(StudentIdService::validateStudentIdFormat($student->student_id));
  84. // 验证对应的用户记录被创建
  85. $this->assertDatabaseHas('users', [
  86. 'user_id' => $student->student_id,
  87. 'username' => $student->student_id,
  88. 'role' => 'student',
  89. 'full_name' => '测试学生',
  90. ]);
  91. }
  92. /**
  93. * 测试创建学生时班级字段为可选
  94. */
  95. public function test_create_student_without_class(): void
  96. {
  97. $student = new Student();
  98. $student->name = '无班级学生';
  99. $student->grade = '高二';
  100. $student->teacher_id = $this->teacher->teacher_id;
  101. $student->save();
  102. $this->assertNull($student->class_name);
  103. $this->assertDatabaseHas('students', [
  104. 'student_id' => $student->student_id,
  105. 'class_name' => null,
  106. ]);
  107. }
  108. /**
  109. * 测试学生更新功能
  110. */
  111. public function test_update_student(): void
  112. {
  113. // 先创建一个学生
  114. $student = Student::create([
  115. 'student_id' => StudentIdService::generateStudentId(),
  116. 'name' => '原姓名',
  117. 'grade' => '高一',
  118. 'teacher_id' => $this->teacher->teacher_id,
  119. ]);
  120. // 更新学生信息
  121. $student->update([
  122. 'name' => '新姓名',
  123. 'grade' => '高二',
  124. 'class_name' => '2班',
  125. ]);
  126. $this->assertDatabaseHas('students', [
  127. 'student_id' => $student->student_id,
  128. 'name' => '新姓名',
  129. 'grade' => '高二',
  130. 'class_name' => '2班',
  131. ]);
  132. }
  133. /**
  134. * 测试学生删除功能
  135. */
  136. public function test_delete_student(): void
  137. {
  138. $student = Student::create([
  139. 'student_id' => StudentIdService::generateStudentId(),
  140. 'name' => '待删除学生',
  141. 'grade' => '高一',
  142. 'teacher_id' => $this->teacher->teacher_id,
  143. ]);
  144. $studentId = $student->student_id;
  145. // 验证记录存在
  146. $this->assertDatabaseHas('students', ['student_id' => $studentId]);
  147. $this->assertDatabaseHas('users', ['user_id' => $studentId]);
  148. // 删除学生
  149. $student->delete();
  150. // 验证记录被删除
  151. $this->assertDatabaseMissing('students', ['student_id' => $studentId]);
  152. // 注意:由于外键约束,用户记录可能也会被删除
  153. }
  154. /**
  155. * 测试学生和老师的关系
  156. */
  157. public function test_student_teacher_relationship(): void
  158. {
  159. $student = Student::create([
  160. 'student_id' => StudentIdService::generateStudentId(),
  161. 'name' => '关联测试学生',
  162. 'grade' => '高一',
  163. 'teacher_id' => $this->teacher->teacher_id,
  164. ]);
  165. // 测试关系
  166. $this->assertEquals($this->teacher->teacher_id, $student->teacher_id);
  167. $this->assertInstanceOf(Teacher::class, $student->teacher);
  168. }
  169. /**
  170. * 测试空班级字段的显示
  171. */
  172. public function test_empty_class_name_display(): void
  173. {
  174. $student = Student::create([
  175. 'student_id' => StudentIdService::generateStudentId(),
  176. 'name' => '无班级学生',
  177. 'grade' => '高三',
  178. 'teacher_id' => $this->teacher->teacher_id,
  179. ]);
  180. // 测试班级字段为空时的处理
  181. $this->assertNull($student->class_name);
  182. // 模拟表格显示逻辑
  183. $displayValue = $student->class_name ?: '未分配';
  184. $this->assertEquals('未分配', $displayValue);
  185. }
  186. /**
  187. * 测试批量创建学生
  188. */
  189. public function test_bulk_create_students(): void
  190. {
  191. $students = [];
  192. for ($i = 1; $i <= 5; $i++) {
  193. $student = new Student();
  194. $student->name = "测试学生{$i}";
  195. $student->grade = '高一';
  196. $student->teacher_id = $this->teacher->teacher_id;
  197. $student->save();
  198. $students[] = $student;
  199. }
  200. // 验证所有学生都被创建
  201. $this->assertCount(5, $students);
  202. // 验证每个学生的ID都是唯一的
  203. $studentIds = array_map(fn($s) => $s->student_id, $students);
  204. $this->assertEquals(count($studentIds), count(array_unique($studentIds)));
  205. // 验证对应的用户记录都被创建
  206. foreach ($students as $student) {
  207. $this->assertDatabaseHas('users', [
  208. 'user_id' => $student->student_id,
  209. 'role' => 'student',
  210. ]);
  211. }
  212. }
  213. }