DiditMaintenanceTest.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. namespace Tests\Feature;
  3. use App\Enums\ApprovalStatusEnum;
  4. use App\Enums\IdentityVerificationStatusEnum;
  5. use App\Enums\UserTypeEnum;
  6. use App\Models\IdentityVerification;
  7. use App\Models\Provider;
  8. use App\Models\User;
  9. use App\Services\Didit\DiditSessionService;
  10. use App\Services\PushNotificationService;
  11. use Illuminate\Foundation\Testing\RefreshDatabase;
  12. use Illuminate\Support\Facades\Mail;
  13. use Mockery\MockInterface;
  14. use Tests\TestCase;
  15. class DiditMaintenanceTest extends TestCase
  16. {
  17. use RefreshDatabase;
  18. protected function setUp(): void
  19. {
  20. parent::setUp();
  21. Mail::fake();
  22. $this->mock(PushNotificationService::class)->shouldReceive('sendToUser')->andReturnNull();
  23. }
  24. public function test_sync_reconcilia_verificacao_travada(): void
  25. {
  26. $provider = $this->makeProvider();
  27. $verification = $this->makeStuckVerification($provider->user_id);
  28. $this->mockDecision($verification->session_id, $this->approvedDecision());
  29. $this->artisan('didit:sync')->assertSuccessful();
  30. $verification->refresh();
  31. $this->assertSame('Approved', $verification->didit_status);
  32. $this->assertNotNull($verification->completed_at);
  33. $this->assertSame(
  34. IdentityVerificationStatusEnum::APPROVED,
  35. $provider->refresh()->identity_verification_status,
  36. );
  37. }
  38. public function test_sync_ignora_verificacao_recente(): void
  39. {
  40. $provider = $this->makeProvider();
  41. $this->makeStuckVerification($provider->user_id, startedHoursAgo: 1);
  42. $this->mock(DiditSessionService::class)
  43. ->shouldNotReceive('getDecision');
  44. $this->artisan('didit:sync')
  45. ->expectsOutputToContain('Nenhuma verificacao para reconciliar')
  46. ->assertSuccessful();
  47. }
  48. public function test_dry_run_nao_altera_nada(): void
  49. {
  50. $provider = $this->makeProvider();
  51. $verification = $this->makeStuckVerification($provider->user_id);
  52. $this->mock(DiditSessionService::class)
  53. ->shouldNotReceive('getDecision');
  54. $this->artisan('didit:sync', ['--dry-run' => true])->assertSuccessful();
  55. $this->assertSame('In Progress', $verification->refresh()->didit_status);
  56. }
  57. //
  58. private function mockDecision(string $sessionId, array $decision): MockInterface
  59. {
  60. return $this->mock(DiditSessionService::class, function (MockInterface $mock) use ($sessionId, $decision) {
  61. $mock->shouldReceive('getDecision')->with($sessionId)->once()->andReturn($decision);
  62. });
  63. }
  64. private function approvedDecision(): array
  65. {
  66. $decision = json_decode(
  67. file_get_contents(base_path('tests/Fixtures/didit/decision_approved_cin.json')),
  68. true,
  69. );
  70. $decision['status'] = 'Approved';
  71. return $decision;
  72. }
  73. private function makeStuckVerification(int $userId, int $startedHoursAgo = 12): IdentityVerification
  74. {
  75. return IdentityVerification::query()->create([
  76. 'user_id' => $userId,
  77. 'session_id' => (string) \Illuminate\Support\Str::uuid(),
  78. 'didit_status' => 'In Progress',
  79. 'attempt' => 1,
  80. 'started_at' => now()->subHours($startedHoursAgo),
  81. ]);
  82. }
  83. private function makeProvider(): Provider
  84. {
  85. $user = User::query()->create([
  86. 'name' => 'Prestador Teste',
  87. 'email' => 'prestador'.uniqid().'@teste.com',
  88. 'password' => 'secret',
  89. 'type' => UserTypeEnum::PROVIDER->value,
  90. ]);
  91. return Provider::query()->create([
  92. 'user_id' => $user->id,
  93. 'document' => '06767310905',
  94. 'birth_date' => '1990-01-01',
  95. 'approval_status' => ApprovalStatusEnum::PENDING->value,
  96. ]);
  97. }
  98. }