Skip to content

Commit d718953

Browse files
kojiromikeIvan Googlaclaude
authored
feat(api): add prescription REST API endpoints with tests (openemr#10837)
Fixes openemr#10833 Related to openemr#10834 #### Short description of what this resolves: Add REST API endpoints for prescriptions: - `POST /api/prescription` - Create a new prescription - `GET /api/prescription` - List all prescriptions - `GET /api/prescription/:uuid` - Get a single prescription by UUID - `DELETE /api/prescription/:id` - Soft-delete (sets `active = 0`) The GET endpoints migrate from the deprecated `handleProcessingResult` (array return) to `createProcessingResultResponse` (PSR-7 `ResponseInterface`), fixing HTTP status codes that were previously ignored by the Symfony kernel's `ViewRendererListener`. The `getOne` service method bypasses `FhirSearchWhereClauseBuilder` and filters by UUID directly, since `_id` is not a valid column in the UNION subquery used by `PrescriptionService`. The DELETE endpoint uses soft delete to preserve medical records for audit compliance, consistent with the `prescriptions` table's existing `active` column. Also fixes MySQL strict mode error in `interface/eRx_xml.php` by removing `enddate = ''` comparisons that fail when comparing DATETIME to empty string. #### Tests: - `testPost` - Create prescription via API - `testGetOne` - Retrieve single prescription by UUID - `testGetOneNotFound` - Verify 400 for invalid UUID - `testGetAll` - List all prescriptions, verify created records appear - `testRoundTrip` - Create → Read → Delete → Verify status=stopped - `testDelete` - Soft-delete and verify response - `testDeleteNonExistent` - Delete non-existent ID returns 200 #### Additional changes: - Updates `SystemLoggerAwareTrait::setSystemLogger()` to accept PSR-3 `LoggerInterface` in addition to `SystemLogger`, enabling use of `NullLogger` in tests - Updates `FhirConditionService` and `FhirOrganizationService` method signatures to match - Uses `NullLogger` in `ApiTestClient` to suppress logging noise during tests --- **Original contribution by @IvanJov** from PR openemr#6106. This PR rebases and fixes that work to use soft deletes, adds GET endpoints and comprehensive API tests, and addresses baseline issues. Co-authored-by: Ivan Googla <ivan.jo.dev@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e423c7f commit d718953

25 files changed

+569
-288
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php declare(strict_types = 1);
2+
3+
$ignoreErrors = [];
4+
$ignoreErrors[] = [
5+
'message' => '#^Unable to resolve the template type T in call to method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getSingleEntry\\(\\)$#',
6+
'count' => 3,
7+
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
8+
];
9+
10+
return ['parameters' => ['ignoreErrors' => $ignoreErrors]];

.phpstan/baseline/argument.type.php

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,31 @@
126126
'count' => 2,
127127
'path' => __DIR__ . '/../../apis/routes/_rest_routes_fhir_r4_us_core_3_1_0.inc.php',
128128
];
129+
$ignoreErrors[] = [
130+
'message' => '#^Parameter \\#1 \\$data of method OpenEMR\\\\RestControllers\\\\PrescriptionRestController\\:\\:post\\(\\) expects array\\<string, mixed\\>, array\\<mixed, mixed\\> given\\.$#',
131+
'count' => 1,
132+
'path' => __DIR__ . '/../../apis/routes/_rest_routes_standard.inc.php',
133+
];
129134
$ignoreErrors[] = [
130135
'message' => '#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#',
131-
'count' => 31,
136+
'count' => 32,
132137
'path' => __DIR__ . '/../../apis/routes/_rest_routes_standard.inc.php',
133138
];
134139
$ignoreErrors[] = [
135140
'message' => '#^Parameter \\#1 \\$puuid of method OpenEMR\\\\RestControllers\\\\InsuranceRestController\\:\\:operationSwapInsurance\\(\\) expects string, mixed given\\.$#',
136141
'count' => 1,
137142
'path' => __DIR__ . '/../../apis/routes/_rest_routes_standard.inc.php',
138143
];
144+
$ignoreErrors[] = [
145+
'message' => '#^Parameter \\#1 \\$uuid of method OpenEMR\\\\RestControllers\\\\PrescriptionRestController\\:\\:delete\\(\\) expects string, mixed given\\.$#',
146+
'count' => 1,
147+
'path' => __DIR__ . '/../../apis/routes/_rest_routes_standard.inc.php',
148+
];
149+
$ignoreErrors[] = [
150+
'message' => '#^Parameter \\#1 \\$uuid of method OpenEMR\\\\RestControllers\\\\PrescriptionRestController\\:\\:getOne\\(\\) expects string, mixed given\\.$#',
151+
'count' => 1,
152+
'path' => __DIR__ . '/../../apis/routes/_rest_routes_standard.inc.php',
153+
];
139154
$ignoreErrors[] = [
140155
'message' => '#^Parameter \\#2 \\$type of method OpenEMR\\\\RestControllers\\\\InsuranceRestController\\:\\:operationSwapInsurance\\(\\) expects string, bool\\|float\\|int\\|string\\|null given\\.$#',
141156
'count' => 1,
@@ -64641,11 +64656,6 @@
6464164656
'count' => 5,
6464264657
'path' => __DIR__ . '/../../src/RestControllers/PractitionerRestController.php',
6464364658
];
64644-
$ignoreErrors[] = [
64645-
'message' => '#^Parameter \\#1 \\$processingResult of static method OpenEMR\\\\RestControllers\\\\RestControllerHelper\\:\\:handleProcessingResult\\(\\) expects OpenEMR\\\\Validators\\\\ProcessingResult, mixed given\\.$#',
64646-
'count' => 3,
64647-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
64648-
];
6464964659
$ignoreErrors[] = [
6465064660
'message' => '#^Parameter \\#1 \\$value of function count expects array\\|Countable, mixed given\\.$#',
6465164661
'count' => 1,
@@ -73872,8 +73882,8 @@
7387273882
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
7387373883
];
7387473884
$ignoreErrors[] = [
73875-
'message' => '#^Parameter \\#1 \\$row of method OpenEMR\\\\Services\\\\PrescriptionService\\:\\:createResultRecordFromDatabaseResult\\(\\) expects array\\<string, mixed\\>, array given\\.$#',
73876-
'count' => 1,
73885+
'message' => '#^Parameter \\#1 \\$row of method OpenEMR\\\\Services\\\\PrescriptionService\\:\\:createResultRecordFromDatabaseResult\\(\\) expects array\\<string, mixed\\>, array\\<mixed\\> given\\.$#',
73886+
'count' => 2,
7387773887
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
7387873888
];
7387973889
$ignoreErrors[] = [
@@ -75787,8 +75797,8 @@
7578775797
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
7578875798
];
7578975799
$ignoreErrors[] = [
75790-
'message' => '#^Parameter \\#1 \\$input of function array_rand expects array, mixed given\\.$#',
75791-
'count' => 1,
75800+
'message' => '#^Parameter \\#1 \\$array of method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getSingleEntry\\(\\) expects array\\<mixed\\>, mixed given\\.$#',
75801+
'count' => 3,
7579275802
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
7579375803
];
7579475804
$ignoreErrors[] = [
@@ -75802,12 +75812,12 @@
7580275812
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
7580375813
];
7580475814
$ignoreErrors[] = [
75805-
'message' => '#^Parameter \\#1 \\.\\.\\.\\$arrays of function array_merge expects array, OpenEMR\\\\Tests\\\\Fixtures\\\\random given\\.$#',
75815+
'message' => '#^Parameter \\#1 \\.\\.\\.\\$arrays of function array_merge expects array, mixed given\\.$#',
7580675816
'count' => 1,
7580775817
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
7580875818
];
7580975819
$ignoreErrors[] = [
75810-
'message' => '#^Parameter \\#2 \\.\\.\\.\\$arrays of function array_merge expects array, ArrayAccess&OpenEMR\\\\Tests\\\\Fixtures\\\\random given\\.$#',
75820+
'message' => '#^Parameter \\#2 \\.\\.\\.\\$arrays of function array_merge expects array, mixed given\\.$#',
7581175821
'count' => 1,
7581275822
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
7581375823
];

