]> BookStack Code Mirror - bookstack/blob - tests/Entity/PageEditorTest.php
Merge branch 'development' of github.com:BookStackApp/BookStack into development
[bookstack] / tests / Entity / PageEditorTest.php
1 <?php
2
3 namespace Tests\Entity;
4
5 use BookStack\Entities\Models\Chapter;
6 use BookStack\Entities\Models\Page;
7 use Tests\TestCase;
8
9 class PageEditorTest extends TestCase
10 {
11     protected Page $page;
12
13     protected function setUp(): void
14     {
15         parent::setUp();
16         $this->page = $this->entities->page();
17     }
18
19     public function test_default_editor_is_wysiwyg_for_new_pages()
20     {
21         $this->assertEquals('wysiwyg', setting('app-editor'));
22         $resp = $this->asAdmin()->get($this->page->book->getUrl('/create-page'));
23         $this->withHtml($this->followRedirects($resp))->assertElementExists('#html-editor');
24     }
25
26     public function test_markdown_setting_shows_markdown_editor_for_new_pages()
27     {
28         $this->setSettings(['app-editor' => 'markdown']);
29
30         $resp = $this->asAdmin()->get($this->page->book->getUrl('/create-page'));
31         $this->withHtml($this->followRedirects($resp))
32             ->assertElementNotExists('#html-editor')
33             ->assertElementExists('#markdown-editor');
34     }
35
36     public function test_markdown_content_given_to_editor()
37     {
38         $mdContent = '# hello. This is a test';
39         $this->page->markdown = $mdContent;
40         $this->page->editor = 'markdown';
41         $this->page->save();
42
43         $resp = $this->asAdmin()->get($this->page->getUrl('/edit'));
44         $this->withHtml($resp)->assertElementContains('[name="markdown"]', $mdContent);
45     }
46
47     public function test_html_content_given_to_editor_if_no_markdown()
48     {
49         $this->page->editor = 'markdown';
50         $this->page->save();
51
52         $resp = $this->asAdmin()->get($this->page->getUrl() . '/edit');
53         $this->withHtml($resp)->assertElementContains('[name="markdown"]', $this->page->html);
54     }
55
56     public function test_empty_markdown_still_saves_without_error()
57     {
58         $this->setSettings(['app-editor' => 'markdown']);
59         $book = $this->entities->book();
60
61         $this->asEditor()->get($book->getUrl('/create-page'));
62         $draft = Page::query()->where('book_id', '=', $book->id)
63             ->where('draft', '=', true)->first();
64
65         $details = [
66             'name'     => 'my page',
67             'markdown' => '',
68         ];
69         $resp = $this->post($book->getUrl("/draft/{$draft->id}"), $details);
70         $resp->assertRedirect();
71
72         $this->assertDatabaseHas('pages', [
73             'markdown' => $details['markdown'],
74             'id'       => $draft->id,
75             'draft'    => false,
76         ]);
77     }
78
79     public function test_back_link_in_editor_has_correct_url()
80     {
81         $book = $this->entities->bookHasChaptersAndPages();
82         $this->asEditor()->get($book->getUrl('/create-page'));
83         /** @var Chapter $chapter */
84         $chapter = $book->chapters()->firstOrFail();
85         /** @var Page $draft */
86         $draft = $book->pages()->where('draft', '=', true)->firstOrFail();
87
88         // Book draft goes back to book
89         $resp = $this->get($book->getUrl("/draft/{$draft->id}"));
90         $this->withHtml($resp)->assertElementContains('a[href="' . $book->getUrl() . '"]', 'Back');
91
92         // Chapter draft goes back to chapter
93         $draft->chapter_id = $chapter->id;
94         $draft->save();
95         $resp = $this->get($book->getUrl("/draft/{$draft->id}"));
96         $this->withHtml($resp)->assertElementContains('a[href="' . $chapter->getUrl() . '"]', 'Back');
97
98         // Saved page goes back to page
99         $this->post($book->getUrl("/draft/{$draft->id}"), ['name' => 'Updated', 'html' => 'Updated']);
100         $draft->refresh();
101         $resp = $this->get($draft->getUrl('/edit'));
102         $this->withHtml($resp)->assertElementContains('a[href="' . $draft->getUrl() . '"]', 'Back');
103     }
104
105     public function test_switching_from_html_to_clean_markdown_works()
106     {
107         $page = $this->entities->page();
108         $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
109         $page->save();
110
111         $resp = $this->asAdmin()->get($page->getUrl('/edit?editor=markdown-clean'));
112         $resp->assertStatus(200);
113         $resp->assertSee("## A Header\n\nSome **bold** content.");
114         $this->withHtml($resp)->assertElementExists('#markdown-editor');
115     }
116
117     public function test_switching_from_html_to_stable_markdown_works()
118     {
119         $page = $this->entities->page();
120         $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
121         $page->save();
122
123         $resp = $this->asAdmin()->get($page->getUrl('/edit?editor=markdown-stable'));
124         $resp->assertStatus(200);
125         $resp->assertSee('<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>', true);
126         $this->withHtml($resp)->assertElementExists('[component="markdown-editor"]');
127     }
128
129     public function test_switching_from_markdown_to_wysiwyg_works()
130     {
131         $page = $this->entities->page();
132         $page->html = '';
133         $page->markdown = "## A Header\n\nSome content with **bold** text!";
134         $page->save();
135
136         $resp = $this->asAdmin()->get($page->getUrl('/edit?editor=wysiwyg'));
137         $resp->assertStatus(200);
138         $this->withHtml($resp)->assertElementExists('[component="wysiwyg-editor"]');
139         $resp->assertSee("<h2>A Header</h2>\n<p>Some content with <strong>bold</strong> text!</p>", true);
140     }
141
142     public function test_page_editor_changes_with_editor_property()
143     {
144         $resp = $this->asAdmin()->get($this->page->getUrl('/edit'));
145         $this->withHtml($resp)->assertElementExists('[component="wysiwyg-editor"]');
146
147         $this->page->markdown = "## A Header\n\nSome content with **bold** text!";
148         $this->page->editor = 'markdown';
149         $this->page->save();
150
151         $resp = $this->asAdmin()->get($this->page->getUrl('/edit'));
152         $this->withHtml($resp)->assertElementExists('[component="markdown-editor"]');
153     }
154
155     public function test_editor_type_switch_options_show()
156     {
157         $resp = $this->asAdmin()->get($this->page->getUrl('/edit'));
158         $editLink = $this->page->getUrl('/edit') . '?editor=';
159         $this->withHtml($resp)->assertElementContains("a[href=\"${editLink}markdown-clean\"]", '(Clean Content)');
160         $this->withHtml($resp)->assertElementContains("a[href=\"${editLink}markdown-stable\"]", '(Stable Content)');
161
162         $resp = $this->asAdmin()->get($this->page->getUrl('/edit?editor=markdown-stable'));
163         $editLink = $this->page->getUrl('/edit') . '?editor=';
164         $this->withHtml($resp)->assertElementContains("a[href=\"${editLink}wysiwyg\"]", 'Switch to WYSIWYG Editor');
165     }
166
167     public function test_editor_type_switch_options_dont_show_if_without_change_editor_permissions()
168     {
169         $resp = $this->asEditor()->get($this->page->getUrl('/edit'));
170         $editLink = $this->page->getUrl('/edit') . '?editor=';
171         $this->withHtml($resp)->assertElementNotExists("a[href*=\"${editLink}\"]");
172     }
173
174     public function test_page_editor_type_switch_does_not_work_without_change_editor_permissions()
175     {
176         $page = $this->entities->page();
177         $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
178         $page->save();
179
180         $resp = $this->asEditor()->get($page->getUrl('/edit?editor=markdown-stable'));
181         $resp->assertStatus(200);
182         $this->withHtml($resp)->assertElementExists('[component="wysiwyg-editor"]');
183         $this->withHtml($resp)->assertElementNotExists('[component="markdown-editor"]');
184     }
185
186     public function test_page_save_does_not_change_active_editor_without_change_editor_permissions()
187     {
188         $page = $this->entities->page();
189         $page->html = '<h2>A Header</h2><p>Some <strong>bold</strong> content.</p>';
190         $page->editor = 'wysiwyg';
191         $page->save();
192
193         $this->asEditor()->put($page->getUrl(), ['name' => $page->name, 'markdown' => '## Updated content abc']);
194         $this->assertEquals('wysiwyg', $page->refresh()->editor);
195     }
196 }