From e709caa0050d74e8cb4940760f5e5e21c49000a5 Mon Sep 17 00:00:00 2001
From: Dan Brown <ssddanbrown@googlemail.com>
Date: Thu, 17 Aug 2023 18:10:34 +0100
Subject: [PATCH] Notifications: Switched testing from string to reference
 levels

---
 app/Activity/Controllers/WatchController.php  |  2 +-
 app/Activity/Tools/UserEntityWatchOptions.php | 11 +++++---
 tests/Activity/WatchTest.php                  | 26 +++++++++----------
 tests/User/UserPreferencesTest.php            |  5 ++--
 4 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/app/Activity/Controllers/WatchController.php b/app/Activity/Controllers/WatchController.php
index 43908812b..3d7e18116 100644
--- a/app/Activity/Controllers/WatchController.php
+++ b/app/Activity/Controllers/WatchController.php
@@ -23,7 +23,7 @@ class WatchController extends Controller
 
         $watchable = $this->getValidatedModelFromRequest($request);
         $watchOptions = new UserEntityWatchOptions(user(), $watchable);
-        $watchOptions->updateWatchLevel($requestData['level']);
+        $watchOptions->updateLevelByName($requestData['level']);
 
         $this->showSuccessNotification(trans('activities.watch_update_level_notification'));
 
diff --git a/app/Activity/Tools/UserEntityWatchOptions.php b/app/Activity/Tools/UserEntityWatchOptions.php
index 08fbe2e8d..231204fdf 100644
--- a/app/Activity/Tools/UserEntityWatchOptions.php
+++ b/app/Activity/Tools/UserEntityWatchOptions.php
@@ -51,15 +51,20 @@ class UserEntityWatchOptions
         return null;
     }
 
-    public function updateWatchLevel(string $level): void
+    public function updateLevelByName(string $level): void
     {
         $levelValue = WatchLevels::levelNameToValue($level);
-        if ($levelValue < 0) {
+        $this->updateLevelByValue($levelValue);
+    }
+
+    public function updateLevelByValue(int $level): void
+    {
+        if ($level < 0) {
             $this->remove();
             return;
         }
 
-        $this->updateLevel($levelValue);
+        $this->updateLevel($level);
     }
 
     public function getWatchMap(): array
diff --git a/tests/Activity/WatchTest.php b/tests/Activity/WatchTest.php
index 00f3f5e4d..fd86029d3 100644
--- a/tests/Activity/WatchTest.php
+++ b/tests/Activity/WatchTest.php
@@ -26,7 +26,7 @@ class WatchTest extends TestCase
             $this->withHtml($resp)->assertElementContains('form[action$="/watching/update"] button.icon-list-item', 'Watch');
 
             $watchOptions = new UserEntityWatchOptions($editor, $entity);
-            $watchOptions->updateWatchLevel('comments');
+            $watchOptions->updateLevelByValue(WatchLevels::COMMENTS);
 
             $resp = $this->get($entity->getUrl());
             $this->withHtml($resp)->assertElementNotExists('form[action$="/watching/update"] button.icon-list-item');
@@ -112,17 +112,17 @@ class WatchTest extends TestCase
         $chapter = $book->chapters()->first();
         $page = $chapter->pages()->first();
 
-        (new UserEntityWatchOptions($editor, $book))->updateWatchLevel('updates');
+        (new UserEntityWatchOptions($editor, $book))->updateLevelByValue(WatchLevels::UPDATES);
 
         $this->actingAs($editor)->get($book->getUrl())->assertSee('Watching new pages and updates');
         $this->get($chapter->getUrl())->assertSee('Watching via parent book');
         $this->get($page->getUrl())->assertSee('Watching via parent book');
 
-        (new UserEntityWatchOptions($editor, $chapter))->updateWatchLevel('comments');
+        (new UserEntityWatchOptions($editor, $chapter))->updateLevelByValue(WatchLevels::COMMENTS);
         $this->get($chapter->getUrl())->assertSee('Watching new pages, updates & comments');
         $this->get($page->getUrl())->assertSee('Watching via parent chapter');
 
-        (new UserEntityWatchOptions($editor, $page))->updateWatchLevel('updates');
+        (new UserEntityWatchOptions($editor, $page))->updateLevelByValue(WatchLevels::UPDATES);
         $this->get($page->getUrl())->assertSee('Watching new pages and updates');
     }
 
