adminUser = User::factory()->create([ 'role' => 'admin', 'is_active' => true, ]); // 创建测试教师 $teacher = Teacher::create([ 'teacher_id' => 'teacher_test_001', 'name' => '测试教师', 'user_id' => $this->adminUser->id, ]); // 创建测试学生 $this->student = Student::create([ 'student_id' => 'stu_test_001', 'name' => '测试学生', 'grade' => '七年级', 'class_name' => '1班', 'teacher_id' => $teacher->teacher_id, ]); Storage::fake('public'); } /** @test */ public function it_can_list_ocr_records() { // 创建测试OCR记录 OCRRecord::create([ 'student_id' => $this->student->student_id, 'image_filename' => 'test.jpg', 'image_path' => 'ocr-uploads/test.jpg', 'status' => 'pending', 'total_questions' => 10, 'processed_questions' => 0, ]); $response = $this->actingAs($this->adminUser) ->get('/admin/ocr-records'); $response->assertStatus(200); } /** @test */ public function it_can_access_create_page() { $response = $this->actingAs($this->adminUser) ->get('/admin/ocr-records/create'); $response->assertStatus(200); } /** @test */ public function it_can_create_ocr_record() { $file = UploadedFile::fake()->image('exam.jpg', 800, 600); $response = $this->actingAs($this->adminUser) ->post('/admin/ocr-records', [ 'student_id' => $this->student->student_id, 'image_path' => $file, 'status' => 'pending', 'total_questions' => 0, 'processed_questions' => 0, ]); $this->assertDatabaseHas('ocr_records', [ 'student_id' => $this->student->student_id, 'status' => 'pending', ]); } /** @test */ public function it_can_view_ocr_record() { $record = OCRRecord::create([ 'student_id' => $this->student->student_id, 'image_filename' => 'test.jpg', 'image_path' => 'ocr-uploads/test.jpg', 'status' => 'completed', 'total_questions' => 10, 'processed_questions' => 10, 'confidence_avg' => 0.85, ]); $response = $this->actingAs($this->adminUser) ->get("/admin/ocr-records/{$record->id}"); $response->assertStatus(200); } /** @test */ public function it_shows_student_information_in_list() { OCRRecord::create([ 'student_id' => $this->student->student_id, 'image_filename' => 'test.jpg', 'status' => 'pending', 'total_questions' => 10, ]); $response = $this->actingAs($this->adminUser) ->get('/admin/ocr-records'); $response->assertStatus(200) ->assertSee($this->student->name) ->assertSee($this->student->grade) ->assertSee($this->student->class_name); } /** @test */ public function it_requires_student_id() { $response = $this->actingAs($this->adminUser) ->post('/admin/ocr-records', [ 'image_path' => UploadedFile::fake()->image('exam.jpg'), 'status' => 'pending', ]); $response->assertSessionHasErrors(['student_id']); } /** @test */ public function it_requires_image_file() { $response = $this->actingAs($this->adminUser) ->post('/admin/ocr-records', [ 'student_id' => $this->student->student_id, 'status' => 'pending', ]); $response->assertSessionHasErrors(['image_path']); } /** @test */ public function it_calculates_progress_percentage_correctly() { $record = OCRRecord::create([ 'student_id' => $this->student->student_id, 'image_filename' => 'test.jpg', 'status' => 'processing', 'total_questions' => 10, 'processed_questions' => 7, ]); $this->assertEquals(70, $record->progress_percentage); } /** @test */ public function it_returns_zero_progress_when_no_questions() { $record = OCRRecord::create([ 'student_id' => $this->student->student_id, 'image_filename' => 'test.jpg', 'status' => 'pending', 'total_questions' => 0, 'processed_questions' => 0, ]); $this->assertEquals(0, $record->progress_percentage); } /** @test */ public function it_has_correct_student_relationship() { $record = OCRRecord::create([ 'student_id' => $this->student->student_id, 'image_filename' => 'test.jpg', 'status' => 'pending', 'total_questions' => 10, ]); $this->assertInstanceOf(Student::class, $record->student); $this->assertEquals($this->student->student_id, $record->student->student_id); $this->assertEquals($this->student->name, $record->student->name); } }