lucid_works 0.7.18 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.rvmrc +2 -3
  2. data/Gemfile +2 -8
  3. data/Gemfile.lock +45 -53
  4. data/README.rdoc +2 -6
  5. data/Rakefile +1 -1
  6. data/config/locales/en.yml +221 -239
  7. data/lib/lucid_works/activity.rb +8 -5
  8. data/lib/lucid_works/base.rb +27 -16
  9. data/lib/lucid_works/cache.rb +13 -0
  10. data/lib/lucid_works/cluster.rb +84 -0
  11. data/lib/lucid_works/collection/settings.rb +15 -6
  12. data/lib/lucid_works/collection.rb +62 -92
  13. data/lib/lucid_works/datasource/history.rb +2 -1
  14. data/lib/lucid_works/datasource/mapping.rb +12 -0
  15. data/lib/lucid_works/datasource/schedule.rb +5 -2
  16. data/lib/lucid_works/datasource/status.rb +3 -2
  17. data/lib/lucid_works/datasource.rb +31 -48
  18. data/lib/lucid_works/datasource_property.rb +2 -1
  19. data/lib/lucid_works/datasource_type.rb +14 -0
  20. data/lib/lucid_works/dynamicfield.rb +12 -0
  21. data/lib/lucid_works/elevation.rb +93 -0
  22. data/lib/lucid_works/exceptions.rb +0 -4
  23. data/lib/lucid_works/field.rb +31 -111
  24. data/lib/lucid_works/field_commons.rb +133 -0
  25. data/lib/lucid_works/gem_version.rb +1 -1
  26. data/lib/lucid_works/inflections.rb +3 -0
  27. data/lib/lucid_works/patch_time.rb +4 -0
  28. data/lib/lucid_works/request_handler.rb +16 -0
  29. data/lib/lucid_works/role.rb +23 -8
  30. data/lib/lucid_works/schema/attribute.rb +1 -1
  31. data/lib/lucid_works/schema/boolean_attribute.rb +1 -1
  32. data/lib/lucid_works/schema/integer_attribute.rb +3 -4
  33. data/lib/lucid_works/server/crawlers_status.rb +15 -0
  34. data/lib/lucid_works/server.rb +35 -14
  35. data/lib/lucid_works/simple_naming.rb +1 -7
  36. data/lib/lucid_works/synonym.rb +1 -1
  37. data/lib/lucid_works/version.rb +1 -0
  38. data/lib/lucid_works.rb +8 -1
  39. data/lucid_works.gemspec +8 -9
  40. data/spec/fixtures/zookeeper/clusterstate.json +30 -0
  41. data/spec/fixtures/zookeeper/clusterstate_broken_shard.json +29 -0
  42. data/spec/fixtures/zookeeper/live_nodes.json +28 -0
  43. data/spec/fixtures/zookeeper/live_nodes_no_children.json +26 -0
  44. data/spec/fixtures/zookeeper/live_nodes_one_child.json +36 -0
  45. data/spec/lib/lucid_works/base_spec.rb +33 -24
  46. data/spec/lib/lucid_works/cache_spec.rb +44 -0
  47. data/spec/lib/lucid_works/cluster_spec.rb +109 -0
  48. data/spec/lib/lucid_works/collection/activity_spec.rb +29 -0
  49. data/spec/lib/lucid_works/collection/prime_activities_spec.rb +1 -1
  50. data/spec/lib/lucid_works/collection/settings_spec.rb +31 -0
  51. data/spec/lib/lucid_works/collection_spec.rb +166 -107
  52. data/spec/lib/lucid_works/datasource/schedule_spec.rb +75 -46
  53. data/spec/lib/lucid_works/datasource/status_spec.rb +5 -5
  54. data/spec/lib/lucid_works/datasource_property_spec.rb +41 -0
  55. data/spec/lib/lucid_works/datasource_spec.rb +40 -12
  56. data/spec/lib/lucid_works/datasource_type_spec.rb +31 -0
  57. data/spec/lib/lucid_works/dynamicfield_spec.rb +214 -0
  58. data/spec/lib/lucid_works/elevation_spec.rb +175 -0
  59. data/spec/lib/lucid_works/field_spec.rb +52 -21
  60. data/spec/lib/lucid_works/fieldtype_spec.rb +0 -1
  61. data/spec/lib/lucid_works/request_handler_spec.rb +11 -0
  62. data/spec/lib/lucid_works/role_spec.rb +77 -0
  63. data/spec/lib/lucid_works/server/crawlers_status_spec.rb +21 -0
  64. data/spec/lib/lucid_works/server_spec.rb +123 -22
  65. data/spec/lib/lucid_works/{collection/synonym_spec.rb → synonym_spec.rb} +23 -22
  66. data/spec/lib/lucid_works/version_spec.rb +6 -0
  67. metadata +132 -64
  68. data/spec/lib/lucid_works/collection/acl_config_spec.rb +0 -212
