refactor(test): remove legacy v2 master tests and cleanup HealthTest

- Deleted obsolete v2 master test files and support classes:
  - tests/_support/v2/MasterTestCase.php
  - tests/unit/v2/master/TestDef/TestDefSiteModelTest.php
  - tests/unit/v2/master/TestDef/TestDefTechModelTest.php
  - tests/unit/v2/master/TestDef/TestMapModelTest.php
  - tests/feature/v2/master/TestDef/TestDefSiteTest.php
- Cleaned up formatting and logic in tests/unit/HealthTest.php.
This commit is contained in:
mahdahar 2026-01-19 08:29:56 +07:00
parent 351d3b6279
commit e96ffa1ca9
12 changed files with 2 additions and 2560 deletions

View File

@ -1,325 +0,0 @@
<?php
namespace Tests\Support\v2;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\FeatureTestTrait;
use Firebase\JWT\JWT;
/**
* Base test case for v2 Master Data tests
*
* Provides common setup, authentication, and helper methods
* for all v2 master test feature and unit tests.
*/
abstract class MasterTestCase extends CIUnitTestCase
{
use FeatureTestTrait;
/**
* JWT token for authentication
*/
protected ?string $token = null;
/**
* Test site ID
*/
protected int $testSiteId = 1;
/**
* Test site code
*/
protected string $testSiteCode = 'TEST01';
/**
* Valueset IDs for test types
*/
public const VALUESET_TEST_TYPE = 27; // VSetID for Test Types
public const VALUESET_RESULT_TYPE = 43; // VSetID for Result Types
public const VALUESET_REF_TYPE = 44; // VSetID for Reference Types
public const VALUESET_ENTITY_TYPE = 39; // VSetID for Entity Types
/**
* Test Type VIDs
*/
public const TEST_TYPE_TEST = 1; // VID for TEST
public const TEST_TYPE_PARAM = 2; // VID for PARAM
public const TEST_TYPE_CALC = 3; // VID for CALC
public const TEST_TYPE_GROUP = 4; // VID for GROUP
public const TEST_TYPE_TITLE = 5; // VID for TITLE
/**
* Setup test environment
*/
protected function setUp(): void
{
parent::setUp();
$this->token = $this->generateTestToken();
}
/**
* Cleanup after test
*/
protected function tearDown(): void
{
parent::tearDown();
}
/**
* Generate JWT token for testing
*/
protected function generateTestToken(): string
{
$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'
];
return JWT::encode($payload, $key, 'HS256');
}
/**
* Make authenticated GET request
*/
protected function get(string $path, array $options = [])
{
$this->withHeaders(['Authorization' => 'Bearer ' . $this->token]);
return $this->call('get', $path, $options);
}
/**
* Make authenticated POST request
*/
protected function post(string $path, array $options = [])
{
$this->withHeaders(['Authorization' => 'Bearer ' . $this->token]);
return $this->call('post', $path, $options);
}
/**
* Make authenticated PUT request
*/
protected function put(string $path, array $options = [])
{
$this->withHeaders(['Authorization' => 'Bearer ' . $this->token]);
return $this->call('put', $path, $options);
}
/**
* Make authenticated DELETE request
*/
protected function delete(string $path, array $options = [])
{
$this->withHeaders(['Authorization' => 'Bearer ' . $this->token]);
return $this->call('delete', $path, $options);
}
/**
* Create a TEST type test definition
*/
protected function createTestData(): array
{
return [
'SiteID' => 1,
'TestSiteCode' => $this->testSiteCode,
'TestSiteName' => 'Test Definition ' . time(),
'TestType' => self::TEST_TYPE_TEST,
'Description' => 'Test description',
'SeqScr' => 10,
'SeqRpt' => 10,
'IndentLeft' => 0,
'VisibleScr' => 1,
'VisibleRpt' => 1,
'CountStat' => 1,
'details' => [
'DisciplineID' => 1,
'DepartmentID' => 1,
'ResultType' => 1, // Numeric
'RefType' => 1, // NMRC
'Unit1' => 'mg/dL',
'Decimal' => 2,
'Method' => 'Test Method',
'ExpectedTAT' => 60
],
'testmap' => [
[
'HostType' => 'HIS',
'HostID' => 'TEST001',
'HostTestCode' => 'TEST001',
'HostTestName' => 'Test (HIS)'
]
]
];
}
/**
* Create a PARAM type test definition
*/
protected function createParamData(): array
{
return [
'SiteID' => 1,
'TestSiteCode' => 'PARM' . substr(time(), -4),
'TestSiteName' => 'Parameter Test ' . time(),
'TestType' => self::TEST_TYPE_PARAM,
'Description' => 'Parameter test description',
'SeqScr' => 5,
'SeqRpt' => 5,
'VisibleScr' => 1,
'VisibleRpt' => 1,
'CountStat' => 1,
'details' => [
'DisciplineID' => 1,
'DepartmentID' => 1,
'ResultType' => 1,
'RefType' => 1,
'Unit1' => 'unit',
'Decimal' => 1,
'Method' => 'Parameter Method'
]
];
}
/**
* Create a GROUP type test definition with members
*/
protected function createGroupData(array $memberIds = []): array
{
return [
'SiteID' => 1,
'TestSiteCode' => 'GRUP' . substr(time(), -4),
'TestSiteName' => 'Group Test ' . time(),
'TestType' => self::TEST_TYPE_GROUP,
'Description' => 'Group test description',
'SeqScr' => 100,
'SeqRpt' => 100,
'VisibleScr' => 1,
'VisibleRpt' => 1,
'CountStat' => 1,
'Members' => $memberIds ?: [1, 2],
'testmap' => [
[
'HostType' => 'LIS',
'HostID' => 'LIS001',
'HostTestCode' => 'PANEL',
'HostTestName' => 'Test Panel (LIS)'
]
]
];
}
/**
* Create a CALC type test definition
*/
protected function createCalcData(): array
{
return [
'SiteID' => 1,
'TestSiteCode' => 'CALC' . substr(time(), -4),
'TestSiteName' => 'Calculated Test ' . time(),
'TestType' => self::TEST_TYPE_CALC,
'Description' => 'Calculated test description',
'SeqScr' => 50,
'SeqRpt' => 50,
'VisibleScr' => 1,
'VisibleRpt' => 1,
'CountStat' => 1,
'details' => [
'DisciplineID' => 1,
'DepartmentID' => 1,
'FormulaInput' => '["TEST1", "TEST2"]',
'FormulaCode' => 'TEST1 + TEST2',
'FormulaLang' => 'SQL',
'RefType' => 1,
'Unit1' => 'mg/dL',
'Decimal' => 0,
'Method' => 'Calculation Method'
],
'testmap' => [
[
'HostType' => 'LIS',
'HostID' => 'LIS001',
'HostTestCode' => 'CALCR',
'HostTestName' => 'Calculated Result (LIS)'
]
]
];
}
/**
* Assert API response has success status
*/
protected function assertSuccessResponse($response, string $message = 'Response should be successful'): void
{
$body = json_decode($response->response()->getBody(), true);
$this->assertArrayHasKey('status', $body, $message);
$this->assertEquals('success', $body['status'], $message);
}
/**
* Assert API response has error status
*/
protected function assertErrorResponse($response, string $message = 'Response should be an error'): void
{
$body = json_decode($response->response()->getBody(), true);
$this->assertArrayHasKey('status', $body, $message);
$this->assertNotEquals('success', $body['status'], $message);
}
/**
* Assert response has data key
*/
protected function assertHasData($response, string $message = 'Response should have data'): void
{
$body = json_decode($response->response()->getBody(), true);
$this->assertArrayHasKey('data', $body, $message);
}
/**
* Get test type name from VID
*/
protected function getTestTypeName(int $vid): string
{
return match ($vid) {
self::TEST_TYPE_TEST => 'TEST',
self::TEST_TYPE_PARAM => 'PARAM',
self::TEST_TYPE_CALC => 'CALC',
self::TEST_TYPE_GROUP => 'GROUP',
self::TEST_TYPE_TITLE => 'TITLE',
default => 'UNKNOWN'
};
}
/**
* Skip test if database not available
*/
protected function requireDatabase(): void
{
$db = \Config\Database::connect();
try {
$db->connect();
} catch (\Exception $e) {
$this->markTestSkipped('Database not available: ' . $e->getMessage());
}
}
/**
* Skip test if required seeded data not found
*/
protected function requireSeededData(): void
{
$db = \Config\Database::connect();
$count = $db->table('valueset')
->where('VSetID', self::VALUESET_TEST_TYPE)
->countAllResults();
if ($count === 0) {
$this->markTestSkipped('Test type valuesets not seeded');
}
}
}

