endeca 1.3.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,90 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. spec_helper])
2
+
3
+ module Endeca
4
+ module Breadcrumbs
5
+ class Navigation < Endeca::Breadcrumb
6
+ end
7
+ end
8
+ end
9
+
10
+ describe Endeca::Breadcrumb do
11
+ before do
12
+ @dimension_value = {
13
+ "DimValueID" => "4343565665",
14
+ "RemovalLink" => "N=",
15
+ "DimValueName" => "Apartment"
16
+ }
17
+
18
+ @navigation_hash = {
19
+ "Type" => "Navigation",
20
+ "DimensionName" => "property type",
21
+ "DimensionRemovalLink" => "N=",
22
+ "DimensionValues" => [@dimension_value]
23
+ }
24
+
25
+ @dimensions = { "Dimensions" => [@navigation_hash] }
26
+ @breadcrumb = Endeca::Breadcrumb.new( @dimensions )
27
+ end
28
+
29
+ describe ".create" do
30
+ before do
31
+ @navigation = Endeca::Breadcrumb.create(@navigation_hash)
32
+ end
33
+
34
+ it "should create a breadcrumb of the appropriate type" do
35
+ Endeca::Breadcrumb.create(@navigation_hash).
36
+ should be_a_kind_of(Endeca::Breadcrumbs::Navigation)
37
+ end
38
+
39
+ describe "with an invalid type" do
40
+ it do
41
+ creating_invalid_breadcrumb = lambda{Endeca::Breadcrumb.create({'Type' => 'Invalid'})}
42
+ creating_invalid_breadcrumb.should raise_error(Endeca::Breadcrumbs::TypeError)
43
+ end
44
+ end
45
+ end
46
+
47
+ describe ".to_proc" do
48
+ it "should call create" do
49
+ Endeca::Breadcrumb.should_receive(:create).with(:obj)
50
+ [:obj].map(&Endeca::Breadcrumb)
51
+ end
52
+ end
53
+
54
+ describe '#==' do
55
+ it "should compare Breadcrumbs by name" do
56
+ doc_1, doc_2 = Endeca::Breadcrumb.new, Endeca::Breadcrumb.new
57
+ doc_1.stub!(:name).and_return('property type')
58
+ doc_2.stub!(:name).and_return('property type')
59
+ (doc_1 == doc_2).should be_true
60
+
61
+ doc_2.stub!(:name).and_return('something else')
62
+ (doc_1 == doc_2).should be_false
63
+ end
64
+ end
65
+
66
+ describe '#inspect' do
67
+ it "includes the class name" do
68
+ @breadcrumb.inspect.should include(Endeca::Breadcrumb.name)
69
+ end
70
+
71
+ it "includes the hex string of the object id" do
72
+ @breadcrumb.inspect.should include("0x#{@breadcrumb.object_id.to_s(16)}")
73
+ end
74
+
75
+ it "includes the inspected name" do
76
+ @breadcrumb.stub!(:name).and_return('A Name')
77
+ @breadcrumb.inspect.should include('name="A Name"')
78
+ end
79
+ end
80
+
81
+ describe "#type" do
82
+ it "returns the Type value" do
83
+ Endeca::Breadcrumb.new('Type' => 'AType').type.should == 'AType'
84
+ end
85
+ end
86
+
87
+ describe "#name" do
88
+ it {Endeca::Breadcrumb.new.name.should == ''}
89
+ end
90
+ end
@@ -0,0 +1,91 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. spec_helper])
2
+
3
+ describe Endeca::Dimension do
4
+ describe ".new" do
5
+ it "should set the raw attribute" do
6
+ dimension = Endeca::Dimension.new(:raw)
7
+
8
+ dimension.raw.should == :raw
9
+ end
10
+ end
11
+
12
+ describe "#to_endeca_params" do
13
+ before do
14
+ @dimension = Endeca::Dimension.new
15
+ @selection = mock('selection link')
16
+ @removal = mock('removal link')
17
+ end
18
+
19
+ describe "with a selection link" do
20
+ it "should return the selection link" do
21
+ @dimension.stub!(:selection_link => @selection_link)
22
+ @dimension.stub!(:removal_link => nil)
23
+
24
+ @dimension.to_endeca_params.should == @selection_link
25
+ end
26
+ end
27
+
28
+ describe "with a removal link" do
29
+ it "should return the selection link" do
30
+ @dimension.stub!(:selection_link => nil)
31
+ @dimension.stub!(:removal_link => @removal_link)
32
+
33
+ @dimension.to_endeca_params.should == @removal_link
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#inspect" do
39
+ before do
40
+ @dimension = Endeca::Dimension.new
41
+ end
42
+
43
+ it "should include the class" do
44
+ @dimension.inspect.should include(Endeca::Dimension.name)
45
+ end
46
+
47
+ it "should include the hex formatted object_id" do
48
+ id = 123
49
+ @dimension.stub!(:object_id).and_return(id)
50
+ @dimension.inspect.should include("0x#{id.to_s(16)}")
51
+ end
52
+
53
+ it "should include the id" do
54
+ id = 123
55
+ @dimension.stub!(:id).and_return(id)
56
+ @dimension.inspect.should include("id=#{id}")
57
+ end
58
+
59
+ it "should include the inspected name" do
60
+ name = 'name'
61
+ @dimension.stub!(:name).and_return(name)
62
+ @dimension.inspect.should include("name=#{name.inspect}")
63
+ end
64
+ end
65
+
66
+ describe "#==" do
67
+ it "should compare ids" do
68
+ dim_1 = Endeca::Dimension.new
69
+ dim_2 = Endeca::Dimension.new
70
+ dim_2.stub!(:id).and_return(dim_1.id)
71
+
72
+ (dim_1 == dim_2).should be_true
73
+ end
74
+ end
75
+
76
+ describe "#<=>" do
77
+ it "should compare names" do
78
+ name = mock('name')
79
+
80
+ dim_1 = Endeca::Dimension.new
81
+ dim_2 = Endeca::Dimension.new
82
+
83
+ dim_1.stub!(:name).and_return(name)
84
+ dim_2.stub!(:name).and_return(name)
85
+
86
+ name.should_receive(:<=>).with(name)
87
+
88
+ dim_1 <=> dim_2
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,158 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. spec_helper])
2
+
3
+ describe Endeca::DocumentCollection do
4
+ before do
5
+ @metainfo = mock('MetaInfo', :[] => nil)
6
+ @document = mock('Document', :[] => nil)
7
+ @refinement = { "Dimensions" => [ {
8
+ "ExpansionLink" => "N=&Ne=7",
9
+ "DimensionName" => "city",
10
+ "DimensionID" => "7" } ] }
11
+ @breadcrumb = { "Dimensions" => [ {
12
+ "DimensionName" => "property type",
13
+ "DimensionRemovalLink" => "N=",
14
+ "Type" => "Navigation" } ] }
15
+
16
+ @raw = {
17
+ 'Records' => [@document],
18
+ 'MetaInfo' => @metainfo,
19
+ 'Refinements' => [@refinement],
20
+ 'Breadcrumbs' => [@breadcrumb]
21
+ }
22
+
23
+ @aggregate_raw = {
24
+ 'AggrRecords' => [{'Records' => [@document]}]
25
+ }
26
+
27
+ @document_collection = Endeca::DocumentCollection.new(@raw)
28
+ end
29
+
30
+ describe '#new' do
31
+ it "should store the raw data" do
32
+ @document_collection.raw.should == @raw
33
+ end
34
+ end
35
+
36
+ describe '#attributes' do
37
+ it "should return the metainfo hash of the collection" do
38
+ @document_collection.attributes.should == @metainfo
39
+ end
40
+ end
41
+
42
+ describe '#documents' do
43
+ it "should return the correct document class for subclassees" do
44
+ class ConcreteDocument < Endeca::Document; end
45
+ collection = Endeca::DocumentCollection.new(@raw, ConcreteDocument)
46
+ collection.documents.first.class.should == ConcreteDocument
47
+ end
48
+
49
+ describe "with a normal record set" do
50
+ it "should return a collection of documents" do
51
+ @document_collection.documents.should == [Endeca::Document.new(@document)]
52
+ end
53
+ end
54
+
55
+ describe "with an aggregate record set" do
56
+ before do
57
+ @document_collection = Endeca::DocumentCollection.new(@aggregate_raw)
58
+ end
59
+
60
+ it "should find the documents" do
61
+ @document_collection.documents.size.should == 1
62
+ @document_collection.documents.first.should == Endeca::Document.new(@document)
63
+ end
64
+ end
65
+
66
+ describe "with no record set" do
67
+ before { @document_collection = Endeca::DocumentCollection.new({}) }
68
+ it { @document_collection.documents.should be_empty }
69
+ end
70
+ end
71
+
72
+ describe "#aggregate?" do
73
+ describe "with a normal document collection" do
74
+ it { @document_collection.aggregate?.should be_false }
75
+ end
76
+
77
+ describe "with an aggregate document collection" do
78
+ before { @document_collection = Endeca::DocumentCollection.new(@aggregate_raw) }
79
+ it { @document_collection.aggregate?.should be_true }
80
+ end
81
+ end
82
+
83
+ describe "#previous_page" do
84
+ describe "when on the first page" do
85
+ before { @document_collection.stub!(:current_page).and_return(0) }
86
+
87
+ it { @document_collection.previous_page.should be_nil }
88
+ end
89
+
90
+ describe "when on any other page" do
91
+ before do
92
+ @document_collection.stub!(:current_page).and_return(4)
93
+ end
94
+
95
+ it "should return the previous page" do
96
+ @document_collection.previous_page.should == 3
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "#next_page" do
102
+ before do
103
+ @document_collection.stub!(:total_pages).and_return(20)
104
+ end
105
+
106
+ describe "when on the last page" do
107
+ before { @document_collection.stub!(:current_page).and_return(20) }
108
+ it { @document_collection.next_page.should be_nil }
109
+ end
110
+
111
+ describe "when on any other page" do
112
+ before { @document_collection.stub!(:current_page).and_return(4) }
113
+
114
+ it "should return the next page" do
115
+ @document_collection.next_page.should == 5
116
+ end
117
+ end
118
+ end
119
+
120
+ describe '#refinements' do
121
+ it 'should return a collection of Refinement objects' do
122
+ @document_collection.refinements.should == [Endeca::Refinement.new(@refinement)]
123
+ end
124
+
125
+ it "should return refinement by name" do
126
+ @document_collection.refinement_by_name('city').
127
+ should == Endeca::Refinement.new(@refinement)
128
+ end
129
+ end
130
+
131
+ describe '#breadcrumbs' do
132
+ it 'should return a collection of Breadcrumb objects' do
133
+ @document_collection.breadcrumbs.should == [Endeca::Breadcrumb.new(@breadcrumb)]
134
+ end
135
+ end
136
+
137
+ describe "#each" do
138
+ it "should yield to the documents" do
139
+ block = lambda{1}
140
+ @document_collection.documents.should_receive(:each).with(&block)
141
+ @document_collection.each(&block)
142
+ end
143
+ end
144
+
145
+ describe "#is_a?" do
146
+ describe "Array" do
147
+ it { @document_collection.is_a?(Array).should be_true }
148
+ end
149
+
150
+ describe "DocumentCollection" do
151
+ it { @document_collection.is_a?(Endeca::DocumentCollection).should be_true }
152
+ end
153
+
154
+ describe "String" do
155
+ it { @document_collection.is_a?(String).should be_false }
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,378 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. spec_helper])
2
+
3
+ describe Endeca::Document do
4
+ before do
5
+ Endeca::Document.path 'http://endeca.example.com'
6
+ @document = Endeca::Document.new
7
+ end
8
+
9
+ describe '.map' do
10
+ after do
11
+ Endeca::Document.mappings = {}
12
+ end
13
+
14
+ describe "with a mapping value" do
15
+ it "should assign the mapping with a nil transformation" do
16
+ Endeca::Document.map(:id => :endecaID)
17
+ map = Endeca::Map.new :id, :endecaID
18
+ Endeca::Document.mappings.should include({:id => map})
19
+ end
20
+ end
21
+
22
+ describe "with two maps that join on the same key in a parent hash" do
23
+ it "should join the key and value on the delimiter" do
24
+ Endeca::Document.map(:state => :propertystate).into(:ntk => :ntt)
25
+ Endeca::Document.map(:city => :propertycity).into(:ntk => :ntt)
26
+ [
27
+ {:ntk=>"propertycity|propertystate", :ntt=>"Atlanta|Georgia"},
28
+ {:ntk=>"propertystate|propertycity", :ntt=>"Georgia|Atlanta"}
29
+ ].should include(Endeca::Document.transform_query_options(:city => 'Atlanta', :state => 'Georgia'))
30
+ end
31
+ end
32
+
33
+ describe "with two maps that join on the same key without mapping to a hash" do
34
+ it "should join on the delimiter" do
35
+ Endeca::Document.map(:limit => :recs_per_page).into(:M)
36
+ Endeca::Document.map(:expand_refinements => :expand_all_dims).into(:M)
37
+
38
+ # Hashes are not ordered and order is not important
39
+ [{:M => "recs_per_page:10|expand_all_dims:1"}, {:M => "expand_all_dims:1|recs_per_page:10"}].
40
+ should include(Endeca::Document.transform_query_options(:limit => 10, :expand_refinements => 1))
41
+ end
42
+ end
43
+
44
+ describe "with splitting values" do
45
+ it "should duplicate the key for each value passed" do
46
+ Endeca::Document.map(:features => :feature_cat).split_into(:ntk => :ntt)
47
+ [
48
+ {:ntk=>"feature_cat|feature_cat", :ntt=>"Driveway|Alarm"}
49
+ ].should include(Endeca::Document.transform_query_options(:features => 'Driveway,Alarm'))
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '.find' do
55
+ before do
56
+ @query_options = {:foo => :bar}
57
+ end
58
+
59
+ it do
60
+ Endeca::Document.path nil
61
+ lambda{ Endeca::Document.find('') }.should raise_error(Endeca::RequestError)
62
+ end
63
+
64
+ describe '#==' do
65
+ it "should compare documents by id" do
66
+ id = 1
67
+ doc_1 = Endeca::Document.new
68
+ doc_1.stub!(:id).and_return(id)
69
+ doc_2 = Endeca::Document.new
70
+ doc_2.stub!(:id).and_return(id)
71
+
72
+ (doc_1 == doc_2).should be_true
73
+
74
+ doc_2.stub!(:id).and_return(2)
75
+
76
+ (doc_1 == doc_2).should be_false
77
+ end
78
+ end
79
+
80
+ describe '.inspect' do
81
+ it "includes the class name" do
82
+ @document.inspect.should include(Endeca::Document.name)
83
+ end
84
+
85
+ it "includes the hex string of the object id" do
86
+ @document.inspect.should include("0x#{@document.object_id.to_s(16)}")
87
+ end
88
+ end
89
+
90
+ describe "#dimensions" do
91
+ describe "with a nil Dimensions hash" do
92
+ it "should be empty" do
93
+ @document.stub!(:raw).and_return({})
94
+ @document.dimensions.should be_empty
95
+ end
96
+ end
97
+
98
+ describe 'with a raw Dimensions hash with a key "key" with one element' do
99
+ it 'should return a hash with that dimension at the key "key"' do
100
+ dimension_hash = mock('Dimension Hash')
101
+ dimension = mock(Endeca::Dimension)
102
+
103
+ @document.
104
+ stub!(:raw).
105
+ and_return({'Dimensions' => {"key" => [dimension_hash]}})
106
+
107
+ Endeca::Dimension.
108
+ should_receive(:new).
109
+ with(dimension_hash).
110
+ and_return(dimension)
111
+
112
+ @document.dimensions["key"].should == [dimension]
113
+ end
114
+ end
115
+ end
116
+
117
+ describe 'with :first' do
118
+ it 'should call .first and pass the query options' do
119
+ Endeca::Document.should_receive(:first).with(@query_options)
120
+ Endeca::Document.find(:first, @query_options)
121
+ end
122
+ end
123
+
124
+ describe 'with :all' do
125
+ it "should call .all and pass the query options and self" do
126
+ Endeca::Document.should_receive(:all).with(@query_options)
127
+ Endeca::Document.find(:all, @query_options)
128
+ end
129
+ end
130
+
131
+ describe 'with an Integer' do
132
+ it "should call .by_id with the argument and the query options" do
133
+ id = 5
134
+ Endeca::Document.should_receive(:by_id).with(id, @query_options)
135
+ Endeca::Document.find(id, @query_options)
136
+ end
137
+ end
138
+
139
+ describe 'with an id string' do
140
+ it "should call .by_id with the argument and the query options" do
141
+ id = '5'
142
+ Endeca::Document.should_receive(:by_id).with(id, @query_options)
143
+ Endeca::Document.find(id, @query_options)
144
+ end
145
+ end
146
+
147
+ describe 'with an query string' do
148
+ it "should call find with the argument and the query options" do
149
+ query_string = 'N=0&Ntk=propertycity&Ntt=Atlanta'
150
+ Endeca::Document.should_receive(:all).with(query_string)
151
+ Endeca::Document.find(query_string)
152
+ end
153
+ end
154
+
155
+ describe 'with only query options' do
156
+ it 'should call .all with the query options' do
157
+ Endeca::Document.should_receive(:all).with(@query_options)
158
+ Endeca::Document.find(@query_options)
159
+ end
160
+ end
161
+ end
162
+
163
+ describe ".first" do
164
+ it "should make a request with the correct query" do
165
+ Endeca::Request.
166
+ should_receive(:perform).
167
+ with('http://endeca.example.com', {:id => '1234'}).
168
+ and_return({'Records' => []})
169
+
170
+ Endeca::Document.first(:id => '1234')
171
+ end
172
+
173
+ it "should instantiate a new Endeca::Document from the first record in the response hash" do
174
+ hash = {'Records' => [:document]}
175
+ Endeca::Request.stub!(:perform).and_return(hash)
176
+ Endeca::Document.
177
+ should_receive(:new).
178
+ with(:document)
179
+ Endeca::Document.first(:id => '1234')
180
+ end
181
+
182
+ it "should instantiate a new Endeca::Document from the first record in the response hash with aggregate results" do
183
+ hash = {'AggrRecords' => [{'Records' => [:document]}]}
184
+ Endeca::Request.stub!(:perform).and_return(hash)
185
+ Endeca::Document.
186
+ should_receive(:new).
187
+ with(:document)
188
+ Endeca::Document.first(:id => '1234')
189
+ end
190
+
191
+ describe "when no matching record is returned" do
192
+ it "should be nil" do
193
+ Endeca::Request.stub!(:perform).and_return({'Records' => nil})
194
+ Endeca::Document.first(:id => '1234').should be_nil
195
+ end
196
+ end
197
+ end
198
+
199
+ describe '.by_id' do
200
+ it 'should merge the id into the query options and call .first' do
201
+ Endeca::Document.should_receive(:first).with(:id => '1234', :skip_default_endeca_parameters => true)
202
+ Endeca::Document.by_id('1234')
203
+ end
204
+ end
205
+
206
+ describe '.all' do
207
+ before do
208
+ @query_options = {:foo => :bar}
209
+ @records = mock('RecordArray')
210
+ @response = {'Records' => @records}
211
+ Endeca::Document.
212
+ stub!(:request).
213
+ and_return(@response)
214
+ end
215
+
216
+ it 'should perform a request with the query options' do
217
+ Endeca::Document.
218
+ should_receive(:request).
219
+ with(@query_options).
220
+ and_return(@response)
221
+
222
+ Endeca::Document.all(@query_options)
223
+ end
224
+
225
+ it 'should create a new DocumentCollection from the full response and the document class' do
226
+ Endeca::DocumentCollection.should_receive(:new).with(@response, Endeca::Document)
227
+ Endeca::Document.all(@query_options)
228
+ end
229
+ end
230
+
231
+ describe ".all" do
232
+ describe "with a query string" do
233
+ it 'should make a request with the query string' do
234
+ Endeca::Request.should_receive(:perform).with(anything, "query string")
235
+ Endeca::Document.all("query string")
236
+ end
237
+
238
+ describe "and default parameters" do
239
+ it "should make a request with the query string and ignore the defaults" do
240
+ Endeca::Document.default_params :foo => :bar
241
+ Endeca::Request.should_receive(:perform).with(anything, "query string")
242
+ Endeca::Document.all("query string")
243
+ end
244
+ end
245
+ end
246
+
247
+ describe "with a collection_class on the document" do
248
+ before(:all) do
249
+ class SubDocumentCollection < Endeca::DocumentCollection; end
250
+ Endeca::Document.collection_class SubDocumentCollection
251
+
252
+ Endeca::Request.stub!(:perform).and_return({})
253
+ end
254
+
255
+ it "should initialize an collection of the correct class" do
256
+ Endeca::Document.all(:id => 1).should be_a_kind_of(SubDocumentCollection)
257
+ end
258
+
259
+ end
260
+ end
261
+
262
+ describe ".transform_query_options" do
263
+ before do
264
+ @query_options = {
265
+ :id => 5
266
+ }
267
+ end
268
+
269
+ after do
270
+ Endeca::Document.mappings = {}
271
+ end
272
+
273
+ describe "when the key to be mapped is a string" do
274
+ it "maps correctly" do
275
+ Endeca::Document.map(:apartments => :showapartments)
276
+ Endeca::Document.transform_query_options("apartments" => true).
277
+ should == {:showapartments => 1}
278
+ end
279
+ end
280
+
281
+ describe "with multiple keys that are joined" do
282
+ it "should include all the keys" do
283
+ require 'pp'
284
+ Endeca::Document.map(:apartments => :showapartments).into('Ntk' => 'Ntt')
285
+ Endeca::Document.map(:colleges => :showcolleges).into('Ntk' => 'Ntt')
286
+ ntk = Endeca::Document.transform_query_options('apartments' => '1', 'colleges' => '2')[:Ntk]
287
+ ntk.should include('showapartments')
288
+ ntk.should include('showcolleges')
289
+ ntt = Endeca::Document.transform_query_options('apartments' => '1', 'colleges' => '2')[:Ntt]
290
+ ntt.should include('1')
291
+ ntt.should include('2')
292
+ end
293
+ end
294
+
295
+ describe "when there is no mapping for the given key" do
296
+ it "returns the query options without modification" do
297
+ Endeca::Document.transform_query_options(@query_options).
298
+ should == @query_options
299
+ end
300
+ end
301
+
302
+ describe "when there is a mapping with" do
303
+ describe "a new key" do
304
+ before do
305
+ Endeca::Document.map(:id => :new_id)
306
+ end
307
+
308
+ it "should replace the key with the new key" do
309
+ new_query_options = Endeca::Document.
310
+ transform_query_options(@query_options)
311
+
312
+ new_query_options.should == {:new_id => 5}
313
+ end
314
+ end
315
+
316
+ describe "a new key and a value transformation" do
317
+ before do
318
+ Endeca::Document.map(:id => :new_id).transform {|id| id.to_s}
319
+ end
320
+
321
+ it "should replace the value with the transformed value" do
322
+ Endeca::Document.transform_query_options(@query_options).
323
+ should == {:new_id => "5"}
324
+ end
325
+
326
+ describe "that includes the current value" do
327
+ before do
328
+ Endeca::Document.map(:name => :new_name) do |name, current|
329
+ [current,name].compact.join('|')
330
+ end
331
+
332
+ @current_query_options = {:name => 'bar', :new_name => 'foo'}
333
+ end
334
+ end
335
+ end
336
+ end
337
+ end
338
+
339
+ describe "with default query parameters" do
340
+ before do
341
+ Endeca::Document.default_params :foo => :bar
342
+ end
343
+
344
+ after do
345
+ Endeca::Document.default_params({})
346
+ end
347
+
348
+ it "should get the default params" do
349
+ Endeca::Document.get_default_params.should == {:foo => :bar}
350
+ end
351
+
352
+ it "should include the default parameters" do
353
+ Endeca::Request.should_receive(:perform).with(anything, {:foo => :bar})
354
+ Endeca::Document.request({})
355
+ end
356
+
357
+ describe "that are mapped" do
358
+ it "should map the default parameters" do
359
+ Endeca::Document.map(:foo => :new_foo)
360
+ Endeca::Request.should_receive(:perform).with(anything, {:new_foo => :bar})
361
+ Endeca::Document.request({})
362
+ end
363
+ end
364
+ end
365
+
366
+ describe "#method_missing" do
367
+ it "should include a suggestion to add a reader" do
368
+ lambda{ @document.missing_method }.
369
+ should raise_error(NoMethodError, "undefined method 'missing_method' for #{@document.inspect}. Do you need to add a reader for it?")
370
+ end
371
+ end
372
+
373
+ describe "#inspect" do
374
+ it "should return details of the Document class" do
375
+ Endeca::Document.inspect.should == "#<Endeca::Document>\nPath: \"http://endeca.example.com\"\nCollection Class: SubDocumentCollection\"\nMappings:\n\tfoo: {:new_foo=>nil}\n\t \nDefaultParams:\n\t \n"
376
+ end
377
+ end
378
+ end