@@ -11,6 +11,32 @@ describe LucidWorks::Field do
11
11
  LucidWorks::Field.new(:parent => @collection).should be_a(LucidWorks::Base)
12
12
  end
13
13
 
14
+ describe "adjusting REST URLs" do
15
+ context "when include_dynamic is disabled" do
16
+ it "doesn't change the collection URL" do
17
+ LucidWorks::Field.collection_url(@collection).should == "http://localhost:8888/api/collections/collection1/fields"
18
+ end
19
+
20
+ it "doesn't change the member URL" do
21
+ LucidWorks::Field.member_url(@collection, 5).should == "http://localhost:8888/api/collections/collection1/fields/5"
22
+ end
23
+ end
24
+
25
+ context "when include_dynamic is enabled" do
26
+ before do
27
+ LucidWorks::Field.include_dynamic = true
28
+ end
29
+
30
+ it "changes the collection URL" do
31
+ LucidWorks::Field.collection_url(@collection).should == "http://localhost:8888/api/collections/collection1/fields?include_dynamic=true"
32
+ end
33
+
34
+ it "changes the member URL" do
35
+ LucidWorks::Field.member_url(@collection, 5).should == "http://localhost:8888/api/collections/collection1/fields/5?include_dynamic=true"
36
+ end
37
+ end
38
+ end
39
+
14
40
  describe "default attribute values" do
15
41
  context "for a new field" do
16
42
  subject { LucidWorks::Field.new(:parent => @collection) }
@@ -29,7 +55,7 @@ describe LucidWorks::Field do
29
55
  LucidWorks::Field.new(
30
56
  :parent => @collection,
31
57
  :indexed => true, :facet => true, :synonym_expansion => true, :omit_tf => true, :short_field_boost => true, :search_by_default => false, :use_in_find_similar => false, :query_time_stopword_handling => false,
32
- :stored => true, :include_in_results => true, :highlight => true
58
+ :stored => true, :include_in_results => true, :highlight => true, :field_type => 'string'
33
59
  )
34
60
  }
35
61
 
@@ -40,6 +66,7 @@ describe LucidWorks::Field do
40
66
 
41
67
  it { subject.facet.should be_false }
42
68
  it { subject.synonym_expansion.should be_false }
69
+ it { subject.omit_positions.should be_false }
43
70
  it { subject.omit_tf.should be_false }
44
71
  it { subject.short_field_boost.should == 'high' }
45
72
  it { subject.search_by_default.should be_false }
@@ -62,7 +89,7 @@ describe LucidWorks::Field do
62
89
  context "for a new field" do
63
90
  context :name do
64
91
  it "is required" do
65
- field = LucidWorks::Field.new(:parent => @collection)
92
+ field = LucidWorks::Field.new(:field_type => 'string', :parent => @collection)
66
93
  field.should_not be_valid
67
94
  field.errors[:name].should == ["can't be blank"]
68
95
  end
@@ -73,54 +100,60 @@ describe LucidWorks::Field do
73
100
  field.errors[:name].should == ["must be unique"]
74
101
  end
75
102
  end