View File

@ -1,328 +0,0 @@
<?php
namespace Tests\Feature\v2\master\TestDef;
use Tests\Support\v2\MasterTestCase;
/**
* Feature tests for CALC type test definitions
*
* Tests CALC-specific functionality including formula configuration
*/
class TestDefCalcTest extends MasterTestCase
{
protected string $endpoint = 'v2/master/tests';
/**
* Test create CALC with formula
*/
public function testCreateCalcWithFormula(): void
{
$calcData = [
'SiteID' => 1,
'TestSiteCode' => 'CALC' . substr(time(), -4),
'TestSiteName' => 'Calculated Test ' . time(),
'TestType' => $this::TEST_TYPE_CALC,
'Description' => 'Calculated test with formula',
'SeqScr' => 50,
'SeqRpt' => 50,
'VisibleScr' => 1,
'VisibleRpt' => 1,
'CountStat' => 1,
'details' => [
'DisciplineID' => 1,
'DepartmentID' => 1,
'FormulaInput' => '["CHOL", "HDL", "TG"]',
'FormulaCode' => 'CHOL - HDL - (TG / 5)',
'FormulaLang' => 'SQL',
'RefType' => 1, // NMRC
'Unit1' => 'mg/dL',
'Decimal' => 0,
'Method' => 'Friedewald Formula'
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
if ($status === 201) {
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('created', $body['status']);
// Verify calc details were created
$calcId = $body['data']['TestSiteId'];
$showResult = $this->get($this->endpoint . '/' . $calcId);
$showBody = json_decode($showResult->response()->getBody(), true);
if ($showBody['data'] !== null) {
$this->assertArrayHasKey('testdefcal', $showBody['data']);
}
}
}
/**
* Test CALC with different formula languages
*/
public function testCalcWithDifferentFormulaLanguages(): void
{
$languages = ['Phyton', 'CQL', 'FHIRP', 'SQL'];
foreach ($languages as $lang) {
$calcData = [
'SiteID' => 1,
'TestSiteCode' => 'C' . substr(time(), -5) . strtoupper(substr($lang, 0, 1)),
'TestSiteName' => "Calc with $lang",
'TestType' => $this::TEST_TYPE_CALC,
'details' => [
'FormulaInput' => '["TEST1"]',
'FormulaCode' => 'TEST1 * 2',
'FormulaLang' => $lang
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"CALC with $lang: Expected 201, 400, or 500, got $status"
);
}
}
/**
* Test CALC with JSON formula input
*/
public function testCalcWithJsonFormulaInput(): void
{
$calcData = [
'SiteID' => 1,
'TestSiteCode' => 'CJSN' . substr(time(), -3),
'TestSiteName' => 'Calc with JSON Input',
'TestType' => $this::TEST_TYPE_CALC,
'details' => [
'FormulaInput' => '["parameter1", "parameter2", "parameter3"]',
'FormulaCode' => '(param1 + param2) / param3',
'FormulaLang' => 'FHIRP'
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
}
/**
* Test CALC with complex formula
*/
public function testCalcWithComplexFormula(): void
{
$calcData = [
'SiteID' => 1,
'TestSiteCode' => 'CCMP' . substr(time(), -3),
'TestSiteName' => 'Calc with Complex Formula',
'TestType' => $this::TEST_TYPE_CALC,
'details' => [
'FormulaInput' => '["WBC", "NEUT", "LYMPH", "MONO", "EOS", "BASO"]',
'FormulaCode' => 'if WBC > 0 then (NEUT + LYMPH + MONO + EOS + BASO) / WBC * 100 else 0',
'FormulaLang' => 'Phyton'
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
}
/**
* Test update CALC formula
*/
public function testUpdateCalcFormula(): void
{
// Create a CALC first
$calcData = [
'SiteID' => 1,
'TestSiteCode' => 'UPCL' . substr(time(), -4),
'TestSiteName' => 'Update Calc Test',
'TestType' => $this::TEST_TYPE_CALC,
'details' => [
'FormulaInput' => '["A", "B"]',
'FormulaCode' => 'A + B',
'FormulaLang' => 'SQL'
]
];
$createResult = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$createStatus = $createResult->response()->getStatusCode();
if ($createStatus === 201) {
$createBody = json_decode($createResult->response()->getBody(), true);
$calcId = $createBody['data']['TestSiteId'] ?? null;
if ($calcId) {
// Update formula
$updateData = [
'TestSiteName' => 'Updated Calc Test Name',
'details' => [
'FormulaInput' => '["A", "B", "C"]',
'FormulaCode' => 'A + B + C'
]
];
$updateResult = $this->put($this->endpoint . '/' . $calcId, ['body' => json_encode($updateData)]);
$updateStatus = $updateResult->response()->getStatusCode();
$this->assertTrue(
in_array($updateStatus, [200, 400, 500]),
"Expected 200, 400, or 500, got $updateStatus"
);
}
}
}
/**
* Test CALC has correct TypeCode in response
*/
public function testCalcTypeCodeInResponse(): void
{
$indexResult = $this->get($this->endpoint . '?TestType=CALC');
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$calc = $indexBody['data'][0];
// Verify TypeCode is CALC
$this->assertEquals('CALC', $calc['TypeCode'] ?? '');
}
}
/**
* Test CALC details structure
*/
public function testCalcDetailsStructure(): void
{
$indexResult = $this->get($this->endpoint . '?TestType=CALC');
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$calc = $indexBody['data'][0];
$calcId = $calc['TestSiteID'] ?? null;
if ($calcId) {
$showResult = $this->get($this->endpoint . '/' . $calcId);
$showBody = json_decode($showResult->response()->getBody(), true);
if ($showBody['data'] !== null && isset($showBody['data']['testdefcal'])) {
$calcDetails = $showBody['data']['testdefcal'];
if (is_array($calcDetails) && !empty($calcDetails)) {
$firstDetail = $calcDetails[0];
// Check required fields in calc structure
$this->assertArrayHasKey('TestCalID', $firstDetail);
$this->assertArrayHasKey('TestSiteID', $firstDetail);
$this->assertArrayHasKey('FormulaInput', $firstDetail);
$this->assertArrayHasKey('FormulaCode', $firstDetail);
// Check for joined discipline/department
if (isset($firstDetail['DisciplineName'])) {
$this->assertArrayHasKey('DepartmentName', $firstDetail);
}
}
}
}
}
}
/**
* Test CALC delete cascades to details
*/
public function testCalcDeleteCascadesToDetails(): void
{
// Create a CALC
$calcData = [
'SiteID' => 1,
'TestSiteCode' => 'CDEL' . substr(time(), -4),
'TestSiteName' => 'Calc to Delete',
'TestType' => $this::TEST_TYPE_CALC,
'details' => [
'FormulaInput' => '["TEST1"]',
'FormulaCode' => 'TEST1 * 2'
]
];
$createResult = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$createStatus = $createResult->response()->getStatusCode();
if ($createStatus === 201) {
$createBody = json_decode($createResult->response()->getBody(), true);
$calcId = $createBody['data']['TestSiteId'] ?? null;
if ($calcId) {
// Delete the CALC
$deleteResult = $this->delete($this->endpoint . '/' . $calcId);
$deleteStatus = $deleteResult->response()->getStatusCode();
$this->assertTrue(
in_array($deleteStatus, [200, 404, 500]),
"Expected 200, 404, or 500, got $deleteStatus"
);
if ($deleteStatus === 200) {
// Verify CALC details are also soft deleted
$showResult = $this->get($this->endpoint . '/' . $calcId);
$showBody = json_decode($showResult->response()->getBody(), true);
// CALC should show EndDate set
if ($showBody['data'] !== null) {
$this->assertNotNull($showBody['data']['EndDate']);
}
}
}
}
}
/**
* Test CALC with result unit configuration
*/
public function testCalcWithResultUnit(): void
{
$units = ['mg/dL', 'g/L', 'mmol/L', '%', 'IU/L'];
foreach ($units as $unit) {
$calcData = [
'SiteID' => 1,
'TestSiteCode' => 'CUNT' . substr(time(), -3) . substr($unit, 0, 1),
'TestSiteName' => "Calc with $unit",
'TestType' => $this::TEST_TYPE_CALC,
'details' => [
'Unit1' => $unit,
'Decimal' => 2,
'FormulaInput' => '["TEST1"]',
'FormulaCode' => 'TEST1'
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"CALC with unit $unit: Expected 201, 400, or 500, got $status"
);
}
}
}

View File

@ -1,291 +0,0 @@
<?php
namespace Tests\Feature\v2\master\TestDef;
use Tests\Support\v2\MasterTestCase;
/**
* Feature tests for GROUP type test definitions
*
* Tests GROUP-specific functionality including member management
*/
class TestDefGroupTest extends MasterTestCase
{
protected string $endpoint = 'v2/master/tests';
/**
* Test create GROUP with members
*/
public function testCreateGroupWithMembers(): void
{
// Get existing test IDs to use as members
$memberIds = $this->getExistingTestIds();
$groupData = [
'SiteID' => 1,
'TestSiteCode' => 'GRUP' . substr(time(), -4),
'TestSiteName' => 'Test Group ' . time(),
'TestType' => $this::TEST_TYPE_GROUP,
'Description' => 'Group test with members',
'SeqScr' => 100,
'SeqRpt' => 100,
'VisibleScr' => 1,
'VisibleRpt' => 1,
'CountStat' => 1,
'Members' => $memberIds
];
$result = $this->post($this->endpoint, ['body' => json_encode($groupData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
if ($status === 201) {
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('created', $body['status']);
// Verify members were created
$groupId = $body['data']['TestSiteId'];
$showResult = $this->get($this->endpoint . '/' . $groupId);
$showBody = json_decode($showResult->response()->getBody(), true);
if ($showBody['data'] !== null) {
$this->assertArrayHasKey('testdefgrp', $showBody['data']);
}
}
}
/**
* Test create GROUP without members
*/
public function testCreateGroupWithoutMembers(): void
{
$groupData = [
'SiteID' => 1,
'TestSiteCode' => 'GREM' . substr(time(), -4),
'TestSiteName' => 'Empty Group ' . time(),
'TestType' => $this::TEST_TYPE_GROUP,
'Members' => [] // Empty members
];
$result = $this->post($this->endpoint, ['body' => json_encode($groupData)]);
// Should still succeed but with warning or empty members
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400]),
"Expected 201 or 400, got $status"
);
}
/**
* Test update GROUP members
*/
public function testUpdateGroupMembers(): void
{
// Create a group first
$memberIds = $this->getExistingTestIds();
$groupData = $this->createGroupData($memberIds);
$groupData['TestSiteCode'] = 'UPMB' . substr(time(), -4);
$createResult = $this->post($this->endpoint, ['body' => json_encode($groupData)]);
$createStatus = $createResult->response()->getStatusCode();
if ($createStatus === 201) {
$createBody = json_decode($createResult->response()->getBody(), true);
$groupId = $createBody['data']['TestSiteId'] ?? null;
if ($groupId) {
// Update with new members
$updateData = [
'Members' => array_slice($memberIds, 0, 1) // Only one member
];
$updateResult = $this->put($this->endpoint . '/' . $groupId, ['body' => json_encode($updateData)]);
$updateStatus = $updateResult->response()->getStatusCode();
$this->assertTrue(
in_array($updateStatus, [200, 400, 500]),
"Expected 200, 400, or 500, got $updateStatus"
);
}
}
}
/**
* Test add member to existing GROUP
*/
public function testAddMemberToGroup(): void
{
// Get existing test
$indexResult = $this->get($this->endpoint . '?TestType=GROUP');
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$group = $indexBody['data'][0];
$groupId = $group['TestSiteID'] ?? null;
if ($groupId) {
// Get a test ID to add
$testIds = $this->getExistingTestIds();
$newMemberId = $testIds[0] ?? 1;
$updateData = [
'Members' => [$newMemberId]
];
$result = $this->put($this->endpoint . '/' . $groupId, ['body' => json_encode($updateData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [200, 400, 500]),
"Expected 200, 400, or 500, got $status"
);
}
}
}
/**
* Test GROUP with single member
*/
public function testGroupWithSingleMember(): void
{
$memberIds = $this->getExistingTestIds();
$groupData = [
'SiteID' => 1,
'TestSiteCode' => 'GSGL' . substr(time(), -4),
'TestSiteName' => 'Single Member Group ' . time(),
'TestType' => $this::TEST_TYPE_GROUP,
'Members' => [array_slice($memberIds, 0, 1)[0] ?? 1]
];
$result = $this->post($this->endpoint, ['body' => json_encode($groupData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
}
/**
* Test GROUP members have correct structure
*/
public function testGroupMembersStructure(): void
{
$indexResult = $this->get($this->endpoint . '?TestType=GROUP');
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$group = $indexBody['data'][0];
$groupId = $group['TestSiteID'] ?? null;
if ($groupId) {
$showResult = $this->get($this->endpoint . '/' . $groupId);
$showBody = json_decode($showResult->response()->getBody(), true);
if ($showBody['data'] !== null && isset($showBody['data']['testdefgrp'])) {
$members = $showBody['data']['testdefgrp'];
if (is_array($members) && !empty($members)) {
$firstMember = $members[0];
// Check required fields in member structure
$this->assertArrayHasKey('TestGrpID', $firstMember);
$this->assertArrayHasKey('TestSiteID', $firstMember);
$this->assertArrayHasKey('Member', $firstMember);
// Check for joined test details (if loaded)
if (isset($firstMember['TestSiteCode'])) {
$this->assertArrayHasKey('TestSiteName', $firstMember);
}
}
}
}
}
}
/**
* Test GROUP delete cascades to members
*/
public function testGroupDeleteCascadesToMembers(): void
{
// Create a group
$memberIds = $this->getExistingTestIds();
$groupData = $this->createGroupData($memberIds);
$groupData['TestSiteCode'] = 'GDEL' . substr(time(), -4);
$createResult = $this->post($this->endpoint, ['body' => json_encode($groupData)]);
$createStatus = $createResult->response()->getStatusCode();
if ($createStatus === 201) {
$createBody = json_decode($createResult->response()->getBody(), true);
$groupId = $createBody['data']['TestSiteId'] ?? null;
if ($groupId) {
// Delete the group
$deleteResult = $this->delete($this->endpoint . '/' . $groupId);
$deleteStatus = $deleteResult->response()->getStatusCode();
$this->assertTrue(
in_array($deleteStatus, [200, 404, 500]),
"Expected 200, 404, or 500, got $deleteStatus"
);
if ($deleteStatus === 200) {
// Verify group members are also soft deleted
$showResult = $this->get($this->endpoint . '/' . $groupId);
$showBody = json_decode($showResult->response()->getBody(), true);
// Group should show EndDate set
if ($showBody['data'] !== null) {
$this->assertNotNull($showBody['data']['EndDate']);
}
}
}
}
}
/**
* Test GROUP type has correct TypeCode in response
*/
public function testGroupTypeCodeInResponse(): void
{
$indexResult = $this->get($this->endpoint . '?TestType=GROUP');
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$group = $indexBody['data'][0];
// Verify TypeCode is GROUP
$this->assertEquals('GROUP', $group['TypeCode'] ?? '');
}
}
/**
* Helper to get existing test IDs
*/
private function getExistingTestIds(): array
{
$indexResult = $this->get($this->endpoint);
$indexBody = json_decode($indexResult->response()->getBody(), true);
$ids = [];
if (isset($indexBody['data']) && is_array($indexBody['data'])) {
foreach ($indexBody['data'] as $item) {
if (isset($item['TestSiteID'])) {
$ids[] = $item['TestSiteID'];
}
if (count($ids) >= 3) {
break;
}
}
}
return $ids ?: [1, 2, 3];
}
}

View File

@ -1,288 +0,0 @@
<?php
namespace Tests\Feature\v2\master\TestDef;
use Tests\Support\v2\MasterTestCase;
/**
* Feature tests for PARAM type test definitions
*
* Tests PARAM-specific functionality as sub-test components
*/
class TestDefParamTest extends MasterTestCase
{
protected string $endpoint = 'v2/master/tests';
/**
* Test create PARAM type test
*/
public function testCreateParamTypeTest(): void
{
$paramData = [
'SiteID' => 1,
'TestSiteCode' => 'PARM' . substr(time(), -4),
'TestSiteName' => 'Parameter Test ' . time(),
'TestType' => $this::TEST_TYPE_PARAM,
'Description' => 'Parameter/sub-test description',
'SeqScr' => 5,
'SeqRpt' => 5,
'VisibleScr' => 1,
'VisibleRpt' => 1,
'CountStat' => 1,
'details' => [
'DisciplineID' => 1,
'DepartmentID' => 1,
'ResultType' => 1, // Numeric
'RefType' => 1, // NMRC
'Unit1' => 'unit',
'Decimal' => 1,
'Method' => 'Parameter Method'
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($paramData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
if ($status === 201) {
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('created', $body['status']);
// Verify tech details were created
$paramId = $body['data']['TestSiteId'];
$showResult = $this->get($this->endpoint . '/' . $paramId);
$showBody = json_decode($showResult->response()->getBody(), true);
if ($showBody['data'] !== null) {
$this->assertArrayHasKey('testdeftech', $showBody['data']);
}
}
}
/**
* Test PARAM has correct TypeCode in response
*/
public function testParamTypeCodeInResponse(): void
{
$indexResult = $this->get($this->endpoint . '?TestType=PARAM');
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$param = $indexBody['data'][0];
// Verify TypeCode is PARAM
$this->assertEquals('PARAM', $param['TypeCode'] ?? '');
}
}
/**
* Test PARAM details structure
*/
public function testParamDetailsStructure(): void
{
$indexResult = $this->get($this->endpoint . '?TestType=PARAM');
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$param = $indexBody['data'][0];
$paramId = $param['TestSiteID'] ?? null;
if ($paramId) {
$showResult = $this->get($this->endpoint . '/' . $paramId);
$showBody = json_decode($showResult->response()->getBody(), true);
if ($showBody['data'] !== null && isset($showBody['data']['testdeftech'])) {
$techDetails = $showBody['data']['testdeftech'];
if (is_array($techDetails) && !empty($techDetails)) {
$firstDetail = $techDetails[0];
// Check required fields in tech structure
$this->assertArrayHasKey('TestTechID', $firstDetail);
$this->assertArrayHasKey('TestSiteID', $firstDetail);
$this->assertArrayHasKey('ResultType', $firstDetail);
$this->assertArrayHasKey('RefType', $firstDetail);
// Check for joined discipline/department
if (isset($firstDetail['DisciplineName'])) {
$this->assertArrayHasKey('DepartmentName', $firstDetail);
}
}
}
}
}
}
/**
* Test PARAM with different result types
*/
public function testParamWithDifferentResultTypes(): void
{
$resultTypes = [
1 => 'NMRIC', // Numeric
2 => 'RANGE', // Range
3 => 'TEXT', // Text
4 => 'VSET' // Value Set
];
foreach ($resultTypes as $resultTypeId => $resultTypeName) {
$paramData = [
'SiteID' => 1,
'TestSiteCode' => 'PR' . substr(time(), -4) . substr($resultTypeName, 0, 1),
'TestSiteName' => "Param with $resultTypeName",
'TestType' => $this::TEST_TYPE_PARAM,
'details' => [
'ResultType' => $resultTypeId,
'RefType' => 1
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($paramData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"PARAM with ResultType $resultTypeName: Expected 201, 400, or 500, got $status"
);
}
}
/**
* Test PARAM with different reference types
*/
public function testParamWithDifferentRefTypes(): void
{
$refTypes = [
1 => 'NMRC', // Numeric
2 => 'TEXT' // Text
];
foreach ($refTypes as $refTypeId => $refTypeName) {
$paramData = [
'SiteID' => 1,
'TestSiteCode' => 'PR' . substr(time(), -4) . 'R' . substr($refTypeName, 0, 1),
'TestSiteName' => "Param with RefType $refTypeName",
'TestType' => $this::TEST_TYPE_PARAM,
'details' => [
'ResultType' => 1,
'RefType' => $refTypeId
]
];
$result = $this->post($this->endpoint, ['body' => json_encode($paramData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"PARAM with RefType $refTypeName: Expected 201, 400, or 500, got $status"
);
}
}
/**
* Test PARAM delete cascades to details
*/
public function testParamDeleteCascadesToDetails(): void
{
// Create a PARAM
$paramData = [
'SiteID' => 1,
'TestSiteCode' => 'PDEL' . substr(time(), -4),
'TestSiteName' => 'Param to Delete',
'TestType' => $this::TEST_TYPE_PARAM,
'details' => [
'ResultType' => 1,
'RefType' => 1
]
];
$createResult = $this->post($this->endpoint, ['body' => json_encode($paramData)]);
$createStatus = $createResult->response()->getStatusCode();
if ($createStatus === 201) {
$createBody = json_decode($createResult->response()->getBody(), true);
$paramId = $createBody['data']['TestSiteId'] ?? null;
if ($paramId) {
// Delete the PARAM
$deleteResult = $this->delete($this->endpoint . '/' . $paramId);
$deleteStatus = $deleteResult->response()->getStatusCode();
$this->assertTrue(
in_array($deleteStatus, [200, 404, 500]),
"Expected 200, 404, or 500, got $deleteStatus"
);
if ($deleteStatus === 200) {
// Verify PARAM details are also soft deleted
$showResult = $this->get($this->endpoint . '/' . $paramId);
$showBody = json_decode($showResult->response()->getBody(), true);
// PARAM should show EndDate set
if ($showBody['data'] !== null) {
$this->assertNotNull($showBody['data']['EndDate']);
}
}
}
}
}
/**
* Test PARAM visibility settings
*/
public function testParamVisibilitySettings(): void
{
$visibilityCombinations = [
['VisibleScr' => 1, 'VisibleRpt' => 1],
['VisibleScr' => 1, 'VisibleRpt' => 0],
['VisibleScr' => 0, 'VisibleRpt' => 1],
['VisibleScr' => 0, 'VisibleRpt' => 0]
];
foreach ($visibilityCombinations as $vis) {
$paramData = [
'SiteID' => 1,
'TestSiteCode' => 'PVIS' . substr(time(), -4),
'TestSiteName' => 'Visibility Test',
'TestType' => $this::TEST_TYPE_PARAM,
'VisibleScr' => $vis['VisibleScr'],
'VisibleRpt' => $vis['VisibleRpt']
];
$result = $this->post($this->endpoint, ['body' => json_encode($paramData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"PARAM visibility ({$vis['VisibleScr']}, {$vis['VisibleRpt']}): Expected 201, 400, or 500, got $status"
);
}
}
/**
* Test PARAM sequence ordering
*/
public function testParamSequenceOrdering(): void
{
$paramData = [
'SiteID' => 1,
'TestSiteCode' => 'PSEQ' . substr(time(), -4),
'TestSiteName' => 'Sequenced Param',
'TestType' => $this::TEST_TYPE_PARAM,
'SeqScr' => 25,
'SeqRpt' => 30
];
$result = $this->post($this->endpoint, ['body' => json_encode($paramData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
}
}

View File

@ -1,375 +0,0 @@
<?php
namespace Tests\Feature\v2\master\TestDef;
use Tests\Support\v2\MasterTestCase;
/**
* Feature tests for v2 Test Definition API endpoints
*
* Tests CRUD operations for TEST, PARAM, GROUP, and CALC types
*/
class TestDefSiteTest extends MasterTestCase
{
protected string $endpoint = 'v2/master/tests';
/**
* Test index endpoint returns list of tests
*/
public function testIndexReturnsTestList(): void
{
$result = $this->get($this->endpoint);
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertArrayHasKey('status', $body);
$this->assertArrayHasKey('data', $body);
$this->assertArrayHasKey('message', $body);
}
/**
* Test index with SiteID filter
*/
public function testIndexWithSiteFilter(): void
{
$result = $this->get($this->endpoint . '?SiteID=1');
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('success', $body['status']);
}
/**
* Test index with TestType filter
*/
public function testIndexWithTestTypeFilter(): void
{
// Filter by TEST type
$result = $this->get($this->endpoint . '?TestType=TEST');
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('success', $body['status']);
}
/**
* Test index with Visibility filter
*/
public function testIndexWithVisibilityFilter(): void
{
$result = $this->get($this->endpoint . '?VisibleScr=1&VisibleRpt=1');
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('success', $body['status']);
}
/**
* Test index with keyword search
*/
public function testIndexWithKeywordSearch(): void
{
$result = $this->get($this->endpoint . '?TestSiteName=hemoglobin');
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('success', $body['status']);
}
/**
* Test show endpoint returns single test
*/
public function testShowReturnsSingleTest(): void
{
// First get the list to find a valid ID
$indexResult = $this->get($this->endpoint);
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$firstItem = $indexBody['data'][0];
$testSiteID = $firstItem['TestSiteID'] ?? null;
if ($testSiteID) {
$showResult = $this->get($this->endpoint . '/' . $testSiteID);
$showResult->assertStatus(200);
$body = json_decode($showResult->response()->getBody(), true);
$this->assertArrayHasKey('data', $body);
$this->assertEquals('success', $body['status']);
// Check that related details are loaded based on TestType
if ($body['data'] !== null) {
$typeCode = $body['data']['TypeCode'] ?? '';
if ($typeCode === 'CALC') {
$this->assertArrayHasKey('testdefcal', $body['data']);
} elseif ($typeCode === 'GROUP') {
$this->assertArrayHasKey('testdefgrp', $body['data']);
} elseif (in_array($typeCode, ['TEST', 'PARAM'])) {
$this->assertArrayHasKey('testdeftech', $body['data']);
}
// All types should have testmap
$this->assertArrayHasKey('testmap', $body['data']);
}
}
}
}
/**
* Test show with non-existent ID returns null data
*/
public function testShowWithInvalidIDReturnsNull(): void
{
$result = $this->get($this->endpoint . '/9999999');
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertArrayHasKey('data', $body);
$this->assertNull($body['data']);
}
/**
* Test create new TEST type test definition
*/
public function testCreateTestTypeTest(): void
{
$testData = $this->createTestData();
$result = $this->post($this->endpoint, ['body' => json_encode($testData)]);
$status = $result->response()->getStatusCode();
// Expect 201 (created) or 400 (validation error) or 500 (server error)
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
if ($status === 201) {
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('created', $body['status']);
$this->assertArrayHasKey('TestSiteId', $body['data']);
}
}
/**
* Test create new PARAM type test definition
*/
public function testCreateParamTypeTest(): void
{
$paramData = $this->createParamData();
$result = $this->post($this->endpoint, ['body' => json_encode($paramData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
}
/**
* Test create new GROUP type test definition
*/
public function testCreateGroupTypeTest(): void
{
// First create some member tests
$memberIds = $this->getExistingTestIds();
$groupData = $this->createGroupData($memberIds);
$result = $this->post($this->endpoint, ['body' => json_encode($groupData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
}
/**
* Test create new CALC type test definition
*/
public function testCreateCalcTypeTest(): void
{
$calcData = $this->createCalcData();
$result = $this->post($this->endpoint, ['body' => json_encode($calcData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [201, 400, 500]),
"Expected 201, 400, or 500, got $status"
);
}
/**
* Test update existing test
*/
public function testUpdateTest(): void
{
$indexResult = $this->get($this->endpoint);
$indexBody = json_decode($indexResult->response()->getBody(), true);
if (isset($indexBody['data']) && is_array($indexBody['data']) && !empty($indexBody['data'])) {
$firstItem = $indexBody['data'][0];
$testSiteID = $firstItem['TestSiteID'] ?? null;
if ($testSiteID) {
$updateData = [
'TestSiteName' => 'Updated Test Name ' . time(),
'Description' => 'Updated description'
];
$result = $this->put($this->endpoint . '/' . $testSiteID, ['body' => json_encode($updateData)]);
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [200, 404, 500]),
"Expected 200, 404, or 500, got $status"
);
if ($status === 200) {
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('success', $body['status']);
}
}
}
}
/**
* Test soft delete (disable) test
*/
public function testDeleteTest(): void
{
// Create a test first to delete
$testData = $this->createTestData();
$testData['TestSiteCode'] = 'DEL' . substr(time(), -4);
$createResult = $this->post($this->endpoint, ['body' => json_encode($testData)]);
$createStatus = $createResult->response()->getStatusCode();
if ($createStatus === 201) {
$createBody = json_decode($createResult->response()->getBody(), true);
$testSiteID = $createBody['data']['TestSiteId'] ?? null;
if ($testSiteID) {
$deleteResult = $this->delete($this->endpoint . '/' . $testSiteID);
$deleteStatus = $deleteResult->response()->getStatusCode();
$this->assertTrue(
in_array($deleteStatus, [200, 404, 500]),
"Expected 200, 404, or 500, got $deleteStatus"
);
if ($deleteStatus === 200) {
$deleteBody = json_decode($deleteResult->response()->getBody(), true);
$this->assertEquals('success', $deleteBody['status']);
$this->assertArrayHasKey('EndDate', $deleteBody['data']);
}
}
}
}
/**
* Test validation - missing required fields
*/
public function testCreateValidationRequiredFields(): void
{
$invalidData = [
'TestSiteName' => 'Test without required fields'
];
$result = $this->post($this->endpoint, ['body' => json_encode($invalidData)]);
$result->assertStatus(400);
}
/**
* Test that TestSiteCode is max 6 characters
*/
public function testTestSiteCodeLength(): void
{
$invalidData = [
'SiteID' => 1,
'TestSiteCode' => 'HB123456', // 8 characters - invalid
'TestSiteName' => 'Test with too long code',
'TestType' => $this::TEST_TYPE_TEST
];
$result = $this->post($this->endpoint, ['body' => json_encode($invalidData)]);
$result->assertStatus(400);
}
/**
* Test that TestSiteCode is at least 3 characters
*/
public function testTestSiteCodeMinLength(): void
{
$invalidData = [
'SiteID' => 1,
'TestSiteCode' => 'HB', // 2 characters - invalid
'TestSiteName' => 'Test with too short code',
'TestType' => $this::TEST_TYPE_TEST
];
$result = $this->post($this->endpoint, ['body' => json_encode($invalidData)]);
$result->assertStatus(400);
}
/**
* Test that duplicate TestSiteCode is rejected
*/
public function testDuplicateTestSiteCode(): void
{
// First create a test
$testData = $this->createTestData();
$testData['TestSiteCode'] = 'DUP' . substr(time(), -3);
$this->post($this->endpoint, ['body' => json_encode($testData)]);
// Try to create another test with the same code
$duplicateData = $testData;
$duplicateData['TestSiteName'] = 'Different Name';
$result = $this->post($this->endpoint, ['body' => json_encode($duplicateData)]);
// Should fail with 400 or 500
$status = $result->response()->getStatusCode();
$this->assertTrue(
in_array($status, [400, 500]),
"Expected 400 or 500 for duplicate, got $status"
);
}
/**
* Test filtering by multiple parameters
*/
public function testIndexWithMultipleFilters(): void
{
$result = $this->get($this->endpoint . '?SiteID=1&TestType=TEST&VisibleScr=1');
$result->assertStatus(200);
$body = json_decode($result->response()->getBody(), true);
$this->assertEquals('success', $body['status']);
}
/**
* Helper method to get existing test IDs for group members
*/
private function getExistingTestIds(): array
{
$indexResult = $this->get($this->endpoint);
$indexBody = json_decode($indexResult->response()->getBody(), true);
$ids = [];
if (isset($indexBody['data']) && is_array($indexBody['data'])) {
foreach ($indexBody['data'] as $item) {
if (isset($item['TestSiteID'])) {
$ids[] = $item['TestSiteID'];
}
if (count($ids) >= 2) {
break;
}
}
}
return $ids ?: [1, 2];
}
}

View File

@ -34,13 +34,11 @@ final class HealthTest extends CIUnitTestCase
$validation->check($config->baseURL, 'valid_url'),
'baseURL "' . $config->baseURL . '" in .env is not valid URL',
);
return;
}
// Get the baseURL in app/Config/App.php
// You can't use Config\App, because phpunit.xml.dist sets app.baseURL
// If no baseURL in .env, check app/Config/App.php
$reader = new ConfigReader();
// BaseURL in app/Config/App.php is a valid URL?
$this->assertTrue(
$validation->check($reader->baseURL, 'valid_url'),
'baseURL "' . $reader->baseURL . '" in app/Config/App.php is not valid URL',

View File

@ -1,145 +0,0 @@
<?php
namespace Tests\Unit\v2\master\TestDef;
use CodeIgniter\Test\CIUnitTestCase;
use App\Models\Test\TestDefCalModel;
/**
* Unit tests for TestDefCalModel
*
* Tests the calculation definition model for CALC type tests
*/
class TestDefCalModelTest extends CIUnitTestCase
{
protected TestDefCalModel $model;
protected function setUp(): void
{
parent::setUp();
$this->model = new TestDefCalModel();
}
/**
* Test model has correct table name
*/
public function testModelHasCorrectTableName(): void
{
$this->assertEquals('testdefcal', $this->model->table);
}
/**
* Test model has correct primary key
*/
public function testModelHasCorrectPrimaryKey(): void
{
$this->assertEquals('TestCalID', $this->model->primaryKey);
}
/**
* Test model uses soft deletes
*/
public function testModelUsesSoftDeletes(): void
{
$this->assertTrue($this->model->useSoftDeletes);
$this->assertEquals('EndDate', $this->model->deletedField);
}
/**
* Test model has correct allowed fields
*/
public function testModelHasCorrectAllowedFields(): void
{
$allowedFields = $this->model->allowedFields;
// Foreign key
$this->assertContains('TestSiteID', $allowedFields);
// Calculation fields
$this->assertContains('DisciplineID', $allowedFields);
$this->assertContains('DepartmentID', $allowedFields);
$this->assertContains('FormulaInput', $allowedFields);
$this->assertContains('FormulaCode', $allowedFields);
// Result fields
$this->assertContains('RefType', $allowedFields);
$this->assertContains('Unit1', $allowedFields);
$this->assertContains('Factor', $allowedFields);
$this->assertContains('Unit2', $allowedFields);
$this->assertContains('Decimal', $allowedFields);
$this->assertContains('Method', $allowedFields);
// Timestamp fields
$this->assertContains('CreateDate', $allowedFields);
$this->assertContains('EndDate', $allowedFields);
}
/**
* Test model uses timestamps
*/
public function testModelUsesTimestamps(): void
{
$this->assertTrue($this->model->useTimestamps);
$this->assertEquals('CreateDate', $this->model->createdField);
}
/**
* Test model return type is array
*/
public function testModelReturnTypeIsArray(): void
{
$this->assertEquals('array', $this->model->returnType);
}
/**
* Test model has correct skip validation
*/
public function testModelSkipValidation(): void
{
$this->assertFalse($this->model->skipValidation);
}
/**
* Test model has correct useAutoIncrement
*/
public function testModelUseAutoIncrement(): void
{
$this->assertTrue($this->model->useAutoIncrement);
}
/**
* Test FormulaInput field is in allowed fields
*/
public function testFormulaInputFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('FormulaInput', $allowedFields);
}
/**
* Test FormulaCode field is in allowed fields
*/
public function testFormulaCodeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('FormulaCode', $allowedFields);
}
/**
* Test RefType field is in allowed fields
*/
public function testRefTypeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('RefType', $allowedFields);
}
/**
* Test Method field is in allowed fields
*/
public function testMethodFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('Method', $allowedFields);
}
}

View File

@ -1,132 +0,0 @@
<?php
namespace Tests\Unit\v2\master\TestDef;
use CodeIgniter\Test\CIUnitTestCase;
use App\Models\Test\TestDefGrpModel;
/**
* Unit tests for TestDefGrpModel
*
* Tests the group definition model for GROUP type tests
*/
class TestDefGrpModelTest extends CIUnitTestCase
{
protected TestDefGrpModel $model;
protected function setUp(): void
{
parent::setUp();
$this->model = new TestDefGrpModel();
}
/**
* Test model has correct table name
*/
public function testModelHasCorrectTableName(): void
{
$this->assertEquals('testdefgrp', $this->model->table);
}
/**
* Test model has correct primary key
*/
public function testModelHasCorrectPrimaryKey(): void
{
$this->assertEquals('TestGrpID', $this->model->primaryKey);
}
/**
* Test model uses soft deletes
*/
public function testModelUsesSoftDeletes(): void
{
$this->assertTrue($this->model->useSoftDeletes);
$this->assertEquals('EndDate', $this->model->deletedField);
}
/**
* Test model has correct allowed fields
*/
public function testModelHasCorrectAllowedFields(): void
{
$allowedFields = $this->model->allowedFields;
// Foreign keys
$this->assertContains('TestSiteID', $allowedFields);
$this->assertContains('Member', $allowedFields);
// Timestamp fields
$this->assertContains('CreateDate', $allowedFields);
$this->assertContains('EndDate', $allowedFields);
}
/**
* Test model uses timestamps
*/
public function testModelUsesTimestamps(): void
{
$this->assertTrue($this->model->useTimestamps);
$this->assertEquals('CreateDate', $this->model->createdField);
}
/**
* Test model return type is array
*/
public function testModelReturnTypeIsArray(): void
{
$this->assertEquals('array', $this->model->returnType);
}
/**
* Test model has correct skip validation
*/
public function testModelSkipValidation(): void
{
$this->assertFalse($this->model->skipValidation);
}
/**
* Test model has correct useAutoIncrement
*/
public function testModelUseAutoIncrement(): void
{
$this->assertTrue($this->model->useAutoIncrement);
}
/**
* Test TestSiteID field is in allowed fields
*/
public function testTestSiteIDFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestSiteID', $allowedFields);
}
/**
* Test Member field is in allowed fields
*/
public function testMemberFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('Member', $allowedFields);
}
/**
* Test CreateDate field is in allowed fields
*/
public function testCreateDateFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('CreateDate', $allowedFields);
}
/**
* Test EndDate field is in allowed fields
*/
public function testEndDateFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('EndDate', $allowedFields);
}
}

View File

@ -1,220 +0,0 @@
<?php
namespace Tests\Unit\v2\master\TestDef;
use CodeIgniter\Test\CIUnitTestCase;
use App\Models\Test\TestDefSiteModel;
/**
* Unit tests for TestDefSiteModel - Master Data Tests CRUD operations
*
* Tests the model configuration and behavior for test definition management
*/
class TestDefSiteModelMasterTest extends CIUnitTestCase
{
protected TestDefSiteModel $model;
protected function setUp(): void
{
parent::setUp();
$this->model = new TestDefSiteModel();
}
/**
* Test model has correct table name
*/
public function testModelHasCorrectTableName(): void
{
$this->assertEquals('testdefsite', $this->model->table);
}
/**
* Test model has correct primary key
*/
public function testModelHasCorrectPrimaryKey(): void
{
$this->assertEquals('TestSiteID', $this->model->primaryKey);
}
/**
* Test model uses soft deletes
*/
public function testModelUsesSoftDeletes(): void
{
$this->assertTrue($this->model->useSoftDeletes);
$this->assertEquals('EndDate', $this->model->deletedField);
}
/**
* Test model has correct allowed fields for master data
*/
public function testModelHasCorrectAllowedFields(): void
{
$allowedFields = $this->model->allowedFields;
// Core required fields
$this->assertContains('SiteID', $allowedFields);
$this->assertContains('TestSiteCode', $allowedFields);
$this->assertContains('TestSiteName', $allowedFields);
$this->assertContains('TestType', $allowedFields);
// Display and ordering fields
$this->assertContains('Description', $allowedFields);
$this->assertContains('SeqScr', $allowedFields);
$this->assertContains('SeqRpt', $allowedFields);
$this->assertContains('IndentLeft', $allowedFields);
$this->assertContains('FontStyle', $allowedFields);
// Visibility fields
$this->assertContains('VisibleScr', $allowedFields);
$this->assertContains('VisibleRpt', $allowedFields);
$this->assertContains('CountStat', $allowedFields);
// Timestamp fields
$this->assertContains('CreateDate', $allowedFields);
$this->assertContains('StartDate', $allowedFields);
$this->assertContains('EndDate', $allowedFields);
}
/**
* Test model uses timestamps
*/
public function testModelUsesTimestamps(): void
{
$this->assertTrue($this->model->useTimestamps);
$this->assertEquals('CreateDate', $this->model->createdField);
$this->assertEquals('StartDate', $this->model->updatedField);
}
/**
* Test model return type is array
*/
public function testModelReturnTypeIsArray(): void
{
$this->assertEquals('array', $this->model->returnType);
}
/**
* Test model has correct skip validation
*/
public function testModelSkipValidation(): void
{
$this->assertFalse($this->model->skipValidation);
}
/**
* Test model has correct useAutoIncrement
*/
public function testModelUseAutoIncrement(): void
{
$this->assertTrue($this->model->useAutoIncrement);
}
/**
* Test TestSiteCode field is in allowed fields
*/
public function testTestSiteCodeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestSiteCode', $allowedFields);
}
/**
* Test TestSiteName field is in allowed fields
*/
public function testTestSiteNameFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestSiteName', $allowedFields);
}
/**
* Test TestType field is in allowed fields
*/
public function testTestTypeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestType', $allowedFields);
}
/**
* Test SiteID field is in allowed fields
*/
public function testSiteIDFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('SiteID', $allowedFields);
}
/**
* Test Description field is in allowed fields
*/
public function testDescriptionFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('Description', $allowedFields);
}
/**
* Test SeqScr field is in allowed fields
*/
public function testSeqScrFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('SeqScr', $allowedFields);
}
/**
* Test SeqRpt field is in allowed fields
*/
public function testSeqRptFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('SeqRpt', $allowedFields);
}
/**
* Test VisibleScr field is in allowed fields
*/
public function testVisibleScrFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('VisibleScr', $allowedFields);
}
/**
* Test VisibleRpt field is in allowed fields
*/
public function testVisibleRptFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('VisibleRpt', $allowedFields);
}
/**
* Test CountStat field is in allowed fields
*/
public function testCountStatFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('CountStat', $allowedFields);
}
/**
* Test getTests method exists and is callable
*/
public function testGetTestsMethodExists(): void
{
$this->assertTrue(method_exists($this->model, 'getTests'));
$this->assertIsCallable([$this->model, 'getTests']);
}
/**
* Test getTest method exists and is callable
*/
public function testGetTestMethodExists(): void
{
$this->assertTrue(method_exists($this->model, 'getTest'));
$this->assertIsCallable([$this->model, 'getTest']);
}
}

View File

@ -1,137 +0,0 @@
<?php
namespace Tests\Unit\v2\master\TestDef;
use CodeIgniter\Test\CIUnitTestCase;
use App\Models\Test\TestDefSiteModel;
/**
* Unit tests for TestDefSiteModel
*
* Tests the main test definition model configuration and behavior
*/
class TestDefSiteModelTest extends CIUnitTestCase
{
protected TestDefSiteModel $model;
protected function setUp(): void
{
parent::setUp();
$this->model = new TestDefSiteModel();
}
/**
* Test model has correct table name
*/
public function testModelHasCorrectTableName(): void
{
$this->assertEquals('testdefsite', $this->model->table);
}
/**
* Test model has correct primary key
*/
public function testModelHasCorrectPrimaryKey(): void
{
$this->assertEquals('TestSiteID', $this->model->primaryKey);
}
/**
* Test model uses soft deletes
*/
public function testModelUsesSoftDeletes(): void
{
$this->assertTrue($this->model->useSoftDeletes);
$this->assertEquals('EndDate', $this->model->deletedField);
}
/**
* Test model has correct allowed fields
*/
public function testModelHasCorrectAllowedFields(): void
{
$allowedFields = $this->model->allowedFields;
// Core required fields
$this->assertContains('SiteID', $allowedFields);
$this->assertContains('TestSiteCode', $allowedFields);
$this->assertContains('TestSiteName', $allowedFields);
$this->assertContains('TestType', $allowedFields);
// Optional fields
$this->assertContains('Description', $allowedFields);
$this->assertContains('SeqScr', $allowedFields);
$this->assertContains('SeqRpt', $allowedFields);
$this->assertContains('IndentLeft', $allowedFields);
$this->assertContains('FontStyle', $allowedFields);
$this->assertContains('VisibleScr', $allowedFields);
$this->assertContains('VisibleRpt', $allowedFields);
$this->assertContains('CountStat', $allowedFields);
// Timestamp fields
$this->assertContains('CreateDate', $allowedFields);
$this->assertContains('StartDate', $allowedFields);
$this->assertContains('EndDate', $allowedFields);
}
/**
* Test model uses timestamps
*/
public function testModelUsesTimestamps(): void
{
$this->assertTrue($this->model->useTimestamps);
$this->assertEquals('CreateDate', $this->model->createdField);
$this->assertEquals('StartDate', $this->model->updatedField);
}
/**
* Test model return type is array
*/
public function testModelReturnTypeIsArray(): void
{
$this->assertEquals('array', $this->model->returnType);
}
/**
* Test model has correct skip validation
*/
public function testModelSkipValidation(): void
{
$this->assertFalse($this->model->skipValidation);
}
/**
* Test model has correct useAutoIncrement
*/
public function testModelUseAutoIncrement(): void
{
$this->assertTrue($this->model->useAutoIncrement);
}
/**
* Test TestSiteCode field is in allowed fields
*/
public function testTestSiteCodeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestSiteCode', $allowedFields);
}
/**
* Test TestSiteName field is in allowed fields
*/
public function testTestSiteNameFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestSiteName', $allowedFields);
}
/**
* Test TestType field is in allowed fields
*/
public function testTestTypeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestType', $allowedFields);
}
}

