bcms_google_mini_search 1.2.1 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/bcms_google_mini_search.rb +1 -0
- data/lib/bcms_google_mini_search/gsa.rb +3 -3
- metadata +8 -21
- data/test/performance/browsing_test.rb +0 -9
- data/test/test_helper.rb +0 -39
- data/test/unit/gsa_test.rb +0 -182
- data/test/unit/helpers/search_engine_helper_test.rb +0 -4
- data/test/unit/portlets/google_mini_search_engine_portlet_test.rb +0 -53
- data/test/unit/portlets/search_box_portlet_test.rb +0 -9
- data/test/unit/search_result_test.rb +0 -587
@@ -112,9 +112,9 @@ module GSA
|
|
112
112
|
def initialize(xml_element = nil)
|
113
113
|
return if xml_element == nil
|
114
114
|
self.number = xml_element.attributes["N"]
|
115
|
-
self.title = xml_element.elements["T"].text
|
116
|
-
self.url = xml_element.elements["U"].text
|
117
|
-
self.description = xml_element.elements["S"].text
|
115
|
+
self.title = xml_element.elements["T"].try(:text)
|
116
|
+
self.url = xml_element.elements["U"].try(:text)
|
117
|
+
self.description = xml_element.elements["S"].try(:text)
|
118
118
|
|
119
119
|
cache_element = xml_element.elements["HAS/C"]
|
120
120
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bcms_google_mini_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 1.2.
|
9
|
+
- 2
|
10
|
+
version: 1.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- BrowserMedia
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-11-01 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -43,13 +43,6 @@ files:
|
|
43
43
|
- lib/bcms_google_mini_search/routes.rb
|
44
44
|
- rails/init.rb
|
45
45
|
- README.markdown
|
46
|
-
- test/performance/browsing_test.rb
|
47
|
-
- test/test_helper.rb
|
48
|
-
- test/unit/gsa_test.rb
|
49
|
-
- test/unit/helpers/search_engine_helper_test.rb
|
50
|
-
- test/unit/portlets/google_mini_search_engine_portlet_test.rb
|
51
|
-
- test/unit/portlets/search_box_portlet_test.rb
|
52
|
-
- test/unit/search_result_test.rb
|
53
46
|
has_rdoc: true
|
54
47
|
homepage: http://github.com/browsermedia/bcms_google_mini_search
|
55
48
|
licenses: []
|
@@ -80,15 +73,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
73
|
requirements: []
|
81
74
|
|
82
75
|
rubyforge_project: bcms_google_mini_search
|
83
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.6.2
|
84
77
|
signing_key:
|
85
78
|
specification_version: 3
|
86
79
|
summary: A Google Mini Search Module for BrowserCMS
|
87
|
-
test_files:
|
88
|
-
|
89
|
-
- test/test_helper.rb
|
90
|
-
- test/unit/gsa_test.rb
|
91
|
-
- test/unit/helpers/search_engine_helper_test.rb
|
92
|
-
- test/unit/portlets/google_mini_search_engine_portlet_test.rb
|
93
|
-
- test/unit/portlets/search_box_portlet_test.rb
|
94
|
-
- test/unit/search_result_test.rb
|
80
|
+
test_files: []
|
81
|
+
|
data/test/test_helper.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
ENV["RAILS_ENV"] = "test"
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
|
3
|
-
require 'test_help'
|
4
|
-
require 'mocha'
|
5
|
-
|
6
|
-
class ActiveSupport::TestCase
|
7
|
-
# Transactional fixtures accelerate your tests by wrapping each test method
|
8
|
-
# in a transaction that's rolled back on completion. This ensures that the
|
9
|
-
# test database remains unchanged so your fixtures don't have to be reloaded
|
10
|
-
# between every test method. Fewer database queries means faster tests.
|
11
|
-
#
|
12
|
-
# Read Mike Clark's excellent walkthrough at
|
13
|
-
# http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
|
14
|
-
#
|
15
|
-
# Every Active Record database supports transactions except MyISAM tables
|
16
|
-
# in MySQL. Turn off transactional fixtures in this case; however, if you
|
17
|
-
# don't care one way or the other, switching from MyISAM to InnoDB tables
|
18
|
-
# is recommended.
|
19
|
-
#
|
20
|
-
# The only drawback to using transactional fixtures is when you actually
|
21
|
-
# need to test transactions. Since your test is bracketed by a transaction,
|
22
|
-
# any transactions started in your code will be automatically rolled back.
|
23
|
-
self.use_transactional_fixtures = true
|
24
|
-
|
25
|
-
# Instantiated fixtures are slow, but give you @david where otherwise you
|
26
|
-
# would need people(:david). If you don't want to migrate your existing
|
27
|
-
# test cases which use the @david style and don't mind the speed hit (each
|
28
|
-
# instantiated fixtures translates to a database query per test method),
|
29
|
-
# then set this back to true.
|
30
|
-
self.use_instantiated_fixtures = false
|
31
|
-
|
32
|
-
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
|
33
|
-
#
|
34
|
-
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
35
|
-
# -- they do not yet inherit this setting
|
36
|
-
fixtures :all
|
37
|
-
|
38
|
-
# Add more helper methods to be used by all tests here...
|
39
|
-
end
|
data/test/unit/gsa_test.rb
DELETED
@@ -1,182 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class GSA::ApplianceTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
test "Create Engine" do
|
6
|
-
app = GSA::Engine.new
|
7
|
-
app.host = "http://example.com"
|
8
|
-
assert_equal "http://example.com", app.host
|
9
|
-
assert_equal 8080, app.port
|
10
|
-
assert_equal "/search", app.path
|
11
|
-
end
|
12
|
-
|
13
|
-
test "Create from options" do
|
14
|
-
app = GSA::Engine.new({:host=>"http://example.com", :front_end=>"F", :collection=>"C"})
|
15
|
-
assert_equal "http://example.com", app.host
|
16
|
-
assert_equal "F", app.default_front_end
|
17
|
-
assert_equal "C", app.default_collection
|
18
|
-
end
|
19
|
-
|
20
|
-
test "options_for_query" do
|
21
|
-
options = {:host=>"http://example.com", :front_end=>"F", :collection=>"C"}
|
22
|
-
app = GSA::Engine.new(options)
|
23
|
-
assert_equal options, app.options_for_query
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class SuggestedQueries < ActiveSupport::TestCase
|
28
|
-
|
29
|
-
def setup
|
30
|
-
@cluster_xml = <<XML
|
31
|
-
<toplevel>
|
32
|
-
<Response>
|
33
|
-
<algorithm data="Concepts"/>
|
34
|
-
<t_cluster int="95"/>
|
35
|
-
<cluster>
|
36
|
-
<gcluster>
|
37
|
-
<label data="label 0"/>
|
38
|
-
</gcluster>
|
39
|
-
<gcluster>
|
40
|
-
<label data="label 1"/>
|
41
|
-
</gcluster>
|
42
|
-
<gcluster>
|
43
|
-
<label data="label 2"/>
|
44
|
-
</gcluster>
|
45
|
-
<gcluster>
|
46
|
-
<label data="label 3"/>
|
47
|
-
</gcluster>
|
48
|
-
<gcluster>
|
49
|
-
<label data="label 4"/>
|
50
|
-
</gcluster>
|
51
|
-
<gcluster>
|
52
|
-
<label data="label 5"/>
|
53
|
-
</gcluster>
|
54
|
-
<gcluster>
|
55
|
-
<label data="label 6"/>
|
56
|
-
</gcluster>
|
57
|
-
<gcluster>
|
58
|
-
<label data="label 7"/>
|
59
|
-
</gcluster>
|
60
|
-
<gcluster>
|
61
|
-
<label data="label 8"/>
|
62
|
-
</gcluster>
|
63
|
-
<gcluster>
|
64
|
-
<label data="label 9"/>
|
65
|
-
</gcluster>
|
66
|
-
</cluster>
|
67
|
-
</Response>
|
68
|
-
</toplevel>
|
69
|
-
XML
|
70
|
-
|
71
|
-
@app = GSA::Appliance.new(:host=>"http://example.com", :collection=>"My_Collection", :front_end=>"My_Front")
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
test "parse results" do
|
76
|
-
suggested_queries = GSA::SuggestedQueries.new(@cluster_xml)
|
77
|
-
assert_equal 10, suggested_queries.size
|
78
|
-
assert_equal "label 0", suggested_queries[0].query
|
79
|
-
assert_equal "label 9", suggested_queries[9].query
|
80
|
-
end
|
81
|
-
|
82
|
-
test "Google Search Appliances should generate the URL for Dynamic Results Clustering" do
|
83
|
-
expected = "http://example.com/cluster?coutput=xml&q=TEST&site=My_Collection&client=My_Front&output=xml_no_dtd&oe=UTF-8&ie=UTF-8"
|
84
|
-
assert_equal expected, @app.send(:narrow_search_results_url, "TEST")
|
85
|
-
end
|
86
|
-
|
87
|
-
test "URLs will escape queries" do
|
88
|
-
expected = "http://example.com/cluster?coutput=xml&q=TWO+WORDS&site=My_Collection&client=My_Front&output=xml_no_dtd&oe=UTF-8&ie=UTF-8"
|
89
|
-
assert_equal expected, @app.send(:narrow_search_results_url, "TWO WORDS")
|
90
|
-
end
|
91
|
-
|
92
|
-
test "find narrowed search results" do
|
93
|
-
@app.expects(:narrow_search_results_url).with("TEST").returns("EXPECTED URL")
|
94
|
-
SearchResult.expects(:fetch_document).with("EXPECTED URL").returns("XML Content")
|
95
|
-
expected_suggestions = mock()
|
96
|
-
GSA::SuggestedQueries.expects(:new).with("XML Content").returns(expected_suggestions)
|
97
|
-
|
98
|
-
assert_equal expected_suggestions, @app.find_narrow_search_results("TEST")
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
test "each_with_index" do
|
103
|
-
suggestions = GSA::SuggestedQueries.new(@cluster_xml)
|
104
|
-
count = 0
|
105
|
-
suggestions.each_with_index do |s, i|
|
106
|
-
assert_not_nil s
|
107
|
-
assert_not_nil i
|
108
|
-
count += 1
|
109
|
-
end
|
110
|
-
assert_equal suggestions.size, count
|
111
|
-
end
|
112
|
-
|
113
|
-
test "each" do
|
114
|
-
suggestions = GSA::SuggestedQueries.new(@cluster_xml)
|
115
|
-
count = 0
|
116
|
-
suggestions.each do |s|
|
117
|
-
assert_not_nil s
|
118
|
-
count += 1
|
119
|
-
end
|
120
|
-
assert_equal suggestions.size, count
|
121
|
-
end
|
122
|
-
|
123
|
-
test "A nil query should return an empty set of Suggested Queries" do
|
124
|
-
r = @app.find_narrow_search_results(nil)
|
125
|
-
assert_equal 0, r.size
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
class ResultsTest < ActiveSupport::TestCase
|
130
|
-
|
131
|
-
def setup
|
132
|
-
@results = GSA::Results.new
|
133
|
-
@results.query = "QUERY"
|
134
|
-
@result = GSA::Result.new
|
135
|
-
@result.results = @results
|
136
|
-
|
137
|
-
@engine = GSA::Engine.new(:host=>"http://mini.someurl.com")
|
138
|
-
@query = GSA::Query.new(:engine=>@engine, :collection=>"COLLECT", :front_end=>"FRONT_END")
|
139
|
-
end
|
140
|
-
|
141
|
-
test "Create result from xml" do
|
142
|
-
xml = <<XML
|
143
|
-
<R N="1">
|
144
|
-
<U>http://someurl.com</U>
|
145
|
-
<T>TITLE</T>
|
146
|
-
<S>BLURB</S>
|
147
|
-
<HAS>
|
148
|
-
<C SZ="1k" CID="Ax1j5"/>
|
149
|
-
</HAS>
|
150
|
-
</R>
|
151
|
-
XML
|
152
|
-
xml_doc = REXML::Document.new(xml)
|
153
|
-
result = GSA::Result.new(xml_doc.elements.first)
|
154
|
-
assert_equal "http://someurl.com", result.url
|
155
|
-
assert_equal "TITLE", result.title
|
156
|
-
assert_equal "BLURB", result.description
|
157
|
-
assert_equal "1k", result.size
|
158
|
-
assert_equal "1", result.number
|
159
|
-
assert_equal "Ax1j5", result.cache_id
|
160
|
-
end
|
161
|
-
|
162
|
-
test "cached_document_param" do
|
163
|
-
@result.cache_id = "A2B"
|
164
|
-
@result.url = "http://example.com"
|
165
|
-
|
166
|
-
assert_equal "cache:A2B:http://example.com+QUERY", @result.cached_document_param
|
167
|
-
end
|
168
|
-
|
169
|
-
test "cached_document_param with no result attached" do
|
170
|
-
@result.results = nil
|
171
|
-
@result.cache_id = "A2B"
|
172
|
-
@result.url = "http://example.com"
|
173
|
-
|
174
|
-
assert_equal "cache:A2B:http://example.com", @result.cached_document_param
|
175
|
-
end
|
176
|
-
|
177
|
-
test "cached_document_url" do
|
178
|
-
@result.expects(:cached_document_param).returns("cache:something")
|
179
|
-
expected_url = "http://mini.someurl.com/search?q=cache%3Asomething&output=xml_no_dtd&client=FRONT_END&site=COLLECT&filter=0&proxystylesheet=FRONT_END&oe=UTF-8&ie=UTF-8"
|
180
|
-
assert_equal expected_url, @result.cached_document_url(@query)
|
181
|
-
end
|
182
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '/../../test_helper')
|
2
|
-
|
3
|
-
class GoogleMiniSearchEngineTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@portlet = GoogleMiniSearchEnginePortlet.new(:name=>"Engine", :path => "/engine")
|
7
|
-
end
|
8
|
-
|
9
|
-
test "Should be able to create new instance of a portlet" do
|
10
|
-
assert GoogleMiniSearchEnginePortlet.create!(:name => "New Portlet")
|
11
|
-
end
|
12
|
-
|
13
|
-
test "Path attribute can be set in constructor" do
|
14
|
-
portlet = GoogleMiniSearchEnginePortlet.create!(:name=>"Engine", :path => "/engine")
|
15
|
-
assert_equal "/engine", portlet.path
|
16
|
-
end
|
17
|
-
|
18
|
-
test "Determine if Narrow Your Search is enabled?" do
|
19
|
-
@portlet.enable_narrow_your_search = "1"
|
20
|
-
assert_equal true, @portlet.narrow_your_search?
|
21
|
-
|
22
|
-
@portlet.enable_narrow_your_search = "0"
|
23
|
-
assert_equal false, @portlet.narrow_your_search?
|
24
|
-
|
25
|
-
@portlet.enable_narrow_your_search = ""
|
26
|
-
assert_equal false, @portlet.narrow_your_search?
|
27
|
-
|
28
|
-
@portlet.enable_narrow_your_search = nil
|
29
|
-
assert_equal false, @portlet.narrow_your_search?
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
class RenderTest < ActiveSupport::TestCase
|
36
|
-
def setup
|
37
|
-
@portlet = GoogleMiniSearchEnginePortlet.new(:name=>"Engine", :path => "/engine")
|
38
|
-
@params = {:start => 10, :query => "X", :site=>'default_collection', :sort=>"date:D:S:d1"}
|
39
|
-
@portlet.expects('params').returns(@params).at_least_once
|
40
|
-
end
|
41
|
-
|
42
|
-
test "Sort params" do
|
43
|
-
SearchResult.expects(:find).with("X", {:start => 10, :portlet => @portlet, :site=>'default_collection', :sort=>"date:D:S:d1"})
|
44
|
-
@portlet.render
|
45
|
-
end
|
46
|
-
|
47
|
-
test "Find narrow queries only if enabled" do
|
48
|
-
@portlet.enable_narrow_your_search = "1"
|
49
|
-
GSA::Appliance.any_instance.expects(:find_narrow_search_results).with("X")
|
50
|
-
SearchResult.expects(:find).with("X", {:start => 10, :portlet => @portlet, :site=>'default_collection', :sort=>"date:D:S:d1"})
|
51
|
-
@portlet.render
|
52
|
-
end
|
53
|
-
end
|
@@ -1,587 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '/../test_helper')
|
2
|
-
|
3
|
-
|
4
|
-
class SearchResultTest < ActiveSupport::TestCase
|
5
|
-
|
6
|
-
def setup
|
7
|
-
@xml_string = <<EOF
|
8
|
-
<GSP>
|
9
|
-
<RES>
|
10
|
-
<M>2</M>
|
11
|
-
<R N="1">
|
12
|
-
<U>http://someurl.com</U>
|
13
|
-
<T>TITLE</T>
|
14
|
-
<S>BLURB</S>
|
15
|
-
<HAS>
|
16
|
-
<C SZ="1k" />
|
17
|
-
</HAS>
|
18
|
-
</R>
|
19
|
-
<R N="2">
|
20
|
-
<U>http://someurl2.com</U>
|
21
|
-
<T>TITLE 2</T>
|
22
|
-
<S>BLURB 2</S>
|
23
|
-
<HAS>
|
24
|
-
<C SZ="2k"/>
|
25
|
-
</HAS>
|
26
|
-
</R>
|
27
|
-
</RES>
|
28
|
-
</GSP>
|
29
|
-
EOF
|
30
|
-
@xml_doc = REXML::Document.new @xml_string
|
31
|
-
|
32
|
-
@large_results_set = <<EOF
|
33
|
-
<GSP>
|
34
|
-
<RES>
|
35
|
-
<M>35</M>
|
36
|
-
<R N="1">
|
37
|
-
<U>http://someurl.com</U>
|
38
|
-
<T>TITLE</T>
|
39
|
-
<S>BLURB</S>
|
40
|
-
<HAS>
|
41
|
-
<C SZ="1k" />
|
42
|
-
</HAS>
|
43
|
-
</R>
|
44
|
-
<R N="2">
|
45
|
-
<U>http://someurl2.com</U>
|
46
|
-
<T>TITLE 2</T>
|
47
|
-
<S>BLURB 2</S>
|
48
|
-
<HAS>
|
49
|
-
<C SZ="2k"/>
|
50
|
-
</HAS>
|
51
|
-
</R>
|
52
|
-
</RES>
|
53
|
-
</GSP>
|
54
|
-
EOF
|
55
|
-
@large_xml_doc = REXML::Document.new(@large_results_set)
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
test "Parse result count from google mini results xml." do
|
60
|
-
|
61
|
-
xml = <<EOF
|
62
|
-
<GSP>
|
63
|
-
<RES>
|
64
|
-
<M>35</M>
|
65
|
-
</RES>
|
66
|
-
</GSP>
|
67
|
-
EOF
|
68
|
-
empty_doc = REXML::Document.new xml
|
69
|
-
assert_equal 35, SearchResult.parse_results_count(empty_doc)
|
70
|
-
assert_equal 35, SearchResult.parse_xml(empty_doc).results_count
|
71
|
-
assert_equal 4, SearchResult.parse_xml(empty_doc).num_pages
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
test "Default result count is zero." do
|
76
|
-
|
77
|
-
xml = <<EOF
|
78
|
-
<GSP>
|
79
|
-
<RES>
|
80
|
-
</RES>
|
81
|
-
</GSP>
|
82
|
-
EOF
|
83
|
-
empty_doc = REXML::Document.new xml
|
84
|
-
assert_equal 0, SearchResult.parse_results_count(empty_doc)
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
test "Empty xml gives empty results" do
|
89
|
-
xml = <<EOF
|
90
|
-
<GSP>
|
91
|
-
<RES>
|
92
|
-
</RES>
|
93
|
-
</GSP>
|
94
|
-
EOF
|
95
|
-
empty_doc = REXML::Document.new xml
|
96
|
-
SearchResult.expects(:fetch_xml_doc).with("therapy", {}).returns(empty_doc)
|
97
|
-
|
98
|
-
assert_equal [], SearchResult.find("therapy", {})
|
99
|
-
end
|
100
|
-
|
101
|
-
test "Parse result set" do
|
102
|
-
|
103
|
-
results = SearchResult.parse_hits(@xml_doc)
|
104
|
-
assert_equal 2, results.size
|
105
|
-
|
106
|
-
assert_equal "1", results[0].number
|
107
|
-
assert_equal "http://someurl.com", results[0].url
|
108
|
-
assert_equal "TITLE", results[0].title
|
109
|
-
assert_equal "BLURB", results[0].description
|
110
|
-
assert_equal "1k", results[0].size
|
111
|
-
|
112
|
-
assert_equal "2", results[1].number
|
113
|
-
assert_equal "http://someurl2.com", results[1].url
|
114
|
-
assert_equal "TITLE 2", results[1].title
|
115
|
-
assert_equal "BLURB 2", results[1].description
|
116
|
-
assert_equal "2k", results[1].size
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
test "Calculates the results pages" do
|
121
|
-
assert_equal 1, SearchResult.calculate_results_pages(9)
|
122
|
-
assert_equal 1, SearchResult.calculate_results_pages(10)
|
123
|
-
assert_equal 2, SearchResult.calculate_results_pages(19)
|
124
|
-
assert_equal 2, SearchResult.calculate_results_pages(20)
|
125
|
-
assert_equal 3, SearchResult.calculate_results_pages(21)
|
126
|
-
assert_equal 4, SearchResult.calculate_results_pages(40)
|
127
|
-
assert_equal 0, SearchResult.calculate_results_pages(0)
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
|
-
test "Calculates current page based on total results and start" do
|
132
|
-
results = SearchResult::QueryResult.new
|
133
|
-
results.start = 0
|
134
|
-
assert_equal 1, results.current_page
|
135
|
-
|
136
|
-
results.start = 10
|
137
|
-
assert_equal 2, results.current_page
|
138
|
-
|
139
|
-
results.start = 20
|
140
|
-
assert_equal 3, results.current_page
|
141
|
-
|
142
|
-
results.start = 30
|
143
|
-
assert_equal 4, results.current_page
|
144
|
-
end
|
145
|
-
|
146
|
-
test "Next start" do
|
147
|
-
r = SearchResult::QueryResult.new
|
148
|
-
r.start = 0
|
149
|
-
assert_equal 10, r.next_start
|
150
|
-
r.start = 10
|
151
|
-
assert_equal 20, r.next_start
|
152
|
-
r.start = 20
|
153
|
-
assert_equal 30, r.next_start
|
154
|
-
end
|
155
|
-
|
156
|
-
test "Find results should return a paging list of documents with no start" do
|
157
|
-
SearchResult.expects(:fetch_xml_doc).with("therapy", {}).returns(@large_xml_doc)
|
158
|
-
|
159
|
-
results = SearchResult.find("therapy")
|
160
|
-
assert_equal "therapy", results.query
|
161
|
-
assert_equal 35, results.results_count
|
162
|
-
assert_equal 4, results.num_pages
|
163
|
-
assert_equal 0, results.start
|
164
|
-
assert_equal 2, results.size
|
165
|
-
assert_equal 1, results.current_page
|
166
|
-
assert_equal 10, results.next_start
|
167
|
-
assert results.next_page?
|
168
|
-
assert_equal -10, results.previous_start
|
169
|
-
assert_equal false, results.previous_page?
|
170
|
-
assert_equal (1..4), results.pages
|
171
|
-
|
172
|
-
end
|
173
|
-
|
174
|
-
|
175
|
-
test "Find results starts on page 2, if a start is specified" do
|
176
|
-
SearchResult.expects(:fetch_xml_doc).with("therapy", :start=>10).returns(@large_xml_doc)
|
177
|
-
|
178
|
-
results = SearchResult.find("therapy", :start => 10)
|
179
|
-
assert_equal 35, results.results_count
|
180
|
-
assert_equal 4, results.num_pages
|
181
|
-
assert_equal 10, results.start
|
182
|
-
assert_equal 2, results.size
|
183
|
-
assert_equal 2, results.current_page
|
184
|
-
assert_equal 20, results.next_start
|
185
|
-
assert results.next_page?
|
186
|
-
assert_equal 0, results.previous_start
|
187
|
-
assert_equal true, results.previous_page?
|
188
|
-
end
|
189
|
-
|
190
|
-
test "No next start when on the last page" do
|
191
|
-
SearchResult.expects(:fetch_xml_doc).with("therapy", {:start => 30}).returns(@large_xml_doc)
|
192
|
-
|
193
|
-
results = SearchResult.find("therapy", :start => 30)
|
194
|
-
assert_equal 40, results.next_start
|
195
|
-
assert_equal false, results.next_page?
|
196
|
-
assert_equal 20, results.previous_start
|
197
|
-
assert_equal true, results.previous_page?
|
198
|
-
end
|
199
|
-
|
200
|
-
test "Should be no previous or next for a single page of results" do
|
201
|
-
SearchResult.expects(:fetch_xml_doc).with("therapy", {}).returns(@xml_doc)
|
202
|
-
|
203
|
-
results = SearchResult.find("therapy")
|
204
|
-
assert_equal false, results.next_page?
|
205
|
-
assert_equal false, results.previous_page?
|
206
|
-
assert_equal [], results.pages
|
207
|
-
end
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
test "current_page should check to see if the current page matches" do
|
212
|
-
results = SearchResult::QueryResult.new
|
213
|
-
results.start = 0
|
214
|
-
|
215
|
-
assert_equal true, results.current_page?(1)
|
216
|
-
assert_equal false, results.current_page?(2)
|
217
|
-
assert_equal false, results.current_page?(3)
|
218
|
-
assert_equal false, results.current_page?(4)
|
219
|
-
|
220
|
-
end
|
221
|
-
|
222
|
-
|
223
|
-
test "Portlet attributes are used to look up path" do
|
224
|
-
portlet = GoogleMiniSearchEnginePortlet.new(:name=>"Engine", :path => "/engine")
|
225
|
-
SearchResult.expects(:fetch_xml_doc).with("therapy", {:portlet=> portlet}).returns(@xml_doc)
|
226
|
-
|
227
|
-
results = SearchResult.find("therapy", {:portlet=> portlet})
|
228
|
-
|
229
|
-
assert_equal "/engine", results.path
|
230
|
-
end
|
231
|
-
|
232
|
-
test "Default path is used if no portlet specified" do
|
233
|
-
SearchResult.expects(:fetch_xml_doc).with("therapy", {}).returns(@xml_doc)
|
234
|
-
results = SearchResult.find("therapy", {})
|
235
|
-
assert_equal "/search/search-results", results.path
|
236
|
-
end
|
237
|
-
|
238
|
-
test "Uses service URL from portlet" do
|
239
|
-
portlet = GoogleMiniSearchEnginePortlet.new(
|
240
|
-
:name=>"Engine", :path => "/engine", :service_url => "http://mini.someurl.com",
|
241
|
-
:collection_name => "COLLECT", :front_end_name => "FRONT_END")
|
242
|
-
|
243
|
-
url = SearchResult.create_url_for_query({:portlet => portlet}, "STUFF")
|
244
|
-
assert_equal "http://mini.someurl.com/search?q=STUFF&output=xml_no_dtd&client=FRONT_END&site=COLLECT&filter=0&oe=UTF-8&ie=UTF-8", url
|
245
|
-
|
246
|
-
url = SearchResult.create_url_for_query({:portlet => portlet, :start=>100}, "STUFF")
|
247
|
-
assert_equal "http://mini.someurl.com/search?q=STUFF&output=xml_no_dtd&client=FRONT_END&site=COLLECT&filter=0&start=100&oe=UTF-8&ie=UTF-8", url
|
248
|
-
|
249
|
-
end
|
250
|
-
|
251
|
-
test "Create Engine and Query from portlet attributes" do
|
252
|
-
portlet = GoogleMiniSearchEnginePortlet.new(
|
253
|
-
:name=>"Engine", :path => "/engine", :service_url => "http://mini.someurl.com",
|
254
|
-
:collection_name => "COLLECT", :front_end_name => "FRONT_END")
|
255
|
-
|
256
|
-
query = SearchResult.create_query("therapy", {:portlet=>portlet})
|
257
|
-
assert_equal "http://mini.someurl.com", query.engine.host
|
258
|
-
assert_equal portlet.front_end_name, query.front_end
|
259
|
-
assert_equal portlet.collection_name, query.collection
|
260
|
-
assert_equal "therapy", query.query
|
261
|
-
end
|
262
|
-
|
263
|
-
test "should look up options from portlet and add to hash" do
|
264
|
-
portlet = GoogleMiniSearchEnginePortlet.new(
|
265
|
-
:name=>"Engine", :path => "/engine", :service_url => "http://mini.someurl.com",
|
266
|
-
:collection_name => "COLLECT", :front_end_name => "FRONT_END")
|
267
|
-
options = {:portlet=>portlet}
|
268
|
-
SearchResult.normalize_query_options(options)
|
269
|
-
|
270
|
-
assert_equal "FRONT_END", options[:front_end]
|
271
|
-
assert_equal "COLLECT", options[:collection]
|
272
|
-
assert_equal "http://mini.someurl.com", options[:host]
|
273
|
-
assert_equal nil, options[:portlet]
|
274
|
-
end
|
275
|
-
|
276
|
-
test "Create an appliance from attributes in the portlet." do
|
277
|
-
portlet = GoogleMiniSearchEnginePortlet.new(
|
278
|
-
:name=>"Engine", :path => "/engine", :service_url => "http://mini.someurl.com",
|
279
|
-
:collection_name => "COLLECT", :front_end_name => "FRONT_END")
|
280
|
-
|
281
|
-
gsa = SearchResult.new_gsa(portlet)
|
282
|
-
assert_equal "http://mini.someurl.com", gsa.host
|
283
|
-
assert_equal "FRONT_END", gsa.default_front_end
|
284
|
-
assert_equal "COLLECT", gsa.default_collection
|
285
|
-
end
|
286
|
-
|
287
|
-
test "Explicitly passing a collection in will query with that rather than a default collection" do
|
288
|
-
portlet = GoogleMiniSearchEnginePortlet.new(
|
289
|
-
:name=>"Engine", :path => "/engine", :service_url => "http://mini.someurl.com",
|
290
|
-
:collection_name => "COLLECT", :front_end_name => "FRONT_END")
|
291
|
-
|
292
|
-
url = SearchResult.create_url_for_query({:portlet => portlet, :site=>"ANOTHER_COLLECTION"}, "STUFF")
|
293
|
-
assert_equal "http://mini.someurl.com/search?q=STUFF&output=xml_no_dtd&client=FRONT_END&site=ANOTHER_COLLECTION&filter=0&oe=UTF-8&ie=UTF-8", url
|
294
|
-
end
|
295
|
-
|
296
|
-
test "Handles multiword queries" do
|
297
|
-
url = SearchResult.create_url_for_query({}, "One Two")
|
298
|
-
assert_equal "/search?q=One+Two&output=xml_no_dtd&client=&site=&filter=0&oe=UTF-8&ie=UTF-8", url
|
299
|
-
end
|
300
|
-
|
301
|
-
test "sort is added to google mini query" do
|
302
|
-
url = SearchResult.create_url_for_query({:sort=>"XYZ"}, "STUFF")
|
303
|
-
assert_equal "/search?q=STUFF&output=xml_no_dtd&client=&site=&filter=0&sort=XYZ&oe=UTF-8&ie=UTF-8", url
|
304
|
-
end
|
305
|
-
|
306
|
-
test "sort params are escaped" do
|
307
|
-
url = SearchResult.create_url_for_query({:sort=>"date:D:S:d1"}, "STUFF")
|
308
|
-
assert_equal "/search?q=STUFF&output=xml_no_dtd&client=&site=&filter=0&sort=date%3AD%3AS%3Ad1&oe=UTF-8&ie=UTF-8", url
|
309
|
-
end
|
310
|
-
|
311
|
-
test "Handles keymatches in results" do
|
312
|
-
@xml_with_keymatches = <<XML
|
313
|
-
<GSP>
|
314
|
-
<GM>
|
315
|
-
<GL>http://url1.org</GL>
|
316
|
-
<GD>URL 1</GD>
|
317
|
-
</GM>
|
318
|
-
<GM>
|
319
|
-
<GL>http://url2.org</GL>
|
320
|
-
<GD>URL 2</GD>
|
321
|
-
</GM>
|
322
|
-
<RES>
|
323
|
-
<M>35</M>
|
324
|
-
<R N="1">
|
325
|
-
<U>http://someurl.com</U>
|
326
|
-
<T>TITLE</T>
|
327
|
-
<S>BLURB</S>
|
328
|
-
<HAS>
|
329
|
-
<C SZ="1k" />
|
330
|
-
</HAS>
|
331
|
-
</R>
|
332
|
-
<R N="2">
|
333
|
-
<U>http://someurl2.com</U>
|
334
|
-
<T>TITLE 2</T>
|
335
|
-
<S>BLURB 2</S>
|
336
|
-
<HAS>
|
337
|
-
<C SZ="2k"/>
|
338
|
-
</HAS>
|
339
|
-
</R>
|
340
|
-
</RES>
|
341
|
-
</GSP>
|
342
|
-
XML
|
343
|
-
@results_with_keymatches = REXML::Document.new @xml_with_keymatches
|
344
|
-
|
345
|
-
result = SearchResult.parse_xml @results_with_keymatches
|
346
|
-
|
347
|
-
assert_equal true, result.key_matches?
|
348
|
-
assert_equal 2, result.key_matches.size
|
349
|
-
assert_equal "http://url1.org", result.key_matches[0].url
|
350
|
-
assert_equal "URL 1", result.key_matches[0].title
|
351
|
-
assert_equal "http://url2.org", result.key_matches[1].url
|
352
|
-
assert_equal "URL 2", result.key_matches[1].title
|
353
|
-
end
|
354
|
-
|
355
|
-
test "Handles results with no keymatches" do
|
356
|
-
result = SearchResult.parse_xml @xml_doc
|
357
|
-
assert_equal false, result.key_matches?
|
358
|
-
end
|
359
|
-
|
360
|
-
test "Handle Synonyms / Related Queries" do
|
361
|
-
xml_with_synonyms = <<XML
|
362
|
-
<GSP>
|
363
|
-
<Synonyms>
|
364
|
-
<OneSynonym q="Query 1">Label 1</OneSynonym>
|
365
|
-
<OneSynonym q="Query 2">Label 2</OneSynonym>
|
366
|
-
</Synonyms>
|
367
|
-
<RES>
|
368
|
-
<M>35</M>
|
369
|
-
<R N="1">
|
370
|
-
<U>http://someurl.com</U>
|
371
|
-
<T>TITLE</T>
|
372
|
-
<S>BLURB</S>
|
373
|
-
<HAS>
|
374
|
-
<C SZ="1k" />
|
375
|
-
</HAS>
|
376
|
-
</R>
|
377
|
-
<R N="2">
|
378
|
-
<U>http://someurl2.com</U>
|
379
|
-
<T>TITLE 2</T>
|
380
|
-
<S>BLURB 2</S>
|
381
|
-
<HAS>
|
382
|
-
<C SZ="2k"/>
|
383
|
-
</HAS>
|
384
|
-
</R>
|
385
|
-
</RES>
|
386
|
-
</GSP>
|
387
|
-
XML
|
388
|
-
xml_doc_with_synonyms = REXML::Document.new xml_with_synonyms
|
389
|
-
|
390
|
-
result = SearchResult.parse_xml xml_doc_with_synonyms
|
391
|
-
|
392
|
-
result.expects(:path).returns("/search").twice
|
393
|
-
assert_equal true, result.synonyms?
|
394
|
-
assert_equal 2, result.synonyms.size
|
395
|
-
assert_equal "Label 1", result.synonyms[0].label
|
396
|
-
assert_equal "Query 1", result.synonyms[0].query
|
397
|
-
assert_equal "/search?query=Query 1", result.synonyms[0].url
|
398
|
-
assert_equal "Label 2", result.synonyms[1].label
|
399
|
-
assert_equal "Query 2", result.synonyms[1].query
|
400
|
-
assert_equal "/search?query=Query 2", result.synonyms[1].url
|
401
|
-
|
402
|
-
end
|
403
|
-
|
404
|
-
test "Handles results with no Synonyms" do
|
405
|
-
result = SearchResult.parse_xml @xml_doc
|
406
|
-
assert_equal false, result.synonyms?
|
407
|
-
end
|
408
|
-
|
409
|
-
test "Calculate URL for Related Queries/Synonyms" do
|
410
|
-
syn = SearchResult::Synonym.new
|
411
|
-
syn.query = "Testing"
|
412
|
-
mock_result = mock()
|
413
|
-
mock_result.expects(:path).returns("/random")
|
414
|
-
syn.query_result = mock_result
|
415
|
-
assert_equal "/random?query=Testing", syn.url
|
416
|
-
end
|
417
|
-
|
418
|
-
test "No query = empty results" do
|
419
|
-
result = SearchResult.find(nil)
|
420
|
-
assert_equal 0, result.size
|
421
|
-
assert_equal 0, result.start
|
422
|
-
assert_equal false, result.next_page?
|
423
|
-
assert_equal false, result.previous_page?
|
424
|
-
assert_equal false, result.key_matches?
|
425
|
-
assert_equal false, result.synonyms?
|
426
|
-
assert_equal [], result.pages
|
427
|
-
end
|
428
|
-
|
429
|
-
test "Search results for PDF's that have no size" do
|
430
|
-
pdf_results = <<EOF
|
431
|
-
<GSP>
|
432
|
-
<RES>
|
433
|
-
<M>35</M>
|
434
|
-
<R N="1">
|
435
|
-
<U>http://someurl.com</U>
|
436
|
-
<T>TITLE</T>
|
437
|
-
<S>BLURB</S>
|
438
|
-
<HAS>
|
439
|
-
<C SZ="1k" />
|
440
|
-
</HAS>
|
441
|
-
</R>
|
442
|
-
<R N="2">
|
443
|
-
<U>http://someurl2.com</U>
|
444
|
-
<T>TITLE 2</T>
|
445
|
-
<S>BLURB 2</S>
|
446
|
-
<HAS>
|
447
|
-
<L/>
|
448
|
-
</HAS>
|
449
|
-
</R>
|
450
|
-
</RES>
|
451
|
-
</GSP>
|
452
|
-
EOF
|
453
|
-
xml_doc = REXML::Document.new(pdf_results)
|
454
|
-
results = SearchResult.parse_xml xml_doc
|
455
|
-
assert_equal 2, results.size
|
456
|
-
|
457
|
-
assert_equal "1", results[0].number
|
458
|
-
assert_equal "http://someurl.com", results[0].url
|
459
|
-
assert_equal "TITLE", results[0].title
|
460
|
-
assert_equal "BLURB", results[0].description
|
461
|
-
assert_equal "1k", results[0].size
|
462
|
-
|
463
|
-
assert_equal "2", results[1].number
|
464
|
-
assert_equal "http://someurl2.com", results[1].url
|
465
|
-
assert_equal "TITLE 2", results[1].title
|
466
|
-
assert_equal "BLURB 2", results[1].description
|
467
|
-
assert_equal "", results[1].size
|
468
|
-
end
|
469
|
-
|
470
|
-
end
|
471
|
-
|
472
|
-
class SearchPathsTest < ActiveSupport::TestCase
|
473
|
-
|
474
|
-
def setup
|
475
|
-
@results = SearchResult::QueryResult.new
|
476
|
-
@results.start = 0
|
477
|
-
@results.path = "/search/search-results"
|
478
|
-
@results.query = "X"
|
479
|
-
end
|
480
|
-
|
481
|
-
test "path_for" do
|
482
|
-
assert_equal "/search/search-results?query=Y", @results.path_for("Y")
|
483
|
-
end
|
484
|
-
|
485
|
-
test "sort by date" do
|
486
|
-
assert_equal "#{@results.path}?query=#{@results.query}&sort=#{SearchResult::QueryResult::SORT_BY_DATE_PARAM}", @results.sort_by_date_path
|
487
|
-
end
|
488
|
-
|
489
|
-
test "sort by relevance" do
|
490
|
-
assert @results.sort_by_relevance_path != @results.sort_by_date_path, "Paths should not be the same."
|
491
|
-
assert_equal "#{@results.path}?query=#{@results.query}&sort=#{SearchResult::QueryResult::SORT_BY_RELEVANCE_PARAM}", @results.sort_by_relevance_path
|
492
|
-
end
|
493
|
-
|
494
|
-
test "Path to next page" do
|
495
|
-
assert_equal "/search/search-results?query=X&start=10", @results.next_page_path
|
496
|
-
end
|
497
|
-
|
498
|
-
test "Path to previous page" do
|
499
|
-
@results.start = 20
|
500
|
-
assert_equal "/search/search-results?query=X&start=10", @results.previous_page_path
|
501
|
-
end
|
502
|
-
|
503
|
-
test "Sets path to default search-results" do
|
504
|
-
assert_equal "/search/search-results", @results.path
|
505
|
-
end
|
506
|
-
|
507
|
-
test "Setting path overrides the defaults" do
|
508
|
-
@results.path = "/other"
|
509
|
-
assert_equal "/other", @results.path
|
510
|
-
end
|
511
|
-
|
512
|
-
test "page_path" do
|
513
|
-
assert_equal "/search/search-results?query=X&start=0", @results.page_path(1)
|
514
|
-
assert_equal "/search/search-results?query=X&start=10", @results.page_path(2)
|
515
|
-
assert_equal "/search/search-results?query=X&start=20", @results.page_path(3)
|
516
|
-
assert_equal "/search/search-results?query=X&start=30", @results.page_path(4)
|
517
|
-
end
|
518
|
-
|
519
|
-
test "sorting_by_date?" do
|
520
|
-
assert_equal true, @results.sorting_by_date?({:sort=>SearchResult::QueryResult::SORT_BY_DATE_PARAM})
|
521
|
-
assert_equal false, @results.sorting_by_date?({:sort=>SearchResult::QueryResult::SORT_BY_RELEVANCE_PARAM})
|
522
|
-
assert_equal false, @results.sorting_by_date?({})
|
523
|
-
end
|
524
|
-
end
|
525
|
-
|
526
|
-
|
527
|
-
class PagingTest < ActiveSupport::TestCase
|
528
|
-
|
529
|
-
def setup
|
530
|
-
@results = SearchResult::QueryResult.new
|
531
|
-
and_the_max_number_pages_is 100
|
532
|
-
end
|
533
|
-
|
534
|
-
test "Behavior of Ruby Ranges" do
|
535
|
-
c = 0
|
536
|
-
(1..4).each_with_index do |i, count|
|
537
|
-
assert_equal count + 1, i
|
538
|
-
c = count
|
539
|
-
end
|
540
|
-
assert_equal 3, c
|
541
|
-
end
|
542
|
-
|
543
|
-
|
544
|
-
test "When on page 1, show links for pages 1 - 10" do
|
545
|
-
when_current_page_is(1)
|
546
|
-
assert_equal (1..10), @results.pages
|
547
|
-
end
|
548
|
-
|
549
|
-
test "When on page 11, show links for pages 1-20" do
|
550
|
-
when_current_page_is(11)
|
551
|
-
assert_equal (1..20), @results.pages
|
552
|
-
end
|
553
|
-
|
554
|
-
test "When on page 12, show links for pages 2-22" do
|
555
|
-
when_current_page_is 12
|
556
|
-
assert_equal (2..21), @results.pages
|
557
|
-
end
|
558
|
-
|
559
|
-
test "When less than 10 pages only show up to last page" do
|
560
|
-
when_current_page_is 1
|
561
|
-
and_the_max_number_pages_is 4
|
562
|
-
|
563
|
-
assert_equal (1..4), @results.pages
|
564
|
-
end
|
565
|
-
|
566
|
-
test "When no results, should be empty set of pages." do
|
567
|
-
when_current_page_is 1
|
568
|
-
and_the_max_number_pages_is 0
|
569
|
-
assert_equal [], @results.pages
|
570
|
-
end
|
571
|
-
|
572
|
-
test "With one page, return a single page." do
|
573
|
-
when_current_page_is 1
|
574
|
-
and_the_max_number_pages_is 1
|
575
|
-
assert_equal [], @results.pages, "A single page of results needs no pager control"
|
576
|
-
end
|
577
|
-
|
578
|
-
private
|
579
|
-
|
580
|
-
def and_the_max_number_pages_is(number)
|
581
|
-
@results.expects(:num_pages).returns(number).times(0..5)
|
582
|
-
end
|
583
|
-
|
584
|
-
def when_current_page_is(current_page)
|
585
|
-
@results.expects(:current_page).returns(current_page).times(0..5)
|
586
|
-
end
|
587
|
-
end
|