pose 2.0.1 → 2.1.0

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.
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module Pose
4
4
  describe Assignment do
5
5
 
6
- describe "delete_class_index" do
6
+ describe :delete_class_index do
7
7
 
8
8
  before :each do
9
9
  FactoryGirl.create :assignment, posable_id: 1, posable_type: 'PosableOne'
@@ -21,7 +21,7 @@ module Pose
21
21
  end
22
22
 
23
23
 
24
- describe "cleanup_orphaned_pose_assignments" do
24
+ describe :cleanup_orphaned_pose_assignments do
25
25
 
26
26
  it "deletes the assignment if the posable object doesn't exist" do
27
27
  FactoryGirl.create :assignment, posable_id: 2, posable_type: 'PosableOne'
@@ -5,7 +5,7 @@ module Pose
5
5
 
6
6
  describe 'class methods' do
7
7
 
8
- describe '::remove_unused_words' do
8
+ describe :remove_unused_words do
9
9
 
10
10
  shared_examples 'it properly removes unused words' do
11
11
  it 'removes unused words' do
@@ -15,7 +15,7 @@ module Pose
15
15
  end
16
16
 
17
17
 
18
- describe '#update_pose_index' do
18
+ describe :update_pose_index do
19
19
 
20
20
  before :each do
21
21
  Pose::CONFIGURATION[:perform_search] = perform_search
@@ -45,7 +45,7 @@ module Pose
45
45
  end
46
46
 
47
47
 
48
- describe '#update_pose_words' do
48
+ describe :update_pose_words do
49
49
 
50
50
  it 'saves the words for search' do
51
51
  subject.text = 'foo bar'
@@ -71,7 +71,7 @@ module Pose
71
71
  end
72
72
 
73
73
 
74
- describe 'search' do
74
+ describe :search do
75
75
 
76
76
  it 'works' do
77
77
  pos = PosableOne.create text: 'foo'
@@ -157,22 +157,34 @@ module Pose
157
157
 
158
158
  context 'with ids and scope' do
159
159
  it 'limits the result set to the given number' do
160
- result = Pose.search 'foo', PosableOne, result_type: :ids, limit: 1, where: [private: false]
160
+ result = Pose.search 'foo',
161
+ PosableOne,
162
+ result_type: :ids,
163
+ limit: 1,
164
+ joins: PosableOne,
165
+ where: ["posable_ones.private = ?", false]
161
166
  expect(result[PosableOne]).to have(1).item
162
167
  end
163
168
  end
164
169
 
165
170
  context 'with classes and no scope' do
166
171
  it 'limits the result set to the given number' do
167
- result = Pose.search 'foo', PosableOne, limit: 1
172
+ result = Pose.search 'foo',
173
+ PosableOne,
174
+ limit: 1
168
175
  expect(result[PosableOne]).to have(1).item
169
176
  end
170
177
  end
171
178
 
172
179
  context 'with classes and scope' do
173
180
  it 'limits the result set to the given number' do
174
- result = Pose.search 'foo', PosableOne, limit: 1, where: [private: false]
181
+ result = Pose.search 'foo',
182
+ PosableOne,
183
+ limit: 1,
184
+ joins: PosableOne,
185
+ where: ["posable_ones.private = ?", false]
175
186
  expect(result[PosableOne]).to have(1).item
187
+ expect(result[PosableOne]).to eq [@pos3]
176
188
  end
177
189
  end
178
190
  end
@@ -211,26 +223,30 @@ module Pose
211
223
  context 'with result type :classes' do
212
224
 
213
225
  it 'limits the result set by the given conditions' do
214
- result = Pose.search 'foo', PosableOne, where: [ private: true ]
215
- expect(result[PosableOne]).to have(1).item
216
- expect(result[PosableOne]).to include @one
217
- end
218
-
219
- it 'allows to use the hash syntax for queries' do
220
- result = Pose.search 'foo', PosableOne, where: [ private: true ]
226
+ result = Pose.search 'foo',
227
+ PosableOne,
228
+ joins: PosableOne,
229
+ where: ["posable_ones.private = ?", true]
221
230
  expect(result[PosableOne]).to have(1).item
222
231
  expect(result[PosableOne]).to include @one
223
232
  end
224
233
 
225
234
  it 'allows to use the string syntax for queries' do
