mirror of
https://github.com/discourse/discourse.git
synced 2025-09-07 12:02:53 +08:00
FEATURE: Secondary emails support.
This commit is contained in:
parent
50e59fb9bd
commit
21ebb1cd54
16 changed files with 307 additions and 14 deletions
|
@ -169,6 +169,21 @@ describe Email::Receiver do
|
|||
expect { process(:from_reply_by_email_address) }.to raise_error(Email::Receiver::FromReplyByAddressError)
|
||||
end
|
||||
|
||||
it "accepts reply from secondary email address" do
|
||||
Fabricate(:secondary_email, email: "someone_else@bar.com", user: user)
|
||||
|
||||
expect { process(:reply_user_not_matching) }
|
||||
.to change { topic.posts.count }
|
||||
|
||||
post = Post.last
|
||||
|
||||
expect(post.raw).to eq(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
|
||||
)
|
||||
|
||||
expect(post.user).to eq(user)
|
||||
end
|
||||
|
||||
it "raises a TopicNotFoundError when the topic was deleted" do
|
||||
topic.update_columns(deleted_at: 1.day.ago)
|
||||
expect { process(:reply_user_matching) }.to raise_error(Email::Receiver::TopicNotFoundError)
|
||||
|
@ -490,6 +505,27 @@ describe Email::Receiver do
|
|||
expect(topic.topic_users.count).to eq(3)
|
||||
end
|
||||
|
||||
it "invites users with a secondary email in the chain" do
|
||||
user1 = Fabricate(:user,
|
||||
trust_level: SiteSetting.email_in_min_trust,
|
||||
user_emails: [
|
||||
Fabricate.build(:secondary_email, email: "discourse@bar.com"),
|
||||
Fabricate.build(:secondary_email, email: "someone@else.com"),
|
||||
]
|
||||
)
|
||||
|
||||
user2 = Fabricate(:user,
|
||||
trust_level: SiteSetting.email_in_min_trust,
|
||||
user_emails: [
|
||||
Fabricate.build(:secondary_email, email: "team@bar.com"),
|
||||
Fabricate.build(:secondary_email, email: "wat@bar.com"),
|
||||
]
|
||||
)
|
||||
|
||||
expect { process(:cc) }.to change(Topic, :count)
|
||||
expect(Topic.last.allowed_users).to contain_exactly(user1, user2)
|
||||
end
|
||||
|
||||
it "cap the number of staged users created per email" do
|
||||
SiteSetting.maximum_staged_users_per_email = 1
|
||||
expect { process(:cc) }.to change(Topic, :count)
|
||||
|
@ -696,6 +732,24 @@ describe Email::Receiver do
|
|||
SiteSetting.ignore_by_title = "foo"
|
||||
expect { process(:ignored) }.to_not change(Topic, :count)
|
||||
end
|
||||
|
||||
it "associates email from a secondary address with user" do
|
||||
user = Fabricate(:user,
|
||||
trust_level: SiteSetting.email_in_min_trust,
|
||||
user_emails: [
|
||||
Fabricate.build(:secondary_email, email: "existing@bar.com")
|
||||
]
|
||||
)
|
||||
|
||||
expect { process(:existing_user) }.to change(Topic, :count).by(1)
|
||||
|
||||
topic = Topic.last
|
||||
|
||||
expect(topic.posts.last.raw)
|
||||
.to eq("Hey, this is a topic from an existing user ;)")
|
||||
|
||||
expect(topic.user).to eq(user)
|
||||
end
|
||||
end
|
||||
|
||||
context "new topic in a category that allows strangers" do
|
||||
|
|
|
@ -3,7 +3,7 @@ Fabricator(:user_email) do
|
|||
primary true
|
||||
end
|
||||
|
||||
Fabricator(:alternate_email, from: :user_email) do
|
||||
Fabricator(:secondary_email, from: :user_email) do
|
||||
email { sequence(:email) { |i| "bwayne#{i}@wayne.com" } }
|
||||
primary false
|
||||
end
|
||||
|
|
|
@ -12,7 +12,7 @@ Fabricator(:user_single_email, class_name: :user) do
|
|||
end
|
||||
|
||||
Fabricator(:user, from: :user_single_email) do
|
||||
after_create { |user| Fabricate(:alternate_email, user: user) }
|
||||
after_create { |user| Fabricate(:secondary_email, user: user) }
|
||||
end
|
||||
|
||||
Fabricator(:coding_horror, from: :user) do
|
||||
|
|
|
@ -6,14 +6,14 @@ describe UserEmail do
|
|||
it "allows only one primary email" do
|
||||
user = Fabricate(:user_single_email)
|
||||
expect {
|
||||
Fabricate(:alternate_email, user: user, primary: true)
|
||||
Fabricate(:secondary_email, user: user, primary: true)
|
||||
}.to raise_error(ActiveRecord::RecordInvalid)
|
||||
end
|
||||
|
||||
it "allows multiple secondary emails" do
|
||||
user = Fabricate(:user_single_email)
|
||||
Fabricate(:alternate_email, user: user, primary: false)
|
||||
Fabricate(:alternate_email, user: user, primary: false)
|
||||
Fabricate(:secondary_email, user: user, primary: false)
|
||||
Fabricate(:secondary_email, user: user, primary: false)
|
||||
expect(user.user_emails.count).to eq 3
|
||||
end
|
||||
end
|
||||
|
@ -22,14 +22,14 @@ describe UserEmail do
|
|||
it "allows only one primary email" do
|
||||
user = Fabricate(:user_single_email)
|
||||
expect {
|
||||
Fabricate.build(:alternate_email, user: user, primary: true).save(validate: false)
|
||||
Fabricate.build(:secondary_email, user: user, primary: true).save(validate: false)
|
||||
}.to raise_error(ActiveRecord::RecordNotUnique)
|
||||
end
|
||||
|
||||
it "allows multiple secondary emails" do
|
||||
user = Fabricate(:user_single_email)
|
||||
Fabricate.build(:alternate_email, user: user, primary: false).save(validate: false)
|
||||
Fabricate.build(:alternate_email, user: user, primary: false).save(validate: false)
|
||||
Fabricate.build(:secondary_email, user: user, primary: false).save(validate: false)
|
||||
Fabricate.build(:secondary_email, user: user, primary: false).save(validate: false)
|
||||
expect(user.user_emails.count).to eq 3
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1758,4 +1758,17 @@ describe User do
|
|||
filter_by(:filter_by_username_or_email)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#secondary_emails" do
|
||||
let(:user) { Fabricate(:user_single_email) }
|
||||
|
||||
it "only contains secondary emails" do
|
||||
expect(user.user_emails.secondary).to eq([])
|
||||
|
||||
secondary_email = Fabricate(:secondary_email, user: user)
|
||||
|
||||
expect(user.user_emails.secondary).to contain_exactly(secondary_email)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -1900,14 +1900,16 @@ describe UsersController do
|
|||
expect(response).to be_forbidden
|
||||
end
|
||||
|
||||
it "returns both email and associated_accounts when you're allowed to see them" do
|
||||
it "returns emails and associated_accounts when you're allowed to see them" do
|
||||
user = Fabricate(:user)
|
||||
sign_in_admin
|
||||
|
||||
get "/u/#{Fabricate(:user).username}/emails.json"
|
||||
get "/u/#{user.username}/emails.json"
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
json = JSON.parse(response.body)
|
||||
expect(json["email"]).to be_present
|
||||
expect(json["email"]).to eq(user.email)
|
||||
expect(json["secondary_emails"]).to eq(user.secondary_emails)
|
||||
expect(json["associated_accounts"]).to be_present
|
||||
end
|
||||
|
||||
|
@ -1919,7 +1921,8 @@ describe UsersController do
|
|||
|
||||
expect(response.status).to eq(200)
|
||||
json = JSON.parse(response.body)
|
||||
expect(json["email"]).to be_present
|
||||
expect(json["email"]).to eq(inactive_user.email)
|
||||
expect(json["secondary_emails"]).to eq(inactive_user.secondary_emails)
|
||||
expect(json["associated_accounts"]).to be_present
|
||||
end
|
||||
end
|
||||
|
|
78
spec/serializers/admin_user_list_serializer_spec.rb
Normal file
78
spec/serializers/admin_user_list_serializer_spec.rb
Normal file
|
@ -0,0 +1,78 @@
|
|||
require 'rails_helper'
|
||||
require_dependency 'user'
|
||||
|
||||
describe AdminUserListSerializer do
|
||||
|
||||
context "emails" do
|
||||
let(:admin) { Fabricate(:user_single_email, admin: true, email: "admin@email.com") }
|
||||
let(:user) { Fabricate(:user_single_email, email: "user@email.com") }
|
||||
let(:guardian) { Guardian.new(admin) }
|
||||
|
||||
let(:json) do
|
||||
AdminUserListSerializer.new(user,
|
||||
scope: guardian,
|
||||
root: false
|
||||
).as_json
|
||||
end
|
||||
|
||||
def fabricate_secondary_emails_for(u)
|
||||
["first", "second"].each do |name|
|
||||
Fabricate(:secondary_email, user: u, email: "#{name}@email.com")
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples "shown" do |email|
|
||||
it "contains emails" do
|
||||
expect(json[:email]).to eq(email)
|
||||
|
||||
expect(json[:secondary_emails]).to contain_exactly(
|
||||
"first@email.com",
|
||||
"second@email.com"
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples "not shown" do
|
||||
it "doesn't contain emails" do
|
||||
expect(json[:email]).to eq(nil)
|
||||
expect(json[:secondary_emails]).to eq(nil)
|
||||
end
|
||||
end
|
||||
|
||||
context "with myself" do
|
||||
let(:user) { admin }
|
||||
|
||||
before do
|
||||
fabricate_secondary_emails_for(admin)
|
||||
end
|
||||
|
||||
include_examples "shown", "admin@email.com"
|
||||
end
|
||||
|
||||
context "with a normal user" do
|
||||
before do
|
||||
fabricate_secondary_emails_for(user)
|
||||
end
|
||||
|
||||
include_examples "not shown"
|
||||
end
|
||||
|
||||
context "with a normal user after clicking 'show emails'" do
|
||||
before do
|
||||
guardian.can_see_emails = true
|
||||
fabricate_secondary_emails_for(user)
|
||||
end
|
||||
|
||||
include_examples "shown", "user@email.com"
|
||||
end
|
||||
|
||||
context "with a staged user" do
|
||||
before do
|
||||
user.staged = true
|
||||
fabricate_secondary_emails_for(user)
|
||||
end
|
||||
|
||||
include_examples "shown", "user@email.com"
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue