Expose Care service-token APIs to create queues and counters.
Deploy Ladill Queue / deploy (push) Successful in 1m0s

Specialty module activation needs idempotent queue/counter upserts
(by external_key or name+branch) plus soft deactivate, without
opening Queue admin for each Care specialty.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-17 16:03:16 +00:00
co-authored by Cursor
parent 01792b38e7
commit 9edf573d39
5 changed files with 484 additions and 33 deletions
+111
View File
@@ -97,4 +97,115 @@ class CareIntegrationTest extends TestCase
$this->assertSame('uuid', (new Counter)->getRouteKeyName());
$this->assertSame('uuid', (new ServiceQueue)->getRouteKeyName());
}
public function test_care_can_create_queue_and_counter_idempotently(): void
{
$owner = 'care-owner-uuid';
$headers = $this->careHeaders($owner);
$this->provisionCareOrg($owner);
$queueResponse = $this->postJson('/api/v1/queues', [
'owner' => $owner,
'name' => 'Dentistry',
'prefix' => 'DEN',
'branch_name' => 'Main',
'external_key' => 'care:specialty:dentistry:queue:1',
'strategy' => 'fifo',
], $headers)
->assertCreated()
->assertJsonPath('data.name', 'Dentistry')
->assertJsonPath('data.external_key', 'care:specialty:dentistry:queue:1');
$queueUuid = $queueResponse->json('data.uuid');
$this->postJson('/api/v1/queues', [
'owner' => $owner,
'name' => 'Dentistry Desk',
'prefix' => 'DEN',
'branch_name' => 'Main',
'external_key' => 'care:specialty:dentistry:queue:1',
'strategy' => 'fifo',
], $headers)
->assertOk()
->assertJsonPath('data.uuid', $queueUuid)
->assertJsonPath('data.name', 'Dentistry Desk');
$this->assertSame(1, ServiceQueue::owned($owner)->count());
$counterResponse = $this->postJson('/api/v1/counters', [
'owner' => $owner,
'name' => 'Dentistry counter',
'branch_name' => 'Main',
'queue_uuids' => [$queueUuid],
'external_key' => 'care:specialty:dentistry:counter:1',
], $headers)
->assertCreated()
->assertJsonPath('data.name', 'Dentistry counter')
->assertJsonPath('data.branch', 'Main')
->assertJsonPath('data.queues.0.uuid', $queueUuid);
$counterUuid = $counterResponse->json('data.uuid');
$this->postJson('/api/v1/counters', [
'owner' => $owner,
'name' => 'Dentistry counter',
'branch_name' => 'Main',
'queue_uuids' => [$queueUuid],
'external_key' => 'care:specialty:dentistry:counter:1',
], $headers)
->assertOk()
->assertJsonPath('data.uuid', $counterUuid);
$this->assertSame(1, Counter::owned($owner)->count());
$this->getJson('/api/v1/counters?owner='.$owner, $headers)
->assertOk()
->assertJsonPath('data.0.uuid', $counterUuid)
->assertJsonPath('data.0.branch', 'Main')
->assertJsonPath('data.0.queues.0.name', 'Dentistry Desk');
}
public function test_care_can_soft_deactivate_counter(): void
{
$owner = 'care-owner-uuid';
$headers = $this->careHeaders($owner);
$organization = $this->provisionCareOrg($owner);
$branch = Branch::owned($owner)->where('organization_id', $organization->id)->firstOrFail();
$counter = Counter::create([
'owner_ref' => $owner,
'organization_id' => $organization->id,
'branch_id' => $branch->id,
'name' => 'Eye care counter',
'status' => 'offline',
'is_active' => true,
]);
$this->patchJson('/api/v1/counters/'.$counter->uuid, [
'owner' => $owner,
'is_active' => false,
], $headers)
->assertOk()
->assertJsonPath('data.is_active', false);
$this->assertFalse($counter->fresh()->is_active);
$this->assertDatabaseHas('queue_counters', ['id' => $counter->id]);
}
public function test_care_can_ensure_branch_by_name_idempotently(): void
{
$owner = 'care-owner-uuid';
$headers = $this->careHeaders($owner);
$this->provisionCareOrg($owner);
// Free plan is capped at 1 branch; provision already created Main — upsert must not duplicate.
$this->postJson('/api/v1/branches', [
'owner' => $owner,
'name' => 'Main',
], $headers)
->assertOk()
->assertJsonPath('data.name', 'Main')
->assertJsonPath('data.is_active', true);
$this->assertSame(1, Branch::owned($owner)->count());
}
}