226
- result = Pose.search 'foo', PosableOne, where: [ ['private = ?', true] ]
235
+ result = Pose.search 'foo',
236
+ PosableOne,
237
+ joins: PosableOne,
238
+ where: ["posable_ones.private = ?", true]
227
239
  expect(result[PosableOne]).to have(1).item
228
240
  expect(result[PosableOne]).to include @one
229
241
  end
230
242
 
231
243
  it 'allows to combine several conditions' do
232
244
  three = FactoryGirl.create :posable_one, text: 'foo two', private: true
233
- result = Pose.search 'foo', PosableOne, where: [ {private: true}, ['text = ?', 'foo two'] ]
245
+ result = Pose.search 'foo',
246
+ PosableOne,
247
+ joins: PosableOne,
248
+ where: [ ["posable_ones.private = ?", true],
249
+ ['posable_ones.text = ?', 'foo two'] ]
234
250
  expect(result[PosableOne]).to have(1).item
235
251
  expect(result[PosableOne]).to include three
236
252
  end
@@ -239,16 +255,41 @@ module Pose
239
255
  context 'with result type :ids' do
240
256
 
241
257
  it 'limits the result set by the given condition' do
242
- result = Pose.search 'foo', PosableOne, result_type: :ids, where: [ private: true ]
258
+ result = Pose.search 'foo',
259
+ PosableOne,
260
+ result_type: :ids,
261
+ joins: PosableOne,
262
+ where: ["posable_ones.private = ?", true]
243
263
  expect(result[PosableOne]).to have(1).item
244
264
  expect(result[PosableOne]).to include @one.id
245
265
  end
246
266
  end
247
267
  end
268
+
269
+ describe ':joins parameter' do
270
+
271
+ before :each do
272
+ @user_1 = FactoryGirl.create :user, name: 'Jeff'
273
+ @user_2 = FactoryGirl.create :user, name: 'Jim'
274
+ @one = FactoryGirl.create :posable_one, text: 'snippet one', user: @user_1
275
+ @two = FactoryGirl.create :posable_one, text: 'snippet two', user: @user_2
276
+ end
277
+
278
+ it 'allows to use joined tables for queries' do
279
+ result = Pose.search 'snippet',
280
+ PosableOne,
281
+ { joins: [ PosableOne,
282
+ "INNER JOIN users on posable_ones.user_id=users.id" ],
283
+ where: ["users.name == 'Jeff'"] }
284
+ expect(result[PosableOne].map(&:text)).to eql ['snippet one']
285
+ end
286
+
287
+ it 'allows to load data from joined tables'
288
+ end
248
289
  end
249
290
 
250
291
 
251
- describe 'autocomplete_words' do
292
+ describe :autocomplete_words do
252
293
 
253
294
  it 'returns words that start with the given phrase' do
254
295
  PosableOne.create text: 'great green pine tree'
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,8 @@
1
+ if ENV['COVERALLS_CONFIG'] == 'nocoveralls'
2
+ require 'coveralls'
3
+ Coveralls.wear!
4
+ end
5
+
1
6
  # This file is copied to spec/ when you run 'rails generate rspec:install'
2
7
  ENV["RAILS_ENV"] ||= 'test'
3
8
  require File.expand_path("../dummy/config/environment.rb", __FILE__)
metadata CHANGED
@@ -1,110 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pose
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
5
- prerelease:
4
+ version: 2.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kevin Goslar
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-12 00:00:00.000000000 Z
11
+ date: 2013-07-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 3.0.0
19
+ version: '3.0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: 3.0.0
26
+ version: '3.0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: ruby-progressbar
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: factory_girl_rails
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: faker
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
76
81
  - !ruby/object:Gem::Version
77
82
  version: '0'
78
83
  - !ruby/object:Gem::Dependency
79
84
  name: rspec-rails
80
85
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
86
  requirements:
83
- - - ! '>='
87
+ - - '>='
84
88
  - !ruby/object:Gem::Version
85
89
  version: '0'
86
90
  type: :development
87
91
  prerelease: false
88
92
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
93
  requirements:
91
- - - ! '>='
94
+ - - '>='
92
95
  - !ruby/object:Gem::Version
93
96
  version: '0'
94
97
  - !ruby/object:Gem::Dependency
95
98
  name: sqlite3
96
99
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
100
  requirements:
99
- - - ! '>='
101
+ - - '>='
100
102
  - !ruby/object:Gem::Version
101
103
  version: '0'
102
104
  type: :development
103
105
  prerelease: false
104
106
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
107
  requirements:
