shouldReceive('getConfig')->with('semester')->andReturn('Fall'); $configModel->shouldReceive('getConfig')->with('school_year')->andReturn('2025-2026'); // Eloquent chain: newQuery()->updateOrCreate(...) $studentClassModel->shouldReceive('newQuery')->once()->andReturn($studentClassQuery); $expectedRecord = (object) [ 'id' => 99, 'student_id' => 10, 'class_section_id' => 7, 'semester' => 'Fall', 'school_year' => '2025-2026', 'description' => 'Auto-assigned', 'updated_by' => 55, ]; $studentClassQuery->shouldReceive('updateOrCreate') ->once() ->with( [ 'student_id' => 10, 'school_year' => '2025-2026', 'semester' => 'Fall', ], Mockery::on(function ($payload) { return $payload['student_id'] === 10 && $payload['class_section_id'] === 7 && $payload['semester'] === 'Fall' && $payload['school_year'] === '2025-2026' && $payload['description'] === 'Auto-assigned' && $payload['updated_by'] === 55; }) ) ->andReturn($expectedRecord); $service = new AssignmentService( $userModel, $configModel, $studentModel, $classSectionModel, $teacherClassModel, $studentClassModel ); $result = $service->saveStudentAssignment([ 'student_id' => 10, 'class_section_id' => 7, 'description' => 'Auto-assigned', // semester/school_year intentionally omitted to test fallback ], 55); $this->assertSame($expectedRecord, $result); } }