diff options
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/censor_rule_spec.rb | 33 | ||||
-rw-r--r-- | spec/models/change_email_validator_spec.rb | 124 | ||||
-rw-r--r-- | spec/models/info_request_spec.rb | 11 | ||||
-rw-r--r-- | spec/models/public_body_category/category_collection_spec.rb | 81 | ||||
-rw-r--r-- | spec/models/public_body_category_link_spec.rb | 53 | ||||
-rw-r--r-- | spec/models/public_body_category_spec.rb | 71 | ||||
-rw-r--r-- | spec/models/public_body_heading_spec.rb | 68 | ||||
-rw-r--r-- | spec/models/public_body_spec.rb | 52 |
8 files changed, 483 insertions, 10 deletions
diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 5b41cc0d4..4ecd2d3e1 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -90,17 +90,32 @@ end describe 'when validating rules' do - it 'should be invalid without text' do + it 'must have the text to redact' do censor_rule = CensorRule.new - censor_rule.valid?.should == false - censor_rule.errors[:text].should == ["can't be blank"] + expect(censor_rule).to have(1).error_on(:text) + expect(censor_rule.errors[:text]).to eql(["can't be blank"]) + end + + it 'must have a replacement' do + expect(CensorRule.new).to have(1).error_on(:replacement) + end + + it 'must have a last_edit_editor' do + expect(CensorRule.new).to have(1).error_on(:last_edit_editor) + end + + it 'must have a last_edit_comment' do + expect(CensorRule.new).to have(1).error_on(:last_edit_comment) end describe 'when validating a regexp rule' do before do @censor_rule = CensorRule.new(:regexp => true, - :text => '*') + :text => '*', + :replacement => '---', + :last_edit_comment => 'test', + :last_edit_editor => 'rspec') end it 'should try to create a regexp from the text' do @@ -133,7 +148,10 @@ describe 'when validating rules' do describe 'when the allow_global flag has been set' do before do - @censor_rule = CensorRule.new(:text => 'some text') + @censor_rule = CensorRule.new(:text => 'some text', + :replacement => '---', + :last_edit_comment => 'test', + :last_edit_editor => 'rspec') @censor_rule.allow_global = true end @@ -146,7 +164,10 @@ describe 'when validating rules' do describe 'when the allow_global flag has not been set' do before do - @censor_rule = CensorRule.new(:text => '/./') + @censor_rule = CensorRule.new(:text => '/./', + :replacement => '---', + :last_edit_comment => 'test', + :last_edit_editor => 'rspec') end it 'should not allow a global text censor rule (without user_id, request_id or public_body_id)' do diff --git a/spec/models/change_email_validator_spec.rb b/spec/models/change_email_validator_spec.rb new file mode 100644 index 000000000..b667a23d1 --- /dev/null +++ b/spec/models/change_email_validator_spec.rb @@ -0,0 +1,124 @@ +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +def validator_with_user_and_params(user, params = {}) + validator = ChangeEmailValidator.new(params) + validator.logged_in_user = user + validator +end + +describe ChangeEmailValidator do + + let(:user) { FactoryGirl.create(:user) } + + describe :old_email do + + it 'must have an old email' do + params = { :old_email => nil, + :new_email => 'new@example.com', + :user_circumstance => 'change_email', + :password => 'jonespassword' } + validator = validator_with_user_and_params(user, params) + + msg = 'Please enter your old email address' + expect(validator.errors_on(:old_email)).to include(msg) + end + + it 'must be a valid email' do + params = { :old_email => 'old', + :new_email => 'new@example.com', + :user_circumstance => 'change_email', + :password => 'jonespassword' } + validator = validator_with_user_and_params(user, params) + + msg = "Old email doesn't look like a valid address" + expect(validator.errors_on(:old_email)).to include(msg) + end + + it 'must have the same email as the logged in user' do + params = { :old_email => user.email, + :new_email => 'new@example.com', + :user_circumstance => 'change_email', + :password => 'jonespassword' } + validator = validator_with_user_and_params(user, params) + validator.logged_in_user = FactoryGirl.build(:user) + + msg = "Old email address isn't the same as the address of the account you are logged in with" + expect(validator.errors_on(:old_email)).to include(msg) + end + + end + + describe :new_email do + + it 'must have a new email' do + params = { :old_email => user.email, + :new_email => nil, + :user_circumstance => 'change_email', + :password => 'jonespassword' } + validator = validator_with_user_and_params(user, params) + + msg = 'Please enter your new email address' + expect(validator.errors_on(:new_email)).to include(msg) + end + + it 'must be a valid email' do + params = { :old_email => user.email, + :new_email => 'new', + :user_circumstance => 'change_email', + :password => 'jonespassword' } + validator = validator_with_user_and_params(user, params) + + msg = "New email doesn't look like a valid address" + expect(validator.errors_on(:new_email)).to include(msg) + end + + end + + describe :password do + + pending 'password_and_format_of_email validation fails when password is nil' do + it 'must have a password' do + params = { :old_email => user.email, + :new_email => 'new@example.com', + :password => nil } + validator = validator_with_user_and_params(user, params) + + msg = 'Please enter your password' + expect(validator.errors_on(:password)).to include(msg) + end + end + + it 'does not require a password if changing email' do + params = { :old_email => user.email, + :new_email => 'new@example.com', + :user_circumstance => 'change_email', + :password => '' } + validator = validator_with_user_and_params(user, params) + + expect(validator).to have(0).errors_on(:password) + end + + it 'must have a password if not changing email' do + params = { :old_email => user.email, + :new_email => 'new@example.com', + :user_circumstance => 'unknown', + :password => '' } + validator = validator_with_user_and_params(user, params) + + msg = 'Please enter your password' + expect(validator.errors_on(:password)).to include(msg) + end + + it 'must be the correct password' do + params = { :old_email => user.email, + :new_email => 'new@example.com', + :password => 'incorrectpass' } + validator = validator_with_user_and_params(user, params) + + msg = 'Password is not correct' + expect(validator.errors_on(:password)).to include(msg) + end + + end + +end diff --git a/spec/models/info_request_spec.rb b/spec/models/info_request_spec.rb index afb8e0949..9ad616ea5 100644 --- a/spec/models/info_request_spec.rb +++ b/spec/models/info_request_spec.rb @@ -848,9 +848,11 @@ describe InfoRequest do context "a series of events on a request" do it "should have sensible events after the initial request has been made" do # An initial request is sent - # The logic that changes the status when a message is sent is mixed up - # in OutgoingMessage#send_message. So, rather than extract it (or call it) - # let's just duplicate what it does here for the time being. + # FIXME: The logic that changes the status when a message + # is sent is mixed up in + # OutgoingMessage#record_email_delivery. So, rather than + # extract it (or call it) let's just duplicate what it does + # here for the time being. request.log_event('sent', {}) request.set_described_state('waiting_response') @@ -919,7 +921,8 @@ describe InfoRequest do request.log_event("status_update", {}) request.set_described_state("waiting_response") # A normal follow up is sent - # This is normally done in OutgoingMessage#send_message + # This is normally done in + # OutgoingMessage#record_email_delivery request.log_event('followup_sent', {}) request.set_described_state('waiting_response') diff --git a/spec/models/public_body_category/category_collection_spec.rb b/spec/models/public_body_category/category_collection_spec.rb new file mode 100644 index 000000000..1fbcbe739 --- /dev/null +++ b/spec/models/public_body_category/category_collection_spec.rb @@ -0,0 +1,81 @@ +require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') + +describe PublicBodyCategory::CategoryCollection do + context "requesting data" do + + before do + data = [ "Local and regional", + [ "local_council", "Local councils", "a local council" ], + "Miscellaneous", + [ "other", "Miscellaneous", "miscellaneous" ] ] + @categories = PublicBodyCategory::CategoryCollection.new + data.each { |item| @categories << item } + end + + describe 'when asked for headings' do + + it 'should return a list of headings' do + @categories.headings().should == ['Local and regional', 'Miscellaneous'] + end + + end + + describe 'when asked for categories with headings' do + it 'should return a list of headings as plain strings, each followed by n tag specifications as + lists in the form: + ["tag_to_use_as_category", "Sub category title", "Instance description"]' do + expected_categories = ["Local and regional", ["local_council", + "Local councils", + "a local council"], + "Miscellaneous", ["other", + "Miscellaneous", + "miscellaneous"]] + @categories.with_headings().should == expected_categories + end + end + + + + describe 'when asked for tags by headings' do + it 'should return a hash of tags keyed by heading' do + @categories.by_heading().should == {'Local and regional' => ['local_council'], + 'Miscellaneous' => ['other']} + end + end + + describe 'when asked for categories with description' do + it 'should return a list of tag specifications as lists in the form: + ["tag_to_use_as_category", "Sub category title", "Instance description"]' do + expected_categories = [ + ["local_council", "Local councils", "a local council"], + ["other", "Miscellaneous", "miscellaneous"] + ] + @categories.with_description().should == expected_categories + end + end + + describe 'when asked for tags' do + it 'should return a list of tags' do + @categories.tags().should == ["local_council", "other"] + end + end + + describe 'when asked for categories by tag' do + it 'should return a hash of categories keyed by tag' do + @categories.by_tag().should == { + "local_council" => "Local councils", + "other" => "Miscellaneous" + } + end + end + + describe 'when asked for singular_by_tag' do + it 'should return a hash of category descriptions keyed by tag' do + @categories.singular_by_tag().should == { + "local_council" => "a local council", + "other" => "miscellaneous" + } + end + end + end +end diff --git a/spec/models/public_body_category_link_spec.rb b/spec/models/public_body_category_link_spec.rb new file mode 100644 index 000000000..8d91f02d5 --- /dev/null +++ b/spec/models/public_body_category_link_spec.rb @@ -0,0 +1,53 @@ +# == Schema Information +# +# Table name: public_body_category_link +# +# public_body_category_id :integer not null +# public_body_heading_id :integer not null +# category_display_order :integer +# + +require 'spec_helper' + +describe PublicBodyHeading, 'when validating' do + + it 'should set a default display order based on the next available display order' do + heading = FactoryGirl.create(:public_body_heading) + category = FactoryGirl.create(:public_body_category) + category_link = PublicBodyCategoryLink.new(:public_body_heading => heading, + :public_body_category => category) + category_link.valid? + category_link.category_display_order.should == PublicBodyCategoryLink.next_display_order(heading) + end + + it 'should be invalid without a category' do + category_link = PublicBodyCategoryLink.new + category_link.should_not be_valid + category_link.errors[:public_body_category].should == ["can't be blank"] + end + + it 'should be invalid without a heading' do + category_link = PublicBodyCategoryLink.new + category_link.should_not be_valid + category_link.errors[:public_body_heading].should == ["can't be blank"] + end + +end + +describe PublicBodyCategoryLink, 'when setting a category display order' do + + it 'should return 0 if there are no public body headings' do + heading = FactoryGirl.create(:public_body_heading) + PublicBodyCategoryLink.next_display_order(heading).should == 0 + end + + it 'should return one more than the highest display order if there are public body headings' do + heading = FactoryGirl.create(:public_body_heading) + category = FactoryGirl.create(:public_body_category) + category_link = PublicBodyCategoryLink.create(:public_body_heading_id => heading.id, + :public_body_category_id => category.id) + + PublicBodyCategoryLink.next_display_order(heading).should == 1 + end + +end diff --git a/spec/models/public_body_category_spec.rb b/spec/models/public_body_category_spec.rb new file mode 100644 index 000000000..c185a3169 --- /dev/null +++ b/spec/models/public_body_category_spec.rb @@ -0,0 +1,71 @@ +# == Schema Information +# +# Table name: public_body_categories +# +# id :integer not null, primary key +# locale :string +# title :text not null +# category_tag :text not null +# description :text not null +# display_order :integer +# + +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe PublicBodyCategory do + describe 'when loading the data' do + it 'should use the display_order field to preserve the original data order' do + PublicBodyCategory.add(:en, [ + "Local and regional", + [ "local_council", "Local councils", "a local council" ], + "Miscellaneous", + [ "other", "Miscellaneous", "miscellaneous" ], + [ "aardvark", "Aardvark", "daft test"],]) + + headings = PublicBodyHeading.all + cat_group1 = headings[0].public_body_categories + cat_group1.count.should eq 1 + cat_group1[0].title.should eq "Local councils" + + cat_group2 = headings[1].public_body_categories + cat_group2.count.should eq 2 + cat_group2[0].title.should eq "Miscellaneous" + cat_group2[0].public_body_category_links.where( + :public_body_heading_id => headings[1].id). + first. + category_display_order.should eq 0 + + cat_group2[1].title.should eq "Aardvark" + cat_group2[1].public_body_category_links.where( + :public_body_heading_id => headings[1].id). + first. + category_display_order.should eq 1 + end + end + + context 'when validating' do + + it 'should require a title' do + category = PublicBodyCategory.new + category.should_not be_valid + category.errors[:title].should == ["Title can't be blank"] + end + + it 'should require a category tag' do + category = PublicBodyCategory.new + category.should_not be_valid + category.errors[:category_tag].should == ["Tag can't be blank"] + end + + it 'should require a unique tag' do + existing = FactoryGirl.create(:public_body_category) + PublicBodyCategory.new(:email => existing.category_tag).should_not be_valid + end + + it 'should require a description' do + category = PublicBodyCategory.new + category.should_not be_valid + category.errors[:description].should == ["Description can't be blank"] + end + end +end diff --git a/spec/models/public_body_heading_spec.rb b/spec/models/public_body_heading_spec.rb new file mode 100644 index 000000000..add2cac60 --- /dev/null +++ b/spec/models/public_body_heading_spec.rb @@ -0,0 +1,68 @@ +# == Schema Information +# +# Table name: public_body_headings +# +# id :integer not null, primary key +# locale :string +# name :text not null +# display_order :integer +# + +require 'spec_helper' + +describe PublicBodyHeading do + + context 'when loading the data' do + + before do + PublicBodyCategory.add(:en, [ + "Local and regional", + [ "local_council", "Local councils", "a local council" ], + "Miscellaneous", + [ "other", "Miscellaneous", "miscellaneous" ],]) + end + + it 'should use the display_order field to preserve the original data order' do + headings = PublicBodyHeading.all + headings[0].name.should eq 'Local and regional' + headings[0].display_order.should eq 0 + headings[1].name.should eq 'Miscellaneous' + headings[1].display_order.should eq 1 + end + + end + + context 'when validating' do + + it 'should require a name' do + heading = PublicBodyHeading.new + heading.should_not be_valid + heading.errors[:name].should == ["Name can't be blank"] + end + + it 'should require a unique name' do + heading = FactoryGirl.create(:public_body_heading) + new_heading = PublicBodyHeading.new(:name => heading.name) + new_heading.should_not be_valid + new_heading.errors[:name].should == ["Name is already taken"] + end + + it 'should set a default display order based on the next available display order' do + heading = PublicBodyHeading.new + heading.valid? + heading.display_order.should == PublicBodyHeading.next_display_order + end + end + + context 'when setting a display order' do + + it 'should return 0 if there are no public body headings' do + PublicBodyHeading.next_display_order.should == 0 + end + + it 'should return one more than the highest display order if there are public body headings' do + heading = FactoryGirl.create(:public_body_heading) + PublicBodyHeading.next_display_order.should == 1 + end + end +end diff --git a/spec/models/public_body_spec.rb b/spec/models/public_body_spec.rb index a7544c218..225958cac 100644 --- a/spec/models/public_body_spec.rb +++ b/spec/models/public_body_spec.rb @@ -546,6 +546,58 @@ CSV errors.should include("error: line 3: Url name URL name is already taken for authority 'Foobar Test'") end + it 'has a default list of fields to import' do + expected_fields = [ + ['name', '(i18n)<strong>Existing records cannot be renamed</strong>'], + ['short_name', '(i18n)'], + ['request_email', '(i18n)'], + ['notes', '(i18n)'], + ['publication_scheme', '(i18n)'], + ['disclosure_log', '(i18n)'], + ['home_page', ''], + ['tag_string', '(tags separated by spaces)'], + ] + + expect(PublicBody.csv_import_fields).to eq(expected_fields) + end + + it 'allows you to override the default list of fields to import' do + old_csv_import_fields = PublicBody.csv_import_fields.clone + expected_fields = [ + ['name', '(i18n)<strong>Existing records cannot be renamed</strong>'], + ['short_name', '(i18n)'], + ] + + PublicBody.csv_import_fields = expected_fields + + expect(PublicBody.csv_import_fields).to eq(expected_fields) + + # Reset our change so that we don't affect other specs + PublicBody.csv_import_fields = old_csv_import_fields + end + + it 'allows you to append to the default list of fields to import' do + old_csv_import_fields = PublicBody.csv_import_fields.clone + expected_fields = [ + ['name', '(i18n)<strong>Existing records cannot be renamed</strong>'], + ['short_name', '(i18n)'], + ['request_email', '(i18n)'], + ['notes', '(i18n)'], + ['publication_scheme', '(i18n)'], + ['disclosure_log', '(i18n)'], + ['home_page', ''], + ['tag_string', '(tags separated by spaces)'], + ['a_new_field', ''], + ] + + PublicBody.csv_import_fields << ['a_new_field', ''] + + expect(PublicBody.csv_import_fields).to eq(expected_fields) + + # Reset our change so that we don't affect other specs + PublicBody.csv_import_fields = old_csv_import_fields + end + end describe PublicBody do |