107
- - - ! '>='
108
+ - - '>='
108
109
  - !ruby/object:Gem::Version
109
110
  version: '0'
110
111
  description: Pose ('Polymorphic Search') allows fulltext search for ActiveRecord objects.
@@ -117,15 +118,19 @@ files:
117
118
  - app/models/pose/assignment.rb
118
119
  - app/models/pose/word.rb
119
120
  - db/migrate/20130308144915_pose_install.rb
121
+ - lib/generators/pose/install/install_generator.rb
122
+ - lib/generators/pose/install/templates/install_migration.rb
120
123
  - lib/generators/pose/remove/remove_generator.rb
121
124
  - lib/generators/pose/remove/templates/remove_migration.rb
122
125
  - lib/generators/pose/upgrade/templates/upgrade_migration.rb
123
126
  - lib/generators/pose/upgrade/upgrade_generator.rb
124
127
  - lib/pose/activerecord_base_additions.rb
125
128
  - lib/pose/engine.rb
126
- - lib/pose/internal_helpers.rb
129
+ - lib/pose/helpers.rb
127
130
  - lib/pose/model_class_additions.rb
131
+ - lib/pose/query.rb
128
132
  - lib/pose/railtie.rb
133
+ - lib/pose/search.rb
129
134
  - lib/pose/static_api.rb
130
135
  - lib/pose/version.rb
131
136
  - lib/pose.rb
@@ -135,6 +140,7 @@ files:
135
140
  - README.md
136
141
  - spec/dummy/app/models/posable_one.rb
137
142
  - spec/dummy/app/models/posable_two.rb
143
+ - spec/dummy/app/models/user.rb
138
144
  - spec/dummy/config/application.rb
139
145
  - spec/dummy/config/boot.rb
140
146
  - spec/dummy/config/database.yml
@@ -154,6 +160,7 @@ files:
154
160
  - spec/dummy/db/development.sqlite3
155
161
  - spec/dummy/db/migrate/20130308054001_create_posable_one.rb
156
162
  - spec/dummy/db/migrate/20130308054142_create_posable_two.rb
163
+ - spec/dummy/db/migrate/20130708084009_create_users.rb
157
164
  - spec/dummy/db/schema.rb
158
165
  - spec/dummy/db/test.sqlite3
159
166
  - spec/dummy/log/development.log
@@ -162,8 +169,12 @@ files:
162
169
  - spec/dummy/script/rails
163
170
  - spec/factories/assignments.rb
164
171
  - spec/factories/posable_one.rb
172
+ - spec/factories/posable_two.rb
173
+ - spec/factories/user.rb
165
174
  - spec/factories/words.rb
166
- - spec/internal_helpers_spec.rb
175
+ - spec/lib/pose/helpers_spec.rb
176
+ - spec/lib/pose/query_spec.rb
177
+ - spec/lib/pose/search_spec.rb
167
178
  - spec/models/assignment_spec.rb
168
179
  - spec/models/word_spec.rb
169
180
  - spec/pose_api_spec.rb
@@ -171,31 +182,39 @@ files:
171
182
  - spec/support/matchers.rb
172
183
  homepage: http://github.com/kevgo/pose
173
184
  licenses: []
174
- post_install_message:
185
+ metadata: {}
186
+ post_install_message: |2
187
+
188
+ HEADS UP! If you have used Pose 1.x before,
189
+ you need to update your database tables!
190
+
191
+ * run: rails g pose:upgrade
192
+ * run: rake db:migrate
193
+
194
+ For more information, see: https://github.com/kevgo/pose
175
195
  rdoc_options: []
176
196
  require_paths:
177
197
  - lib
178
198
  required_ruby_version: !ruby/object:Gem::Requirement
179
- none: false
180
199
  requirements:
181
- - - ! '>='
200
+ - - '>='
182
201
  - !ruby/object:Gem::Version
183
202
  version: '0'
184
203
  required_rubygems_version: !ruby/object:Gem::Requirement
185
- none: false
186
204
  requirements:
187
- - - ! '>='
205
+ - - '>='
188
206
  - !ruby/object:Gem::Version
189
207
  version: '0'
190
208
  requirements: []
191
209
  rubyforge_project:
192
- rubygems_version: 1.8.23
210
+ rubygems_version: 2.0.3
193
211
  signing_key:
194
- specification_version: 3
212
+ specification_version: 4
195
213
  summary: A polymorphic, storage-system independent search engine for Ruby on Rails.
