users: move emails to separate table.
* Move emails from users table to email_addresses table. * Validate that addresses are formatted correctly and are unique across users. Existing invalid emails are grandfathered in. * Add is_verified flag (the address has been confirmed by the user). * Add is_deliverable flag (an undeliverable address is an address that bounces). * Normalize addresses to prevent registering multiple accounts with the same email address (using tricks like Gmail's plus addressing).
This commit is contained in:
6
test/factories/email_address.rb
Normal file
6
test/factories/email_address.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
FactoryBot.define do
|
||||
factory(:email_address) do
|
||||
address { FFaker::Internet.email }
|
||||
is_verified { true }
|
||||
end
|
||||
end
|
||||
@@ -4,7 +4,6 @@ FactoryBot.define do
|
||||
"user#{n}"
|
||||
end
|
||||
password {"password"}
|
||||
email {FFaker::Internet.email}
|
||||
default_image_size {"large"}
|
||||
level {20}
|
||||
created_at {Time.now}
|
||||
|
||||
@@ -5,7 +5,7 @@ module Maintenance
|
||||
class EmailChangesControllerTest < ActionDispatch::IntegrationTest
|
||||
context "in all cases" do
|
||||
setup do
|
||||
@user = create(:user, :email => "bob@ogres.net")
|
||||
@user = create(:user, email_address: build(:email_address, { address: "bob@ogres.net" }))
|
||||
end
|
||||
|
||||
context "#new" do
|
||||
@@ -20,16 +20,14 @@ module Maintenance
|
||||
should "work" do
|
||||
post_auth maintenance_user_email_change_path, @user, params: {:email_change => {:password => "password", :email => "abc@ogres.net"}}
|
||||
assert_redirected_to(edit_user_path(@user))
|
||||
@user.reload
|
||||
assert_equal("abc@ogres.net", @user.email)
|
||||
assert_equal("abc@ogres.net", @user.reload.email_address.address)
|
||||
end
|
||||
end
|
||||
|
||||
context "with the incorrect password" do
|
||||
should "not work" do
|
||||
post_auth maintenance_user_email_change_path, @user, params: {:email_change => {:password => "passwordx", :email => "abc@ogres.net"}}
|
||||
@user.reload
|
||||
assert_equal("bob@ogres.net", @user.email)
|
||||
assert_equal("bob@ogres.net", @user.reload.email_address.address)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -114,8 +114,28 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
|
||||
|
||||
context "create action" do
|
||||
should "create a user" do
|
||||
assert_difference("User.count", 1) do
|
||||
post users_path, params: {:user => {:name => "xxx", :password => "xxxxx1", :password_confirmation => "xxxxx1"}}
|
||||
user_params = { name: "xxx", password: "xxxxx1", password_confirmation: "xxxxx1" }
|
||||
post users_path, params: { user: user_params }
|
||||
|
||||
assert_redirected_to User.last
|
||||
assert_equal("xxx", User.last.name)
|
||||
end
|
||||
|
||||
should "create a user with a valid email" do
|
||||
user_params = { name: "xxx", password: "xxxxx1", password_confirmation: "xxxxx1", email_address_attributes: { address: "test@gmail.com" } }
|
||||
post users_path, params: { user: user_params }
|
||||
|
||||
assert_redirected_to User.last
|
||||
assert_equal("xxx", User.last.name)
|
||||
assert_equal("test@gmail.com", User.last.email_address.address)
|
||||
end
|
||||
|
||||
should "not create a user with an invalid email" do
|
||||
user_params = { name: "xxx", password: "xxxxx1", password_confirmation: "xxxxx1", email_address_attributes: { address: "test" } }
|
||||
|
||||
assert_no_difference("User.count") do
|
||||
post users_path, params: { user: user_params }
|
||||
assert_response :success
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class DmailTest < ActiveSupport::TestCase
|
||||
context "that is spam" do
|
||||
should "be automatically reported and deleted" do
|
||||
@recipient = create(:user)
|
||||
@spammer = create(:user, created_at: 2.weeks.ago, email: "akismet-guaranteed-spam@example.com")
|
||||
@spammer = create(:user, created_at: 2.weeks.ago, email_address: build(:email_address, address: "akismet-guaranteed-spam@example.com"))
|
||||
|
||||
SpamDetector.stubs(:enabled?).returns(true)
|
||||
dmail = create(:dmail, owner: @recipient, from: @spammer, to: @recipient, creator_ip_addr: "127.0.0.1")
|
||||
@@ -87,14 +87,14 @@ class DmailTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
should "send an email if the user wants it" do
|
||||
user = create(:user, receive_email_notifications: true)
|
||||
user = create(:user, receive_email_notifications: true, email_address: build(:email_address))
|
||||
assert_difference("ActionMailer::Base.deliveries.size", 1) do
|
||||
create(:dmail, to: user, owner: user, body: "test [[tagme]]")
|
||||
end
|
||||
end
|
||||
|
||||
should "create only one message for a split response" do
|
||||
user = FactoryBot.create(:user, :receive_email_notifications => true)
|
||||
user = create(:user, receive_email_notifications: true, email_address: build(:email_address))
|
||||
assert_difference("ActionMailer::Base.deliveries.size", 1) do
|
||||
Dmail.create_split(from: CurrentUser.user, creator_ip_addr: "127.0.0.1", to_id: user.id, title: "foo", body: "foo")
|
||||
end
|
||||
|
||||
@@ -7,7 +7,7 @@ class SpamDetectorTest < ActiveSupport::TestCase
|
||||
SpamDetector.stubs(:enabled?).returns(true)
|
||||
|
||||
@user = create(:gold_user, created_at: 1.month.ago)
|
||||
@spammer = create(:user, created_at: 2.weeks.ago, email: "akismet-guaranteed-spam@example.com")
|
||||
@spammer = create(:user, created_at: 2.weeks.ago, email_address: build(:email_address, address: "akismet-guaranteed-spam@example.com"))
|
||||
end
|
||||
|
||||
context "for dmails" do
|
||||
|
||||
@@ -27,13 +27,13 @@ class UserDeletionTest < ActiveSupport::TestCase
|
||||
|
||||
context "a valid user deletion" do
|
||||
setup do
|
||||
@user = create(:user, email: "ted@danbooru.com")
|
||||
@user = create(:user, email_address: build(:email_address))
|
||||
@deletion = UserDeletion.new(@user, "password")
|
||||
end
|
||||
|
||||
should "blank out the email" do
|
||||
@deletion.delete!
|
||||
assert_nil(@user.reload.email)
|
||||
assert_nil(@user.reload.email_address)
|
||||
end
|
||||
|
||||
should "rename the user" do
|
||||
|
||||
Reference in New Issue
Block a user