.phpstan/baseline/class.notFound.php

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,36 +1201,11 @@
12011201
'count' => 1,
12021202
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FacilityFixtureManager.php',
12031203
];
1204-
$ignoreErrors[] = [
1205-
'message' => '#^Access to offset \'address_id\' on an unknown class OpenEMR\\\\Tests\\\\Fixtures\\\\random\\.$#',
1206-
'count' => 1,
1207-
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
1208-
];
1209-
$ignoreErrors[] = [
1210-
'message' => '#^Access to offset \'addresses\' on an unknown class OpenEMR\\\\Tests\\\\Fixtures\\\\random\\.$#',
1211-
'count' => 1,
1212-
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
1213-
];
1214-
$ignoreErrors[] = [
1215-
'message' => '#^Access to offset \'contact_id\' on an unknown class OpenEMR\\\\Tests\\\\Fixtures\\\\random\\.$#',
1216-
'count' => 1,
1217-
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
1218-
];
12191204
$ignoreErrors[] = [
12201205
'message' => '#^Method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getNextPid\\(\\) has invalid return type OpenEMR\\\\Tests\\\\Fixtures\\\\the\\.$#',
12211206
'count' => 1,
12221207
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
12231208
];
1224-
$ignoreErrors[] = [
1225-
'message' => '#^Method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getSingleEntry\\(\\) has invalid return type OpenEMR\\\\Tests\\\\Fixtures\\\\random\\.$#',
1226-
'count' => 1,
1227-
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
1228-
];
1229-
$ignoreErrors[] = [
1230-
'message' => '#^Method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getSinglePatientFixture\\(\\) has invalid return type OpenEMR\\\\Tests\\\\Fixtures\\\\a\\.$#',
1231-
'count' => 1,
1232-
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
1233-
];
12341209
$ignoreErrors[] = [
12351210
'message' => '#^Method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getUnregisteredUuid\\(\\) has invalid return type OpenEMR\\\\Tests\\\\Fixtures\\\\uuid4\\.$#',
12361211
'count' => 1,
@@ -1306,10 +1281,5 @@
13061281
'count' => 1,
13071282
'path' => __DIR__ . '/../../tests/Tests/Services/FHIR/FhirPatientServiceMappingTest.php',
13081283
];
1309-
$ignoreErrors[] = [
1310-
'message' => '#^Access to offset \'pubpid\' on an unknown class OpenEMR\\\\Tests\\\\Fixtures\\\\a\\.$#',
1311-
'count' => 1,
1312-
'path' => __DIR__ . '/../../tests/Tests/Services/Qrda/QrdaReportServiceTest.php',
1313-
];
13141284

