]> BookStack Code Mirror - bookstack/blob - tests/References/ReferencesTest.php
20829b6b4ac695d4c39c5c458834a033b20cd199
[bookstack] / tests / References / ReferencesTest.php
1 <?php
2
3 namespace Tests\References;
4
5 use BookStack\Entities\Models\Page;
6 use BookStack\Entities\Repos\PageRepo;
7 use BookStack\Entities\Tools\TrashCan;
8 use BookStack\Model;
9 use BookStack\References\Reference;
10 use Tests\TestCase;
11
12 class ReferencesTest extends TestCase
13 {
14
15     public function test_references_created_on_page_update()
16     {
17         /** @var Page $pageA */
18         /** @var Page $pageB */
19         $pageA = Page::query()->first();
20         $pageB = Page::query()->where('id', '!=', $pageA->id)->first();
21
22         $this->assertDatabaseMissing('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]);
23
24         $this->asEditor()->put($pageA->getUrl(), [
25             'name' => 'Reference test',
26             'html' => '<a href="' . $pageB->getUrl() . '">Testing</a>'
27         ]);
28
29         $this->assertDatabaseHas('references', [
30             'from_id' => $pageA->id,
31             'from_type' => $pageA->getMorphClass(),
32             'to_id' => $pageB->id,
33             'to_type' => $pageB->getMorphClass(),
34         ]);
35     }
36
37     public function test_references_deleted_on_entity_delete()
38     {
39         /** @var Page $pageA */
40         /** @var Page $pageB */
41         $pageA = Page::query()->first();
42         $pageB = Page::query()->where('id', '!=', $pageA->id)->first();
43
44         $this->createReference($pageA, $pageB);
45         $this->createReference($pageB, $pageA);
46
47         $this->assertDatabaseHas('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]);
48         $this->assertDatabaseHas('references', ['to_id' => $pageA->id, 'to_type' => $pageA->getMorphClass()]);
49
50         app(PageRepo::class)->destroy($pageA);
51         app(TrashCan::class)->empty();
52
53         $this->assertDatabaseMissing('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]);
54         $this->assertDatabaseMissing('references', ['to_id' => $pageA->id, 'to_type' => $pageA->getMorphClass()]);
55     }
56
57     public function test_references_to_visible_on_references_page()
58     {
59         $entities = $this->getEachEntityType();
60         $this->asEditor();
61         foreach ($entities as $entity) {
62             $this->createReference($entities['page'], $entity);
63         }
64
65         foreach ($entities as $entity) {
66             $resp = $this->get($entity->getUrl('/references'));
67             $resp->assertSee('References');
68             $resp->assertSee($entities['page']->name);
69             $resp->assertDontSee('There are no tracked references');
70         }
71     }
72
73     public function test_reference_not_visible_if_view_permission_does_not_permit()
74     {
75         /** @var Page $page */
76         /** @var Page $pageB */
77         $page = Page::query()->first();
78         $pageB = Page::query()->where('id', '!=', $page->id)->first();
79         $this->createReference($pageB, $page);
80
81         $this->setEntityRestrictions($pageB);
82
83         $this->asEditor()->get($page->getUrl('/references'))->assertDontSee($pageB->name);
84         $this->asAdmin()->get($page->getUrl('/references'))->assertSee($pageB->name);
85     }
86
87     public function test_reference_page_shows_empty_state_with_no_references()
88     {
89         /** @var Page $page */
90         $page = Page::query()->first();
91
92         $this->asEditor()
93             ->get($page->getUrl('/references'))
94             ->assertSee('There are no tracked references');
95     }
96
97     protected function createReference(Model $from, Model $to)
98     {
99         (new Reference())->forceFill([
100             'from_type' => $from->getMorphClass(),
101             'from_id' => $from->id,
102             'to_type' => $to->getMorphClass(),
103             'to_id' => $to->id,
104         ])->save();
105     }
106
107 }