@@ -130,7 +130,7 @@ class WatchTest extends TestCase
     {
         $editor = $this->users->editor();
         $book = $this->entities->bookHasChaptersAndPages();
-        (new UserEntityWatchOptions($editor, $book))->updateWatchLevel('ignore');
+        (new UserEntityWatchOptions($editor, $book))->updateLevelByValue(WatchLevels::IGNORE);
 
         $this->actingAs($editor)->get($book->getUrl())->assertSee('Ignoring notifications');
         $this->get($book->chapters()->first()->getUrl())->assertSee('Ignoring via parent book');
@@ -146,11 +146,11 @@ class WatchTest extends TestCase
         $respHtml = $this->withHtml($this->actingAs($editor)->get($book->getUrl()));
         $respHtml->assertElementNotExists('form[action$="/watching/update"] svg[data-icon="check-circle"]');
 
-        $options->updateWatchLevel('comments');
+        $options->updateLevelByValue(WatchLevels::COMMENTS);
         $respHtml = $this->withHtml($this->actingAs($editor)->get($book->getUrl()));
         $respHtml->assertElementExists('form[action$="/watching/update"] button[value="comments"] svg[data-icon="check-circle"]');
 
-        $options->updateWatchLevel('ignore');
+        $options->updateLevelByValue(WatchLevels::IGNORE);
         $respHtml = $this->withHtml($this->actingAs($editor)->get($book->getUrl()));
         $respHtml->assertElementExists('form[action$="/watching/update"] button[value="ignore"] svg[data-icon="check-circle"]');
     }
@@ -159,7 +159,7 @@ class WatchTest extends TestCase
     {
         $editor = $this->users->editor();
         $book = $this->entities->bookHasChaptersAndPages();
-        (new UserEntityWatchOptions($editor, $book))->updateWatchLevel('ignore');
+        (new UserEntityWatchOptions($editor, $book))->updateLevelByValue(WatchLevels::IGNORE);
 
         $respHtml = $this->withHtml($this->actingAs($editor)->get($book->getUrl()));
         $respHtml->assertElementExists('form[action$="/watching/update"] button[name="level"][value="new"]');
@@ -225,7 +225,7 @@ class WatchTest extends TestCase
         $entities = $this->entities->createChainBelongingToUser($editor);
         $watches = new UserEntityWatchOptions($editor, $entities['book']);
         $prefs = new UserNotificationPreferences($editor);
-        $watches->updateWatchLevel('ignore');
+        $watches->updateLevelByValue(WatchLevels::IGNORE);
         $prefs->updateFromSettingsArray(['own-page-changes' => 'true', 'own-page-comments' => true]);
 
         $notifications = Notification::fake();
@@ -244,7 +244,7 @@ class WatchTest extends TestCase
         $admin = $this->users->admin();
         $entities = $this->entities->createChainBelongingToUser($editor);
         $watches = new UserEntityWatchOptions($editor, $entities['book']);
-        $watches->updateWatchLevel('comments');
+        $watches->updateLevelByValue(WatchLevels::COMMENTS);
 
         // Comment post
         $this->actingAs($admin)->post("/comment/{$entities['page']->id}", [
@@ -269,7 +269,7 @@ class WatchTest extends TestCase
         $admin = $this->users->admin();
         $entities = $this->entities->createChainBelongingToUser($editor);
         $watches = new UserEntityWatchOptions($editor, $entities['book']);
-        $watches->updateWatchLevel('updates');
+        $watches->updateLevelByValue(WatchLevels::UPDATES);
 
         $this->actingAs($admin);
         $this->entities->updatePage($entities['page'], ['name' => 'Updated page', 'html' => 'new page content']);
@@ -297,7 +297,7 @@ class WatchTest extends TestCase
         $admin = $this->users->admin();
         $entities = $this->entities->createChainBelongingToUser($editor);
         $watches = new UserEntityWatchOptions($editor, $entities['book']);
-        $watches->updateWatchLevel('new');
+        $watches->updateLevelByValue(WatchLevels::NEW);
 
         $this->actingAs($admin)->get($entities['chapter']->getUrl('/create-page'));
         $page = $entities['chapter']->pages()->where('draft', '=', true)->first();
@@ -320,7 +320,7 @@ class WatchTest extends TestCase
         $page = $this->entities->page();
 
         $watches = new UserEntityWatchOptions($editor, $page);
-        $watches->updateWatchLevel('comments');
+        $watches->updateLevelByValue(WatchLevels::COMMENTS);
         $this->permissions->disableEntityInheritedPermissions($page);
 
         $this->asAdmin()->post("/comment/{$page->id}", [
diff --git a/tests/User/UserPreferencesTest.php b/tests/User/UserPreferencesTest.php
index 4ee04ea67..9d72f4e14 100644
--- a/tests/User/UserPreferencesTest.php
+++ b/tests/User/UserPreferencesTest.php
@@ -3,6 +3,7 @@
 namespace Tests\User;
 
 use BookStack\Activity\Tools\UserEntityWatchOptions;
+use BookStack\Activity\WatchLevels;
 use Tests\TestCase;
 
 class UserPreferencesTest extends TestCase
@@ -110,13 +111,13 @@ class UserPreferencesTest extends TestCase
         $book = $this->entities->book();
 
         $options = new UserEntityWatchOptions($editor, $book);
-        $options->updateWatchLevel('comments');
+        $options->updateLevelByValue(WatchLevels::COMMENTS);
 
         $resp = $this->actingAs($editor)->get('/preferences/notifications');
         $resp->assertSee($book->name);
         $resp->assertSee('All Page Updates & Comments');
 
-        $options->updateWatchLevel('default');
+        $options->updateLevelByValue(WatchLevels::DEFAULT);
 
         $resp = $this->actingAs($editor)->get('/preferences/notifications');
         $resp->assertDontSee($book->name);