163 lines
5.6 KiB
PHP
163 lines
5.6 KiB
PHP
|
|
<?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);
|
||
|
|
}
|
||
|
|
}
|