aboutsummaryrefslogtreecommitdiffstats
path: root/spec/models/xapian_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/xapian_spec.rb')
-rw-r--r--spec/models/xapian_spec.rb124
1 files changed, 99 insertions, 25 deletions
diff --git a/spec/models/xapian_spec.rb b/spec/models/xapian_spec.rb
index b0c122f50..c2a87b969 100644
--- a/spec/models/xapian_spec.rb
+++ b/spec/models/xapian_spec.rb
@@ -3,42 +3,52 @@ require File.dirname(__FILE__) + '/../spec_helper'
describe User, " when indexing users with Xapian" do
fixtures :users
- before(:all) do
- rebuild_xapian_index
- end
-
it "should search by name" do
+ rebuild_xapian_index
# def InfoRequest.full_search(models, query, order, ascending, collapse, per_page, page)
xapian_object = InfoRequest.full_search([User], "Silly", 'created_at', true, nil, 100, 1)
xapian_object.results.size.should == 1
xapian_object.results[0][:model].should == users(:silly_name_user)
end
-
end
describe PublicBody, " when indexing public bodies with Xapian" do
- fixtures :public_bodies
+ fixtures :public_bodies, :incoming_messages, :outgoing_messages, :raw_emails, :comments
- before(:all) do
+ it "should search index the main name field" do
rebuild_xapian_index
- end
- it "should search index the main name field" do
xapian_object = InfoRequest.full_search([PublicBody], "humpadinking", 'created_at', true, nil, 100, 1)
xapian_object.results.size.should == 1
xapian_object.results[0][:model].should == public_bodies(:humpadink_public_body)
end
it "should search index the notes field" do
+ rebuild_xapian_index
+
xapian_object = InfoRequest.full_search([PublicBody], "albatross", 'created_at', true, nil, 100, 1)
xapian_object.results.size.should == 1
xapian_object.results[0][:model].should == public_bodies(:humpadink_public_body)
end
+ it "should delete public bodies from the index when they are deleted" do
+ rebuild_xapian_index
+
+ xapian_object = InfoRequest.full_search([PublicBody], "albatross", 'created_at', true, nil, 100, 1)
+ xapian_object.results.size.should == 1
+ xapian_object.results[0][:model].should == public_bodies(:humpadink_public_body)
+
+ public_bodies(:humpadink_public_body).delete
+
+ update_xapian_index
+ xapian_object = InfoRequest.full_search([PublicBody], "albatross", 'created_at', true, nil, 100, 1)
+ xapian_object.results.size.should == 0
+ end
+
end
describe PublicBody, " when indexing requests by body they are to" do
- fixtures :public_bodies, :info_request_events, :info_requests
+ fixtures :public_bodies, :info_request_events, :info_requests, :raw_emails, :comments
it "should find requests to the body" do
rebuild_xapian_index
@@ -47,8 +57,6 @@ describe PublicBody, " when indexing requests by body they are to" do
end
it "should update index correctly when URL name of body changes" do
- verbose = false
-
# initial search
rebuild_xapian_index
xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_from:tgq", 'created_at', true, nil, 100, 1)
@@ -60,7 +68,7 @@ describe PublicBody, " when indexing requests by body they are to" do
body.short_name = 'GQ'
body.save!
body.url_name.should == 'gq'
- ActsAsXapian.update_index(true, verbose) # true = flush to disk
+ update_xapian_index
# check we get results expected
xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_from:tgq", 'created_at', true, nil, 100, 1)
@@ -71,10 +79,32 @@ describe PublicBody, " when indexing requests by body they are to" do
models_found_before.should == models_found_after
end
+
+ # if you index via the Xapian TermGenerator, it ignores terms of this length,
+ # this checks we're using Document:::add_term() instead
+ it "should work with URL names that are longer than 64 characters" do
+ rebuild_xapian_index
+
+ # change the URL name of the body
+ body = public_bodies(:geraldine_public_body)
+ body.short_name = 'The Uncensored, Complete Name of the Quasi-Autonomous Public Body Also Known As Geraldine'
+ body.save!
+ body.url_name.size.should > 70
+ update_xapian_index
+
+ # check we get results expected
+ xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_from:tgq", 'created_at', true, nil, 100, 1)
+ xapian_object.results.size.should == 0
+ xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_from:gq", 'created_at', true, nil, 100, 1)
+ xapian_object.results.size.should == 0
+ xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_from:" + body.url_name, 'created_at', true, nil, 100, 1)
+ xapian_object.results.size.should == 4
+ models_found_after = xapian_object.results.map { |x| x[:model] }
+ end
end
describe User, " when indexing requests by user they are from" do
- fixtures :users, :info_request_events, :info_requests
+ fixtures :users, :info_request_events, :info_requests, :incoming_messages, :outgoing_messages, :raw_emails, :comments
it "should find requests from the user" do
rebuild_xapian_index
@@ -82,9 +112,57 @@ describe User, " when indexing requests by user they are from" do
xapian_object.results.size.should == 4
end
- it "should update index correctly when URL name of user changes" do
- verbose = false
+ it "should find just the sent message events from a particular user" do
+ rebuild_xapian_index
+ # def InfoRequest.full_search(models, query, order, ascending, collapse, per_page, page)
+ xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_by:bob_smith variety:sent", 'created_at', true, nil, 100, 1)
+ xapian_object.results.size.should == 2
+ xapian_object.results[1][:model].should == info_request_events(:useless_outgoing_message_event)
+ xapian_object.results[0][:model].should == info_request_events(:silly_outgoing_message_event)
+ end
+
+ it "should not find it when one of the request's users is changed" do
+ rebuild_xapian_index
+ silly_user = users(:silly_name_user)
+ naughty_chicken_request = info_requests(:naughty_chicken_request)
+ naughty_chicken_request.user = silly_user
+ naughty_chicken_request.save!
+ update_xapian_index
+
+ # def InfoRequest.full_search(models, query, order, ascending, collapse, per_page, page)
+ xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_by:bob_smith", 'created_at', true, 'request_collapse', 100, 1)
+ xapian_object.results.size.should == 1
+ xapian_object.results[0][:model].should == info_request_events(:silly_comment_event)
+ end
+
+ it "should not get confused searching for requests when one user has a name which has same stem as another" do
+ rebuild_xapian_index
+
+ bob_smith_user = users(:bob_smith_user)
+ bob_smith_user.name = "John King"
+ bob_smith_user.url_name.should == 'john_king'
+ bob_smith_user.save!
+
+ silly_user = users(:silly_name_user)
+ silly_user.name = "John K"
+ silly_user.url_name.should == 'john_k'
+ silly_user.save!
+
+ naughty_chicken_request = info_requests(:naughty_chicken_request)
+ naughty_chicken_request.user = silly_user
+ naughty_chicken_request.save!
+
+ update_xapian_index
+
+ # def InfoRequest.full_search(models, query, order, ascending, collapse, per_page, page)
+ xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_by:john_k", 'created_at', true, 'request_collapse', 100, 1)
+ xapian_object.results.size.should == 1
+ xapian_object.results[0][:model].should == info_request_events(:silly_outgoing_message_event)
+ end
+
+
+ it "should update index correctly when URL name of user changes" do
# initial search
rebuild_xapian_index
xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_by:bob_smith", 'created_at', true, nil, 100, 1)
@@ -96,7 +174,7 @@ describe User, " when indexing requests by user they are from" do
u.name = 'Robert Smith'
u.save!
u.url_name.should == 'robert_smith'
- ActsAsXapian.update_index(flush_to_disk=true, verbose)
+ update_xapian_index
# check we get results expected
xapian_object = InfoRequest.full_search([InfoRequestEvent], "requested_by:bob_smith", 'created_at', true, nil, 100, 1)
@@ -110,7 +188,7 @@ describe User, " when indexing requests by user they are from" do
end
describe User, " when indexing comments by user they are by" do
- fixtures :users, :info_request_events, :info_requests, :comments
+ fixtures :users, :info_request_events, :info_requests, :comments, :incoming_messages, :outgoing_messages, :raw_emails, :comments
it "should find requests from the user" do
rebuild_xapian_index
@@ -119,8 +197,6 @@ describe User, " when indexing comments by user they are by" do
end
it "should update index correctly when URL name of user changes" do
- verbose = false
-
# initial search
rebuild_xapian_index
xapian_object = InfoRequest.full_search([InfoRequestEvent], "commented_by:silly_emnameem", 'created_at', true, nil, 100, 1)
@@ -132,7 +208,7 @@ describe User, " when indexing comments by user they are by" do
u.name = 'Silly Name'
u.save!
u.url_name.should == 'silly_name'
- ActsAsXapian.update_index(true, verbose) # true = flush to disk
+ update_xapian_index
# check we get results expected
xapian_object = InfoRequest.full_search([InfoRequestEvent], "commented_by:silly_emnameem", 'created_at', true, nil, 100, 1)
@@ -146,7 +222,7 @@ describe User, " when indexing comments by user they are by" do
end
describe InfoRequest, " when indexing requests by their title" do
- fixtures :info_request_events, :info_requests, :incoming_messages
+ fixtures :info_request_events, :info_requests, :incoming_messages, :raw_emails, :comments
it "should find events for the request" do
rebuild_xapian_index
@@ -156,15 +232,13 @@ describe InfoRequest, " when indexing requests by their title" do
end
it "should update index correctly when URL title of request changes" do
- verbose = false
-
# change the URL name of the body
rebuild_xapian_index
ir = info_requests(:naughty_chicken_request)
ir.title = 'Really naughty'
ir.save!
ir.url_title.should == 'really_naughty'
- ActsAsXapian.update_index(true, verbose) # true = flush to disk
+ update_xapian_index
# check we get results expected
xapian_object = InfoRequest.full_search([InfoRequestEvent], "request:how_much_public_money_is_wasted_o", 'created_at', true, nil, 100, 1)