Files
alrahma_sunday_school_api/tests/Feature/Api/V1/Admin/TeacherSubmissionApiTest.php
T
2026-03-05 12:29:37 -05:00

158 lines
4.5 KiB
PHP

<?php
namespace Tests\Feature\Api\Admin;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Tests\TestCase;
class TeacherSubmissionApiTest extends TestCase
{
use RefreshDatabase;
protected function createAdmin(): User
{
$admin = User::factory()->create([
'role' => 'administrator',
'firstname' => 'Admin',
'lastname' => 'User',
'email' => 'admin@example.com',
]);
return $admin;
}
protected function seedSchoolConfig(): void
{
DB::table('configurations')->insert([
['config_key' => 'semester', 'config_value' => 'Fall'],
['config_key' => 'school_year', 'config_value' => '2025-2026'],
]);
}
/** @test */
public function admin_can_fetch_teacher_submission_report(): void
{
$admin = $this->createAdmin();
$this->seedSchoolConfig();
// Minimal records to allow report query to run
DB::table('classSection')->insert([
'class_section_id' => 1,
'class_section_name' => 'Grade 5 - A',
]);
$teacher = User::factory()->create([
'firstname' => 'Fatima',
'lastname' => 'Teacher',
'email' => 'teacher1@example.com',
]);
DB::table('teacher_class')->insert([
'teacher_id' => $teacher->id,
'class_section_id' => 1,
'position' => 'main',
'semester' => 'Fall',
'school_year' => '2025-2026',
]);
$response = $this->actingAs($admin, 'sanctum')
->getJson('/api/admin/teacher-submissions/report');
$response->assertOk()
->assertJsonStructure([
'semester',
'school_year',
'rows',
'notification_history',
'summary' => [
'total_items',
'missing_items',
'submitted_items',
'submission_percentage',
],
]);
}
/** @test */
public function admin_can_send_teacher_submission_notifications(): void
{
Mail::fake();
$admin = $this->createAdmin();
$this->seedSchoolConfig();
DB::table('classSection')->insert([
'class_section_id' => 2,
'class_section_name' => 'Grade 6 - B',
]);
$teacher = User::factory()->create([
'firstname' => 'Amina',
'lastname' => 'Smith',
'email' => 'amina@example.com',
]);
// optional history table insert compatibility depends on schema; no need to seed rows
$payload = [
'notify' => [
2 => [
$teacher->id => 1,
],
],
'missing_items' => [
2 => [
$teacher->id => base64_encode(json_encode(['midterm scores', 'PTAP comments'])),
],
],
];
$response = $this->actingAs($admin, 'sanctum')
->postJson('/api/admin/teacher-submissions/notifications', $payload);
$response->assertOk()
->assertJsonStructure([
'message',
'sent',
'failed',
'results' => [
'*' => [
'teacher_id',
'class_section_id',
'teacher_name',
'section_name',
'email',
'status',
'missing_items',
'error',
],
],
]);
Mail::assertSentCount(1);
}
/** @test */
public function teacher_submission_notifications_requires_notify_payload(): void
{
$admin = $this->createAdmin();
$response = $this->actingAs($admin, 'sanctum')
->postJson('/api/admin/teacher-submissions/notifications', []);
$response->assertStatus(422)
->assertJsonValidationErrors(['notify']);
}
/** @test */
public function non_admin_cannot_access_teacher_submission_endpoints(): void
{
$user = User::factory()->create(['role' => 'teacher']);
$this->actingAs($user, 'sanctum')
->getJson('/api/admin/teacher-submissions/report')
->assertStatus(403);
}
}