From 19a0bdc0ee08777eebd5c4c25bc92d1dc8b978e5 Mon Sep 17 00:00:00 2001
From: Jamie Wilson <jamie.wilson@discourse.org>
Date: Thu, 5 Jan 2023 15:38:32 -0500
Subject: [PATCH] FIX: Link to category settings should use slug

Links to category settings were created using the category name. If the name was a single word, the link would be valid (regardless of capitalization).

For example, if the category was named `Awesome`

`/c/Awesome/edit/settings`

is a valid URL as that is a case-insensitive match for the category slug of `awesome`.

However, if the category had a space in it, the URL would be

`/c/Awesome%20Name/edit/settings`

which does not match the slug of `awesome-name`.

This change uses the category slug, rather than the name, which is the expected behaviour (see `Category.find_by_slug_path`).
---
 app/serializers/reviewable_score_serializer.rb       | 2 +-
 spec/fabricators/category_fabricator.rb              | 1 +
 spec/serializers/reviewable_score_serializer_spec.rb | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/app/serializers/reviewable_score_serializer.rb b/app/serializers/reviewable_score_serializer.rb
index 6a0eac38d0a..5a4d1f05ded 100644
--- a/app/serializers/reviewable_score_serializer.rb
+++ b/app/serializers/reviewable_score_serializer.rb
@@ -72,7 +72,7 @@ class ReviewableScoreSerializer < ApplicationSerializer
     when 'watched_word'
       "#{Discourse.base_url}/admin/customize/watched_words"
     when 'category'
-      "#{Discourse.base_url}/c/#{object.reviewable.category&.name}/edit/settings"
+      "#{Discourse.base_url}/c/#{object.reviewable.category&.slug}/edit/settings"
     else
       "#{Discourse.base_url}/admin/site_settings/category/all_results?filter=#{text}"
     end
diff --git a/spec/fabricators/category_fabricator.rb b/spec/fabricators/category_fabricator.rb
index 0e14967af41..3793bb118ee 100644
--- a/spec/fabricators/category_fabricator.rb
+++ b/spec/fabricators/category_fabricator.rb
@@ -2,6 +2,7 @@
 
 Fabricator(:category) do
   name { sequence(:name) { |n| "Amazing Category #{n}" } }
+  slug { sequence(:slug) { |n| "amazing-category-#{n}" } }
   skip_category_definition true
   user
 end
diff --git a/spec/serializers/reviewable_score_serializer_spec.rb b/spec/serializers/reviewable_score_serializer_spec.rb
index 1a52cbe9a8f..4b58979493f 100644
--- a/spec/serializers/reviewable_score_serializer_spec.rb
+++ b/spec/serializers/reviewable_score_serializer_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe ReviewableScoreSerializer do
         category = Fabricate.build(:category)
         reviewable.category = category
         serialized = serialized_score('category')
-        link_url = "#{Discourse.base_url}/c/#{category.name}/edit/settings"
+        link_url = "#{Discourse.base_url}/c/#{category.slug}/edit/settings"
         category_link = "<a href=\"#{link_url}\">#{I18n.t('reviewables.reasons.links.category')}</a>"
 
         expect(serialized.reason).to include(category_link)