103
+
104
+ it "requires a field type" do
105
+ field = LucidWorks::Field.new(:parent => @collection, :name => 'data_source')
106
+ field.should_not be_valid
107
+ field.errors[:field_type].should == ["can't be blank"]
108
+ end
76
109
 
77
110
  context :short_field_boost do
78
111
  it "cannot be set to 'none' for a non-indexed field" do
79
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => false, :short_field_boost => 'none').tap do |field|
112
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => false, :short_field_boost => 'none').tap do |field|
80
113
  field.should_not be_valid
81
114
  field.errors[:short_field_boost].should == ['cannot be set to "none" for a non-indexed field']
82
115
  end
83
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => true, :short_field_boost => true, :indexing_options => :document_only).should be_valid
116
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => true, :short_field_boost => true, :indexing_options => :document_only).should be_valid
84
117
  end
85
118
  end
86
119
 
87
120
  context :include_in_results do
88
121
  it "requires the field to be stored" do
89
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :stored => false, :include_in_results => true).tap do |field|
122
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :stored => false, :include_in_results => true).tap do |field|
90
123
  field.should_not be_valid
91
124
  field.errors[:include_in_results].should == ["a field must be stored to be included in results"]
92
125
  end
93
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :stored => true, :include_in_results => true, :indexing_options => :document_only).should be_valid
126
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :stored => true, :include_in_results => true, :indexing_options => :document_only).should be_valid
94
127
  end
95
128
  end
96
129
 
97
130
  context :highlight do
98
131
  it "requires the field to be stored" do
99
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :stored => false, :highlight => true).tap do |field|
132
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :stored => false, :highlight => true).tap do |field|
100
133
  field.should_not be_valid
101
134
  field.errors[:highlight].should == ["a field must be stored to be highlighted"]
102
135
  end
103
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :stored => true, :highlighted => true).should be_valid
136
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :stored => true, :highlighted => true).should be_valid
104
137
  end
105
138
  end
106
139
 
107
140
  context :facet do
108
141
  it "requires the field to be indexed" do
109
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => false, :facet => true).tap do |field|
142
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => false, :facet => true).tap do |field|
110
143
  field.should_not be_valid
111
144
  field.errors[:facet].should == ["a field must be indexed to be facetable"]
112
145
  end
113
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => true, :facet => true, :indexing_options => :document_only).should be_valid
146
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => true, :facet => true, :indexing_options => :document_only).should be_valid
114
147
  end
115
148
  end
116
149
 
117
150
  context :use_in_find_similar do
118
151
  it "requires the field to be indexed" do
119
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => false, :use_in_find_similar => true).tap do |field|
152
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => false, :use_in_find_similar => true).tap do |field|
120
153
  field.should_not be_valid
121
154
  field.errors[:use_in_find_similar].should == ["a field must be indexed for it to be used for find-similar"]
122
155
  end
123
- LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => true, :use_in_find_similar => true, :indexing_options => :document_only).should be_valid
156
+ LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => true, :use_in_find_similar => true, :indexing_options => :document_only).should be_valid
124
157
  end
125
158
  end
126
159
  end
@@ -134,7 +167,7 @@ describe LucidWorks::Field do
134
167
  end
135
168
 
136
169
  describe "indexing options" do
137
- INDEXING_OPTIONS_TRUTH_TABLE = [
170
+ FIELD_INDEXING_OPTIONS_TRUTH_TABLE = [
138
171
  { :indexed => true, :indexing_options => :document_termfreq_termpos, :omit_tf => false, :omit_positions => false },
139
172
  { :indexed => true, :indexing_options => :document_termfreq, :omit_tf => false, :omit_positions => true },
140
173
  { :indexed => true, :indexing_options => :document_only, :omit_tf => true, :omit_positions => true },
@@ -180,11 +213,11 @@ describe LucidWorks::Field do
180
213
  describe "getter" do
181
214
  context "when indexed is false" do
182
215
  before do
183
- @field = LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => false)
216
+ @field = LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => false)
184
217
  end
185
218
 
186
219
  describe "it should always return :document_termfreq_termpos" do
