PATCH requests in this API now follow update semantics and return 200 instead of 201. Update the feature test assertion so it validates the standardized behavior and avoids false failures.
302 lines
11 KiB
PHP
302 lines
11 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature;
|
|
|
|
use CodeIgniter\Exceptions\PageNotFoundException;
|
|
use CodeIgniter\Test\FeatureTestTrait;
|
|
use CodeIgniter\Test\CIUnitTestCase;
|
|
use Firebase\JWT\JWT;
|
|
|
|
class MasterDataPatchTest extends CIUnitTestCase
|
|
{
|
|
use FeatureTestTrait;
|
|
|
|
protected string $token;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
$key = getenv('JWT_SECRET') ?: 'my-secret-key';
|
|
$payload = [
|
|
'iss' => 'localhost',
|
|
'aud' => 'localhost',
|
|
'iat' => time(),
|
|
'nbf' => time(),
|
|
'exp' => time() + 3600,
|
|
'uid' => 1,
|
|
'email' => 'admin@admin.com',
|
|
];
|
|
|
|
$this->token = JWT::encode($payload, $key, 'HS256');
|
|
}
|
|
|
|
private function authHeaders(): array
|
|
{
|
|
return ['Cookie' => 'token=' . $this->token];
|
|
}
|
|
|
|
private function createResource(string $endpoint, array $payload)
|
|
{
|
|
$response = $this->withHeaders($this->authHeaders())
|
|
->withBody(json_encode($payload))
|
|
->call('post', $endpoint);
|
|
|
|
$response->assertStatus(201);
|
|
$decoded = json_decode($response->getJSON(), true);
|
|
|
|
$this->assertEquals('success', $decoded['status']);
|
|
|
|
return $decoded['data'];
|
|
}
|
|
|
|
private function fetchFirstRecord(string $endpoint, string $idKey): array
|
|
{
|
|
try {
|
|
$response = $this->withHeaders($this->authHeaders())->call('get', $endpoint);
|
|
} catch (PageNotFoundException $e) {
|
|
$this->markTestSkipped("{$endpoint} GET not available: {$e->getMessage()}");
|
|
}
|
|
|
|
$response->assertStatus(200);
|
|
$decoded = json_decode($response->getJSON(), true);
|
|
$rows = $decoded['data'] ?? [];
|
|
|
|
if (empty($rows)) {
|
|
$this->markTestSkipped("No data available at {$endpoint}");
|
|
}
|
|
|
|
$record = $rows[0];
|
|
$this->assertArrayHasKey($idKey, $record);
|
|
|
|
return $record;
|
|
}
|
|
|
|
private function fetchResource(string $endpoint, $id): array
|
|
{
|
|
try {
|
|
$response = $this->withHeaders($this->authHeaders())
|
|
->call('get', "$endpoint/{$id}");
|
|
} catch (PageNotFoundException $e) {
|
|
$this->markTestSkipped("{$endpoint}/{$id} GET not available: {$e->getMessage()}");
|
|
}
|
|
|
|
$response->assertStatus(200);
|
|
$decoded = json_decode($response->getJSON(), true);
|
|
|
|
return $decoded['data'];
|
|
}
|
|
|
|
public function testPartialUpdateOccupation()
|
|
{
|
|
$occCode = 'PATCH_OCC_' . uniqid();
|
|
$id = $this->createResource('api/occupation', [
|
|
'OccCode' => $occCode,
|
|
'OccText' => 'Original text',
|
|
]);
|
|
|
|
$originalData = $this->fetchResource('api/occupation', $id);
|
|
$originalCode = $originalData['OccCode'];
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/occupation/{$id}", ['OccText' => 'Patched occupation']);
|
|
|
|
$patch->assertStatus(201);
|
|
$patchData = json_decode($patch->getJSON(), true);
|
|
$this->assertEquals('success', $patchData['status']);
|
|
|
|
$showData = $this->fetchResource('api/occupation', $id);
|
|
|
|
$this->assertEquals('Patched occupation', $showData['OccText']);
|
|
$this->assertEquals($originalCode, $showData['OccCode']);
|
|
}
|
|
|
|
public function testPartialUpdateMedicalSpecialty()
|
|
{
|
|
$text = 'Specialty ' . uniqid();
|
|
$id = $this->createResource('api/medicalspecialty', ['SpecialtyText' => $text]);
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/medicalspecialty/{$id}", ['SpecialtyText' => 'Updated specialty']);
|
|
|
|
$patch->assertStatus(201);
|
|
$show = $this->withHeaders($this->authHeaders())->call('get', "api/medicalspecialty/{$id}");
|
|
$show->assertStatus(200);
|
|
$showData = json_decode($show->getJSON(), true)['data'];
|
|
|
|
$this->assertEquals('Updated specialty', $showData['SpecialtyText']);
|
|
}
|
|
|
|
public function testPartialUpdateCounter()
|
|
{
|
|
$initial = 'Counter ' . uniqid();
|
|
$id = $this->createResource('api/counter', [
|
|
'CounterName' => $initial,
|
|
'CounterValue' => 1,
|
|
'CounterStart' => 1,
|
|
'CounterEnd' => 10,
|
|
'CounterReset' => 1,
|
|
]);
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/counter/{$id}", ['CounterName' => 'Updated counter']);
|
|
|
|
$patch->assertStatus(201);
|
|
$show = $this->withHeaders($this->authHeaders())->call('get', "api/counter/{$id}");
|
|
$show->assertStatus(200);
|
|
$showData = json_decode($show->getJSON(), true)['data'];
|
|
|
|
$this->assertEquals('Updated counter', $showData['CounterName']);
|
|
$this->assertEquals(1, (int) $showData['CounterValue']);
|
|
}
|
|
|
|
public function testPartialUpdateOrganizationAccount()
|
|
{
|
|
$name = 'Account ' . uniqid();
|
|
$id = $this->createResource('api/organization/account', ['AccountName' => $name]);
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/organization/account/{$id}", ['AccountName' => 'Updated account']);
|
|
|
|
$patch->assertStatus(200);
|
|
$show = $this->withHeaders($this->authHeaders())->call('get', "api/organization/account/{$id}");
|
|
$show->assertStatus(200);
|
|
$showData = json_decode($show->getJSON(), true)['data'];
|
|
|
|
$this->assertEquals('Updated account', $showData['AccountName']);
|
|
}
|
|
|
|
public function testPartialUpdateDiscipline()
|
|
{
|
|
$code = 'DIS_' . strtoupper(bin2hex(random_bytes(2)));
|
|
$name = 'Discipline ' . uniqid();
|
|
$id = $this->createResource('api/organization/discipline', [
|
|
'DisciplineCode' => $code,
|
|
'DisciplineName' => $name,
|
|
]);
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/organization/discipline/{$id}", ['DisciplineName' => 'Discipline Updated']);
|
|
|
|
$patch->assertStatus(201);
|
|
$show = $this->withHeaders($this->authHeaders())->call('get', "api/organization/discipline/{$id}");
|
|
$show->assertStatus(200);
|
|
$showData = json_decode($show->getJSON(), true)['data'];
|
|
|
|
$this->assertEquals('Discipline Updated', $showData['DisciplineName']);
|
|
$this->assertEquals($code, $showData['DisciplineCode']);
|
|
}
|
|
|
|
public function testPartialUpdateCodingSystem()
|
|
{
|
|
$abbr = 'CS' . strtoupper(bin2hex(random_bytes(2)));
|
|
$full = 'Full text ' . uniqid();
|
|
$id = $this->createResource('api/organization/codingsys', [
|
|
'CodingSysAbb' => $abbr,
|
|
'FullText' => $full,
|
|
]);
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/organization/codingsys/{$id}", ['FullText' => 'Updated full text']);
|
|
|
|
$patch->assertStatus(201);
|
|
$show = $this->withHeaders($this->authHeaders())->call('get', "api/organization/codingsys/{$id}");
|
|
$show->assertStatus(200);
|
|
$showData = json_decode($show->getJSON(), true)['data'];
|
|
|
|
$this->assertEquals('Updated full text', $showData['FullText']);
|
|
$this->assertEquals($abbr, $showData['CodingSysAbb']);
|
|
}
|
|
|
|
public function testPartialUpdateSpecimenContainer()
|
|
{
|
|
$record = $this->fetchFirstRecord('api/specimen/container', 'ConDefID');
|
|
$id = $record['ConDefID'];
|
|
$newName = 'Patch Container ' . uniqid();
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/specimen/container/{$id}", ['ConName' => $newName]);
|
|
|
|
$patch->assertStatus(201);
|
|
$showData = $this->fetchResource('api/specimen/container', $id);
|
|
|
|
$this->assertEquals($newName, $showData['ConName']);
|
|
$this->assertEquals($record['ConCode'] ?? null, $showData['ConCode'] ?? null);
|
|
}
|
|
|
|
public function testPartialUpdateSpecimenPrep()
|
|
{
|
|
$record = $this->fetchFirstRecord('api/specimen/prep', 'SpcPrpID');
|
|
$id = $record['SpcPrpID'];
|
|
$newDesc = 'Partial Prep ' . uniqid();
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/specimen/prep/{$id}", ['Description' => $newDesc]);
|
|
|
|
$patch->assertStatus(201);
|
|
$showData = $this->fetchResource('api/specimen/prep', $id);
|
|
|
|
$this->assertEquals($newDesc, $showData['Description']);
|
|
$this->assertEquals($record['SpcStaID'] ?? null, $showData['SpcStaID'] ?? null);
|
|
}
|
|
|
|
public function testPartialUpdateSpecimenStatus()
|
|
{
|
|
$record = $this->fetchFirstRecord('api/specimen/status', 'SpcStaID');
|
|
$id = $record['SpcStaID'];
|
|
$newStatus = 'UpdatedStatus';
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/specimen/status/{$id}", ['SpcStatus' => $newStatus]);
|
|
|
|
$patch->assertStatus(201);
|
|
$showData = $this->fetchResource('api/specimen/status', $id);
|
|
|
|
$this->assertEquals($newStatus, $showData['SpcStatus']);
|
|
$this->assertEquals($record['OrderID'] ?? null, $showData['OrderID'] ?? null);
|
|
}
|
|
|
|
public function testPartialUpdateSpecimenCollection()
|
|
{
|
|
$record = $this->fetchFirstRecord('api/specimen/collection', 'SpcColID');
|
|
$id = $record['SpcColID'];
|
|
$newBodySite = 'BodySite ' . uniqid();
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/specimen/collection/{$id}", ['BodySite' => $newBodySite]);
|
|
|
|
$patch->assertStatus(201);
|
|
$showData = $this->fetchResource('api/specimen/collection', $id);
|
|
|
|
$this->assertEquals($newBodySite, $showData['BodySite']);
|
|
$this->assertEquals($record['SpRole'] ?? null, $showData['SpRole'] ?? null);
|
|
}
|
|
|
|
public function testPartialUpdateEquipmentList()
|
|
{
|
|
$record = $this->fetchFirstRecord('api/equipmentlist', 'EID');
|
|
$id = $record['EID'];
|
|
$newName = 'Equipment ' . uniqid();
|
|
|
|
$patch = $this->withHeaders($this->authHeaders())
|
|
->withBodyFormat('json')
|
|
->call('patch', "api/equipmentlist/{$id}", ['InstrumentName' => $newName]);
|
|
|
|
$patch->assertStatus(200, 'Equipment patch should return 200');
|
|
$showData = $this->fetchResource('api/equipmentlist', $id);
|
|
|
|
$this->assertEquals($newName, $showData['InstrumentName']);
|
|
$this->assertEquals($record['DepartmentID'] ?? null, $showData['DepartmentID'] ?? null);
|
|
}
|
|
}
|