View File

@ -1,160 +0,0 @@
<?php
namespace Tests\Unit\v2\master\TestDef;
use CodeIgniter\Test\CIUnitTestCase;
use App\Models\Test\TestDefTechModel;
/**
* Unit tests for TestDefTechModel
*
* Tests the technical definition model for TEST and PARAM types
*/
class TestDefTechModelTest extends CIUnitTestCase
{
protected TestDefTechModel $model;
protected function setUp(): void
{
parent::setUp();
$this->model = new TestDefTechModel();
}
/**
* Test model has correct table name
*/
public function testModelHasCorrectTableName(): void
{
$this->assertEquals('testdeftech', $this->model->table);
}
/**
* Test model has correct primary key
*/
public function testModelHasCorrectPrimaryKey(): void
{
$this->assertEquals('TestTechID', $this->model->primaryKey);
}
/**
* Test model uses soft deletes
*/
public function testModelUsesSoftDeletes(): void
{
$this->assertTrue($this->model->useSoftDeletes);
$this->assertEquals('EndDate', $this->model->deletedField);
}
/**
* Test model has correct allowed fields
*/
public function testModelHasCorrectAllowedFields(): void
{
$allowedFields = $this->model->allowedFields;
// Foreign key
$this->assertContains('TestSiteID', $allowedFields);
// Technical fields
$this->assertContains('DisciplineID', $allowedFields);
$this->assertContains('DepartmentID', $allowedFields);
$this->assertContains('ResultType', $allowedFields);
$this->assertContains('RefType', $allowedFields);
$this->assertContains('VSet', $allowedFields);
// Quantity and units
$this->assertContains('ReqQty', $allowedFields);
$this->assertContains('ReqQtyUnit', $allowedFields);
$this->assertContains('Unit1', $allowedFields);
$this->assertContains('Factor', $allowedFields);
$this->assertContains('Unit2', $allowedFields);
$this->assertContains('Decimal', $allowedFields);
// Collection and method
$this->assertContains('CollReq', $allowedFields);
$this->assertContains('Method', $allowedFields);
$this->assertContains('ExpectedTAT', $allowedFields);
// Timestamp fields
$this->assertContains('CreateDate', $allowedFields);
$this->assertContains('EndDate', $allowedFields);
}
/**
* Test model uses timestamps
*/
public function testModelUsesTimestamps(): void
{
$this->assertTrue($this->model->useTimestamps);
$this->assertEquals('CreateDate', $this->model->createdField);
}
/**
* Test model return type is array
*/
public function testModelReturnTypeIsArray(): void
{
$this->assertEquals('array', $this->model->returnType);
}
/**
* Test model has correct skip validation
*/
public function testModelSkipValidation(): void
{
$this->assertFalse($this->model->skipValidation);
}
/**
* Test model has correct useAutoIncrement
*/
public function testModelUseAutoIncrement(): void
{
$this->assertTrue($this->model->useAutoIncrement);
}
/**
* Test TestSiteID field is in allowed fields
*/
public function testTestSiteIDFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestSiteID', $allowedFields);
}
/**
* Test ResultType field is in allowed fields
*/
public function testResultTypeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('ResultType', $allowedFields);
}
/**
* Test RefType field is in allowed fields
*/
public function testRefTypeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('RefType', $allowedFields);
}
/**
* Test Unit1 field is in allowed fields
*/
public function testUnit1FieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('Unit1', $allowedFields);
}
/**
* Test Method field is in allowed fields
*/
public function testMethodFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('Method', $allowedFields);
}
}

