This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace As3\Modlr\Persister\MongoDb\Tests; |
||
4 | |||
5 | use PHPUnit_Framework_TestCase; |
||
6 | use Doctrine\MongoDB\Configuration; |
||
7 | use Doctrine\MongoDB\Connection; |
||
8 | use As3\Modlr; |
||
9 | |||
10 | class PersisterTest extends PHPUnit_Framework_TestCase |
||
11 | { |
||
12 | protected static $dbName = 'modlr_mongodb'; |
||
13 | |||
14 | protected $connection; |
||
15 | protected $smf; |
||
16 | protected $persister; |
||
17 | |||
18 | public function setUp() |
||
19 | { |
||
20 | // Initialize the doctrine connection |
||
21 | $config = new Configuration(); |
||
22 | $config->setLoggerCallable(function($msg) {}); |
||
23 | $this->connection = new Connection(null, array(), $config); |
||
24 | |||
25 | // Initialize the metadata factory |
||
26 | $typeFactory = new Modlr\DataTypes\TypeFactory; |
||
27 | $validator = new Modlr\Util\Validator; |
||
28 | |||
29 | $config = new Modlr\Rest\RestConfiguration($validator); |
||
30 | $config->setRootEndpoint('/modlr/api/'); |
||
31 | |||
32 | $entityUtil = new Modlr\Util\EntityUtility($config, $typeFactory); |
||
33 | $this->smf = new Modlr\Persister\MongoDb\StorageMetadataFactory($entityUtil); |
||
34 | |||
35 | $formatter = new Modlr\Persister\MongoDb\Formatter(); |
||
36 | $query = new Modlr\Persister\MongoDb\Query($this->connection, $formatter); |
||
37 | |||
38 | $hydrator = new Modlr\Persister\MongoDb\Hydrator(); |
||
39 | $schemaManager = new Modlr\Persister\MongoDb\SchemaManager(); |
||
40 | |||
41 | $this->persister = new Modlr\Persister\MongoDb\Persister($query, $this->smf, $hydrator, $schemaManager); |
||
42 | } |
||
43 | |||
44 | public function tearDown() |
||
45 | { |
||
46 | $collections = $this->connection->selectDatabase(self::$dbName)->listCollections(); |
||
47 | foreach ($collections as $collection) { |
||
48 | $collection->drop(); |
||
49 | } |
||
50 | |||
51 | $this->connection->close(); |
||
52 | unset($this->connection); |
||
53 | } |
||
54 | |||
55 | public function testPersisterValues() |
||
56 | { |
||
57 | $this->assertEquals('mongodb', $this->persister->getPersisterKey()); |
||
58 | $this->assertEquals('_type', $this->persister->getPolymorphicKey()); |
||
59 | $this->assertEquals('_id', $this->persister->getIdentifierKey()); |
||
60 | } |
||
61 | |||
62 | public function testMDFInstance() |
||
63 | { |
||
64 | $this->assertInstanceOf( |
||
65 | 'As3\Modlr\Metadata\Interfaces\StorageMetadataFactoryInterface', |
||
66 | $this->persister->getPersistenceMetadataFactory() |
||
67 | ); |
||
68 | } |
||
69 | |||
70 | /** |
||
71 | * @expectedException As3\Modlr\Persister\PersisterException |
||
72 | * @expectedExceptionMessage ID conversion currently only supports an object strategy, or none at all. |
||
73 | */ |
||
74 | public function testConvertIdInvalidStrategy() |
||
75 | { |
||
76 | $this->assertInstanceOf('MongoId', $this->persister->convertId('test', 'blag')); |
||
77 | } |
||
78 | |||
79 | /** |
||
80 | * @expectedException As3\Modlr\Persister\PersisterException |
||
81 | * @expectedExceptionMessage ID generation currently only supports an object strategy, or none at all. |
||
82 | */ |
||
83 | public function testGenerateIdInvalidStrategy() |
||
84 | { |
||
85 | $this->assertInstanceOf('MongoId', $this->persister->generateId('blag')); |
||
86 | } |
||
87 | |||
88 | public function testConvertIdObject() |
||
89 | { |
||
90 | $test = '49a7011a05c677b9a916612a'; |
||
91 | $id = new \MongoId($test); |
||
92 | |||
93 | $this->assertEquals($id, $this->persister->convertId($id)); |
||
94 | $this->assertEquals($id, $this->persister->convertId($id, 'object')); |
||
95 | } |
||
96 | |||
97 | public function testGenerateIdObject() |
||
98 | { |
||
99 | $this->assertInstanceOf('MongoId', $this->persister->generateId()); |
||
100 | $this->assertInstanceOf('MongoId', $this->persister->generateId('object')); |
||
101 | } |
||
102 | |||
103 | /** |
||
104 | * @expectedException As3\Modlr\Persister\PersisterException |
||
105 | * @expectedExceptionMessage ID conversion currently only supports an object strategy, or none at all. |
||
106 | */ |
||
107 | public function testConvertIdIncrementId() |
||
108 | { |
||
109 | $test = 12345; |
||
110 | $this->assertEquals($test, $this->persister->convertId($test, 'incrementId')); |
||
111 | } |
||
112 | |||
113 | /** |
||
114 | * @expectedException As3\Modlr\Persister\PersisterException |
||
115 | * @expectedExceptionMessage ID generation currently only supports an object strategy, or none at all. |
||
116 | */ |
||
117 | public function testGenerateIdIncrementId() |
||
118 | { |
||
119 | $val = $this->persister->generateId('incrementId'); |
||
120 | $this->assertGreaterThan($val, $this->persister->generateId('incrementId')); |
||
121 | } |
||
122 | |||
123 | public function testNameIsAppendedToSchemata() |
||
124 | { |
||
125 | $metadata = $this->getMetadata()->persistence; |
||
126 | |||
127 | foreach ($metadata->schemata as $schema) { |
||
0 ignored issues
–
show
|
|||
128 | $this->assertTrue(isset($schema['options']['name']) && !empty($schema['options']['name']), 'index name was not applied to schema'); |
||
129 | $this->assertSame(stripos($schema['options']['name'], 'modlr_'), 0, '`modlr_` prefix missing from schema name'); |
||
130 | } |
||
131 | } |
||
132 | |||
133 | /** |
||
134 | * @expectedException As3\Modlr\Exception\MetadataException |
||
135 | * @expectedExceptionMessage At least one key must be specified to define an index. |
||
136 | */ |
||
137 | public function testSchemaRequiresKeys() |
||
138 | { |
||
139 | $schemata = [['options' => ['unique' => true]]]; |
||
140 | $metadata = $this->getMetadata($schemata); |
||
0 ignored issues
–
show
$metadata is not used, you could remove the assignment.
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently. $myVar = 'Value';
$higher = false;
if (rand(1, 6) > 3) {
$higher = true;
} else {
$higher = false;
}
Both the ![]() |
|||
141 | } |
||
142 | |||
143 | /** |
||
144 | * @expectedException As3\Modlr\Exception\MetadataException |
||
145 | * @expectedExceptionMessage At least one key must be specified to define an index. |
||
146 | */ |
||
147 | public function testSchemaRequiresAtLeastOneKey() |
||
148 | { |
||
149 | $schemata = ['keys' => [], ['options' => ['unique' => true]]]; |
||
150 | $metadata = $this->getMetadata($schemata); |
||
0 ignored issues
–
show
$metadata is not used, you could remove the assignment.
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently. $myVar = 'Value';
$higher = false;
if (rand(1, 6) > 3) {
$higher = true;
} else {
$higher = false;
}
Both the ![]() |
|||
151 | } |
||
152 | |||
153 | /** |
||
154 | * @expectedException InvalidArgumentException |
||
155 | * @expectedExceptionMessage Cannot create an index with no keys defined. |
||
156 | */ |
||
157 | View Code Duplication | public function testSchemaCreateRequiresKeys() |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
158 | { |
||
159 | $collection = $this->connection->selectCollection(self::$dbName, 'test-model'); |
||
160 | $manager = new Modlr\Persister\MongoDb\SchemaManager; |
||
161 | |||
162 | $schemata = [ |
||
163 | ['options' => ['unique' => true]] |
||
164 | ]; |
||
165 | |||
166 | $manager->createSchemata($collection, $schemata); |
||
167 | } |
||
168 | |||
169 | /** |
||
170 | * @expectedException InvalidArgumentException |
||
171 | * @expectedExceptionMessage Cannot create an index with no keys defined. |
||
172 | */ |
||
173 | View Code Duplication | public function testSchemaCreateRequiresAtLeastOneKey() |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. ![]() |
|||
174 | { |
||
175 | $collection = $this->connection->selectCollection(self::$dbName, 'test-model'); |
||
176 | $manager = new Modlr\Persister\MongoDb\SchemaManager; |
||
177 | |||
178 | $schemata = [ |
||
179 | ['keys' => [], 'options' => ['unique' => true]] |
||
180 | ]; |
||
181 | |||
182 | $manager->createSchemata($collection, $schemata); |
||
183 | } |
||
184 | |||
185 | public function testSchemaCreation() |
||
186 | { |
||
187 | $metadata = $this->getMetadata(); |
||
188 | $this->persister->createSchemata($metadata); |
||
189 | |||
190 | $collection = $this->connection->selectCollection(self::$dbName, 'test-model'); |
||
191 | $indices = $collection->getIndexInfo(); |
||
192 | |||
193 | foreach ($metadata->persistence->schemata as $schema) { |
||
0 ignored issues
–
show
Accessing
schemata on the interface As3\Modlr\Metadata\Inter...s\StorageLayerInterface suggest that you code against a concrete implementation. How about adding an instanceof check?
If you access a property on an interface, you most likely code against a concrete implementation of the interface. Available Fixes
![]() |
|||
194 | $found = false; |
||
195 | foreach ($indices as $index) { |
||
196 | if ($index['name'] === $schema['options']['name']) { |
||
197 | $found = true; |
||
198 | } |
||
199 | } |
||
200 | $this->assertTrue($found, sprintf('Index for "%s" was not created!', $schema['options']['name'])); |
||
201 | } |
||
202 | } |
||
203 | |||
204 | private function getMetadata(array $schemata = []) |
||
205 | { |
||
206 | $mapping = [ |
||
207 | 'type' => 'test-model', |
||
208 | 'attributes' => [ |
||
209 | 'name' => ['data_type' => 'string'], |
||
210 | 'active' => ['data_type' => 'boolean'] |
||
211 | ], |
||
212 | 'persistence' => [ |
||
213 | 'db' => self::$dbName, |
||
214 | 'collection' => 'test-model', |
||
215 | 'schemata' => [ |
||
216 | ['keys' => ['name' => 1]], |
||
217 | ['keys' => ['active' => 1], ['options' => ['unique' => true]]] |
||
218 | ] |
||
219 | ] |
||
220 | ]; |
||
221 | if (!empty($schemata)) { |
||
222 | $mapping['persistence']['schemata'] = $schemata; |
||
223 | } |
||
224 | $metadata = new Modlr\Metadata\EntityMetadata($mapping['type']); |
||
225 | $pmd = $this->smf->createInstance($mapping['persistence']); |
||
226 | $metadata->setPersistence($pmd); |
||
227 | $this->smf->handleValidate($metadata); |
||
228 | return $metadata; |
||
229 | } |
||
230 | } |
||
231 |
If you access a property on an interface, you most likely code against a concrete implementation of the interface.
Available Fixes
Adding an additional type check:
Changing the type hint: