diff --git a/core/tests/Drupal/Tests/Core/Entity/ChunkedIteratorTest.php b/core/tests/Drupal/Tests/Core/Entity/ChunkedIteratorTest.php new file mode 100644 index 0000000..136867a --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Entity/ChunkedIteratorTest.php @@ -0,0 +1,185 @@ +entityStorage = $this->prophesize('Drupal\Core\Entity\EntityStorageInterface'); + $this->entity = $this->prophesize('Drupal\Core\Entity\EntityInterface'); + } + + /** + * @covers ::count + */ + public function testCountWithNoItems() { + $this->entityStorage->loadMultiple()->shouldNotBeCalled(); + $iterator = new ChunkedIterator($this->entityStorage->reveal(), []); + $this->assertSame(0, $iterator->count()); + } + + /** + * @covers ::getIterator + * @covers ::loadEntities + */ + public function testIterationWithNoItems() { + $this->entityStorage->resetCache()->shouldNotBeCalled(); + $this->entityStorage->loadMultiple()->shouldNotBeCalled(); + + $iterator = new ChunkedIterator($this->entityStorage->reveal(), []); + + foreach ($iterator as $entity) { + + } + } + + /** + * @covers ::getIterator + * @covers ::loadEntities + */ + public function testIteratorWithNoValidItems() { + $this->entityStorage->resetCache()->shouldBeCalled(); + $this->entityStorage->loadMultiple([1,2,3]) + ->willReturn([]) + ->shouldBeCalled(); + + $iterator = new ChunkedIterator($this->entityStorage->reveal(), [1,2,3]); + + foreach ($iterator as $entity) { + + } + } + + /** + * @covers ::getIterator + * @covers ::loadEntities + */ + public function testIteratorWithOneChunkValidItems() { + $return = [ + 1 => $this->entity->reveal(), + 2 => $this->entity->reveal(), + 3 => $this->entity->reveal(), + ]; + + $this->entityStorage->resetCache()->shouldBeCalled(); + $this->entityStorage->loadMultiple([1,2,3]) + ->willReturn($return) + ->shouldBeCalled(); + + $iterator = new ChunkedIterator($this->entityStorage->reveal(), [1,2,3]); + + $this->assertSame($return, iterator_to_array($iterator)); + } + + /** + * @covers ::getIterator + * @covers ::loadEntities + */ + public function testIteratorWithOneChunkInvalidItems() { + $return = [ + 2 => $this->entity->reveal(), + 3 => $this->entity->reveal(), + ]; + + $this->entityStorage->resetCache()->shouldBeCalled(); + $this->entityStorage->loadMultiple([1,2,3]) + ->willReturn($return) + ->shouldBeCalled(); + + $iterator = new ChunkedIterator($this->entityStorage->reveal(), [1,2,3]); + + $this->assertSame($return, iterator_to_array($iterator)); + } + + /** + * @covers ::getIterator + * @covers ::loadEntities + */ + public function testIteratorWithMultipleChunkValidItems() { + $return_1 = [ + 1 => $this->entity->reveal(), + 2 => $this->entity->reveal(), + 3 => $this->entity->reveal(), + ]; + + $return_2 = [ + 4 => $this->entity->reveal(), + 5 => $this->entity->reveal(), + 6 => $this->entity->reveal(), + ]; + + $this->entityStorage->resetCache()->shouldBeCalled(); + $this->entityStorage->loadMultiple([1, 2, 3]) + ->willReturn($return_1) + ->shouldBeCalled(); + $this->entityStorage->loadMultiple([4, 5, 6]) + ->willReturn($return_2) + ->shouldBeCalled(); + + // Create a new iterator but set the cache limit to 3. Two chunks should be + // loaded. + $iterator = new ChunkedIterator($this->entityStorage->reveal(), [1, 2, 3, 4, 5, 6], 3); + + $this->assertSame($return_1 + $return_2, iterator_to_array($iterator)); + } + + /** + * @covers ::getIterator + * @covers ::loadEntities + */ + public function testIteratorWithMultipleChunkInvalidItems() { + $return_1 = [ + 2 => $this->entity->reveal(), + 3 => $this->entity->reveal(), + ]; + + $return_2 = [ + 5 => $this->entity->reveal(), + 6 => $this->entity->reveal(), + ]; + + $this->entityStorage->resetCache()->shouldBeCalled(); + $this->entityStorage->loadMultiple([1, 2, 3]) + ->willReturn($return_1) + ->shouldBeCalled(); + $this->entityStorage->loadMultiple([4, 5, 6]) + ->willReturn($return_2) + ->shouldBeCalled(); + + // Create a new iterator but set the cache limit to 3. Two chunks should be + // loaded. + $iterator = new ChunkedIterator($this->entityStorage->reveal(), [1, 2, 3, 4, 5, 6], 3); + + $this->assertSame($return_1 + $return_2, iterator_to_array($iterator)); + } + +}