diff options
| -rw-r--r-- | users/app/models/email.rb | 12 | ||||
| -rw-r--r-- | users/app/models/identity.rb | 18 | ||||
| -rw-r--r-- | users/app/models/local_email.rb | 4 | ||||
| -rw-r--r-- | users/app/models/login_format_validation.rb | 8 | ||||
| -rw-r--r-- | users/test/unit/identity_test.rb | 26 | 
5 files changed, 60 insertions, 8 deletions
| diff --git a/users/app/models/email.rb b/users/app/models/email.rb index 1bcff1c..f38f2f5 100644 --- a/users/app/models/email.rb +++ b/users/app/models/email.rb @@ -3,10 +3,16 @@ class Email < String    validates :email,      :format => { -      :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, +      :with => /\A([^@\s]+)@((?:[-a-zA-Z0-9]+\.)+[a-zA-Z]{2,})\Z/, #checks format, but allows lowercase        :message => "needs to be a valid email address"      } +  validates :email, +    :format => { +      :with => /\A[^A-Z]*\Z/, #forbids uppercase characters +      :message => "letters must be lowercase" +    } +    def to_partial_path      "emails/email"    end @@ -19,4 +25,8 @@ class Email < String      self    end +  def handle +    self.split('@').first +  end +  end diff --git a/users/app/models/identity.rb b/users/app/models/identity.rb index 355f67a..e0a24e9 100644 --- a/users/app/models/identity.rb +++ b/users/app/models/identity.rb @@ -1,4 +1,5 @@  class Identity < CouchRest::Model::Base +  include LoginFormatValidation    use_database :identities @@ -10,6 +11,8 @@ class Identity < CouchRest::Model::Base    validate :unique_forward    validate :alias_available +  validate :address_local_email +  validate :destination_email    design do      view :by_user_id @@ -63,6 +66,11 @@ class Identity < CouchRest::Model::Base      write_attribute('keys', keys.merge(type => value))    end +  # for LoginFormatValidation +  def login +    self.address.handle +  end +    protected    def unique_forward @@ -79,4 +87,14 @@ class Identity < CouchRest::Model::Base      end    end +  def address_local_email +    return if address.valid? #this ensures it is LocalEmail +    self.errors.add(:address, address.errors.messages[:email].first) #assumes only one error +  end + +  def destination_email +    return if destination.valid? #this ensures it is Email +    self.errors.add(:destination, destination.errors.messages[:email].first) #assumes only one error #TODO +  end +  end diff --git a/users/app/models/local_email.rb b/users/app/models/local_email.rb index c1f7c11..6303bb6 100644 --- a/users/app/models/local_email.rb +++ b/users/app/models/local_email.rb @@ -20,10 +20,6 @@ class LocalEmail < Email      [handle]    end -  def handle -    gsub(/@#{domain}/i, '') -  end -    def domain      LocalEmail.domain    end diff --git a/users/app/models/login_format_validation.rb b/users/app/models/login_format_validation.rb index 1d02bd1..c1fcf70 100644 --- a/users/app/models/login_format_validation.rb +++ b/users/app/models/login_format_validation.rb @@ -1,19 +1,21 @@  module LoginFormatValidation    extend ActiveSupport::Concern +  #TODO: Probably will replace this. Playing with using it for aliases too, but won't want it connected to login field. +    included do      # Have multiple regular expression validations so we can get specific error messages:      validates :login,        :format => { :with => /\A.{2,}\z/, -        :message => "Login must have at least two characters"} +        :message => "Must have at least two characters"}      validates :login,        :format => { :with => /\A[a-z\d_\.-]+\z/,          :message => "Only lowercase letters, digits, . - and _ allowed."}      validates :login,        :format => { :with => /\A[a-z].*\z/, -        :message => "Login must begin with a lowercase letter"} +        :message => "Must begin with a lowercase letter"}      validates :login,        :format => { :with => /\A.*[a-z\d]\z/, -        :message => "Login must end with a letter or digit"} +        :message => "Must end with a letter or digit"}    end  end diff --git a/users/test/unit/identity_test.rb b/users/test/unit/identity_test.rb index fa88315..02f14c0 100644 --- a/users/test/unit/identity_test.rb +++ b/users/test/unit/identity_test.rb @@ -70,6 +70,32 @@ class IdentityTest < ActiveSupport::TestCase      id.destroy    end +  test "fail to add non-local email address as identity address" do +    id = Identity.for @user, address: forward_address +    assert !id.valid? +    assert_match /needs to end in/, id.errors[:address].first +  end + +  test "alias must meet some conditions as login" do +    id = Identity.create_for @user, address: alias_name.capitalize +    assert !id.valid? +    #hacky way to do this, but okay for now: +    assert id.errors.messages.flatten(2).include? "Must begin with a lowercase letter" +    assert id.errors.messages.flatten(2).include? "Only lowercase letters, digits, . - and _ allowed." +  end + +  test "destination must be valid email address" do +    id = Identity.create_for @user, address: @user.email_address, destination: 'ASKJDLFJD' +    assert !id.valid? +    assert id.errors.messages[:destination].include? "needs to be a valid email address" +  end + +  test "only lowercase destination" do +    id = Identity.create_for @user, address: @user.email_address, destination: forward_address.capitalize +    assert !id.valid? +    assert id.errors.messages[:destination].include? "letters must be lowercase" +  end +    def alias_name      @alias_name ||= Faker::Internet.user_name    end | 
