diff --git a/app/controllers/stories_controller.rb b/app/controllers/stories_controller.rb
index 6386fa87c..e7acfdc7a 100644
--- a/app/controllers/stories_controller.rb
+++ b/app/controllers/stories_controller.rb
@@ -184,6 +184,9 @@ class StoriesController < ApplicationController
end
not_found if @user.username.include?("spam_") && @user.decorate.fully_banished?
not_found unless @user.registered
+ if !user_signed_in? && (@user.suspended? && @user.has_no_published_content?)
+ not_found
+ end
assign_user_comments
assign_user_stories
@list_of = "articles"
diff --git a/app/models/user.rb b/app/models/user.rb
index 1d9b553cf..5ca5cc3e1 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -567,6 +567,10 @@ class User < ApplicationRecord
Tag.followed_by(self)
end
+ def has_no_published_content?
+ articles.published.empty? && comments_count.zero?
+ end
+
protected
# Send emails asynchronously
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index f5b584c9c..16e23d8ab 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -870,6 +870,18 @@ RSpec.describe User do
end
end
+ describe "#has_no_published_content?" do
+ it "returns true if the user has no published articles or comments" do
+ create(:article, user_id: user.id, published: false, published_at: Date.tomorrow)
+ expect(user.has_no_published_content?).to be(true)
+ end
+
+ it "returns false if the user has any published articles or comments" do
+ create(:article, user_id: user.id, published: true)
+ expect(user.has_no_published_content?).to be(false)
+ end
+ end
+
describe ".above_average and .average_x_count" do
context "when there are not yet any articles with score above 0" do
it "works as expected" do
diff --git a/spec/requests/user/user_profile_spec.rb b/spec/requests/user/user_profile_spec.rb
index 99571956d..60ee897d8 100644
--- a/spec/requests/user/user_profile_spec.rb
+++ b/spec/requests/user/user_profile_spec.rb
@@ -3,8 +3,9 @@ require "rails_helper"
RSpec.describe "UserProfiles" do
let(:user) { create(:user) }
let(:organization) { create(:organization) }
+ let(:current_user) { create(:user) }
- describe "GET /user" do
+ describe "GET /:username" do
it "renders to appropriate page" do
get "/#{user.username}"
expect(response.body).to include CGI.escapeHTML(user.name)
@@ -47,24 +48,6 @@ RSpec.describe "UserProfiles" do
expect(response).to redirect_to("/#{user.username}")
end
- it "raises not found for banished users" do
- banishable_user = create(:user)
- Moderator::BanishUser.call(admin: user, user: banishable_user)
- expect { get "/#{banishable_user.reload.old_username}" }.to raise_error(ActiveRecord::RecordNotFound)
- expect { get "/#{banishable_user.reload.username}" }.to raise_error(ActiveRecord::RecordNotFound)
- end
-
- it "raises not found if user not registered" do
- user.update_column(:registered, false)
- expect { get "/#{user.username}" }.to raise_error(ActiveRecord::RecordNotFound)
- end
-
- it "renders noindex meta if suspended" do
- user.add_role(:suspended)
- get "/#{user.username}"
- expect(response.body).to include("")
- end
-
it "does not render noindex meta if not suspended" do
get "/#{user.username}"
expect(response.body).not_to include("")
@@ -194,6 +177,52 @@ RSpec.describe "UserProfiles" do
expect(response.body).not_to include("github-repos-container")
end
end
+
+ # rubocop:disable RSpec/NestedGroups
+ describe "not found and no index behaviour" do
+ it "raises not found for banished users" do
+ banishable_user = create(:user)
+ Moderator::BanishUser.call(admin: user, user: banishable_user)
+ expect { get "/#{banishable_user.reload.old_username}" }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { get "/#{banishable_user.reload.username}" }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ context "when a user is signed in" do
+ it "does not raise not found for suspended users who have no current content" do
+ sign_in current_user
+
+ suspended_user = create(:user)
+ suspended_user.add_role(:suspended)
+ create(:article, user_id: user.id, published: false, published_at: Date.tomorrow)
+
+ expect { get "/#{suspended_user.username}" }.not_to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context "when a user is not signed in" do
+ it "raises not found for suspended users who do not have published content" do
+ suspended_user = create(:user)
+ suspended_user.add_role(:suspended)
+ create(:article, user_id: user.id, published: false, published_at: Date.tomorrow)
+
+ expect { get "/#{suspended_user.username}" }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ it "renders noindex meta if suspended (and has published content)" do
+ user.add_role(:suspended)
+
+ create(:article, user_id: user.id)
+ get "/#{user.username}"
+ expect(response.body).to include("")
+ end
+
+ it "raises not found if user not registered" do
+ user.update_column(:registered, false)
+ expect { get "/#{user.username}" }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ # rubocop:enable RSpec/NestedGroups
end
describe "redirect to moderation" do