187
- INDEXING_OPTIONS_TRUTH_TABLE.select{ |x| x[:indexed] == 'false'}.each do |settings|
220
+ FIELD_INDEXING_OPTIONS_TRUTH_TABLE.select{ |x| x[:indexed] == 'false'}.each do |settings|
188
221
  it "should return :document_termfreq_termpos if omit_tf=#{settings[:omit_tf]} and omit_positions=#{settings[:omit_positions]}" do
189
222
  settings.each { |k,v| @field.send("#{k}=", v) }
190
223
  @field.indexing_options.should == :document_termfreq_termpos
@@ -196,10 +229,10 @@ describe LucidWorks::Field do
196
229
 
197
230
  context "when indexed is true" do
198
231
  before do
199
- @field = LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :indexed => true)
232
+ @field = LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string', :indexed => true)
200
233
  end
201
234
 
202
- INDEXING_OPTIONS_TRUTH_TABLE.select { |x| x[:indexed] == true }.each do |data|
235
+ FIELD_INDEXING_OPTIONS_TRUTH_TABLE.select { |x| x[:indexed] == true }.each do |data|
203
236
  it "should return #{data[:indexing_options]} if omit_tf=#{data[:omit_tf]} and omit_positions=#{data[:omit_positions]}" do
204
237
  @field.omit_tf = data[:omit_tf]
205
238
  @field.omit_positions = data[:omit_positions]
@@ -207,15 +240,14 @@ describe LucidWorks::Field do
207
240
  end
208
241
  end
209
242
  end
210
-
211
243
  end
212
244
 
213
245
  describe "setter" do
214
246
  before do
215
- @field = LucidWorks::Field.new(:parent => @collection, :name => 'my_field')
247
+ @field = LucidWorks::Field.new(:parent => @collection, :name => 'my_field', :field_type => 'string')
216
248
  end
217
249
 
218
- INDEXING_OPTIONS_TRUTH_TABLE.each do |data|
250
+ FIELD_INDEXING_OPTIONS_TRUTH_TABLE.each do |data|
219
251
 
220
252
  context "when indexed is set to #{data[:indexed]} BEFORE indexing options is set to #{data[:indexing_options]}" do
221
253
  before do
@@ -277,7 +309,6 @@ describe LucidWorks::Field do
277
309
  it "should retrieve a field" do
278
310
  field = LucidWorks::Field.find('body', :parent => @collection)
279
311
  field.should be_a(LucidWorks::Field)
280
- field.should respond_to(:field_type)
281
312
  end
282
313
  end
283
314
  end
@@ -88,7 +88,6 @@ describe LucidWorks::Fieldtype do
88
88
  ft.attributes.should == {
89
89
  "_class" => "solr.StrField",
90
90
  "name" => "string",
91
- "omitNorms" => "true",
92
91
  "sortMissingLast" => "true"
93
92
  }
94
93
  end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe LucidWorks::RequestHandler do