View File

@ -1,155 +0,0 @@
<?php
namespace Tests\Unit\v2\master\TestDef;
use CodeIgniter\Test\CIUnitTestCase;
use App\Models\Test\TestMapModel;
/**
* Unit tests for TestMapModel
*
* Tests the test mapping model for all test types
*/
class TestMapModelTest extends CIUnitTestCase
{
protected TestMapModel $model;
protected function setUp(): void
{
parent::setUp();
$this->model = new TestMapModel();
}
/**
* Test model has correct table name
*/
public function testModelHasCorrectTableName(): void
{
$this->assertEquals('testmap', $this->model->table);
}
/**
* Test model has correct primary key
*/
public function testModelHasCorrectPrimaryKey(): void
{
$this->assertEquals('TestMapID', $this->model->primaryKey);
}
/**
* Test model uses soft deletes
*/
public function testModelUsesSoftDeletes(): void
{
$this->assertTrue($this->model->useSoftDeletes);
$this->assertEquals('EndDate', $this->model->deletedField);
}
/**
* Test model has correct allowed fields
*/
public function testModelHasCorrectAllowedFields(): void
{
$allowedFields = $this->model->allowedFields;
// Foreign key
$this->assertContains('TestSiteID', $allowedFields);
// Host system mapping
$this->assertContains('HostType', $allowedFields);
$this->assertContains('HostID', $allowedFields);
$this->assertContains('HostDataSource', $allowedFields);
$this->assertContains('HostTestCode', $allowedFields);
$this->assertContains('HostTestName', $allowedFields);
// Client system mapping
$this->assertContains('ClientType', $allowedFields);
$this->assertContains('ClientID', $allowedFields);
$this->assertContains('ClientDataSource', $allowedFields);
$this->assertContains('ConDefID', $allowedFields);
$this->assertContains('ClientTestCode', $allowedFields);
$this->assertContains('ClientTestName', $allowedFields);
// Timestamp fields
$this->assertContains('CreateDate', $allowedFields);
$this->assertContains('EndDate', $allowedFields);
}
/**
* Test model uses timestamps
*/
public function testModelUsesTimestamps(): void
{
$this->assertTrue($this->model->useTimestamps);
$this->assertEquals('CreateDate', $this->model->createdField);
}
/**
* Test model return type is array
*/
public function testModelReturnTypeIsArray(): void
{
$this->assertEquals('array', $this->model->returnType);
}
/**
* Test model has correct skip validation
*/
public function testModelSkipValidation(): void
{
$this->assertFalse($this->model->skipValidation);
}
/**
* Test model has correct useAutoIncrement
*/
public function testModelUseAutoIncrement(): void
{
$this->assertTrue($this->model->useAutoIncrement);
}
/**
* Test HostType field is in allowed fields
*/
public function testHostTypeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('HostType', $allowedFields);
}
/**
* Test HostID field is in allowed fields
*/
public function testHostIDFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('HostID', $allowedFields);
}
/**
* Test HostTestCode field is in allowed fields
*/
public function testHostTestCodeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('HostTestCode', $allowedFields);
}
/**
* Test ClientType field is in allowed fields
*/
public function testClientTypeFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('ClientType', $allowedFields);
}
/**
* Test TestSiteID field is in allowed fields
*/
public function testTestSiteIDFieldExists(): void
{
$allowedFields = $this->model->allowedFields;
$this->assertContains('TestSiteID', $allowedFields);
}
}