create(); $this->planner = $planner; $this->action = new EditUserAction(); } public function test_successfully_updates_user_name(): void { $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); $newName = 'Updated Name'; $result = $this->action->execute($user, ['name' => $newName]); $this->assertTrue($result); $this->assertEquals($newName, $user->fresh()->name); } public function test_logs_successful_update(): void { Log::shouldReceive('info') ->with('EditUserAction: Starting user update', \Mockery::type('array')) ->once(); Log::shouldReceive('info') ->with('EditUserAction: Update result', \Mockery::type('array')) ->once(); Log::shouldReceive('info') ->with('EditUserAction: User successfully updated', \Mockery::type('array')) ->once(); $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); $this->action->execute($user, ['name' => 'Updated Name']); } public function test_throws_exception_when_update_fails(): void { $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); $mockUser = \Mockery::mock($user); $mockUser->shouldReceive('update')->andReturn(false); $mockUser->shouldReceive('getAttribute')->with('id')->andReturn($user->id); $mockUser->shouldReceive('getAttribute')->with('name')->andReturn($user->name); $mockUser->shouldReceive('getAttribute')->with('planner_id')->andReturn($user->planner_id); Log::shouldReceive('info')->twice(); Log::shouldReceive('error') ->with('EditUserAction: User update failed', \Mockery::type('array')) ->once(); $this->expectException(\Exception::class); $this->expectExceptionMessage('User update returned false'); $this->action->execute($mockUser, ['name' => 'Updated Name']); } public function test_throws_exception_when_update_does_not_persist(): void { $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); $mockUser = \Mockery::mock($user); $mockUser->shouldReceive('update')->andReturn(true); $mockUser->shouldReceive('refresh')->andReturnSelf(); $mockUser->shouldReceive('getAttribute')->with('id')->andReturn($user->id); $mockUser->shouldReceive('getAttribute')->with('name')->andReturn('Original Name'); $mockUser->shouldReceive('getAttribute')->with('planner_id')->andReturn($user->planner_id); Log::shouldReceive('info')->twice(); Log::shouldReceive('error') ->with('EditUserAction: User update failed', \Mockery::type('array')) ->once(); $this->expectException(\Exception::class); $this->expectExceptionMessage('User update did not persist to database'); $this->action->execute($mockUser, ['name' => 'Updated Name']); } public function test_rolls_back_transaction_on_failure(): void { $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); DB::shouldReceive('beginTransaction')->once(); DB::shouldReceive('rollBack')->once(); DB::shouldReceive('commit')->never(); $mockUser = \Mockery::mock($user); $mockUser->shouldReceive('update')->andThrow(new \Exception('Database error')); $mockUser->shouldReceive('getAttribute')->with('id')->andReturn($user->id); $mockUser->shouldReceive('getAttribute')->with('name')->andReturn($user->name); $mockUser->shouldReceive('getAttribute')->with('planner_id')->andReturn($user->planner_id); Log::shouldReceive('info')->once(); Log::shouldReceive('error') ->with('EditUserAction: User update failed', \Mockery::type('array')) ->once(); $this->expectException(\Exception::class); $this->expectExceptionMessage('Database error'); $this->action->execute($mockUser, ['name' => 'Updated Name']); } public function test_commits_transaction_on_success(): void { DB::shouldReceive('beginTransaction')->once(); DB::shouldReceive('commit')->once(); DB::shouldReceive('rollBack')->never(); Log::shouldReceive('info')->times(3); $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); $result = $this->action->execute($user, ['name' => 'Updated Name']); $this->assertTrue($result); } public function test_validates_name_is_provided(): void { $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); $this->expectException(\Exception::class); $this->action->execute($user, []); } public function test_handles_empty_name(): void { $user = User::factory()->planner($this->planner)->create(['name' => 'Original Name']); $result = $this->action->execute($user, ['name' => '']); $this->assertTrue($result); $this->assertEquals('', $user->fresh()->name); } }