4
+ let(:server) { connect_to_live_server.tap {|server| server.reset_collections! } }
5
+
6
+ subject { server.collections.first.request_handler('lucid') }
7
+
8
+ its(:name) { should == 'lucid' }
9
+
10
+ its(:default_params) { should include(qf: 'author text_all title^5.0', pf: 'author text_all title^5.0') }
11
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ describe LucidWorks::Role do
4
+ before :all do
5
+ @server = connect_to_live_server
6
+ @server.reset_collections!
7
+ @collection = @server.collection('collection1')
8
+ end
9
+
10
+ it "should use the ORM" do
11
+ LucidWorks::Role.new(:parent => @collection).should be_a(LucidWorks::Base)
12
+ end
13
+
14
+ context "view helper methods" do
15
+ before do
16
+ @role = LucidWorks::Role.new(:parent => @collection)
17
+ end
18
+
19
+ context "list is empty" do
20
+ describe "#users_for_text_field" do
21
+ it "should return an empty string" do
22
+ users = []
23
+ @role.users = users
24
+ @role.users.should == users
25
+ @role.users_for_text_field.should == ""
26
+ end
27
+ end
28
+
29
+ describe "#groups_for_text_field" do
30
+ it "should return an empty string" do
31
+ groups = []
32
+ @role.groups = groups
33
+ @role.groups.should == groups
34
+ @role.groups_for_text_field.should == ""
35
+ end
36
+ end
37
+
38
+ describe "#filters_for_text_area" do
39
+ it "should return an empty string" do
40
+ filters = []
41
+ @role.filters = filters
42
+ @role.filters.should == filters
43
+ @role.filters_for_text_area.should == ""
44
+ end
45
+ end
46
+ end
47
+
48
+ context "list is not empty" do
49
+ describe "#users_for_text_field" do
50
+ it "should return a comma-space joined string" do
51
+ users = ["John Smith", "bob"]
52
+ @role.users = users
53
+ @role.users.should == users
54
+ @role.users_for_text_field.should == "John Smith, bob"
55
+ end
56
+ end
57
+
58
+ describe "#groups_for_text_field" do
59
+ it "should return a comma-space joined string" do
60
+ groups = ["Domain Admins", "admins"]
61
+ @role.groups = groups
62
+ @role.groups.should == groups
63
+ @role.groups_for_text_field.should == "Domain Admins, admins"
64
+ end
65
+ end
66
+
67
+ describe "#filters_for_text_area" do
68
+ it "should return an empty string" do
69
+ filters = ["rails", "telecommute*"]
70
+ @role.filters = filters
71
+ @role.filters.should == filters
72
+ @role.filters_for_text_area.should == "rails\ntelecommute*"
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe LucidWorks::Server::CrawlersStatus do
4
+ let(:server) { LucidWorks::Server.new('http://1.1.1.1:8888') }
5
+
6
+ it "adjusts the member URL" do
7
+ LucidWorks::Server::CrawlersStatus.member_url(server).should == "http://1.1.1.1:8888/api/crawlers/status"
8
+ end
9
+
10
+ context "with an OK status" do
11
+ subject { LucidWorks::Server::CrawlersStatus.new(:parent => server, :status => 'OK') }
12
+
13
+ it { should be_ok }
14
+ end
15
+
16
+ context "with a non-OK status" do
17
+ subject { LucidWorks::Server::CrawlersStatus.new(:parent => server, :status => 'WARNING') }
18
+
19
+ it { should_not be_ok }
20
+ end
21
+ end
@@ -1,30 +1,30 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe LucidWorks::Server do
4
- before do
5
- @fake_server_uri = "http://fakehost.com:8888"
4
+ describe "exposing attributes" do
5
+ let(:server_uri) { "http://joe:xyz@fakehost.com:8888" }
6
+
7
+ subject { server = LucidWorks::Server.new(server_uri) }
8
+
9
+ its(:server_uri) { should == server_uri }
10
+ its(:uri) { should == server_uri + "/api" } # TODO: 'uri' is a confusing name
11
+ its(:api_uri) { should == server_uri + "/api" }
12
+ its(:solr_uri) { should == server_uri + "/solr" }
13
+ its(:logs_uri) { should == server_uri + "/logs" }
14
+ its(:host) { should == "fakehost.com" }
15
+ its(:protocol) { should == "http://" }
16
+ its(:port) { should == 8888 }
17
+ its(:user) { should == "joe" }
18
+ its(:password) { should == "xyz" }
6
19
  end
7
20
 
8
- describe ".new" do
9
- it "should require a URL" do
10
- lambda {
11
- LucidWorks::Server.new
12
- }.should raise_error(ArgumentError)
13
- end
14
-
15
- it "should remember the server URL" do
16
- server = LucidWorks::Server.new(@fake_server_uri)
17
- server.uri.should == @fake_server_uri + "/api"
18
- end
19
- end
20
-
21
- context "server" do
22
- before { @server = LucidWorks::Server.new(@fake_server_uri) }
21
+ describe "associations" do
22
+ let(:server) { LucidWorks::Server.new('http://host.example.com:8000') }
23
23
 
24
24
  describe "#collection" do
25
25
  it "should call Collection.find and pass the server" do