196
214
  test_files:
197
215
  - spec/dummy/app/models/posable_one.rb
198
216
  - spec/dummy/app/models/posable_two.rb
217
+ - spec/dummy/app/models/user.rb
199
218
  - spec/dummy/config/application.rb
200
219
  - spec/dummy/config/boot.rb
201
220
  - spec/dummy/config/database.yml
@@ -215,6 +234,7 @@ test_files:
215
234
  - spec/dummy/db/development.sqlite3
216
235
  - spec/dummy/db/migrate/20130308054001_create_posable_one.rb
217
236
  - spec/dummy/db/migrate/20130308054142_create_posable_two.rb
237
+ - spec/dummy/db/migrate/20130708084009_create_users.rb
218
238
  - spec/dummy/db/schema.rb
219
239
  - spec/dummy/db/test.sqlite3
220
240
  - spec/dummy/log/development.log
@@ -223,8 +243,12 @@ test_files:
223
243
  - spec/dummy/script/rails
224
244
  - spec/factories/assignments.rb
225
245
  - spec/factories/posable_one.rb
246
+ - spec/factories/posable_two.rb
247
+ - spec/factories/user.rb
226
248
  - spec/factories/words.rb
227
- - spec/internal_helpers_spec.rb
249
+ - spec/lib/pose/helpers_spec.rb
250
+ - spec/lib/pose/query_spec.rb
251
+ - spec/lib/pose/search_spec.rb
228
252
  - spec/models/assignment_spec.rb
229
253
  - spec/models/word_spec.rb
230
254
  - spec/pose_api_spec.rb
