2022-08-16 06:27:22 -04:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Tests;
|
2021-05-15 20:07:20 -04:00
|
|
|
|
|
|
|
use BookStack\Actions\Favourite;
|
2022-08-10 03:06:48 -04:00
|
|
|
use BookStack\Auth\User;
|
2021-05-15 20:07:20 -04:00
|
|
|
|
|
|
|
class FavouriteTest extends TestCase
|
|
|
|
{
|
|
|
|
public function test_page_add_favourite_flow()
|
|
|
|
{
|
2022-09-29 12:31:38 -04:00
|
|
|
$page = $this->entities->page();
|
2021-05-15 20:07:20 -04:00
|
|
|
$editor = $this->getEditor();
|
|
|
|
|
|
|
|
$resp = $this->actingAs($editor)->get($page->getUrl());
|
2022-07-23 10:10:18 -04:00
|
|
|
$this->withHtml($resp)->assertElementContains('button', 'Favourite');
|
|
|
|
$this->withHtml($resp)->assertElementExists('form[method="POST"][action$="/favourites/add"]');
|
2021-05-15 20:07:20 -04:00
|
|
|
|
|
|
|
$resp = $this->post('/favourites/add', [
|
|
|
|
'type' => get_class($page),
|
2021-06-26 11:23:15 -04:00
|
|
|
'id' => $page->id,
|
2021-05-15 20:07:20 -04:00
|
|
|
]);
|
|
|
|
$resp->assertRedirect($page->getUrl());
|
|
|
|
$resp->assertSessionHas('success', "\"{$page->name}\" has been added to your favourites");
|
|
|
|
|
|
|
|
$this->assertDatabaseHas('favourites', [
|
2021-06-26 11:23:15 -04:00
|
|
|
'user_id' => $editor->id,
|
2021-05-15 20:07:20 -04:00
|
|
|
'favouritable_type' => $page->getMorphClass(),
|
2021-06-26 11:23:15 -04:00
|
|
|
'favouritable_id' => $page->id,
|
2021-05-15 20:07:20 -04:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function test_page_remove_favourite_flow()
|
|
|
|
{
|
2022-09-29 12:31:38 -04:00
|
|
|
$page = $this->entities->page();
|
2021-05-15 20:07:20 -04:00
|
|
|
$editor = $this->getEditor();
|
|
|
|
Favourite::query()->forceCreate([
|
2021-06-26 11:23:15 -04:00
|
|
|
'user_id' => $editor->id,
|
|
|
|
'favouritable_id' => $page->id,
|
2021-05-15 20:07:20 -04:00
|
|
|
'favouritable_type' => $page->getMorphClass(),
|
|
|
|
]);
|
|
|
|
|
|
|
|
$resp = $this->actingAs($editor)->get($page->getUrl());
|
2022-07-23 10:10:18 -04:00
|
|
|
$this->withHtml($resp)->assertElementContains('button', 'Unfavourite');
|
|
|
|
$this->withHtml($resp)->assertElementExists('form[method="POST"][action$="/favourites/remove"]');
|
2021-05-15 20:07:20 -04:00
|
|
|
|
|
|
|
$resp = $this->post('/favourites/remove', [
|
|
|
|
'type' => get_class($page),
|
2021-06-26 11:23:15 -04:00
|
|
|
'id' => $page->id,
|
2021-05-15 20:07:20 -04:00
|
|
|
]);
|
|
|
|
$resp->assertRedirect($page->getUrl());
|
|
|
|
$resp->assertSessionHas('success', "\"{$page->name}\" has been removed from your favourites");
|
|
|
|
|
|
|
|
$this->assertDatabaseMissing('favourites', [
|
|
|
|
'user_id' => $editor->id,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2022-08-10 03:06:48 -04:00
|
|
|
public function test_favourite_flow_with_own_permissions()
|
|
|
|
{
|
2022-09-29 12:31:38 -04:00
|
|
|
$book = $this->entities->book();
|
2022-08-10 03:06:48 -04:00
|
|
|
$user = User::factory()->create();
|
|
|
|
$book->owned_by = $user->id;
|
|
|
|
$book->save();
|
|
|
|
|
|
|
|
$this->giveUserPermissions($user, ['book-view-own']);
|
|
|
|
|
|
|
|
$this->actingAs($user)->get($book->getUrl());
|
|
|
|
$resp = $this->post('/favourites/add', [
|
|
|
|
'type' => get_class($book),
|
|
|
|
'id' => $book->id,
|
|
|
|
]);
|
|
|
|
$resp->assertRedirect($book->getUrl());
|
|
|
|
|
|
|
|
$this->assertDatabaseHas('favourites', [
|
|
|
|
'user_id' => $user->id,
|
|
|
|
'favouritable_type' => $book->getMorphClass(),
|
|
|
|
'favouritable_id' => $book->id,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2022-09-29 17:11:16 -04:00
|
|
|
public function test_each_entity_type_shows_favourite_button()
|
2021-05-23 09:34:36 -04:00
|
|
|
{
|
|
|
|
$this->actingAs($this->getEditor());
|
|
|
|
|
2022-09-29 17:11:16 -04:00
|
|
|
foreach ($this->entities->all() as $entity) {
|
2021-05-23 09:34:36 -04:00
|
|
|
$resp = $this->get($entity->getUrl());
|
2022-07-23 10:10:18 -04:00
|
|
|
$this->withHtml($resp)->assertElementExists('form[method="POST"][action$="/favourites/add"]');
|
2021-05-23 09:34:36 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function test_header_contains_link_to_favourites_page_when_logged_in()
|
|
|
|
{
|
|
|
|
$this->setSettings(['app-public' => 'true']);
|
2022-07-23 10:11:06 -04:00
|
|
|
$resp = $this->get('/');
|
2022-07-23 10:10:18 -04:00
|
|
|
$this->withHtml($resp)->assertElementNotContains('header', 'My Favourites');
|
|
|
|
$resp = $this->actingAs($this->getViewer())->get('/');
|
|
|
|
$this->withHtml($resp)->assertElementContains('header a', 'My Favourites');
|
2021-05-23 09:34:36 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public function test_favourites_shown_on_homepage()
|
|
|
|
{
|
|
|
|
$editor = $this->getEditor();
|
|
|
|
|
|
|
|
$resp = $this->actingAs($editor)->get('/');
|
2022-07-23 10:10:18 -04:00
|
|
|
$this->withHtml($resp)->assertElementNotExists('#top-favourites');
|
2021-05-23 09:34:36 -04:00
|
|
|
|
2022-09-29 12:31:38 -04:00
|
|
|
$page = $this->entities->page();
|
2021-06-26 11:23:15 -04:00
|
|
|
$page->favourites()->save((new Favourite())->forceFill(['user_id' => $editor->id]));
|
2021-05-23 09:34:36 -04:00
|
|
|
|
|
|
|
$resp = $this->get('/');
|
2022-07-23 10:10:18 -04:00
|
|
|
$this->withHtml($resp)->assertElementExists('#top-favourites');
|
|
|
|
$this->withHtml($resp)->assertElementContains('#top-favourites', $page->name);
|
2021-05-23 09:34:36 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public function test_favourites_list_page_shows_favourites_and_has_working_pagination()
|
|
|
|
{
|
2022-09-29 12:31:38 -04:00
|
|
|
$page = $this->entities->page();
|
2021-05-23 09:34:36 -04:00
|
|
|
$editor = $this->getEditor();
|
|
|
|
|
|
|
|
$resp = $this->actingAs($editor)->get('/favourites');
|
|
|
|
$resp->assertDontSee($page->name);
|
|
|
|
|
2021-06-26 11:23:15 -04:00
|
|
|
$page->favourites()->save((new Favourite())->forceFill(['user_id' => $editor->id]));
|
2021-05-23 09:34:36 -04:00
|
|
|
|
|
|
|
$resp = $this->get('/favourites');
|
|
|
|
$resp->assertSee($page->name);
|
|
|
|
|
|
|
|
$resp = $this->get('/favourites?page=2');
|
|
|
|
$resp->assertDontSee($page->name);
|
|
|
|
}
|
2021-06-26 11:23:15 -04:00
|
|
|
}
|