diff options
| author | Louise Crow <louise.crow@gmail.com> | 2012-08-22 17:34:51 +0100 | 
|---|---|---|
| committer | Louise Crow <louise.crow@gmail.com> | 2012-08-22 17:34:51 +0100 | 
| commit | e98bfd6e9ed7e6bb151d0eb5c216cad0fed6a40c (patch) | |
| tree | 222e151cf7ee87a06824553b2b53b2053c8f10a4 /spec/models | |
| parent | da70b7b4f58be9d78afba9ec6045d18094ea9581 (diff) | |
| parent | bc73110b230e607d4d7e5acae467790845784704 (diff) | |
Merge branch 'release/0.6.3'0.6.3
Diffstat (limited to 'spec/models')
| -rw-r--r-- | spec/models/censor_rule_spec.rb | 206 | ||||
| -rw-r--r-- | spec/models/incoming_message_spec.rb | 33 | ||||
| -rw-r--r-- | spec/models/info_request_spec.rb | 281 | 
3 files changed, 391 insertions, 129 deletions
diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 44087c5a6..c11b05a03 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -1,25 +1,197 @@  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') -describe CensorRule, "substituting things" do  -    before do -        @censor_rule = CensorRule.new -        @censor_rule.text = "goodbye" -        @censor_rule.replacement = "hello" +describe CensorRule, "substituting things" do + +    describe 'when using a text rule' do + +        before do +            @censor_rule = CensorRule.new +            @censor_rule.text = "goodbye" +            @censor_rule.replacement = "hello" +        end + +        it 'should do basic text substitution' do +            body = "I don't know why you say goodbye" +            @censor_rule.apply_to_text!(body) +            body.should == "I don't know why you say hello" +        end + +        it 'should keep size same for binary substitution' do +            body = "I don't know why you say goodbye" +            orig_body = body.dup +            @censor_rule.apply_to_binary!(body) +            body.size.should == orig_body.size +            body.should == "I don't know why you say xxxxxxx" +            body.should_not == orig_body # be sure duplicated as expected +        end +      end -    it 'should do basic text substitution' do  -        body = "I don't know why you say goodbye" -        @censor_rule.apply_to_text!(body) -        body.should == "I don't know why you say hello" +    describe "when using a regular expression rule" do + +        before do +            @censor_rule = CensorRule.new(:last_edit_editor => 1, +                                          :last_edit_comment => 'comment') +            @censor_rule.text = "--PRIVATE.*--PRIVATE" +            @censor_rule.replacement = "--REMOVED\nHidden private info\n--REMOVED" +            @censor_rule.regexp = true +            @body = +<<BODY +Some public information +--PRIVATE +Some private information +--PRIVATE +BODY +        end + +        it "replaces the regexp with the replacement text when applied to text" do +            @censor_rule.apply_to_text!(@body) +            @body.should == +<<BODY +Some public information +--REMOVED +Hidden private info +--REMOVED +BODY +        end + +        it "replaces the regexp with the same number of 'x' characters as the text replaced +            when applied to binary" do +            @censor_rule.apply_to_binary!(@body) +            @body.should == +<<BODY +Some public information +xxxxxxxxx +xxxxxxxxxxxxxxxxxxxxxxxx +xxxxxxxxx +BODY +        end + +    end + +end + +describe 'when validating rules' do + +    describe 'should be invalid without text' do +        censor_rule = CensorRule.new +        censor_rule.valid?.should == false +        censor_rule.errors.on(:text).should == "can't be blank"      end -    it 'should keep size same for binary substitution' do  -        body = "I don't know why you say goodbye" -        orig_body = body.dup -        @censor_rule.apply_to_binary!(body) -        body.size.should == orig_body.size -        body.should == "I don't know why you say xxxxxxx" -        body.should_not == orig_body # be sure duplicated as expected +    describe 'when validating a regexp rule' do + +        before do +            @censor_rule = CensorRule.new(:regexp => true, +                                          :text => '*') +        end + +        it 'should try to create a regexp from the text' do +            Regexp.should_receive(:new).with('*', Regexp::MULTILINE) +            @censor_rule.valid? +        end + +        describe 'if a regexp error is produced' do + +            it 'should add an error message to the text field with the regexp error message' do +                Regexp.stub!(:new).and_raise(RegexpError.new("very bad regexp")) +                @censor_rule.valid?.should == false +                @censor_rule.errors.on(:text).should == "very bad regexp" +            end + +        end + +        describe 'if no regexp error is produced' do + +            it 'should not add any error message to the text field' do +                Regexp.stub!(:new) +                @censor_rule.valid? +                @censor_rule.errors.on(:text).should == nil +            end + +        end +      end + +    describe 'when the allow_global flag has been set' do + +        before do +            @censor_rule = CensorRule.new(:text => 'some text') +            @censor_rule.allow_global = true +        end + +        it 'should allow a global censor rule (without user_id, request_id or public_body_id)' do +            @censor_rule.valid?.should == true +        end + +    end + +    describe 'when the allow_global flag has not been set' do + +        before do +            @censor_rule = CensorRule.new(:text => '/./') +        end + +        it 'should not allow a global text censor rule (without user_id, request_id or public_body_id)' do +            @censor_rule.valid?.should == false +            @expected_error = 'Censor must apply to an info request a user or a body;  is invalid' +            @censor_rule.errors.full_messages.should == [@expected_error] +        end + +        it 'should not allow a global regex censor rule (without user_id, request_id or public_body_id)' do +            @censor_rule.regexp = true +            @censor_rule.valid?.should == false +            @expected_error = 'Censor must apply to an info request a user or a body;  is invalid' +            @censor_rule.errors.full_messages.should == [@expected_error] +        end + +    end +  end -  + +describe 'when handling global rules' do + +    describe 'an instance without user_id, request_id or public_body_id' do + +        before do +            @global_rule = CensorRule.new +        end + +        it 'should return a value of true from is_global?' do +           @global_rule.is_global?.should == true +        end + +    end + +    describe 'the scope CensorRule.global.all' do + +        before do +            @global_rule = CensorRule.create!(:allow_global => true, +                                              :text => 'hide me', +                                              :replacement => 'nothing to see here', +                                              :last_edit_editor => 1, +                                              :last_edit_comment => 'comment') +            @user_rule = CensorRule.create!(:user_id => 1, +                                            :text => 'hide me', +                                            :replacement => 'nothing to see here', +                                            :last_edit_editor => 1, +                                            :last_edit_comment => 'comment') +        end + +        it 'should include an instance without user_id, request_id or public_body_id' do +            CensorRule.global.all.include?(@global_rule).should == true +        end + +        it 'should not include a request with user_id' do +            CensorRule.global.all.include?(@user_rule).should == false +        end + +        after do +            @global_rule.destroy if @global_rule +            @user_rule.destroy if @user_rule +        end +    end + +end + + diff --git a/spec/models/incoming_message_spec.rb b/spec/models/incoming_message_spec.rb index c6658905c..bc73ef071 100644 --- a/spec/models/incoming_message_spec.rb +++ b/spec/models/incoming_message_spec.rb @@ -71,7 +71,7 @@ describe IncomingMessage, " when dealing with incoming mail" do  end -describe IncomingMessage, "when parsing HTML mail" do  +describe IncomingMessage, "when parsing HTML mail" do      it "should display UTF-8 characters in the plain text version correctly" do          html = "<html><b>foo</b> është"          plain_text = IncomingMessage._get_attachment_text_internal_one_file('text/html', html) @@ -79,15 +79,15 @@ describe IncomingMessage, "when parsing HTML mail" do      end  end -describe IncomingMessage, "when getting the attachment text" do  +describe IncomingMessage, "when getting the attachment text" do -  it "should not raise an error if the expansion of a zip file raises an error" do  +  it "should not raise an error if the expansion of a zip file raises an error" do      mock_entry = mock('ZipFile entry', :file? => true)      mock_entry.stub!(:get_input_stream).and_raise("invalid distance too far back")      Zip::ZipFile.stub!(:open).and_return([mock_entry])      IncomingMessage._get_attachment_text_internal_one_file('application/zip', "some string")    end -   +  end @@ -196,17 +196,17 @@ describe IncomingMessage, " checking validity to reply to with real emails" do          ActionMailer::Base.deliveries.clear      end      it "should allow a reply to plain emails" do -        ir = info_requests(:fancy_dog_request)  +        ir = info_requests(:fancy_dog_request)          receive_incoming_mail('incoming-request-plain.email', ir.incoming_email)          ir.incoming_messages[1].valid_to_reply_to?.should == true      end      it "should not allow a reply to emails with empty return-paths" do -        ir = info_requests(:fancy_dog_request)  +        ir = info_requests(:fancy_dog_request)          receive_incoming_mail('empty-return-path.email', ir.incoming_email)          ir.incoming_messages[1].valid_to_reply_to?.should == false      end      it "should not allow a reply to emails with autoresponse headers" do -        ir = info_requests(:fancy_dog_request)  +        ir = info_requests(:fancy_dog_request)          receive_incoming_mail('autoresponse-header.email', ir.incoming_email)          ir.incoming_messages[1].valid_to_reply_to?.should == false      end @@ -234,6 +234,13 @@ describe IncomingMessage, " when censoring data" do          @censor_rule_2.last_edit_comment = "none"          @im.info_request.censor_rules << @censor_rule_2 +        @regex_censor_rule = CensorRule.new() +        @regex_censor_rule.text = 'm[a-z][a-z][a-z]e' +        @regex_censor_rule.regexp = true +        @regex_censor_rule.replacement = 'cat' +        @regex_censor_rule.last_edit_editor = 'unknown' +        @regex_censor_rule.last_edit_comment = 'none' +        @im.info_request.censor_rules << @regex_censor_rule          load_raw_emails_data      end @@ -246,7 +253,7 @@ describe IncomingMessage, " when censoring data" do      it "should replace censor text in Word documents" do          data = @test_data.dup          @im.binary_mask_stuff!(data, "application/vnd.ms-word") -        data.should == "There was a mouse called xxxxxxx, he wished that he was xxxx." +        data.should == "There was a xxxxx called xxxxxxx, he wished that he was xxxx."      end      it "should replace ASCII email addresses in Word documents" do @@ -301,7 +308,7 @@ describe IncomingMessage, " when censoring data" do      it "should apply censor rules to HTML files" do          data = @test_data.dup          @im.html_mask_stuff!(data) -        data.should == "There was a mouse called Jarlsberg, he wished that he was yellow." +        data.should == "There was a cat called Jarlsberg, he wished that he was yellow."      end      it "should apply hard-coded privacy rules to HTML files" do @@ -312,8 +319,8 @@ describe IncomingMessage, " when censoring data" do      end      it "should apply censor rules to From: addresses" do -        @im.stub!(:mail_from).and_return("Stilton Mouse")         -        @im.stub!(:last_parsed).and_return(Time.now)         +        @im.stub!(:mail_from).and_return("Stilton Mouse") +        @im.stub!(:last_parsed).and_return(Time.now)          safe_mail_from = @im.safe_mail_from          safe_mail_from.should == "Jarlsberg Mouse"      end @@ -363,7 +370,7 @@ describe IncomingMessage, " when uudecoding bad messages" do          im = incoming_messages(:useless_incoming_message)          im.stub!(:mail).and_return(mail)          im.extract_attachments! -         +          attachments = im.foi_attachments          attachments.size.should == 2          attachments[1].filename.should == 'moo.txt' @@ -407,7 +414,7 @@ describe IncomingMessage, "when messages are attached to messages" do          im = incoming_messages(:useless_incoming_message)          im.stub!(:mail).and_return(mail) -         +          im.extract_attachments!          attachments = im.get_attachments_for_display diff --git a/spec/models/info_request_spec.rb b/spec/models/info_request_spec.rb index a18a4bd1d..2a738fa4c 100644 --- a/spec/models/info_request_spec.rb +++ b/spec/models/info_request_spec.rb @@ -1,8 +1,8 @@  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') -describe InfoRequest do  +describe InfoRequest do -    describe "guessing a request from an email" do  +    describe "guessing a request from an email" do          before(:each) do              @im = incoming_messages(:useless_incoming_message) @@ -17,7 +17,7 @@ describe InfoRequest do              @info_request.idhash.should_not == nil          end -        it 'should find a request based on an email with an intact id and a broken hash' do  +        it 'should find a request based on an email with an intact id and a broken hash' do              ir = info_requests(:fancy_dog_request)              id = ir.id              @im.mail.to = "request-#{id}-asdfg@example.com" @@ -35,42 +35,42 @@ describe InfoRequest do      end -    describe "making up the URL title" do  +    describe "making up the URL title" do          before do              @info_request = InfoRequest.new          end -        it 'should remove spaces, and make lower case' do  +        it 'should remove spaces, and make lower case' do              @info_request.title = 'Something True'              @info_request.url_title.should == 'something_true'          end -        it 'should not allow a numeric title' do  +        it 'should not allow a numeric title' do              @info_request.title = '1234'              @info_request.url_title.should == 'request'          end      end -      -    describe "when asked for the last event id that needs description" do  -     + +    describe "when asked for the last event id that needs description" do +          before do              @info_request = InfoRequest.new          end -         -        it 'should return the last undescribed event id if there is one' do  + +        it 'should return the last undescribed event id if there is one' do              last_mock_event = mock_model(InfoRequestEvent)              other_mock_event = mock_model(InfoRequestEvent)              @info_request.stub!(:events_needing_description).and_return([other_mock_event, last_mock_event])              @info_request.last_event_id_needing_description.should == last_mock_event.id -        end  -         +        end +          it 'should return zero if there are no undescribed events' do              @info_request.stub!(:events_needing_description).and_return([])              @info_request.last_event_id_needing_description.should == 0          end -         +      end -     +      describe " when emailing" do          before do @@ -116,7 +116,7 @@ describe InfoRequest do                  hash_part = ir.incoming_email.match(/-[0-9a-f]+@/)[0]                  break if hash_part.match(/1/)              end -         +              # Make email with a 1 in the hash part changed to l              test_email = ir.incoming_email              new_hash_part = hash_part.gsub(/1/, "l") @@ -134,7 +134,7 @@ describe InfoRequest do          end          it "should return nil when receiving email for a deleted request" do -            deleted_request_address = InfoRequest.magic_email_for_id("request-", 98765)   +            deleted_request_address = InfoRequest.magic_email_for_id("request-", 98765)              found_info_request = InfoRequest.find_by_incoming_email(deleted_request_address)              found_info_request.should be_nil          end @@ -148,7 +148,7 @@ describe InfoRequest do              update_xapian_index          end -    end  +    end      describe "when calculating the status" do @@ -169,22 +169,22 @@ describe InfoRequest do          end          it "isn't overdue on due date (20 working days after request sent)" do -            Time.stub!(:now).and_return(Time.utc(2007, 11, 9, 23, 59))  +            Time.stub!(:now).and_return(Time.utc(2007, 11, 9, 23, 59))              @ir.calculate_status.should == 'waiting_response'          end          it "is overdue a day after due date (20 working days after request sent)" do -            Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))  +            Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))              @ir.calculate_status.should == 'waiting_response_overdue'          end          it "is still overdue 40 working days after request sent" do -            Time.stub!(:now).and_return(Time.utc(2007, 12, 10, 23, 59))  +            Time.stub!(:now).and_return(Time.utc(2007, 12, 10, 23, 59))              @ir.calculate_status.should == 'waiting_response_overdue'          end          it "is very overdue the day after 40 working days after request sent" do -            Time.stub!(:now).and_return(Time.utc(2007, 12, 11, 00, 01))  +            Time.stub!(:now).and_return(Time.utc(2007, 12, 11, 00, 01))              @ir.calculate_status.should == 'waiting_response_very_overdue'          end      end @@ -209,18 +209,18 @@ describe InfoRequest do          it "accepts extended states" do              # this time would normally be "overdue" -            Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))  +            Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))              @ir.set_described_state("deadline_extended")              @ir.display_status.should == 'Deadline extended.'              @ir.date_deadline_extended          end -         +          it "is not overdue if it's had the deadline extended" do              when_overdue = Time.utc(2007, 11, 10, 00, 01) + 16.days -            Time.stub!(:now).and_return(when_overdue)  +            Time.stub!(:now).and_return(when_overdue)              @ir.calculate_status.should == 'waiting_response_overdue'          end -         +      end @@ -245,160 +245,243 @@ describe InfoRequest do          end          it "isn't overdue on due date (20 working days after request sent)" do -            Time.stub!(:now).and_return(Time.utc(2007, 11, 9, 23, 59))  +            Time.stub!(:now).and_return(Time.utc(2007, 11, 9, 23, 59))              @ir.calculate_status.should == 'waiting_response'          end          it "is overdue a day after due date (20 working days after request sent)" do -            Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))  +            Time.stub!(:now).and_return(Time.utc(2007, 11, 10, 00, 01))              @ir.calculate_status.should == 'waiting_response_overdue'          end          it "is still overdue 40 working days after request sent" do -            Time.stub!(:now).and_return(Time.utc(2007, 12, 10, 23, 59))  +            Time.stub!(:now).and_return(Time.utc(2007, 12, 10, 23, 59))              @ir.calculate_status.should == 'waiting_response_overdue'          end          it "is still overdue the day after 40 working days after request sent" do -            Time.stub!(:now).and_return(Time.utc(2007, 12, 11, 00, 01))  +            Time.stub!(:now).and_return(Time.utc(2007, 12, 11, 00, 01))              @ir.calculate_status.should == 'waiting_response_overdue'          end          it "is still overdue 60 working days after request sent" do -            Time.stub!(:now).and_return(Time.utc(2008, 01, 11, 23, 59))  +            Time.stub!(:now).and_return(Time.utc(2008, 01, 11, 23, 59))              @ir.calculate_status.should == 'waiting_response_overdue'          end          it "is very overdue the day after 60 working days after request sent" do -            Time.stub!(:now).and_return(Time.utc(2008, 01, 12, 00, 01))  +            Time.stub!(:now).and_return(Time.utc(2008, 01, 12, 00, 01))              @ir.calculate_status.should == 'waiting_response_very_overdue'          end      end -   -    describe 'when asked if a user is the owning user for this request' do  -     -        before do  + +    describe 'when asked if a user is the owning user for this request' do + +        before do              @mock_user = mock_model(User)              @info_request = InfoRequest.new(:user => @mock_user)              @other_mock_user = mock_model(User)          end -         -        it 'should return false if a nil object is passed to it' do  + +        it 'should return false if a nil object is passed to it' do              @info_request.is_owning_user?(nil).should be_false          end -         -        it 'should return true if the user is the request\'s owner' do  + +        it 'should return true if the user is the request\'s owner' do              @info_request.is_owning_user?(@mock_user).should be_true          end -         -        it 'should return false for a user that is not the owner and does not own every request' do  + +        it 'should return false for a user that is not the owner and does not own every request' do              @other_mock_user.stub!(:owns_every_request?).and_return(false)              @info_request.is_owning_user?(@other_mock_user).should be_false          end -         +          it 'should return true if the user is not the owner but owns every request' do              @other_mock_user.stub!(:owns_every_request?).and_return(true)              @info_request.is_owning_user?(@other_mock_user).should be_true          end -         +      end -     -    describe 'when asked if it requires admin' do  -     -        before do  + +    describe 'when asked if it requires admin' do + +        before do              @info_request = InfoRequest.new          end -         -        it 'should return true if its described state is error_message' do  + +        it 'should return true if its described state is error_message' do              @info_request.described_state = 'error_message'              @info_request.requires_admin?.should be_true          end -         -        it 'should return true if its described state is requires_admin' do  + +        it 'should return true if its described state is requires_admin' do              @info_request.described_state = 'requires_admin'              @info_request.requires_admin?.should be_true          end -         -        it 'should return false if its described state is waiting_response' do  + +        it 'should return false if its described state is waiting_response' do              @info_request.described_state = 'waiting_response'              @info_request.requires_admin?.should be_false          end -         +      end -     -    describe 'when asked for old unclassified requests' do  -     -        before do  + +    describe 'when asked for old unclassified requests' do + +        before do              Time.stub!(:now).and_return(Time.utc(2007, 11, 9, 23, 59))          end -         -        it 'should ask for requests using any limit param supplied' do  -            InfoRequest.should_receive(:find).with(:all, {:select => anything,  -                                                          :order => anything,  -                                                          :conditions=> anything,  + +        it 'should ask for requests using any limit param supplied' do +            InfoRequest.should_receive(:find).with(:all, {:select => anything, +                                                          :order => anything, +                                                          :conditions=> anything,                                                            :limit => 5})              InfoRequest.find_old_unclassified(:limit => 5)          end -         -        it 'should not limit the number of requests returned by default' do  -            InfoRequest.should_not_receive(:find).with(:all, {:select => anything,  -                                                              :order => anything,  -                                                              :conditions=> anything,  + +        it 'should not limit the number of requests returned by default' do +            InfoRequest.should_not_receive(:find).with(:all, {:select => anything, +                                                              :order => anything, +                                                              :conditions=> anything,                                                                :limit => anything})              InfoRequest.find_old_unclassified -        end  -         -        it 'should add extra conditions if supplied' do  -            InfoRequest.should_receive(:find).with(:all,  -                  {:select=> anything,  -                   :order=> anything,  -                   :conditions=>["awaiting_description = ? and (select created_at from info_request_events where info_request_events.info_request_id = info_requests.id and info_request_events.event_type = 'response' order by created_at desc limit 1) < ? and url_title != 'holding_pen' and prominence != 'backpage'",  +        end + +        it 'should add extra conditions if supplied' do +            InfoRequest.should_receive(:find).with(:all, +                  {:select=> anything, +                   :order=> anything, +                   :conditions=>["awaiting_description = ? and (select created_at from info_request_events where info_request_events.info_request_id = info_requests.id and info_request_events.event_type = 'response' order by created_at desc limit 1) < ? and url_title != 'holding_pen' and prominence != 'backpage'",                      true, Time.now - 21.days]})              InfoRequest.find_old_unclassified({:conditions => ["prominence != 'backpage'"]})          end -         -        it 'should ask the database for requests that are awaiting description, have a last response older than 21 days old, are not the holding pen and are not backpaged' do  -            InfoRequest.should_receive(:find).with(:all,  -                  {:select=>"*, (select created_at from info_request_events where info_request_events.info_request_id = info_requests.id and info_request_events.event_type = 'response' order by created_at desc limit 1) as last_response_time",  -                   :order=>"last_response_time",  -                   :conditions=>["awaiting_description = ? and (select created_at from info_request_events where info_request_events.info_request_id = info_requests.id and info_request_events.event_type = 'response' order by created_at desc limit 1) < ? and url_title != 'holding_pen'",  + +        it 'should ask the database for requests that are awaiting description, have a last response older than 21 days old, are not the holding pen and are not backpaged' do +            InfoRequest.should_receive(:find).with(:all, +                  {:select=>"*, (select created_at from info_request_events where info_request_events.info_request_id = info_requests.id and info_request_events.event_type = 'response' order by created_at desc limit 1) as last_response_time", +                   :order=>"last_response_time", +                   :conditions=>["awaiting_description = ? and (select created_at from info_request_events where info_request_events.info_request_id = info_requests.id and info_request_events.event_type = 'response' order by created_at desc limit 1) < ? and url_title != 'holding_pen'",                      true, Time.now - 21.days]})              InfoRequest.find_old_unclassified          end -         +      end -     -    describe 'when an instance is asked if it is old and unclassified' do  -         -        before do  + +    describe 'when an instance is asked if it is old and unclassified' do + +        before do              Time.stub!(:now).and_return(Time.utc(2007, 11, 9, 23, 59))              @mock_comment_event = safe_mock_model(InfoRequestEvent, :created_at => Time.now - 23.days, :event_type => 'comment')              @mock_response_event = safe_mock_model(InfoRequestEvent, :created_at => Time.now - 22.days, :event_type => 'response') -            @info_request = InfoRequest.new(:prominence => 'normal',  -                                            :awaiting_description => true,  +            @info_request = InfoRequest.new(:prominence => 'normal', +                                            :awaiting_description => true,                                              :info_request_events => [@mock_response_event, @mock_comment_event])          end -         -        it 'should return false if it is the holding pen' do  + +        it 'should return false if it is the holding pen' do              @info_request.stub!(:url_title).and_return('holding_pen')              @info_request.is_old_unclassified?.should be_false          end -         -        it 'should return false if it is not awaiting description' do  + +        it 'should return false if it is not awaiting description' do              @info_request.stub!(:awaiting_description).and_return(false)              @info_request.is_old_unclassified?.should be_false          end -         -        it 'should return false if its last response event occurred less than 21 days ago' do  + +        it 'should return false if its last response event occurred less than 21 days ago' do              @mock_response_event.stub!(:created_at).and_return(Time.now - 20.days)              @info_request.is_old_unclassified?.should be_false          end -         -        it 'should return true if it is awaiting description, isn\'t the holding pen and hasn\'t had an event in 21 days' do  + +        it 'should return true if it is awaiting description, isn\'t the holding pen and hasn\'t had an event in 21 days' do              @info_request.is_old_unclassified?.should be_true          end -         +      end -     + +    describe 'when applying censor rules' do + +        before do +            @global_rule = mock_model(CensorRule, :apply_to_text! => nil, +                                                  :apply_to_binary! => nil) +            @user_rule = mock_model(CensorRule, :apply_to_text! => nil, +                                                :apply_to_binary! => nil) +            @request_rule = mock_model(CensorRule, :apply_to_text! => nil, +                                                   :apply_to_binary! => nil) +            @body_rule = mock_model(CensorRule, :apply_to_text! => nil, +                                                :apply_to_binary! => nil) +            @user = mock_model(User, :censor_rules => [@user_rule]) +            @body = mock_model(PublicBody, :censor_rules => [@body_rule]) +            @info_request = InfoRequest.new(:prominence => 'normal', +                                            :awaiting_description => true, +                                            :title => 'title') +            @info_request.stub!(:user).and_return(@user) +            @info_request.stub!(:censor_rules).and_return([@request_rule]) +            @info_request.stub!(:public_body).and_return(@body) +            @text = 'some text' +            CensorRule.stub!(:global).and_return(mock('global context', :all => [@global_rule])) +        end + +        context "when applying censor rules to text" do + +            it "should apply a global censor rule" do +                @global_rule.should_receive(:apply_to_text!).with(@text) +                @info_request.apply_censor_rules_to_text!(@text) +            end + +            it 'should apply a user rule' do +                @user_rule.should_receive(:apply_to_text!).with(@text) +                @info_request.apply_censor_rules_to_text!(@text) +            end + +            it 'should not raise an error if there is no user' do +                @info_request.user_id = nil +                lambda{ @info_request.apply_censor_rules_to_text!(@text) }.should_not raise_error +            end + +            it 'should apply a rule from the body associated with the request' do +                @body_rule.should_receive(:apply_to_text!).with(@text) +                @info_request.apply_censor_rules_to_text!(@text) +            end + +            it 'should apply a request rule' do +                @request_rule.should_receive(:apply_to_text!).with(@text) +                @info_request.apply_censor_rules_to_text!(@text) +            end + +        end + +        context 'when applying censor rules to binary files' do + +            it "should apply a global censor rule" do +                @global_rule.should_receive(:apply_to_binary!).with(@text) +                @info_request.apply_censor_rules_to_binary!(@text) +            end + +            it 'should apply a user rule' do +                @user_rule.should_receive(:apply_to_binary!).with(@text) +                @info_request.apply_censor_rules_to_binary!(@text) +            end + +            it 'should not raise an error if there is no user' do +                @info_request.user_id = nil +                lambda{ @info_request.apply_censor_rules_to_binary!(@text) }.should_not raise_error +            end + +            it 'should apply a rule from the body associated with the request' do +                @body_rule.should_receive(:apply_to_binary!).with(@text) +                @info_request.apply_censor_rules_to_binary!(@text) +            end + +            it 'should apply a request rule' do +                @request_rule.should_receive(:apply_to_binary!).with(@text) +                @info_request.apply_censor_rules_to_binary!(@text) +            end + +        end + +    end +  end  | 