26
- LucidWorks::Collection.should_receive(:find).with('foo', :parent => @server)
27
- @server.collection('foo')
26
+ LucidWorks::Collection.should_receive(:find).with('foo', :parent => server)
27
+ server.collection('foo')
28
28
  end
29
29
  end
30
30
 
@@ -32,11 +32,112 @@ describe LucidWorks::Server do
32
32
  it "should create a HasMany association proxy for the specified class" do
33
33
  mock_proxy = double('has_many proxy', :find => nil)
34
34
  LucidWorks::Associations::HasMany.should_receive(:new).
35
- with(@server, LucidWorks::Collection, {}).
35
+ with(server, LucidWorks::Collection, {}).
36
36
  and_return(mock_proxy)
37
-
38
- @server.collections
37
+ server.collections
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "helpers" do
43
+ let(:server) { connect_to_live_server }
44
+
45
+ describe "#datasource_types" do
46
+ before(:each) do
47
+ RestClient.should_receive(:get).with("#{server.server_uri}/api/crawlers").and_return <<-EOF
48
+ [
49
+ {
50
+ "name" : "lucid.aperture",
51
+ "datasource_types" : [
52
+ {
53
+ "props": [],
54
+ "type" : "file",
55
+ "category" : "FileSystem"
56
+ },
57
+ {
58
+ "props": [],
59
+ "type" : "web",
60
+ "category" : "Web"
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "name" : "lucid.fs",
66
+ "datasource_types" : [
67
+ {
68
+ "props": [],
69
+ "type" : "file",
70
+ "category" : "FileSystem"
71
+ }
72
+ ]
73
+ }
74
+ ]
75
+ EOF
76
+ end
77
+
78
+ it "returns a flat list of datasource types" do
79
+ server.datasource_types.should have(3).items
80
+ dt = server.datasource_types.first
81
+ dt.should be_a(LucidWorks::DatasourceType)
82
+ dt.type.should == "file"
83
+ dt.crawler.name.should == "lucid.aperture"
84
+ end
85
+ end
86
+
87
+ describe "#datasource_type" do
88
+ before(:each) do
89
+ RestClient.should_receive(:get).with("#{server.server_uri}/api/crawlers").and_return <<-EOF
90
+ [
91
+ {
92
+ "name" : "lucid.aperture",
93
+ "datasource_types" : [
94
+ {
95
+ "props": [],
96
+ "type" : "file",
97
+ "category" : "FileSystem"
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "name" : "lucid.fs",
103
+ "datasource_types" : [
104
+ {
105
+ "props": [],
106
+ "type" : "file",
107
+ "category" : "FileSystem"
108
+ }
109
+ ]
110
+ }
111
+ ]
112
+ EOF
113
+ end
114
+
115
+ it "finds the datasource type matching the provided type name and crawler name" do
116
+ dt = server.datasource_type('file', 'lucid.fs')
117
+ dt.should be_a(LucidWorks::DatasourceType)
118
+ dt.type.should == "file"
119
+ dt.crawler.name.should == "lucid.fs"
120
+ end
121
+ end
122
+ end
123
+
124
+ describe "#clustered" do
125
+ subject { LucidWorks::Server.new('http://host.example.com:8000') }
126
+
127
+ context "with ZooKeeper" do
128
+ before(:each) do
129
+ RestClient.stub(:get).with('http://host.example.com:8000/solr/zookeeper') { '{"some":"json"}' }
130
+ end
131
+
132
+ it { should be_clustered }
133
+ end
134
+
135
+ context "without ZooKeeper" do
136
+ before(:each) do
137
+ RestClient.stub(:get).with('http://host.example.com:8000/solr/zookeeper').and_raise RestClient::ResourceNotFound
39
138
  end
139
+
140
+ it { should_not be_clustered }
40
141
  end
41
142
  end
42
143
  end
@@ -1,27 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe LucidWorks::Synonym do
4
- before do
5
- @server = connect_to_live_server.tap {|server| server.reset_collections! }
6
- load_collection
7
- end
4
+ let(:server) { connect_to_live_server.tap {|server| server.reset_collections! } }
8
5
 
9
- def load_collection
10
- @collection = @server.collection('collection1')
6
+ let(:collection) { server.collection('collection1') }
7
+
8
+ def reload_collection
9
+ __memoized[:collection] = server.collection('collection1')
11
10
  end
12
- alias :reload_collection :load_collection
13
11
 
14
12
  describe "naming support" do
15
- it "demodulizes names" do
16
- LucidWorks::Synonym.model_name.singular.should == "synonym"
17
- LucidWorks::Synonym.model_name.plural.should == "synonyms"
18
- LucidWorks::Synonym.model_name.collection.should == "synonyms"
13
+ it "demodulizes the model's name" do
14
+ LucidWorks::Synonym.model_name.should == "Synonym"
19
15
  end
20
16
  end
21
17
 
22
18
  describe "conversion support" do
23
19
  it "can be converted to a key" do
24
- synonym = LucidWorks::Synonym.new(:collection => @collection, :mapping => "car, auto")
20
+ synonym = LucidWorks::Synonym.new(:collection => collection, :mapping => "car, auto")
25
21
  synonym.save
26
22
  synonym.to_key.should == [8]
27
23
  end
@@ -49,11 +45,12 @@ describe LucidWorks::Synonym do
49
45
 
50
46
  describe :save do
51
47
  context "when valid" do
52
- subject { LucidWorks::Synonym.new(:collection => @collection, :mapping => "car, auto") }
48
+ subject { LucidWorks::Synonym.new(:collection => collection, :mapping => "car, auto") }
53
49
 
54
50
  it "gets saved in the collection settings" do
55
51
  subject.save
56
- reload_collection.settings.synonym_list.should include("car, auto")
52
+ reload_collection
53
+ collection.settings.synonym_list.should include("car, auto")
57
54
  end
58
55
 
59
56
  it "returns true" do
@@ -72,11 +69,12 @@ describe LucidWorks::Synonym do
72
69
  end
73
70
 
74
71
  context "when invalid" do
75
- subject { LucidWorks::Synonym.new(:collection => @collection, :mapping => "car") }
72
+ subject { LucidWorks::Synonym.new(:collection => collection, :mapping => "car") }
76
73
 
77
74
  it "doesn't get saved in the collection settings" do
78
75
  subject.save
79
- reload_collection.settings.synonym_list.should_not include("car")
76
+ reload_collection
77
+ collection.settings.synonym_list.should_not include("car")
80
78
  end
81
79
 
82
80
  it "returns false" do
@@ -105,17 +103,20 @@ describe LucidWorks::Synonym do
105
103
 
106
104
  describe :update_attributes do
107
105
  it "updates the collection settings" do
108
- @collection.synonyms[0].update_attributes(:mapping => "lawyer, clown")
109
- reload_collection.should have(8).synonyms
110
- @collection.synonyms[0].mapping.should == "lawyer, clown"
106
+ first_default_synonym = collection.settings.synonym_list.first
107
+ LucidWorks::Synonym.new(:id => 0, :collection => collection, :mapping => first_default_synonym, :persisted => true).
108
+ update_attributes(:mapping => "lawyer, clown")
109
+ reload_collection
110
+ collection.settings.synonym_list.first.should == "lawyer, clown"
111
111
  end
112
112
  end
113
113
 
114
114
  describe :destroy do
115
115
  it "removes the mapping from the collection settings" do
116
- @collection.synonyms[0].destroy
117
- reload_collection.should have(7).synonyms
118
- @collection.synonyms.should_not include("lawyer, attorney")
116
+ first_default_synonym = collection.settings.synonym_list.first
117
+ LucidWorks::Synonym.new(:id => 0, :collection => collection, :mapping => first_default_synonym, :persisted => true).destroy
118
+ reload_collection
119
+ collection.settings.synonym_list.should_not include(first_default_synonym)
119
120
  end
120
121
  end
121
122
  end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe LucidWorks::Version do
4
+
5
+ specify { LucidWorks::Version.singleton.should be_true }
6
+ end