-
Notifications
You must be signed in to change notification settings - Fork 143
Expand file tree
/
Copy pathIntOffsetPagerTest.php
More file actions
108 lines (93 loc) · 2.43 KB
/
Copy pathIntOffsetPagerTest.php
File metadata and controls
108 lines (93 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
namespace Intercom\Tests\Core\Pagination\IntOffsetPagerTest;
use ArrayIterator;
use PHPUnit\Framework\TestCase;
use Intercom\Core\Pagination\OffsetPager;
use Intercom\Core\Pagination\Pager;
class Request
{
public ?Pagination $pagination;
public function __construct(?Pagination $pagination)
{
$this->pagination = $pagination;
}
}
class Pagination
{
public int $page;
public function __construct(int $page)
{
$this->page = $page;
}
}
class Response
{
public Data $data;
public function __construct(Data $data)
{
$this->data = $data;
}
}
class Data
{
/**
* @var string[]
*/
public array $items;
/**
* @param string[] $items
*/
public function __construct(array $items)
{
$this->items = $items;
}
}
class IntOffsetPagerTest extends TestCase
{
public function testOffsetPagerWithPage(): void
{
$pager = $this->createPager();
$this->assertPager($pager);
}
/**
* @return OffsetPager<Request, Response, string>
*/
private function createPager(): OffsetPager
{
$responses = new ArrayIterator([
new Response(new Data(['item1', 'item2'])),
new Response(new Data(['item3'])),
new Response(new Data([])),
]);
return new OffsetPager(
new Request(new Pagination(1)),
function (Request $request) use ($responses) {
$response = $responses->current();
$responses->next();
return $response;
},
fn (Request $request) => $request->pagination?->page ?? 0,
function (Request $request, int $offset) {
if ($request->pagination === null) {
$request->pagination = new Pagination(0);
}
$request->pagination->page = $offset;
},
null,
fn (Response $response) => $response->data->items,
null
);
}
/**
* @param Pager<string> $pager
* @return void
*/
private function assertPager(Pager $pager): void
{
$pages = iterator_to_array($pager->getPages());
$pageCounter = count($pages);
$itemCounter = array_reduce($pages, fn ($carry, $page) => $carry + count($page->getItems()), 0);
$this->assertEquals(3, $pageCounter);
$this->assertEquals(3, $itemCounter);
}
}