diff --git a/app/models/user_email.rb b/app/models/user_email.rb index 101eddcd5c5..4a5a9e80cab 100644 --- a/app/models/user_email.rb +++ b/app/models/user_email.rb @@ -11,7 +11,7 @@ class UserEmail < ActiveRecord::Base validates :email, email: true, format: { with: EmailValidator.email_regex }, if: :validate_email? - validates :primary, uniqueness: { scope: [:user_id] }, if: :user_id + validates :primary, uniqueness: { scope: [:user_id] }, if: [:user_id, :primary] validate :user_id_not_changed, if: :primary validate :unique_email diff --git a/db/migrate/20171220181249_change_user_emails_primary_index.rb b/db/migrate/20171220181249_change_user_emails_primary_index.rb new file mode 100644 index 00000000000..f78a5d77897 --- /dev/null +++ b/db/migrate/20171220181249_change_user_emails_primary_index.rb @@ -0,0 +1,11 @@ +class ChangeUserEmailsPrimaryIndex < ActiveRecord::Migration[5.1] + def up + remove_index :user_emails, [:user_id, :primary] + add_index :user_emails, [:user_id, :primary], unique: true, where: '"primary"' + end + + def down + remove_index :user_emails, [:user_id, :primary] + add_index :user_emails, [:user_id, :primary], unique: true + end +end diff --git a/spec/models/user_email_spec.rb b/spec/models/user_email_spec.rb new file mode 100644 index 00000000000..c2d822491ea --- /dev/null +++ b/spec/models/user_email_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' +require_dependency 'user_email' + +describe UserEmail do + context "validation" do + it "allows only one primary email" do + user = Fabricate(:user_single_email) + expect { + Fabricate(:alternate_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) + expect(user.user_emails.count).to eq 3 + end + end + + context "indexes" 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) + }.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) + expect(user.user_emails.count).to eq 3 + end + end +end