From 5378e7344d6acebed0ff306767d53df550d3a7ba Mon Sep 17 00:00:00 2001 From: Skud Date: Mon, 18 Mar 2013 17:36:54 +1100 Subject: [PATCH] Added validations for member names: 2-25 chars long alphanumeric and underscores only disallowed: "growstuff", "admin", "moderator" removed everything that was there to handle/truncate long usernames since it's no longer needed. --- app/models/member.rb | 14 +++++++ app/views/members/index.html.haml | 2 +- spec/factories/member.rb | 36 +++++++++++++++-- spec/models/member_spec.rb | 47 +++++++++++++++++++++- spec/views/members/index.html.haml_spec.rb | 11 +---- 5 files changed, 93 insertions(+), 17 deletions(-) diff --git a/app/models/member.rb b/app/models/member.rb index 50fad800a..3244d240f 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -37,6 +37,20 @@ class Member < ActiveRecord::Base :accept => true validates_uniqueness_of :login_name + validates :login_name, + :length => { + :minimum => 2, + :maximum => 25, + :message => "should be between 2 and 25 characters long" + }, + :exclusion => { + :in => %w(growstuff admin moderator), + :message => "name is reserved" + }, + :format => { + :with => /^\w+$/, + :message => "may only include letters, numbers, or underscores" + } # Give each new member a default garden after_create {|member| Garden.create(:name => "Garden", :owner_id => member.id) } diff --git a/app/views/members/index.html.haml b/app/views/members/index.html.haml index b4986f743..4a46bf1bf 100644 --- a/app/views/members/index.html.haml +++ b/app/views/members/index.html.haml @@ -8,4 +8,4 @@ %li.span2 .thumbnail(style="height: 190px") = render :partial => "members/avatar", :locals => { :member => m } - = link_to shorten(m.to_s, 30), m + = link_to m.to_s, m diff --git a/spec/factories/member.rb b/spec/factories/member.rb index 50db85bf7..571ce25ba 100644 --- a/spec/factories/member.rb +++ b/spec/factories/member.rb @@ -18,10 +18,6 @@ FactoryGirl.define do confirmed_at nil end - factory :long_name_member do - login_name 'Marmaduke Blundell-Hollinshead-Blundell-Tolemache-Plantagenet-Whistlebinkie, 3rd Duke of Marmoset' - end - # this member has very loose privacy settings factory :public_member do login_name 'NothingToHide' @@ -40,6 +36,38 @@ FactoryGirl.define do roles { [ FactoryGirl.create(:admin) ] } end + factory :invalid_member_shortname do + login_name 'a' + end + + factory :invalid_member_longname do + login_name 'MarmadukeBlundellHollinsheadBlundellTolemachePlantagenetWhistlebinkie3rdDukeofMarmoset' + end + + factory :invalid_member_spaces do + login_name "a b" + end + + factory :invalid_member_badchars do + login_name 'aa%$' + end + + factory :invalid_member_badname do + login_name 'admin' + end + + factory :valid_member_alphanumeric do + login_name 'abc123' + end + + factory :valid_member_uppercase do + login_name 'ABC123' + end + + factory :valid_member_underscore do + login_name 'abc_123' + end + end end diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb index 04f87dcea..0035032dc 100644 --- a/spec/models/member_spec.rb +++ b/spec/models/member_spec.rb @@ -101,13 +101,56 @@ describe 'member' do context 'same :login_name' do it "should not allow two members with the same login_name" do - FactoryGirl.create(:member, :login_name => "login-name") - member = FactoryGirl.build(:member, :login_name => "login-name") + FactoryGirl.create(:member, :login_name => "login_name") + member = FactoryGirl.build(:member, :login_name => "login_name") member.should_not be_valid member.errors[:login_name].should include("has already been taken") end end + context 'invalid login names' do + it "doesn't allow short names" do + member = FactoryGirl.build(:invalid_member_shortname) + member.should_not be_valid + member.errors[:login_name].should include("should be between 2 and 25 characters long") + end + it "doesn't allow really long names" do + member = FactoryGirl.build(:invalid_member_longname) + member.should_not be_valid + member.errors[:login_name].should include("should be between 2 and 25 characters long") + end + it "doesn't allow spaces in names" do + member = FactoryGirl.build(:invalid_member_spaces) + member.should_not be_valid + member.errors[:login_name].should include("may only include letters, numbers, or underscores") + end + it "doesn't allow other chars in names" do + member = FactoryGirl.build(:invalid_member_badchars) + member.should_not be_valid + member.errors[:login_name].should include("may only include letters, numbers, or underscores") + end + it "doesn't allow reserved names" do + member = FactoryGirl.build(:invalid_member_badname) + member.should_not be_valid + member.errors[:login_name].should include("name is reserved") + end + end + + context 'valid login names' do + it "allows plain alphanumeric chars in names" do + member = FactoryGirl.build(:valid_member_alphanumeric) + member.should be_valid + end + it "allows uppercase chars in names" do + member = FactoryGirl.build(:valid_member_uppercase) + member.should be_valid + end + it "allows underscores in names" do + member = FactoryGirl.build(:valid_member_underscore) + member.should be_valid + end + end + context 'roles' do before(:each) do @member = FactoryGirl.create(:member) diff --git a/spec/views/members/index.html.haml_spec.rb b/spec/views/members/index.html.haml_spec.rb index 24a8d6845..b4c33c75e 100644 --- a/spec/views/members/index.html.haml_spec.rb +++ b/spec/views/members/index.html.haml_spec.rb @@ -4,20 +4,11 @@ describe "members/index" do before(:each) do assign(:members, [ FactoryGirl.create(:member), - FactoryGirl.create(:long_name_member) + FactoryGirl.create(:member) ]) render end - it "truncates long names" do - rendered.should contain "marmaduke blundell-hollinsh..." - end - - it "does not truncate short names" do - rendered.should contain /member\d+/ - rendered.should_not contain /member\d+\.\.\./ - end - it "counts the number of members" do rendered.should contain "Displaying 2 members" end