clqms-be/tests/feature/Patients/PatientCreateTest.php

377 lines
17 KiB
PHP
Raw Normal View History

2025-09-23 10:18:48 +07:00
<?php
2025-09-25 14:01:33 +07:00
namespace Tests\Feature\Patients;
2025-09-23 10:18:48 +07:00
use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Test\CIUnitTestCase;
2025-10-14 15:50:22 +07:00
use Faker\Factory;
2025-09-23 10:18:48 +07:00
class PatientCreateTest extends CIUnitTestCase
{
use FeatureTestTrait;
2025-09-25 14:01:33 +07:00
protected $endpoint = 'api/patient';
2025-09-23 10:18:48 +07:00
2025-10-14 15:50:22 +07:00
// 400 - Passed
2025-09-26 15:03:11 +07:00
public function testCreatePatientValidationFail() {
2025-09-26 14:11:25 +07:00
// error 400 yg diharapkan
$payload = ['Name' => 'Ngawur'];
$result = $this->withBodyFormat('json')
->call('post', 'api/patient', $payload);
$result->assertStatus(400);
$result->assertJSONFragment([
'status' => 'error'
]);
2025-09-25 14:01:33 +07:00
2025-09-26 14:11:25 +07:00
// Kondisi Jika PatiD Sama
$payload = [
"PatientID"=> "SMAJ1",
"AlternatePID"=> "ALT001234",
"Prefix"=> "Mr.",
"NameFirst"=> "Budi",
"NameMiddle"=> "Santoso",
"NameMaiden"=> "Kiki",
"NameLast"=> "Wijaya",
"Suffix"=> "S.kom",
"NameAlias"=> "Bud",
"Gender"=> "1",
];
$result = $this->withBodyFormat('json')
->call('post', 'api/patient', $payload);
$result->assertStatus(400);
$result->assertJSONFragment([
'status' => 'error',
"message" => "Validation failed (patient)",
]);
2025-09-25 14:01:33 +07:00
2025-09-26 14:11:25 +07:00
}
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
// 201 - Passed
2025-09-26 15:03:11 +07:00
public function testCreatePatientSuccess() {
2025-10-14 15:50:22 +07:00
$faker = Factory::create('id_ID');
for ($i = 0; $i < 7; $i++) {
$payload = [
"PatientID" => "DUM" . $faker->numberBetween(1, 1000). $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000),
"AlternatePID" => "DMY" . $faker->numberBetween(1, 1000). $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000),
"Prefix" => $faker->title,
"NameFirst" => $faker->firstName,
"NameMiddle" => $faker->firstName,
"NameMaiden" => $faker->firstName,
"NameLast" => $faker->lastName,
"Suffix" => "S.Kom",
"NameAlias" => $faker->userName,
"Gender" => $faker->numberBetween(5, 6),
"PlaceOfBirth" => $faker->city,
"Birthdate" => $faker->date('Y-m-d'),
"ZIP" => $faker->postcode,
"Street_1" => $faker->streetAddress,
"Street_2" => "RT " . $faker->numberBetween(1, 10) . " RW " . $faker->numberBetween(1, 10),
"Street_3" => "Blok " . $faker->numberBetween(1, 20),
"City" => $faker->city,
"Province" => $faker->state,
"EmailAddress1" => "A" . $faker->numberBetween(1, 1000). $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000).'@gmail.com',
"EmailAddress2" => "B" . $faker->numberBetween(1, 1000). $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000).'@gmail.com',
"Phone" => $faker->phoneNumber,
"MobilePhone" => $faker->phoneNumber,
"Race" => (string) $faker->numberBetween(175, 205),
"Country" => (string) $faker->numberBetween(221, 469),
"MaritalStatus" => (string) $faker->numberBetween(8, 15),
"Religion" => (string) $faker->numberBetween(206, 212),
"Ethnic" => (string) $faker->numberBetween(213, 220),
"Citizenship" => "WNI",
"DeathIndicator" => (string) $faker->numberBetween(16, 17),
"LinkTo" => (string) $faker->numberBetween(2, 3),
"Custodian" => $i-1,
"PatIdt" => [
"IdentifierType" => "KTP",
"Identifier" => $faker->nik() ?? $faker->numerify('################')
],
"PatAtt" => [
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ]
],
"PatCom" => $faker->sentence,
];
if($payload['DeathIndicator'] == '16') {
$payload['DeathDateTime'] = $faker->date('Y-m-d H:i:s');
} else {
$payload['DeathDateTime'] = null;
}
$result = $this->withBodyFormat('json')->call('post', 'api/patient', $payload);
$result->assertStatus(201);
$result->assertJSONFragment(['status' => 'success']);
}
}
// Error - Passed
public function testCreatePatientValidationError() {
2025-09-25 14:01:33 +07:00
$payload = [
2025-10-14 15:50:22 +07:00
"NameFirst" => "Jane" // PatientID kosong
2025-09-25 14:01:33 +07:00
];
2025-10-14 15:50:22 +07:00
$result = $this->withBodyFormat('json')->post($this->endpoint, $payload);
// dd($result);
$result->assertArrayHasKey("errors", $result);
2025-09-25 14:01:33 +07:00
}
2025-10-14 15:50:22 +07:00
// Error - Passed
public function testCreatePatidtValidationError() {
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$faker = Factory::create('id_ID');
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$payload = [
"PatientID" => "DUMQ" . $faker->numberBetween(1, 1000). $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000),
"AlternatePID" => "DMYQ" . $faker->numberBetween(1, 1000). $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000),
"Prefix" => $faker->title,
"NameFirst" => $faker->firstName,
"NameMiddle" => $faker->firstName,
"NameMaiden" => $faker->firstName,
"NameLast" => $faker->lastName,
"Suffix" => "S.Kom",
"NameAlias" => $faker->userName,
"Gender" => $faker->numberBetween(5, 6),
"PlaceOfBirth" => $faker->city,
"Birthdate" => $faker->date('Y-m-d'),
"ZIP" => $faker->postcode,
"Street_1" => $faker->streetAddress,
"Street_2" => "RT " . $faker->numberBetween(1, 10) . " RW " . $faker->numberBetween(1, 10),
"Street_3" => "Blok " . $faker->numberBetween(1, 20),
"City" => $faker->city,
"Province" => $faker->state,
"EmailAddress1" => "AAQ" . (string)$faker->numberBetween(1, 1110).'@gmail.com',
"EmailAddress2" => "BAQ" . (string)$faker->numberBetween(1, 1110).'@gmail.com',
"Phone" => $faker->phoneNumber,
"MobilePhone" => $faker->phoneNumber,
"Race" => (string) $faker->numberBetween(175, 205),
"Country" => (string) $faker->numberBetween(221, 469),
"MaritalStatus" => (string) $faker->numberBetween(8, 15),
"Religion" => (string) $faker->numberBetween(206, 212),
"Ethnic" => (string) $faker->numberBetween(213, 220),
"Citizenship" => "WNI",
"DeathIndicator" => (string) $faker->numberBetween(16, 17),
"LinkTo" => (string) $faker->numberBetween(2, 3),
"Custodian" => 1,
"PatIdt" => [
"IdentifierType" => "KTP",
"Identifier" => "numberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetweennumberBetween"
// "Identifier" => $faker->nik() ?? $faker->numerify('################')
],
"PatAtt" => [
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ]
],
"PatCom" => $faker->sentence,
];
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
if($payload['DeathIndicator'] == '16') {
$payload['DeathDateTime'] = $faker->date('Y-m-d H:i:s');
} else {
$payload['DeathDateTime'] = null;
}
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$result = $this->withBodyFormat('json')->post($this->endpoint, $payload);
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$result->assertArrayHasKey("errors", $result);
}
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
// 201 - Passed
public function testCreateWithoutAttachments() {
$faker = Factory::create('id_ID');
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$payload = [
"PatientID" => "DUAU" . $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000),
"AlternatePID" => "DMAU" . $faker->numberBetween(5, 1000).$faker->numberBetween(1, 1000),
"Prefix" => $faker->title,
"NameFirst" => $faker->firstName,
"NameMiddle" => $faker->firstName,
"NameMaiden" => $faker->firstName,
"NameLast" => $faker->lastName,
"Suffix" => "S.Kom",
"NameAlias" => $faker->userName,
"Gender" => $faker->numberBetween(5, 6),
"PlaceOfBirth" => $faker->city,
"Birthdate" => $faker->date('Y-m-d'),
"ZIP" => $faker->postcode,
"Street_1" => $faker->streetAddress,
"Street_2" => "RT " . $faker->numberBetween(1, 10) . " RW " . $faker->numberBetween(1, 10),
"Street_3" => "Blok " . $faker->numberBetween(1, 20),
"City" => $faker->city,
"Province" => $faker->state,
"EmailAddress1" => "AiA" . $faker->numberBetween(1, 1110).$faker->numberBetween(1, 1110).'@gmail.com',
"EmailAddress2" => "BiA" . $faker->numberBetween(1, 1110).$faker->numberBetween(1, 1110).'@gmail.com',
"Phone" => $faker->phoneNumber,
"MobilePhone" => $faker->phoneNumber,
"Race" => (string) $faker->numberBetween(175, 205),
"Country" => (string) $faker->numberBetween(221, 469),
"MaritalStatus" => (string) $faker->numberBetween(8, 15),
"Religion" => (string) $faker->numberBetween(206, 212),
"Ethnic" => (string) $faker->numberBetween(213, 220),
"Citizenship" => "WNI",
"DeathIndicator" => (string) $faker->numberBetween(16, 17),
"LinkTo" => (string) $faker->numberBetween(2, 3),
"Custodian" => 1,
"PatIdt" => [
"IdentifierType" => "KTP",
"Identifier" => $faker->nik() ?? $faker->numerify('################')
],
"PatAtt" => [],
"PatCom" => $faker->sentence,
];
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
if($payload['DeathIndicator'] == '16') {
$payload['DeathDateTime'] = $faker->date('Y-m-d H:i:s');
} else {
$payload['DeathDateTime'] = null;
}
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$result = $this->withBodyFormat('json')->post($this->endpoint, $payload);
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$result->assertStatus(201);
}
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
// 201 - Passed
public function testCreateWithoutPatComments() {
$faker = Factory::create('id_ID');
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$payload = [
"PatientID" => "DUALU" . $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000),
"AlternatePID" => "DMALU" . $faker->numberBetween(5, 1000).$faker->numberBetween(1, 1000),
"Prefix" => $faker->title,
"NameFirst" => $faker->firstName,
"NameMiddle" => $faker->firstName,
"NameMaiden" => $faker->firstName,
"NameLast" => $faker->lastName,
"Suffix" => "S.Kom",
"NameAlias" => $faker->userName,
"Gender" => $faker->numberBetween(5, 6),
"PlaceOfBirth" => $faker->city,
"Birthdate" => $faker->date('Y-m-d'),
"ZIP" => $faker->postcode,
"Street_1" => $faker->streetAddress,
"Street_2" => "RT " . $faker->numberBetween(1, 10) . " RW " . $faker->numberBetween(1, 10),
"Street_3" => "Blok " . $faker->numberBetween(1, 20),
"City" => $faker->city,
"Province" => $faker->state,
"EmailAddress1" => "AiAe" . $faker->numberBetween(1, 1110).$faker->numberBetween(1, 1110).'@gmail.com',
"EmailAddress2" => "BiAe" . $faker->numberBetween(1, 1110).$faker->numberBetween(1, 1110).'@gmail.com',
"Phone" => $faker->phoneNumber,
"MobilePhone" => $faker->phoneNumber,
"Race" => (string) $faker->numberBetween(175, 205),
"Country" => (string) $faker->numberBetween(221, 469),
"MaritalStatus" => (string) $faker->numberBetween(8, 15),
"Religion" => (string) $faker->numberBetween(206, 212),
"Ethnic" => (string) $faker->numberBetween(213, 220),
"Citizenship" => "WNI",
"DeathIndicator" => (string) $faker->numberBetween(16, 17),
"LinkTo" => (string) $faker->numberBetween(2, 3),
"Custodian" => 1,
"PatIdt" => [
"IdentifierType" => "KTP",
"Identifier" => $faker->nik() ?? $faker->numerify('################')
],
"PatAtt" => [
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ],
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ],
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ]
],
"PatCom" => null,
];
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
if($payload['DeathIndicator'] == '16') {
$payload['DeathDateTime'] = $faker->date('Y-m-d H:i:s');
} else {
$payload['DeathDateTime'] = null;
}
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$result = $this->withBodyFormat('json')->post($this->endpoint, $payload);
2025-09-25 14:01:33 +07:00
2025-10-14 15:50:22 +07:00
$result->assertStatus(201);
}
// 500 - Passed
public function testCreateDatabaseError() {
$faker = Factory::create('id_ID');
// Insert patient pertama
$payload = [
"PatientID" => "DaUALU" . $faker->numberBetween(1, 1000).$faker->numberBetween(1, 1000),
"AlternatePID" => "DaMALU" . $faker->numberBetween(5, 1000).$faker->numberBetween(1, 1000),
"Prefix" => $faker->title,
"NameFirst" => $faker->firstName,
"NameMiddle" => $faker->firstName,
"NameMaiden" => $faker->firstName,
"NameLast" => $faker->lastName,
"Suffix" => "S.Kom",
"NameAlias" => $faker->userName,
"Gender" => $faker->numberBetween(5, 6),
"PlaceOfBirth" => $faker->city,
"Birthdate" => $faker->date('Y-m-d'),
"ZIP" => $faker->postcode,
"Street_1" => $faker->streetAddress,
"Street_2" => "RT " . $faker->numberBetween(1, 10) . " RW " . $faker->numberBetween(1, 10),
"Street_3" => "Blok " . $faker->numberBetween(1, 20),
"City" => $faker->city,
"Province" => $faker->state,
"EmailAddress1" => "AiaAe" . $faker->numberBetween(1, 1110).$faker->numberBetween(1, 1110).'@gmail.com',
"EmailAddress2" => "BiaAe" . $faker->numberBetween(1, 1110).$faker->numberBetween(1, 1110).'@gmail.com',
"Phone" => $faker->phoneNumber,
"MobilePhone" => $faker->phoneNumber,
"Race" => (string) $faker->numberBetween(175, 205),
"Country" => (string) $faker->numberBetween(221, 469),
"MaritalStatus" => (string) $faker->numberBetween(8, 15),
"Religion" => (string) $faker->numberBetween(206, 212),
"Ethnic" => (string) $faker->numberBetween(213, 220),
"Citizenship" => "WNI",
"DeathIndicator" => (string) $faker->numberBetween(16, 17),
"LinkTo" => (string) $faker->numberBetween(2, 3),
"Custodian" => 1,
"PatIdt" => [
"IdentifierType" => "KTP",
"Identifier" => $faker->nik() ?? $faker->numerify('################')
],
"PatAtt" => [
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ],
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ],
[ "Address" => "/api/upload/" . $faker->word . ".jpg" ]
],
"PatCom" => [], // Ini Salah
];
if($payload['DeathIndicator'] == '16') {
$payload['DeathDateTime'] = $faker->date('Y-m-d H:i:s');
} else {
$payload['DeathDateTime'] = null;
}
$result = $this->withBodyFormat('json')->post($this->endpoint, $payload);
$result->assertStatus(500);
}
2025-09-25 14:01:33 +07:00
// public function testCreateDuplicateIdentifier() {
// $payload = [
// "PatientID" => "PX006",
// "NameFirst" => "Alpha",
// "Identity" => [
// "IdentifierType" => "KTP",
// "Identifier" => "DUP123"
// ]
// ];
// $this->withBodyFormat('json')->post($this->endpoint, $payload);
// $payload2 = [
// "PatientID" => "PX007",
// "NameFirst" => "Beta",
// "Identity" => [
// "IdentifierType" => "KTP",
// "Identifier" => "DUP123" // Sama
// ]
// ];
// $result = $this->withBodyFormat('json')->post($this->endpoint, $payload2);
// $result->assertStatus(422);
// }
2025-09-23 10:18:48 +07:00
}