Passed
Push — master ( a80842...bbbee0 )
by Caen
03:37 queued 13s
created

RelatedPublicationsComponentTest::testTheRenderMethod()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 46
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 34
nc 1
nop 0
dl 0
loc 46
rs 9.376
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Hyde\Publications\Testing\Feature;
6
7
use Carbon\Carbon;
8
use Hyde\Hyde;
9
use Hyde\Publications\Models\PublicationType;
10
use Hyde\Publications\Pages\PublicationPage;
11
use Hyde\Publications\Views\Components\RelatedPublicationsComponent;
12
use Hyde\Support\Models\Route;
13
use Hyde\Testing\TestCase;
14
use Illuminate\Support\Collection;
15
use Illuminate\Support\Facades\View;
16
use Illuminate\View\ComponentAttributeBag;
17
18
/**
19
 * @covers \Hyde\Publications\Views\Components\RelatedPublicationsComponent
20
 */
21
class RelatedPublicationsComponentTest extends TestCase
22
{
23
    public function testWithStandardPage()
24
    {
25
        $this->mockRoute();
26
27
        $component = new RelatedPublicationsComponent();
28
        $this->assertEquals(new Collection(), $component->relatedPublications);
29
    }
30
31
    public function testWithBlankPublicationType()
32
    {
33
        $type = new PublicationType('foo');
34
        $page = new PublicationPage('foo', type: $type);
35
        $this->mockRoute(new Route($page));
36
37
        $component = new RelatedPublicationsComponent();
38
        $this->assertEquals(new Collection(), $component->relatedPublications);
39
    }
40
41
    public function testWithEmptyTags()
42
    {
43
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
44
        $page = new PublicationPage('foo', type: $type);
45
        $this->mockRoute(new Route($page));
46
47
        $component = new RelatedPublicationsComponent();
48
        $this->assertEquals(new Collection(), $component->relatedPublications);
49
    }
50
51
    public function testWithPublicationWithTag()
52
    {
53
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
54
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
55
        $this->mockRoute(new Route($page));
56
57
        $component = new RelatedPublicationsComponent();
58
        $this->assertEquals(new Collection(), $component->relatedPublications);
59
    }
60
61
    public function testWithMoreTaggedPublications()
62
    {
63
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
64
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
65
        $this->mockRoute(new Route($page));
66
67
        $otherPage = new PublicationPage('bar', ['foo' => 'bar'], type: $type);
68
        Hyde::pages()->addPage($page);
69
        Hyde::pages()->addPage($otherPage);
70
71
        $component = new RelatedPublicationsComponent();
72
        $this->assertEquals(new Collection(['foo/bar' => $otherPage]), $component->relatedPublications);
73
    }
74
75
    public function testWithPublicationsWithOtherTagValue()
76
    {
77
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
78
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
79
        $this->mockRoute(new Route($page));
80
81
        $otherPage = new PublicationPage('bar', ['foo' => 'baz'], type: $type);
82
        Hyde::pages()->addPage($page);
83
        Hyde::pages()->addPage($otherPage);
84
85
        $component = new RelatedPublicationsComponent();
86
        $this->assertEquals(new Collection(), $component->relatedPublications);
87
    }
88
89
    public function testWithPublicationsWithCurrentOneBeingUntagged()
90
    {
91
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
92
        $page = new PublicationPage('foo', type: $type);
93
        $this->mockRoute(new Route($page));
94
95
        $otherPage = new PublicationPage('bar', ['foo' => 'bar'], type: $type);
96
        Hyde::pages()->addPage($page);
97
        Hyde::pages()->addPage($otherPage);
98
99
        $component = new RelatedPublicationsComponent();
100
        $this->assertEquals(new Collection(), $component->relatedPublications);
101
    }
102
103
    public function testWithMultipleRelatedPages()
104
    {
105
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
106
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
107
        $this->mockRoute(new Route($page));
108
109
        $page1 = new PublicationPage('page-1', ['foo' => 'bar'], type: $type);
110
        $page2 = new PublicationPage('page-2', ['foo' => 'bar'], type: $type);
111
        $page3 = new PublicationPage('page-3', ['foo' => 'bar'], type: $type);
112
        $page4 = new PublicationPage('page-4', ['foo' => 'bar'], type: $type);
113
        $page5 = new PublicationPage('page-5', ['foo' => 'bar'], type: $type);
114
        Hyde::pages()->addPage($page);
115
        Hyde::pages()->addPage($page1);
116
        Hyde::pages()->addPage($page2);
117
        Hyde::pages()->addPage($page3);
118
        Hyde::pages()->addPage($page4);
119
        Hyde::pages()->addPage($page5);
120
121
        $component = new RelatedPublicationsComponent();
122
        $this->assertEquals(new Collection([
123
            'foo/page-1' => $page1,
124
            'foo/page-2' => $page2,
125
            'foo/page-3' => $page3,
126
            'foo/page-4' => $page4,
127
            'foo/page-5' => $page5,
128
        ]), $component->relatedPublications);
129
    }
130
131
    public function testWithMultipleRelatedPagesAndLimit()
132
    {
133
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
134
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
135
        $this->mockRoute(new Route($page));
136
137
        $page1 = new PublicationPage('page-1', ['foo' => 'bar'], type: $type);
138
        $page2 = new PublicationPage('page-2', ['foo' => 'bar'], type: $type);
139
        $page3 = new PublicationPage('page-3', ['foo' => 'bar'], type: $type);
140
        $page4 = new PublicationPage('page-4', ['foo' => 'bar'], type: $type);
141
        $page5 = new PublicationPage('page-5', ['foo' => 'bar'], type: $type);
142
        Hyde::pages()->addPage($page);
143
        Hyde::pages()->addPage($page1);
144
        Hyde::pages()->addPage($page2);
145
        Hyde::pages()->addPage($page3);
146
        Hyde::pages()->addPage($page4);
147
        Hyde::pages()->addPage($page5);
148
149
        $component = new RelatedPublicationsComponent(limit: 3);
150
        $this->assertEquals(new Collection([
151
            'foo/page-1' => $page1,
152
            'foo/page-2' => $page2,
153
            'foo/page-3' => $page3,
154
        ]), $component->relatedPublications);
155
    }
156
157
    public function testOnlyPublicationsWithTheSameTagAreIncluded()
158
    {
159
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
160
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
161
        $this->mockRoute(new Route($page));
162
163
        $page1 = new PublicationPage('page-1', ['foo' => 'foo'], type: $type);
164
        $page2 = new PublicationPage('page-2', ['foo' => 'bar'], type: $type);
165
        $page3 = new PublicationPage('page-3', ['foo' => 'baz'], type: $type);
166
        $page4 = new PublicationPage('page-4', ['foo' => 'hat'], type: $type);
167
        $page5 = new PublicationPage('page-5', ['foo' => 'cat'], type: $type);
168
169
        Hyde::pages()->addPage($page);
170
        Hyde::pages()->addPage($page1);
171
        Hyde::pages()->addPage($page2);
172
        Hyde::pages()->addPage($page3);
173
        Hyde::pages()->addPage($page4);
174
        Hyde::pages()->addPage($page5);
175
176
        $component = new RelatedPublicationsComponent();
177
        $this->assertEquals(new Collection([
178
            'foo/page-2' => $page2,
179
        ]), $component->relatedPublications);
180
    }
181
182
    public function testResultsAreSortedByDateWithLatestFirst()
183
    {
184
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
185
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
186
        $this->mockRoute(new Route($page));
187
188
        $page1 = new PublicationPage('page-1', ['foo' => 'bar', '__createdAt' => Carbon::now()->addDays(1)], type: $type);
189
        $page2 = new PublicationPage('page-2', ['foo' => 'bar', '__createdAt' => Carbon::now()->addDays(2)], type: $type);
190
        $page3 = new PublicationPage('page-3', ['foo' => 'bar', '__createdAt' => Carbon::now()->addDays(3)], type: $type);
191
        $page4 = new PublicationPage('page-4', ['foo' => 'bar', '__createdAt' => Carbon::now()->addDays(4)], type: $type);
192
        $page5 = new PublicationPage('page-5', ['foo' => 'bar', '__createdAt' => Carbon::now()->addDays(5)], type: $type);
193
        Hyde::pages()->addPage($page);
194
        Hyde::pages()->addPage($page1);
195
        Hyde::pages()->addPage($page2);
196
        Hyde::pages()->addPage($page3);
197
        Hyde::pages()->addPage($page4);
198
        Hyde::pages()->addPage($page5);
199
200
        $component = new RelatedPublicationsComponent();
201
        $this->assertSame([
202
            'foo/page-1',
203
            'foo/page-2',
204
            'foo/page-3',
205
            'foo/page-4',
206
            'foo/page-5',
207
        ], $component->relatedPublications->keys()->all());
208
    }
209
210
    public function testTheRenderMethod()
211
    {
212
        $type = new PublicationType('foo', fields: [['name' => 'foo', 'type' => 'tag']]);
213
        $page = new PublicationPage('foo', ['foo' => 'bar'], type: $type);
214
        $this->mockRoute(new Route($page));
215
216
        $time = time();
217
        $page1 = new PublicationPage('page-1', ['foo' => 'bar', '__createdAt' => $time], type: $type);
218
        $page2 = new PublicationPage('page-2', ['foo' => 'bar', '__createdAt' => $time], type: $type);
219
        $page3 = new PublicationPage('page-3', ['foo' => 'bar', '__createdAt' => $time], type: $type);
220
        $page4 = new PublicationPage('page-4', ['foo' => 'bar', '__createdAt' => $time], type: $type);
221
        $page5 = new PublicationPage('page-5', ['foo' => 'bar', '__createdAt' => $time], type: $type);
222
        Hyde::pages()->addPage($page);
223
        Hyde::pages()->addPage($page1);
224
        Hyde::pages()->addPage($page2);
225
        Hyde::pages()->addPage($page3);
226
        Hyde::pages()->addPage($page4);
227
        Hyde::pages()->addPage($page5);
228
229
        $component = new RelatedPublicationsComponent(limit: 3);
230
        View::share('relatedPublications', $component->relatedPublications);
231
        View::share('title', $component->title);
232
        View::share('attributes', new ComponentAttributeBag());
233
        $dateFull = Carbon::parse($time);
234
        $dateShort = date('Y-m-d', $time);
235
        $this->assertEqualsIgnoringIndentation(<<<HTML
236
            <section class="prose dark:prose-invert">
237
                <h2>Related Publications</h2>
238
                <nav aria-label="related">
239
                    <ul>
240
                        <li>
241
                            <a href="{$page1->getRoute()}">Page 1</a>
242
                            <time datetime="$dateFull">($dateShort)</time>
243
                        </li>
244
                        <li>
245
                            <a href="{$page2->getRoute()}">Page 2</a>
246
                            <time datetime="$dateFull">($dateShort)</time>
247
                        </li>
248
                        <li>
249
                            <a href="{$page3->getRoute()}">Page 3</a>
250
                            <time datetime="$dateFull">($dateShort)</time>
251
                        </li>
252
                    </ul>
253
                </nav>
254
            </section>
255
        HTML, $component->render()->render());
256
    }
257
258
    protected function assertEqualsIgnoringIndentation(string $param, string $render)
259
    {
260
        $this->assertEquals(
261
            preg_replace('/\s+/', '', $param),
262
            preg_replace('/\s+/', '', $render)
263
        );
264
    }
265
}
266