13151285
return ['parameters' => ['ignoreErrors' => $ignoreErrors]];

.phpstan/baseline/empty.notAllowed.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5063,7 +5063,7 @@
50635063
];
50645064
$ignoreErrors[] = [
50655065
'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#',
5066-
'count' => 4,
5066+
'count' => 3,
50675067
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
50685068
];
50695069
$ignoreErrors[] = [

.phpstan/baseline/loader.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
return ['includes' => [
44
__DIR__ . '/argument.byRef.php',
5+
__DIR__ . '/argument.templateType.php',
56
__DIR__ . '/argument.type.php',
67
__DIR__ . '/argument.unpackNonIterable.php',
78
__DIR__ . '/arguments.count.php',

.phpstan/baseline/method.alreadyNarrowedType.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,6 @@
126126
'count' => 1,
127127
'path' => __DIR__ . '/../../tests/Tests/Isolated/Validators/BaseValidatorTest.php',
128128
];
129-
$ignoreErrors[] = [
130-
'message' => '#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertTrue\\(\\) with true will always evaluate to true\\.$#',
131-
'count' => 2,
132-
'path' => __DIR__ . '/../../tests/Tests/Isolated/Validators/BaseValidatorTest.php',
133-
];
134129
$ignoreErrors[] = [
135130
'message' => '#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with \'OpenEMR\\\\\\\\Validators\\\\\\\\BaseValidator\' and OpenEMR\\\\Tests\\\\Isolated\\\\Validators\\\\CoverageValidatorStub will always evaluate to true\\.$#',
136131
'count' => 1,

.phpstan/baseline/method.impossibleType.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@
66
'count' => 2,
77
'path' => __DIR__ . '/../../tests/Tests/Api/ApiTestClientTest.php',
88
];
9-
$ignoreErrors[] = [
10-
'message' => '#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with \'OpenEMR\\\\\\\\Validators\\\\\\\\ProcessingResult\' and true will always evaluate to false\\.$#',
11-
'count' => 3,
12-
'path' => __DIR__ . '/../../tests/Tests/Isolated/Validators/BaseValidatorTest.php',
13-
];
149
$ignoreErrors[] = [
1510
'message' => '#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertNull\\(\\) with OpenEMR\\\\FHIR\\\\R4\\\\FHIRElement\\\\FHIRReference and \'Problems/health…\' will always evaluate to false\\.$#',
1611
'count' => 1,

.phpstan/baseline/method.nonObject.php

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7506,26 +7506,6 @@
75067506
'count' => 1,
75077507
'path' => __DIR__ . '/../../src/RestControllers/PractitionerRestController.php',
75087508
];
7509-
$ignoreErrors[] = [
7510-
'message' => '#^Cannot call method getAll\\(\\) on mixed\\.$#',
7511-
'count' => 1,
7512-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
7513-
];
7514-
$ignoreErrors[] = [
7515-
'message' => '#^Cannot call method getData\\(\\) on mixed\\.$#',
7516-
'count' => 1,
7517-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
7518-
];
7519-
$ignoreErrors[] = [
7520-
'message' => '#^Cannot call method getOne\\(\\) on mixed\\.$#',
7521-
'count' => 1,
7522-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
7523-
];
7524-
$ignoreErrors[] = [
7525-
'message' => '#^Cannot call method hasErrors\\(\\) on mixed\\.$#',
7526-
'count' => 1,
7527-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
7528-
];
75297509
$ignoreErrors[] = [
75307510
'message' => '#^Cannot call method getAll\\(\\) on mixed\\.$#',
75317511
'count' => 1,
@@ -8951,11 +8931,6 @@
89518931
'count' => 2,
89528932
'path' => __DIR__ . '/../../src/Services/PractitionerService.php',
89538933
];
8954-
$ignoreErrors[] = [
8955-
'message' => '#^Cannot call method validateId\\(\\) on mixed\\.$#',
8956-
'count' => 2,
8957-
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
8958-
];
89598934
$ignoreErrors[] = [
89608935
'message' => '#^Cannot call method calculate\\(\\) on mixed\\.$#',
89618936
'count' => 1,

.phpstan/baseline/missingType.parameter.php

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -40421,16 +40421,6 @@
4042140421
'count' => 1,
4042240422
'path' => __DIR__ . '/../../src/RestControllers/PractitionerRestController.php',
4042340423
];
40424-
$ignoreErrors[] = [
40425-
'message' => '#^Method OpenEMR\\\\RestControllers\\\\PrescriptionRestController\\:\\:getAll\\(\\) has parameter \\$search with no type specified\\.$#',
40426-
'count' => 1,
40427-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
40428-
];
40429-
$ignoreErrors[] = [
40430-
'message' => '#^Method OpenEMR\\\\RestControllers\\\\PrescriptionRestController\\:\\:getOne\\(\\) has parameter \\$uuid with no type specified\\.$#',
40431-
'count' => 1,
40432-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
40433-
];
4043440424
$ignoreErrors[] = [
4043540425
'message' => '#^Method OpenEMR\\\\RestControllers\\\\ProcedureRestController\\:\\:getAll\\(\\) has parameter \\$search with no type specified\\.$#',
4043640426
'count' => 1,
@@ -46551,26 +46541,11 @@
4655146541
'count' => 1,
4655246542
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
4655346543
];
46554-
$ignoreErrors[] = [
46555-
'message' => '#^Method OpenEMR\\\\Services\\\\PrescriptionService\\:\\:getAll\\(\\) has parameter \\$puuidBind with no type specified\\.$#',
46556-
'count' => 1,
46557-
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
46558-
];
4655946544
$ignoreErrors[] = [
4656046545
'message' => '#^Method OpenEMR\\\\Services\\\\PrescriptionService\\:\\:getAll\\(\\) has parameter \\$search with no type specified\\.$#',
4656146546
'count' => 1,
4656246547
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
4656346548
];
46564-
$ignoreErrors[] = [
46565-
'message' => '#^Method OpenEMR\\\\Services\\\\PrescriptionService\\:\\:getOne\\(\\) has parameter \\$puuidBind with no type specified\\.$#',
46566-
'count' => 1,
46567-
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
46568-
];
46569-
$ignoreErrors[] = [
46570-
'message' => '#^Method OpenEMR\\\\Services\\\\PrescriptionService\\:\\:getOne\\(\\) has parameter \\$uuid with no type specified\\.$#',
46571-
'count' => 1,
46572-
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
46573-
];
4657446549
$ignoreErrors[] = [
4657546550
'message' => '#^Method OpenEMR\\\\Services\\\\ProcedureService\\:\\:addDiagnosis\\(\\) has parameter \\$data with no type specified\\.$#',
4657646551
'count' => 1,
@@ -48511,11 +48486,6 @@
4851148486
'count' => 1,
4851248487
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FacilityFixtureManager.php',
4851348488
];
48514-
$ignoreErrors[] = [
48515-
'message' => '#^Method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getSingleEntry\\(\\) has parameter \\$array with no type specified\\.$#',
48516-
'count' => 1,
48517-
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
48518-
];
4851948489
$ignoreErrors[] = [
4852048490
'message' => '#^Method OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:getUuid\\(\\) has parameter \\$tableName with no type specified\\.$#',
4852148491
'count' => 1,

.phpstan/baseline/missingType.property.php

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30436,11 +30436,6 @@
3043630436
'count' => 1,
3043730437
'path' => __DIR__ . '/../../src/RestControllers/PractitionerRestController.php',
3043830438
];
30439-
$ignoreErrors[] = [
30440-
'message' => '#^Property OpenEMR\\\\RestControllers\\\\PrescriptionRestController\\:\\:\\$prescriptionService has no type specified\\.$#',
30441-
'count' => 1,
30442-
'path' => __DIR__ . '/../../src/RestControllers/PrescriptionRestController.php',
30443-
];
3044430439
$ignoreErrors[] = [
3044530440
'message' => '#^Property OpenEMR\\\\RestControllers\\\\ProcedureRestController\\:\\:\\$procedureService has no type specified\\.$#',
3044630441
'count' => 1,
@@ -30646,11 +30641,6 @@
3064630641
'count' => 1,
3064730642
'path' => __DIR__ . '/../../src/Services/PatientService.php',
3064830643
];
30649-
$ignoreErrors[] = [
30650-
'message' => '#^Property OpenEMR\\\\Services\\\\PrescriptionService\\:\\:\\$patientValidator has no type specified\\.$#',
30651-
'count' => 1,
30652-
'path' => __DIR__ . '/../../src/Services/PrescriptionService.php',
30653-
];
3065430644
$ignoreErrors[] = [
3065530645
'message' => '#^Property OpenEMR\\\\Services\\\\Qdm\\\\CqmCalculator\\:\\:\\$client has no type specified\\.$#',
3065630646
'count' => 1,
@@ -31246,11 +31236,6 @@
3124631236
'count' => 1,
3124731237
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
3124831238
];
31249-
$ignoreErrors[] = [
31250-
'message' => '#^Property OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManager\\:\\:\\$patientFixtures has no type specified\\.$#',
31251-
'count' => 1,
31252-
'path' => __DIR__ . '/../../tests/Tests/Fixtures/FixtureManager.php',
31253-
];
3125431239
$ignoreErrors[] = [
3125531240
'message' => '#^Property OpenEMR\\\\Tests\\\\Fixtures\\\\FixtureManagerTest\\:\\:\\$fixtureManager has no type specified\\.$#',
3125631241
'count' => 1,

0 commit comments

Comments
 (0)