0

Hello im new to PHPUnit with minimum knowledge in laravel.

Im trying to test this method that mass create student section

public function setStudentsSection(Request $request)
    {
        $enrollments = Enrollment::whereIn('student_id', $request->students)->where('session_id', $request->session_id)->get();
        $program_section = ProgramSection::withCount('students')->find($request->program_section_id);
        if(($program_section->students_count + count($enrollments)) <= $program_section->max_students) {
            foreach($enrollments as $enrollment) {
                $response = StudentSection::create([
                    'student_id'    => $enrollment->student_id,
                    'enrollment_id' => $enrollment->id,
                    'section_id'    => $request->program_section_id,
                    'created_at'    => Carbon::now()
                ]);
                return $response;
            }
        }
        return response()->json(['errors' => ['message' => 'Selected Section is full.']], 405);
    }

UPDATE
Here's the test case. Im trying to match the method that i've modified with my test, but im failing to do so.

public function testCanMassAssignSection()
    {
        $sectioning_data = $this->setMassSectioning(10);
        
        $this->json('POST', 'api/enrollments/set-students-section', $sectioning_data['data'])
            ->assertStatus(201);
        $student_section_data = ['student_id' => $sectioning_data['student_ids'], 'section_id' => $sectioning_data['program_section']->id];
        $this->assertDatabaseHas('student.sections', $student_section_data);
    }
private function setMassSectioning($max_students)
    {
        $session = Session::factory()->create();
        $program_section = ProgramSection::factory()->create(['session_id' => $session->id, 'max_students' => $max_students]);
        $enrollments = Enrollment::factory(['session_id' => $session->id])->count(3)->create();
        $student_ids = array();
        foreach($enrollments as $enrollment) {
            array_push($student_ids, $enrollment->student_id);
        }

        return  [
            'data'              => ['program_section_id' => $program_section->id, 'session_id' => $session->id, 'students' => $student_ids],
            'student_ids'       => $enrollment->student_id,
            'program_section'   => $program_section
        ];
    }

UPDATE Here's the error the i get.

1) Test\Feature\EnrollmentTest::testCanMassAssignSection
Failed asserting that a row in the table [student.sections] matches the attributes {
    "student_id": 2765,
    "section_id": 1649
}.

Found: [
    {
        "id": 262,
        "student_id": 2763,
        "section_id": 1649,
        "created_at": "2022-08-24 09:32:05",
        "updated_at": "2022-08-24 09:32:05",
        "enrollment_id": 1740
    }
].

Still can't make it to match. I do not know what im doing wrong.

Kael
  • 161
  • 2
  • 13

1 Answers1

0

Solve! I just create $student data and added to $enrollments now assert in database match. Although don't know what exactly is happening on the background.

I think when i added to enrollments variable the 'student_id' => $student->id it creates those 3 records.

private function setMassSectioning($max_students)
    {
        $session = Session::factory()->create();
        $student = Student::factory()->create();
        $program_section = ProgramSection::factory()->create(['session_id' => $session->id, 'max_students' => $max_students]);
        $enrollments = Enrollment::factory(['session_id' => $session->id, 'student_id' => $student->id])->count(3)->create();
        $student_ids = array();
        foreach($enrollments as $enrollment) {
            array_push($student_ids, $enrollment->student_id);
        }

        return  [
            'data'              => ['program_section_id' => $program_section->id, 'session_id' => $session->id, 'students' => $student_ids],
            'student_ids'       => $enrollment->student_id,
            'program_section'   => $program_section
        ];
    }
Kael
  • 161
  • 2
  • 13