app/tests/Unit/Actions/EditUserActionTest.php

163 lines
5.6 KiB
PHP
Raw Normal View History

<?php
namespace Tests\Unit\Actions;
use App\Actions\User\EditUserAction;
use App\Models\Planner;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Tests\TestCase;
use Tests\Traits\HasPlanner;
class EditUserActionTest extends TestCase
{
use HasPlanner;
use RefreshDatabase;
protected EditUserAction $action;
protected function setUp(): void
{
parent::setUp();
$planner = Planner::factory()->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);
}
}