'argon2id']); } public function test_customer_bcrypt_hash_is_upgraded_to_argon2id_on_login(): void { $customer = Customer::factory()->create([ 'status' => 1, 'password' => Hash::driver('bcrypt')->make(self::PASSWORD), ]); $this->withHeaders(['x-access-token' => $this->buildClientAccessToken()]) ->postJson('/v1/client/login', ['email' => $customer->email, 'password' => self::PASSWORD]) ->assertOk() ->assertJsonStructure(['data' => ['token']]); $hash = $customer->fresh()->password; $this->assertStringStartsWith('$argon2id$', $hash); $this->assertTrue(Hash::check(self::PASSWORD, $hash)); } public function test_admin_bcrypt_hash_is_upgraded_to_argon2id_on_login(): void { $admin = User::factory()->create([ 'username' => 'rehash-admin', 'email' => 'rehash-admin@example.com', 'password' => Hash::driver('bcrypt')->make(self::PASSWORD), ]); $this->postJson('/api/v1/administrator/login', ['username' => 'rehash-admin', 'password' => self::PASSWORD]) ->assertOk(); $this->assertStringStartsWith('$argon2id$', $admin->fresh()->password); } public function test_wrong_password_does_not_rehash(): void { $bcrypt = Hash::driver('bcrypt')->make(self::PASSWORD); $customer = Customer::factory()->create(['status' => 1, 'password' => $bcrypt]); $this->withHeaders(['x-access-token' => $this->buildClientAccessToken()]) ->postJson('/v1/client/login', ['email' => $customer->email, 'password' => 'wrong-password']) ->assertStatus(422); $this->assertSame($bcrypt, $customer->fresh()->password); } }