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