discourse/spec/services/anonymous_shadow_creator_spec.rb
Martin Brennan 475ff1b0fa
UX: Introduce anonymous and logged_in_users auto groups (#39516)
The everyone pseudogroup has long been a source of confusion
for admins and developers, since it's never been clear whether
it is supposed to include anonymous users.

This PR introduces two new auto groups, anonymous_users and
logged_in_users, to replace the everyone group. The everyone group will
continue to exist for backwards compatibility, but it will be deprecated
and eventually removed in a future release. All group_list based site
settings will use the new groups.

In addition, for site settings where it doesn't make sense to allow
anon users, the anonymous group is added as a disallowed_groups
option.

In a followup PR, an upcoming change will be introduced
to phase out the use of the everyone group and use
logged_in_users as a replacement.
2026-05-06 10:35:52 +10:00

93 lines
3 KiB
Ruby
Vendored

# frozen_string_literal: true
RSpec.describe AnonymousShadowCreator do
it "returns no shadow by default" do
expect(AnonymousShadowCreator.get(Fabricate.build(:user))).to eq(nil)
end
context "when anonymous posting is enabled" do
fab!(:user) { Fabricate(:user, trust_level: TrustLevel[3]) }
before do
SiteSetting.allow_anonymous_mode = true
SiteSetting.anonymous_posting_allowed_groups = "11"
end
it "returns no shadow if the user is not in a group that is allowed to anonymously post" do
user = Fabricate(:user, trust_level: TrustLevel[0])
expect(AnonymousShadowCreator.get(user)).to eq(nil)
end
it "returns no shadow if must_approve_users is true and user is not approved" do
SiteSetting.must_approve_users = true
expect(AnonymousShadowCreator.get(Fabricate.build(:user, approved: false))).to eq(nil)
end
it "returns a new shadow once time expires" do
SiteSetting.anonymous_account_duration_minutes = 1
shadow = AnonymousShadowCreator.get(user)
freeze_time 2.minutes.from_now
shadow2 = AnonymousShadowCreator.get(user)
expect(shadow.id).to eq(shadow2.id)
shadow.send(:trigger_user_automatic_group_refresh)
create_post(user: shadow)
user.reload
shadow.reload
freeze_time 4.minutes.from_now
shadow3 = AnonymousShadowCreator.get(user)
expect(shadow3.user_option.email_digests).to eq(false)
expect(shadow3.user_option.email_messages_level).to eq(UserOption.email_level_types[:never])
expect(shadow2.id).not_to eq(shadow3.id)
end
it "returns a shadow for a legit user" do
shadow = AnonymousShadowCreator.get(user)
shadow2 = AnonymousShadowCreator.get(user)
expect(shadow.id).to eq(shadow2.id)
expect(shadow.trust_level).to eq(1)
expect(shadow.username).to eq("anonymous1")
expect(shadow.created_at).not_to eq_time(user.created_at)
p = create_post
expect(Guardian.new(shadow).post_can_act?(p, :like)).to eq(false)
expect(Guardian.new(user).post_can_act?(p, :like)).to eq(true)
expect(user.anonymous?).to eq(false)
expect(shadow.anonymous?).to eq(true)
end
it "works even when names are required" do
SiteSetting.full_name_requirement = "required_at_signup"
expect { AnonymousShadowCreator.get(user) }.to_not raise_error
end
it "works when there is an email allowlist" do
SiteSetting.allowed_email_domains = "wayne.com"
expect { AnonymousShadowCreator.get(user) }.to_not raise_error
end
it "falls back to username 'anonymous' if the translation for 'anonymous' consists entirely of disallowed characters" do
# use russian locale but do not allow russian characters:
I18n.locale = :ru
SiteSetting.unicode_usernames = true
SiteSetting.allowed_unicode_username_characters = "[äöü]"
shadow = AnonymousShadowCreator.get(user)
expect(shadow.username).to eq("anonymous1")
end
end
end