shopit-back/tests/Feature/Ticket/PrepareLoadTestTicketsComma...

108 lines
3.8 KiB
PHP

<?php
namespace Tests\Feature\Ticket;
use App\Domains\Attachable\Models\Attachment;
use App\Domains\Catalog\Models\CatalogItem;
use App\Domains\Catalog\Models\Category;
use App\Domains\Tenant\Models\Tenant;
use App\Domains\Tenant\Models\WebsiteType;
use App\Domains\Ticket\Models\Ticket;
use Database\Seeders\AuthorizationSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Tests\TestCase;
class PrepareLoadTestTicketsCommandTest extends TestCase
{
use RefreshDatabase;
public function test_it_generates_a_postman_dataset_that_can_scan_the_tickets(): void
{
Storage::fake('local');
$this->seed(AuthorizationSeeder::class);
WebsiteType::query()->create(['codigo' => 'onticket', 'nombre' => 'OnTicket']);
$tenant = $this->createTenant('acme');
$category = Category::query()->create([
'tenant_code' => $tenant->codigo,
'nombre' => 'Entradas de carga',
]);
$catalogItem = CatalogItem::query()->create([
'tenant_code' => $tenant->codigo,
'category_id' => $category->id,
'slug' => 'entrada-load-test',
'nombre' => 'Entrada load test',
'descripcion' => 'Ticket descartable',
'precio' => 100,
'has_tickets' => true,
]);
$exitCode = Artisan::call('load-test:tickets:prepare', [
'tenant' => $tenant->codigo,
'--tickets' => 4,
'--scanners' => 2,
'--owners' => 2,
'--catalog-item' => $catalogItem->id,
'--run' => 'test-run',
'--output' => 'load-tests/test-run.postman.json',
]);
$this->assertSame(0, $exitCode, Artisan::output());
Storage::disk('local')->assertExists('load-tests/test-run.postman.json');
$rows = json_decode(
Storage::disk('local')->get('load-tests/test-run.postman.json'),
true,
flags: JSON_THROW_ON_ERROR,
);
$this->assertCount(4, $rows);
$this->assertCount(4, collect($rows)->pluck('ticket_uuid')->unique());
$this->assertCount(2, collect($rows)->pluck('scanner_token')->unique());
$this->assertSame([200], collect($rows)->pluck('expected_status')->unique()->values()->all());
$this->assertDatabaseCount('tickets', 4);
$this->assertCount(2, Ticket::query()->distinct()->pluck('user_id'));
$this->assertDatabaseCount('category_scanners', 2);
$first = $rows[0];
$this->withToken($first['scanner_token'])
->postJson("/api/v1/scanner/tickets/{$first['ticket_uuid']}/scan")
->assertOk()
->assertJsonPath('data.ticket', $first['ticket_uuid']);
$this->assertNotNull(
Ticket::query()->where('ticket', $first['ticket_uuid'])->firstOrFail()->used_at
);
}
private function createTenant(string $code): Tenant
{
$logo = Attachment::query()->create([
'key' => (string) Str::uuid(),
'path' => "tests/{$code}-logo.png",
'filename' => "{$code}-logo.png",
'type' => 'image',
'mime_type' => 'image/png',
'extension' => 'png',
'size' => 1,
]);
return Tenant::query()->create([
'codigo' => $code,
'nombre' => ucfirst($code),
'dominio' => "{$code}.test",
'primary_color' => '#ff7006',
'secondary_color' => '#777777',
'danger_color' => '#e04a4a',
'success_color' => '#81bc73',
'header_bg_color' => '#313131',
'footer_bg_color' => '#313131',
'header_logo_id' => $logo->id,
'footer_logo_id' => $logo->id,
'website_type_code' => 'onticket',
]);
}
}