aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorArthurHoaro <arthur@hoa.ro>2021-01-19 12:44:48 +0100
committerArthurHoaro <arthur@hoa.ro>2021-01-19 12:54:34 +0100
commit93175b6e9d5cfa4d4319bd58b9de01824d596288 (patch)
treea09a4d05273d5d615508cc469b8155f6fcebd4b7
parentffa39719a17982e6a6cac9bc3f758aa12fa69973 (diff)
downloadShaarli-93175b6e9d5cfa4d4319bd58b9de01824d596288.tar.gz
Shaarli-93175b6e9d5cfa4d4319bd58b9de01824d596288.tar.zst
Shaarli-93175b6e9d5cfa4d4319bd58b9de01824d596288.zip
Fix: bulk add - delete existing link
Do not send redirect response in bookmark delete controller if the request comes from bulk creation page. Fixes #1683
-rw-r--r--application/front/controller/admin/ShaareManageController.php4
-rw-r--r--assets/common/js/shaare-batch.js4
-rw-r--r--tests/front/controller/admin/ShaareManageControllerTest/DeleteBookmarkTest.php45
3 files changed, 50 insertions, 3 deletions
diff --git a/application/front/controller/admin/ShaareManageController.php b/application/front/controller/admin/ShaareManageController.php
index 35837baa..9633cd51 100644
--- a/application/front/controller/admin/ShaareManageController.php
+++ b/application/front/controller/admin/ShaareManageController.php
@@ -66,6 +66,10 @@ class ShaareManageController extends ShaarliAdminController
66 return $response->write('<script>self.close();</script>'); 66 return $response->write('<script>self.close();</script>');
67 } 67 }
68 68
69 if ($request->getParam('source') === 'batch') {
70 return $response->withStatus(204);
71 }
72
69 // Don't redirect to permalink after deletion. 73 // Don't redirect to permalink after deletion.
70 return $this->redirectFromReferer($request, $response, ['shaare/']); 74 return $this->redirectFromReferer($request, $response, ['shaare/']);
71 } 75 }
diff --git a/assets/common/js/shaare-batch.js b/assets/common/js/shaare-batch.js
index 557325ee..2b438045 100644
--- a/assets/common/js/shaare-batch.js
+++ b/assets/common/js/shaare-batch.js
@@ -26,9 +26,9 @@ const sendBookmarkForm = (basePath, formElement) => {
26const sendBookmarkDelete = (buttonElement, formElement) => ( 26const sendBookmarkDelete = (buttonElement, formElement) => (
27 new Promise((resolve, reject) => { 27 new Promise((resolve, reject) => {
28 const xhr = new XMLHttpRequest(); 28 const xhr = new XMLHttpRequest();
29 xhr.open('GET', buttonElement.href); 29 xhr.open('GET', `${buttonElement.href}&source=batch`);
30 xhr.onload = () => { 30 xhr.onload = () => {
31 if (xhr.status !== 200) { 31 if (xhr.status !== 204) {
32 alert(`An error occurred. Return code: ${xhr.status}`); 32 alert(`An error occurred. Return code: ${xhr.status}`);
33 reject(); 33 reject();
34 } else { 34 } else {
diff --git a/tests/front/controller/admin/ShaareManageControllerTest/DeleteBookmarkTest.php b/tests/front/controller/admin/ShaareManageControllerTest/DeleteBookmarkTest.php
index a276d988..42d0c0d6 100644
--- a/tests/front/controller/admin/ShaareManageControllerTest/DeleteBookmarkTest.php
+++ b/tests/front/controller/admin/ShaareManageControllerTest/DeleteBookmarkTest.php
@@ -363,6 +363,7 @@ class DeleteBookmarkTest extends TestCase
363 $this->container->bookmarkService->method('get')->with('123')->willReturn( 363 $this->container->bookmarkService->method('get')->with('123')->willReturn(
364 (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123') 364 (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123')
365 ); 365 );
366 $this->container->bookmarkService->expects(static::once())->method('remove');
366 367
367 $this->container->formatterFactory = $this->createMock(FormatterFactory::class); 368 $this->container->formatterFactory = $this->createMock(FormatterFactory::class);
368 $this->container->formatterFactory 369 $this->container->formatterFactory
@@ -379,6 +380,48 @@ class DeleteBookmarkTest extends TestCase
379 $result = $this->controller->deleteBookmark($request, $response); 380 $result = $this->controller->deleteBookmark($request, $response);
380 381
381 static::assertSame(200, $result->getStatusCode()); 382 static::assertSame(200, $result->getStatusCode());
382 static::assertSame('<script>self.close();</script>', (string) $result->getBody('location')); 383 static::assertSame('<script>self.close();</script>', (string) $result->getBody());
384 }
385
386 /**
387 * Delete bookmark - from batch view
388 */
389 public function testDeleteBookmarkFromBatch(): void
390 {
391 $parameters = [
392 'id' => '123',
393 'source' => 'batch',
394 ];
395
396 $request = $this->createMock(Request::class);
397 $request
398 ->method('getParam')
399 ->willReturnCallback(function (string $key) use ($parameters): ?string {
400 return $parameters[$key] ?? null;
401 })
402 ;
403 $response = new Response();
404
405 $this->container->bookmarkService->method('get')->with('123')->willReturn(
406 (new Bookmark())->setId(123)->setUrl('http://domain.tld')->setTitle('Title 123')
407 );
408 $this->container->bookmarkService->expects(static::once())->method('remove');
409
410 $this->container->formatterFactory = $this->createMock(FormatterFactory::class);
411 $this->container->formatterFactory
412 ->expects(static::once())
413 ->method('getFormatter')
414 ->willReturnCallback(function (): BookmarkFormatter {
415 $formatter = $this->createMock(BookmarkFormatter::class);
416 $formatter->method('format')->willReturn(['formatted']);
417
418 return $formatter;
419 })
420 ;
421
422 $result = $this->controller->deleteBookmark($request, $response);
423
424 static::assertSame(204, $result->getStatusCode());
425 static::assertEmpty((string) $result->getBody());
383 } 426 }
384} 427}