Skip to content

Commit fd69457

Browse files
committed
Some optimizations and added more tests
1 parent a9b8371 commit fd69457

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

system/Model.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use CodeIgniter\Database\Exceptions\DataException;
2222
use CodeIgniter\Entity\Entity;
2323
use CodeIgniter\Exceptions\BadMethodCallException;
24+
use CodeIgniter\Exceptions\InvalidArgumentException;
2425
use CodeIgniter\Exceptions\ModelException;
2526
use CodeIgniter\Validation\ValidationInterface;
2627
use Config\Database;
@@ -569,10 +570,14 @@ public function chunk(int $size, Closure $userFunc)
569570
*/
570571
public function chunkArray(int $size, Closure $userFunc)
571572
{
573+
if ($size <= 0) {
574+
throw new InvalidArgumentException('chunkArray() requires a positive integer for the $size argument.');
575+
}
576+
572577
$total = $this->builder()->countAllResults(false);
573578
$offset = 0;
574579

575-
while ($offset <= $total) {
580+
while ($offset < $total) {
576581
$builder = clone $this->builder();
577582
$rows = $builder->get($size, $offset);
578583

tests/system/Models/MiscellaneousModelTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
namespace CodeIgniter\Models;
1515

1616
use CodeIgniter\Database\Exceptions\DataException;
17+
use CodeIgniter\Events\Events;
18+
use CodeIgniter\Exceptions\InvalidArgumentException;
1719
use CodeIgniter\I18n\Time;
1820
use PHPUnit\Framework\Attributes\Group;
1921
use Tests\Support\Models\EntityModel;
@@ -53,6 +55,62 @@ public function testChunkArray(): void
5355
$this->assertSame([2, 2], $numRowsInChunk);
5456
}
5557

58+
public function testChunkArrayThrowsOnZeroSize(): void
59+
{
60+
$this->expectException(InvalidArgumentException::class);
61+
$this->expectExceptionMessage('chunkArray() requires a positive integer for the $size argument.');
62+
63+
$this->createModel(UserModel::class)->chunkArray(0, static function ($row): void {});
64+
}
65+
66+
public function testChunkThrowsOnNegativeSize(): void
67+
{
68+
$this->expectException(InvalidArgumentException::class);
69+
$this->expectExceptionMessage('chunkArray() requires a positive integer for the $size argument.');
70+
71+
$this->createModel(UserModel::class)->chunkArray(-1, static function ($row): void {});
72+
}
73+
74+
public function testChunkArrayEarlyExit(): void
75+
{
76+
$rowCount = 0;
77+
78+
$this->createModel(UserModel::class)->chunkArray(2, static function ($rows) use (&$rowCount): bool {
79+
$rowCount++;
80+
81+
return false;
82+
});
83+
84+
$this->assertSame(1, $rowCount);
85+
}
86+
87+
public function testChunkArrayDoesNotRunExtraQuery(): void
88+
{
89+
$queryCount = 0;
90+
$listener = static function () use (&$queryCount): void {
91+
$queryCount++;
92+
};
93+
94+
Events::on('DBQuery', $listener);
95+
$this->createModel(UserModel::class)->chunkArray(4, static function ($rows): void {});
96+
Events::removeListener('DBQuery', $listener);
97+
98+
$this->assertSame(2, $queryCount);
99+
}
100+
101+
public function testChunkArrayEmptyTable(): void
102+
{
103+
$this->db->table('user')->truncate();
104+
105+
$rowCount = 0;
106+
107+
$this->createModel(UserModel::class)->chunkArray(2, static function ($row) use (&$rowCount): void {
108+
$rowCount++;
109+
});
110+
111+
$this->assertSame(0, $rowCount);
112+
}
113+
56114
public function testCanCreateAndSaveEntityClasses(): void
57115
{
58116
$entity = $this->createModel(EntityModel::class)->where('name', 'Developer')->first();

0 commit comments

Comments
 (0)