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:
parent
351d3b6279
commit
e96ffa1ca9
@ -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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -34,13 +34,11 @@ final class HealthTest extends CIUnitTestCase
|
|||||||
$validation->check($config->baseURL, 'valid_url'),
|
$validation->check($config->baseURL, 'valid_url'),
|
||||||
'baseURL "' . $config->baseURL . '" in .env is not valid URL',
|
'baseURL "' . $config->baseURL . '" in .env is not valid URL',
|
||||||
);
|
);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the baseURL in app/Config/App.php
|
// If no baseURL in .env, check app/Config/App.php
|
||||||
// You can't use Config\App, because phpunit.xml.dist sets app.baseURL
|
|
||||||
$reader = new ConfigReader();
|
$reader = new ConfigReader();
|
||||||
|
|
||||||
// BaseURL in app/Config/App.php is a valid URL?
|
|
||||||
$this->assertTrue(
|
$this->assertTrue(
|
||||||
$validation->check($reader->baseURL, 'valid_url'),
|
$validation->check($reader->baseURL, 'valid_url'),
|
||||||
'baseURL "' . $reader->baseURL . '" in app/Config/App.php is not valid URL',
|
'baseURL "' . $reader->baseURL . '" in app/Config/App.php is not valid URL',
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user