|
18 | 18 | use PhalconKit\Exception\ServiceException; |
19 | 19 | use PhalconKit\Mvc\Controller\Restful; |
20 | 20 | use PhalconKit\Tests\Unit\AbstractUnit; |
| 21 | +use PhalconKit\Tests\Unit\Mvc\Controller\Traits\Fixtures\Models\Error as ErrorModel; |
21 | 22 | use PhalconKit\Tests\Unit\Mvc\Controller\Traits\Fixtures\ModelColumnAlternateModel; |
22 | 23 | use PhalconKit\Tests\Unit\Mvc\Controller\Traits\Fixtures\ModelColumnMappedModel; |
23 | 24 | use PhalconKit\Tests\Unit\Mvc\Controller\Traits\Fixtures\ModelColumnMetadataModel; |
24 | 25 | use PhalconKit\Tests\Unit\Mvc\Model\Fixtures\FakeMetaData; |
25 | 26 |
|
26 | 27 | class ModelTraitTest extends AbstractUnit |
27 | 28 | { |
| 29 | + public function testModelNameInferenceIgnoresNonModelGlobalClasses(): void |
| 30 | + { |
| 31 | + $controller = $this->newControllerNamed('Error'); |
| 32 | + $controller->setModelNamespaces([]); |
| 33 | + |
| 34 | + $this->assertNull($controller->getModelNameFromController()); |
| 35 | + } |
| 36 | + |
| 37 | + public function testModelNameInferenceResolvesNamespacedModelAfterGlobalClassCollision(): void |
| 38 | + { |
| 39 | + $controller = $this->newControllerNamed('Error'); |
| 40 | + $controller->setModelNamespaces([ |
| 41 | + substr(ErrorModel::class, 0, -strlen('Error')) => __DIR__ . '/Fixtures/Models/', |
| 42 | + ]); |
| 43 | + |
| 44 | + $this->assertSame(ErrorModel::class, $controller->getModelNameFromController()); |
| 45 | + } |
| 46 | + |
| 47 | + public function testLoadModelRejectsMissingOrNonModelClassBeforeModelsManagerLoad(): void |
| 48 | + { |
| 49 | + $controller = $this->newControllerNamed('Error'); |
| 50 | + $controller->setModelName('Error'); |
| 51 | + |
| 52 | + $this->expectException(ServiceException::class); |
| 53 | + $this->expectExceptionMessage( |
| 54 | + 'Unable to load controller model "Error": expected a class implementing "Phalcon\Mvc\ModelInterface".' |
| 55 | + ); |
| 56 | + |
| 57 | + $controller->loadModel(); |
| 58 | + } |
| 59 | + |
| 60 | + public function testLoadModelAcceptsNamespacedModelAfterGlobalClassCollision(): void |
| 61 | + { |
| 62 | + $controller = $this->newControllerNamed('Error'); |
| 63 | + $controller->setModelName(ErrorModel::class); |
| 64 | + |
| 65 | + $this->assertInstanceOf(ErrorModel::class, $controller->loadModel()); |
| 66 | + } |
| 67 | + |
28 | 68 | public function testGetModelNamespacesRejectsInvalidLoaderService(): void |
29 | 69 | { |
30 | 70 | $controller = new class extends Restful { |
@@ -142,4 +182,33 @@ public function loadModel(?string $modelName = null): ModelInterface |
142 | 182 |
|
143 | 183 | return $controller; |
144 | 184 | } |
| 185 | + |
| 186 | + private function newControllerNamed(string $controllerName): Restful |
| 187 | + { |
| 188 | + $controller = new class extends Restful { |
| 189 | + public string $controllerName = ''; |
| 190 | + |
| 191 | + /** |
| 192 | + * Disable normal REST initialization for this trait-focused test. |
| 193 | + */ |
| 194 | + public function initialize(): void |
| 195 | + { |
| 196 | + } |
| 197 | + |
| 198 | + public function getControllerName(): string |
| 199 | + { |
| 200 | + return $this->controllerName; |
| 201 | + } |
| 202 | + }; |
| 203 | + |
| 204 | + $di = $this->di; |
| 205 | + if ($di === null) { |
| 206 | + self::fail('DI container was not initialized.'); |
| 207 | + } |
| 208 | + |
| 209 | + $controller->setDI($di); |
| 210 | + $controller->controllerName = $controllerName; |
| 211 | + |
| 212 | + return $controller; |
| 213 | + } |
145 | 214 | } |
0 commit comments