From 088bc961328f4d876971994102cde52c1ad49246 Mon Sep 17 00:00:00 2001 From: Seb Bacon Date: Thu, 12 Jul 2012 13:04:27 +0100 Subject: Support regular expressions in CensorRules; also support 'global' CensorRules that aren't attached to a User or Request or Public Body (but don't expose this in the admin UI). Fixes #33 --- spec/models/censor_rule_spec.rb | 42 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'spec/models/censor_rule_spec.rb') diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 44087c5a6..d5797ec74 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -21,5 +21,45 @@ describe CensorRule, "substituting things" do body.should == "I don't know why you say xxxxxxx" body.should_not == orig_body # be sure duplicated as expected end + + context "when regexp type" do + before do + CensorRule.delete_all + CensorRule.create(:last_edit_editor => 1, + :last_edit_comment => 'comment') + @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 + end + + it "replaces with the regexp" do + body = +< Date: Tue, 14 Aug 2012 11:20:51 +0100 Subject: Add concept of global censor rules as orthogonal to regex censor rules. Apply global rules to every request, not regex rules. --- spec/models/censor_rule_spec.rb | 127 +++++++++++++++++++++++++++++++--------- 1 file changed, 100 insertions(+), 27 deletions(-) (limited to 'spec/models/censor_rule_spec.rb') diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index d5797ec74..6b48ac317 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -1,32 +1,35 @@ 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" - end +describe CensorRule, "substituting things" do - 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 + 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 - 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 - context "when regexp type" do + describe "when using a regular expression rule" do + before do - CensorRule.delete_all - CensorRule.create(:last_edit_editor => 1, - :last_edit_comment => 'comment') @censor_rule = CensorRule.new(:last_edit_editor => 1, :last_edit_comment => 'comment') @censor_rule.text = "--PRIVATE.*--PRIVATE" @@ -52,14 +55,84 @@ Hidden private info BODY end - it "validates without info_request, user or public body set" do - @censor_rule.save.should be_true + end + +end + +describe 'when validating rules' do + + describe 'when the allow_global flag has been set' do + + before do + @censor_rule = CensorRule.new + @censor_rule.allow_global = true end - it "has scope for regexps" do - @censor_rule.save - CensorRule.regexps.all.should == [@censor_rule] + 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() + end + + it 'should not allow a global 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 + + 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 + + -- cgit v1.2.3 From c6d5020a9a48226feaccd856df0c8f4584d5fd08 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Tue, 14 Aug 2012 14:14:35 +0100 Subject: Handle regexp rules when running censor rules on binary files. --- spec/models/censor_rule_spec.rb | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'spec/models/censor_rule_spec.rb') diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 6b48ac317..de9651f01 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -35,23 +35,35 @@ describe CensorRule, "substituting things" do @censor_rule.text = "--PRIVATE.*--PRIVATE" @censor_rule.replacement = "--REMOVED\nHidden private info\n--REMOVED" @censor_rule.regexp = true - end - - it "replaces with the regexp" do - body = + @body = < Date: Tue, 14 Aug 2012 15:29:45 +0100 Subject: Make global validation work correctly for regex censor rules. --- spec/models/censor_rule_spec.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'spec/models/censor_rule_spec.rb') diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index de9651f01..443bbe449 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -89,10 +89,17 @@ describe 'when validating rules' do describe 'when the allow_global flag has not been set' do before do - @censor_rule = CensorRule.new() + @censor_rule = CensorRule.new end - it 'should not allow a global censor rule (without user_id, request_id or public_body_id)' do + 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] -- cgit v1.2.3 From 21082cc55d3d61edce660ea7a73ec80380359e2f Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Tue, 14 Aug 2012 16:31:03 +0100 Subject: Add basic validation for regexp censor rules that a valid regexp can be created with the text of the rule. --- spec/models/censor_rule_spec.rb | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'spec/models/censor_rule_spec.rb') diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 443bbe449..471a73fa2 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -73,6 +73,40 @@ end describe 'when validating rules' do + 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 @@ -89,7 +123,7 @@ describe 'when validating rules' do describe 'when the allow_global flag has not been set' do before do - @censor_rule = CensorRule.new + @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 -- cgit v1.2.3 From 495a29cd593ac0a270ebb3bf1c1ff85f03b52e31 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Tue, 14 Aug 2012 16:41:52 +0100 Subject: Validate presence of text to replace in censor rules. --- spec/models/censor_rule_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'spec/models/censor_rule_spec.rb') diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 471a73fa2..1965b0894 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -73,6 +73,12 @@ 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 + describe 'when validating a regexp rule' do before do -- cgit v1.2.3 From 86e4169d4bad7a687aa7a60082a466841bfd99d6 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Tue, 14 Aug 2012 16:51:21 +0100 Subject: Add warning about regex censor rules. Fix spec to accommodate validation of text presence. --- spec/models/censor_rule_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/censor_rule_spec.rb') diff --git a/spec/models/censor_rule_spec.rb b/spec/models/censor_rule_spec.rb index 1965b0894..c11b05a03 100644 --- a/spec/models/censor_rule_spec.rb +++ b/spec/models/censor_rule_spec.rb @@ -116,7 +116,7 @@ describe 'when validating rules' do describe 'when the allow_global flag has been set' do before do - @censor_rule = CensorRule.new + @censor_rule = CensorRule.new(:text => 'some text') @censor_rule.allow_global = true end -- cgit v1.2.3