| <?php |
|
|
| 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(); |
| }); |
|
|