Spaces:
Sleeping
Sleeping
| use Illuminate\Http\Client\Request as HttpRequest; | |
| use Illuminate\Support\Facades\Http; | |
| test('login is proxied to rag api and redirects by role', function () { | |
| config(['services.rag.base_url' => 'https://rag.test/api/v1']); | |
| Http::fake([ | |
| 'https://rag.test/api/v1/auth/login' => Http::response([ | |
| 'token' => 'jwt-token', | |
| 'user' => [ | |
| 'created_at' => '2026-05-01T10:00:00Z', | |
| 'email' => 'student@example.com', | |
| 'id' => 1, | |
| 'identity_number' => '123456', | |
| 'name' => 'Alma', | |
| 'phone' => '081234567890', | |
| 'role' => 'student', | |
| 'status' => 'active', | |
| 'updated_at' => '2026-05-01T10:00:00Z', | |
| ], | |
| ]), | |
| ]); | |
| $this->from(route('login')) | |
| ->post(route('auth.login.store'), [ | |
| 'email' => 'student@example.com', | |
| 'password' => 'secret123', | |
| 'remember' => true, | |
| ]) | |
| ->assertRedirect(route('mahasiswa', absolute: false)) | |
| ->assertCookie('sevima_raghub_auth_token') | |
| ->assertCookie('sevima_raghub_auth_user') | |
| ->assertSessionHas('status', 'Login berhasil.') | |
| ->assertSessionHasNoErrors(); | |
| Http::assertSent(fn (HttpRequest $request): bool => $request->method() === 'POST' | |
| && $request->url() === 'https://rag.test/api/v1/auth/login' | |
| && $request['email'] === 'student@example.com' | |
| && $request['password'] === 'secret123'); | |
| }); | |
| test('login uses backend error message', function () { | |
| config(['services.rag.base_url' => 'https://rag.test/api/v1']); | |
| Http::fake([ | |
| 'https://rag.test/api/v1/auth/login' => Http::response([ | |
| 'message' => 'Invalid email or password.', | |
| ], 422), | |
| ]); | |
| $this->from(route('login')) | |
| ->post(route('auth.login.store'), [ | |
| 'email' => 'student@example.com', | |
| 'password' => 'wrong-password', | |
| ]) | |
| ->assertRedirect(route('login')) | |
| ->assertSessionHasErrors(['auth' => 'Invalid email or password.']); | |
| }); | |
| test('register is proxied to rag api and flashes backend message', function () { | |
| config(['services.rag.base_url' => 'https://rag.test/api/v1']); | |
| Http::fake([ | |
| 'https://rag.test/api/v1/auth/register' => Http::response([ | |
| 'message' => 'Registration successful.', | |
| 'user' => [ | |
| 'created_at' => '2026-05-01T10:00:00Z', | |
| 'email' => 'student@example.com', | |
| 'id' => 1, | |
| 'identity_number' => '123456', | |
| 'name' => 'Alma', | |
| 'role' => 'student', | |
| 'status' => 'active', | |
| 'updated_at' => '2026-05-01T10:00:00Z', | |
| ], | |
| ], 201), | |
| ]); | |
| $this->from(route('register.mahasiswa')) | |
| ->post(route('auth.register.store'), [ | |
| 'email' => 'student@example.com', | |
| 'identity_number' => '123456', | |
| 'name' => 'Alma', | |
| 'password' => 'secret123', | |
| 'phone' => '081234567890', | |
| 'role' => 'student', | |
| ]) | |
| ->assertRedirect(route('login')) | |
| ->assertSessionHas('status', 'Registration successful.') | |
| ->assertSessionHasNoErrors(); | |
| Http::assertSent(fn (HttpRequest $request): bool => $request->method() === 'POST' | |
| && $request->url() === 'https://rag.test/api/v1/auth/register' | |
| && $request['email'] === 'student@example.com' | |
| && $request['identity_number'] === '123456' | |
| && $request['name'] === 'Alma' | |
| && $request['password'] === 'secret123' | |
| && $request['phone'] === '081234567890' | |
| && $request['role'] === 'student'); | |
| }); | |
| test('register uses backend error message', function () { | |
| config(['services.rag.base_url' => 'https://rag.test/api/v1']); | |
| Http::fake([ | |
| 'https://rag.test/api/v1/auth/register' => Http::response([ | |
| 'detail' => [ | |
| ['msg' => 'Email already registered.'], | |
| ], | |
| ], 422), | |
| ]); | |
| $this->from(route('register.mahasiswa')) | |
| ->post(route('auth.register.store'), [ | |
| 'email' => 'student@example.com', | |
| 'identity_number' => '123456', | |
| 'name' => 'Alma', | |
| 'password' => 'secret123', | |
| 'role' => 'student', | |
| ]) | |
| ->assertRedirect(route('register.mahasiswa')) | |
| ->assertSessionHasErrors(['auth' => 'Email already registered.']); | |
| }); | |
| test('register maps backend field validation errors to matching fields', function () { | |
| config(['services.rag.base_url' => 'https://rag.test/api/v1']); | |
| Http::fake([ | |
| 'https://rag.test/api/v1/auth/register' => Http::response([ | |
| 'errors' => [ | |
| [ | |
| 'field' => 'name', | |
| 'label' => 'Full Name', | |
| 'message' => 'Full Name harus berisi minimal nama depan dan nama belakang.', | |
| ], | |
| [ | |
| 'field' => 'role', | |
| 'label' => 'Role', | |
| 'message' => 'admin is not allowed for self-registration', | |
| ], | |
| ], | |
| 'field_errors' => [ | |
| 'name' => 'Full Name harus berisi minimal nama depan dan nama belakang.', | |
| 'role' => 'admin is not allowed for self-registration', | |
| ], | |
| 'message' => 'Periksa kembali field yang ditandai.', | |
| ], 422), | |
| ]); | |
| $this->from(route('register.mahasiswa')) | |
| ->post(route('auth.register.store'), [ | |
| 'email' => 'student@example.com', | |
| 'identity_number' => '123456', | |
| 'name' => 'Alma', | |
| 'password' => 'secret123', | |
| 'role' => 'student', | |
| ]) | |
| ->assertRedirect(route('register.mahasiswa')) | |
| ->assertSessionHasErrors([ | |
| 'name' => 'Full Name harus berisi minimal nama depan dan nama belakang.', | |
| 'role' => 'admin is not allowed for self-registration', | |
| ]); | |
| }); | |
| test('register rejects identity number with letters before calling backend', function () { | |
| config(['services.rag.base_url' => 'https://rag.test/api/v1']); | |
| Http::fake(); | |
| $this->from(route('register.mahasiswa')) | |
| ->post(route('auth.register.store'), [ | |
| 'email' => 'student@example.com', | |
| 'identity_number' => 'AB123456', | |
| 'name' => 'Alma Putri', | |
| 'password' => 'secret123', | |
| 'role' => 'student', | |
| ]) | |
| ->assertRedirect(route('register.mahasiswa')) | |
| ->assertSessionHasErrors(['identity_number']); | |
| Http::assertNothingSent(); | |
| }); | |