@@ -1,176 +0,0 @@
1
- # encoding: utf-8
2
- require "spec_helper"
3
-
4
- describe Pose::Helpers do
5
-
6
- describe '::get_words_to_add' do
7
- let(:one) { Pose::Word.new(text: 'one') }
8
- let(:two) { Pose::Word.new(text: 'two') }
9
-
10
- context 'having a new word to be added' do
11
- it 'returns an array with strings that need to be added' do
12
- Pose::Helpers.get_words_to_add([one, two], %w{one three}).should eql(['three'])
13
- end
14
- end
15
-
16
- context 'nothing to add' do
17
- it 'returns an empty array' do
18
- Pose::Helpers.get_words_to_add([one, two], %w{one two}).should be_empty
19
- end
20
- end
21
- end
22
-
23
-
24
- describe '::get_words_to_remove' do
25
- let(:one) { Pose::Word.new(text: 'one') }
26
- let(:two) { Pose::Word.new(text: 'two') }
27
-
28
- it "returns an array of word objects that need to be removed" do
29
- Pose::Helpers.get_words_to_remove([one, two], %w{one three}).should eql([two])
30
- end
31
-
32
- it 'returns an empty array if there are no words to be removed' do
33
- Pose::Helpers.get_words_to_remove([one, two], %w{one two}).should be_empty
34
- end
35
- end
36
-
37
-
38
- describe 'make_array' do
39
-
40
- it 'converts a single value into an array' do
41
- Pose::Helpers.make_array(1).should eq [1]
42
- end
43
-
44
- it 'leaves arrays as arrays' do
45
- Pose::Helpers.make_array([1]).should eq [1]
46
- end
47
- end
48
-
49
-
50
- describe 'merge_search_result_word_matches' do
51
- context 'given a new class name' do
52
-
53
- before :each do
54
- @result = {}
55
- end
56
-
57
- it 'sets the given ids as the ids for this class name' do
58
- Pose::Helpers.merge_search_result_word_matches @result, 'class1', [1, 2]
59
- @result.should eq({ 'class1' => [1, 2] })
60
- end
61
- end
62
-
63
- context 'given a class name with already existing ids from another word' do
64
-
65
- before :each do
66
- @result = { 'class1' => [1, 2] }
67
- end
68
-
69
- it 'only keeps the ids that are included in both sets' do
70
- Pose::Helpers.merge_search_result_word_matches @result, 'class1', [1, 3]
71
- @result.should eq({ 'class1' => [1] })
72
- end
73
- end
74
- end
75
-
76
-
77
- describe 'query_terms' do
78
- it 'returns all individual words resulting from the given query' do
79
- Pose::Helpers.query_terms('foo bar').should eq ['foo', 'bar']
80
- end
81
-
82
- it 'converts the individual words into their root form' do
83
- Pose::Helpers.query_terms('bars').should eq ['bar']
84
- end
85
-
86
- it 'splits complex words into separate terms' do
87
- Pose::Helpers.query_terms('one-two').should eq ['one', 'two']
88
- end
89
-
90
- it 'removes duplicates' do
91
- Pose::Helpers.query_terms('foo-bar foo').should eq ['foo', 'bar']
92
- end
93
- end
94
-
95
-
96
- describe 'root_word' do
97
-
98
- it 'converts words into singular' do
99
- Pose::Helpers.root_word('bars').should eql(['bar'])
100
- end
101
-
102
- it 'removes special characters' do
103
- Pose::Helpers.root_word('(bar').should eq ['bar']
104
- Pose::Helpers.root_word('bar)').should eq ['bar']
105
- Pose::Helpers.root_word('(bar)').should eq ['bar']
106
- Pose::Helpers.root_word('>foo').should eq ['foo']
107
- Pose::Helpers.root_word('<foo').should eq ['foo']
108
- Pose::Helpers.root_word('"foo"').should eq ['foo']
109
- Pose::Helpers.root_word('"foo').should eq ['foo']
110
- Pose::Helpers.root_word("'foo'").should eq ['foo']
111
- Pose::Helpers.root_word("'foo's").should eq ['foo']
112
- Pose::Helpers.root_word("foo?").should eq ['foo']
113
- Pose::Helpers.root_word("foo!").should eq ['foo']
114
- Pose::Helpers.root_word("foo/bar").should eq ['foo', 'bar']
115
- Pose::Helpers.root_word("foo-bar").should eq ['foo', 'bar']
116
- Pose::Helpers.root_word("foo--bar").should eq ['foo', 'bar']
117
- Pose::Helpers.root_word("foo.bar").should eq ['foo', 'bar']
118
- end
119
-
120
- it 'removes umlauts' do
121
- Pose::Helpers.root_word('fünf').should eq ['funf']
122
- end
123
-
124
- it 'splits up numbers' do
125
- Pose::Helpers.root_word('11.2.2011').should eq ['11', '2', '2011']
126
- Pose::Helpers.root_word('11-2-2011').should eq ['11', '2', '2011']
127
- Pose::Helpers.root_word('30:4-5').should eq ['30', '4', '5']
128
- end
129
-
130
- it 'converts into lowercase' do
131
- Pose::Helpers.root_word('London').should eq ['london']
132
- end
133
-
134
- it "stores single-letter words" do
135
- Pose::Helpers.root_word('a b').should eq ['a', 'b']
136
- end
137
-
138
- it "does't encode external URLs" do
139
- Pose::Helpers.root_word('http://web.com').should eq ['http', 'web', 'com']
140
- end
141
-
142
- it "doesn't store empty words" do
143
- Pose::Helpers.root_word(' one two ').should eq ['one', 'two']
144
- end
145
-
146
- it "removes duplicates" do
147
- Pose::Helpers.root_word('one_one').should eq ['one']
148
- Pose::Helpers.root_word('one one').should eq ['one']
149
- end
150
-
151
- it "splits up complex URLs" do
152
- Pose::Helpers.root_word('books?id=p7uyWPcVGZsC&dq=closure%20definitive%20guide&pg=PP1#v=onepage&q&f=false').should eql([
153
- "book", "id", "p7uywpcvgzsc", "dq", "closure", "definitive", "guide", "pg", "pp1", "v", "onepage", "q", "f", "false"])
154
- end
155
- end
156
-
157
-
158
- describe 'search_classes_and_ids_for_word' do
159
-
160
- it 'returns a hash that contains all the given classes' do
161
- result = Pose::Helpers.search_classes_and_ids_for_word 'foo', %w{PosableOne PosableTwo}
162
- result.keys.sort.should eq %w{PosableOne PosableTwo}
163
- end
164
-
165
- it 'returns the ids of all the posable objects that include the given word' do
166
- pos1 = PosableOne.create text: 'one two'
167
- pos2 = PosableTwo.create text: 'one three'
168
- pos3 = PosableTwo.create text: 'two three'
169
-
170
- result = Pose::Helpers.search_classes_and_ids_for_word 'one', %w{PosableOne PosableTwo}
171
-
172
- result['PosableOne'].should eq [pos1.id]
173
- result['PosableTwo'].should eq [pos2.id]
174
- end
175
- end
176
- end