From 5d8de7587d67b5c3e5d1fed8562d9b87ecde80c1 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 10 Oct 2020 17:40:26 +0200 Subject: Feature: bulk creation of bookmarks This changes creates a new form in addlink page allowing to create multiple bookmarks at once more easily. It focuses on re-using as much existing code and template component as possible. These changes includes: - a new form in addlink (hidden behind a button by default), containing a text area for URL, and tags/private status to apply to created links - this form displays a new template called editlink.batch, itself including editlink template multiple times - User interation in this new templates are handle by a new JS script (shaare-batch.js) making AJAX requests, and therefore does not need page reloading - ManageShaareController has been split into 3 distinct controllers: + ShaareAdd: displays addlink template + ShaareManage: various operation applied on existing shaares (change visibility, pin, deletion, etc.) + ShaarePublish: handles creation/edit forms and saving Shaare's form - Updated translations Fixes #137 --- .../ChangeVisibilityBookmarkTest.php | 418 --------------------- 1 file changed, 418 deletions(-) delete mode 100644 tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php (limited to 'tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php') diff --git a/tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php b/tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php deleted file mode 100644 index 096d0774..00000000 --- a/tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php +++ /dev/null @@ -1,418 +0,0 @@ -createContainer(); - - $this->container->httpAccess = $this->createMock(HttpAccess::class); - $this->controller = new ManageShaareController($this->container); - } - - /** - * Change bookmark visibility - Set private - Single public bookmark with valid parameters - */ - public function testSetSingleBookmarkPrivate(): void - { - $parameters = ['id' => '123', 'newVisibility' => 'private']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $bookmark = (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123')->setPrivate(false); - - static::assertFalse($bookmark->isPrivate()); - - $this->container->bookmarkService->expects(static::once())->method('get')->with(123)->willReturn($bookmark); - $this->container->bookmarkService->expects(static::once())->method('set')->with($bookmark, false); - $this->container->bookmarkService->expects(static::once())->method('save'); - $this->container->formatterFactory = $this->createMock(FormatterFactory::class); - $this->container->formatterFactory - ->expects(static::once()) - ->method('getFormatter') - ->with('raw') - ->willReturnCallback(function () use ($bookmark): BookmarkFormatter { - return new BookmarkRawFormatter($this->container->conf, true); - }) - ; - - // Make sure that PluginManager hook is triggered - $this->container->pluginManager - ->expects(static::once()) - ->method('executeHooks') - ->with('save_link') - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertTrue($bookmark->isPrivate()); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - Set public - Single private bookmark with valid parameters - */ - public function testSetSingleBookmarkPublic(): void - { - $parameters = ['id' => '123', 'newVisibility' => 'public']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $bookmark = (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123')->setPrivate(true); - - static::assertTrue($bookmark->isPrivate()); - - $this->container->bookmarkService->expects(static::once())->method('get')->with(123)->willReturn($bookmark); - $this->container->bookmarkService->expects(static::once())->method('set')->with($bookmark, false); - $this->container->bookmarkService->expects(static::once())->method('save'); - $this->container->formatterFactory = $this->createMock(FormatterFactory::class); - $this->container->formatterFactory - ->expects(static::once()) - ->method('getFormatter') - ->with('raw') - ->willReturn(new BookmarkRawFormatter($this->container->conf, true)) - ; - - // Make sure that PluginManager hook is triggered - $this->container->pluginManager - ->expects(static::once()) - ->method('executeHooks') - ->with('save_link') - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertFalse($bookmark->isPrivate()); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - Set private on single already private bookmark - */ - public function testSetSinglePrivateBookmarkPrivate(): void - { - $parameters = ['id' => '123', 'newVisibility' => 'private']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $bookmark = (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123')->setPrivate(true); - - static::assertTrue($bookmark->isPrivate()); - - $this->container->bookmarkService->expects(static::once())->method('get')->with(123)->willReturn($bookmark); - $this->container->bookmarkService->expects(static::once())->method('set')->with($bookmark, false); - $this->container->bookmarkService->expects(static::once())->method('save'); - $this->container->formatterFactory = $this->createMock(FormatterFactory::class); - $this->container->formatterFactory - ->expects(static::once()) - ->method('getFormatter') - ->with('raw') - ->willReturn(new BookmarkRawFormatter($this->container->conf, true)) - ; - - // Make sure that PluginManager hook is triggered - $this->container->pluginManager - ->expects(static::once()) - ->method('executeHooks') - ->with('save_link') - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertTrue($bookmark->isPrivate()); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - Set multiple bookmarks private - */ - public function testSetMultipleBookmarksPrivate(): void - { - $parameters = ['id' => '123 456 789', 'newVisibility' => 'private']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $bookmarks = [ - (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123')->setPrivate(false), - (new Bookmark())->setId(456)->setUrl('http://domain.tld')->setTitle('Title 456')->setPrivate(true), - (new Bookmark())->setId(789)->setUrl('http://domain.tld')->setTitle('Title 789')->setPrivate(false), - ]; - - $this->container->bookmarkService - ->expects(static::exactly(3)) - ->method('get') - ->withConsecutive([123], [456], [789]) - ->willReturnOnConsecutiveCalls(...$bookmarks) - ; - $this->container->bookmarkService - ->expects(static::exactly(3)) - ->method('set') - ->withConsecutive(...array_map(function (Bookmark $bookmark): array { - return [$bookmark, false]; - }, $bookmarks)) - ; - $this->container->bookmarkService->expects(static::once())->method('save'); - $this->container->formatterFactory = $this->createMock(FormatterFactory::class); - $this->container->formatterFactory - ->expects(static::once()) - ->method('getFormatter') - ->with('raw') - ->willReturn(new BookmarkRawFormatter($this->container->conf, true)) - ; - - // Make sure that PluginManager hook is triggered - $this->container->pluginManager - ->expects(static::exactly(3)) - ->method('executeHooks') - ->with('save_link') - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertTrue($bookmarks[0]->isPrivate()); - static::assertTrue($bookmarks[1]->isPrivate()); - static::assertTrue($bookmarks[2]->isPrivate()); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - Single bookmark not found. - */ - public function testChangeVisibilitySingleBookmarkNotFound(): void - { - $parameters = ['id' => '123', 'newVisibility' => 'private']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $this->container->bookmarkService - ->expects(static::once()) - ->method('get') - ->willThrowException(new BookmarkNotFoundException()) - ; - $this->container->bookmarkService->expects(static::never())->method('set'); - $this->container->bookmarkService->expects(static::never())->method('save'); - $this->container->formatterFactory = $this->createMock(FormatterFactory::class); - $this->container->formatterFactory - ->expects(static::once()) - ->method('getFormatter') - ->with('raw') - ->willReturn(new BookmarkRawFormatter($this->container->conf, true)) - ; - - // Make sure that PluginManager hook is not triggered - $this->container->pluginManager - ->expects(static::never()) - ->method('executeHooks') - ->with('save_link') - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - Multiple bookmarks with one not found. - */ - public function testChangeVisibilityMultipleBookmarksOneNotFound(): void - { - $parameters = ['id' => '123 456 789', 'newVisibility' => 'public']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $bookmarks = [ - (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123')->setPrivate(true), - (new Bookmark())->setId(789)->setUrl('http://domain.tld')->setTitle('Title 789')->setPrivate(false), - ]; - - $this->container->bookmarkService - ->expects(static::exactly(3)) - ->method('get') - ->withConsecutive([123], [456], [789]) - ->willReturnCallback(function (int $id) use ($bookmarks): Bookmark { - if ($id === 123) { - return $bookmarks[0]; - } - if ($id === 789) { - return $bookmarks[1]; - } - throw new BookmarkNotFoundException(); - }) - ; - $this->container->bookmarkService - ->expects(static::exactly(2)) - ->method('set') - ->withConsecutive(...array_map(function (Bookmark $bookmark): array { - return [$bookmark, false]; - }, $bookmarks)) - ; - $this->container->bookmarkService->expects(static::once())->method('save'); - - // Make sure that PluginManager hook is not triggered - $this->container->pluginManager - ->expects(static::exactly(2)) - ->method('executeHooks') - ->with('save_link') - ; - - $this->container->sessionManager - ->expects(static::once()) - ->method('setSessionParameter') - ->with(SessionManager::KEY_ERROR_MESSAGES, ['Bookmark with identifier 456 could not be found.']) - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - Invalid ID - */ - public function testChangeVisibilityInvalidId(): void - { - $parameters = ['id' => 'nope not an ID', 'newVisibility' => 'private']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $this->container->sessionManager - ->expects(static::once()) - ->method('setSessionParameter') - ->with(SessionManager::KEY_ERROR_MESSAGES, ['Invalid bookmark ID provided.']) - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - Empty ID - */ - public function testChangeVisibilityEmptyId(): void - { - $request = $this->createMock(Request::class); - $response = new Response(); - - $this->container->sessionManager - ->expects(static::once()) - ->method('setSessionParameter') - ->with(SessionManager::KEY_ERROR_MESSAGES, ['Invalid bookmark ID provided.']) - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } - - /** - * Change bookmark visibility - with invalid visibility - */ - public function testChangeVisibilityWithInvalidVisibility(): void - { - $parameters = ['id' => '123', 'newVisibility' => 'invalid']; - - $request = $this->createMock(Request::class); - $request - ->method('getParam') - ->willReturnCallback(function (string $key) use ($parameters): ?string { - return $parameters[$key] ?? null; - }) - ; - $response = new Response(); - - $this->container->sessionManager - ->expects(static::once()) - ->method('setSessionParameter') - ->with(SessionManager::KEY_ERROR_MESSAGES, ['Invalid visibility provided.']) - ; - - $result = $this->controller->changeVisibility($request, $response); - - static::assertSame(302, $result->getStatusCode()); - static::assertSame(['/subfolder/'], $result->getHeader('location')); - } -} -- cgit v1.2.3