clqms-be/tests/feature/UniformShowTest.php
root 2bcdf09b55 chore: repo-wide normalization + rules test coverage
Normalize formatting/line endings across configs, controllers, models, tests, and OpenAPI specs.

Update rule expression/rule engine implementation and remove obsolete RuleAction controller/model.

Add unit tests for rule expression syntax and multi-action behavior, and include docs updates.
2026-03-16 07:24:50 +07:00

112 lines
3.9 KiB
PHP

<?php
namespace Tests\Feature;
use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Test\CIUnitTestCase;
class UniformShowTest extends CIUnitTestCase
{
use FeatureTestTrait;
protected $endpoint = 'api';
protected $token;
protected function setUp(): void
{
parent::setUp();
// Generate Token
$key = getenv('JWT_SECRET') ?: 'my-secret-key'; // Fallback if env not loaded in test
$payload = [
'iss' => 'localhost',
'aud' => 'localhost',
'iat' => time(),
'nbf' => time(),
'exp' => time() + 3600,
'uid' => 1,
'email' => 'admin@admin.com'
];
$this->token = \Firebase\JWT\JWT::encode($payload, $key, 'HS256');
}
// Override get to inject cookie header
public function get(string $path, array $options = []) {
$this->withHeaders(['Cookie' => 'token=' . $this->token]);
return $this->call('get', $path, $options);
}
/**
* Test that show endpoints return a single object (associative array) in 'data' when found.
*/
public function testShowEndpointsReturnObjectWhenFound()
{
// representative endpoints.
$endpoints = [
'api/location',
'api/organization/site',
'api/organization/account',
'api/patient',
'api/tests',
'api/specimen/containerdef',
'api/contact',
];
foreach ($endpoints as $url) {
// We first check index to get a valid ID if possible
$indexResult = $this->get($url);
$indexBody = json_decode($indexResult->response()->getBody(), true);
$id = 1; // logical default
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$firstItem = $indexBody['data'][0];
// Try to guess ID key
$idKeys = ['LocationID', 'SiteID', 'AccountID', 'InternalPID', 'TestSiteID', 'ConDefID', 'ContactID', 'VID', 'id'];
foreach ($idKeys as $key) {
if (isset($firstItem[$key])) {
$id = $firstItem[$key];
break;
}
}
}
$showUrl = $url . '/' . $id;
$result = $this->get($showUrl);
$body = json_decode($result->response()->getBody(), true);
if ($result->response()->getStatusCode() === 200 && isset($body['data']) && $body['data'] !== null) {
$this->assertTrue(
$this->is_assoc($body['data']),
"Endpoint $showUrl should return an object in 'data', but got a sequential array or empty array. Body: " . $result->response()->getBody()
);
}
}
}
public function testShowEndpointsReturnNullWhenNotFound()
{
$endpoints = [
'api/location/9999999',
'api/organization/site/9999999',
'api/patient/9999999',
];
foreach ($endpoints as $url) {
$result = $this->get($url);
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertArrayHasKey('data', $body, "Endpoint $url missing 'data' key. Body: " . $result->response()->getBody());
$this->assertNull($body['data'], "Endpoint $url should return null in 'data' when not found. Body: " . $result->response()->getBody());
}
}
/**
* Helper to check if array is associative.
*/
private function is_assoc(array $arr)
{
if (array() === $arr) return false;
return array_keys($arr) !== range(0, count($arr) - 1);
}
}