mongoid 4.0.2 → 5.0.0.beta

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.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +14 -13
  4. data/lib/config/locales/en.yml +28 -28
  5. data/lib/mongoid.rb +28 -21
  6. data/lib/mongoid/atomic.rb +2 -4
  7. data/lib/mongoid/attributes.rb +7 -7
  8. data/lib/mongoid/attributes/processing.rb +4 -1
  9. data/lib/mongoid/attributes/readonly.rb +2 -2
  10. data/lib/mongoid/changeable.rb +4 -6
  11. data/lib/mongoid/clients.rb +142 -0
  12. data/lib/mongoid/clients/factory.rb +78 -0
  13. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  14. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  15. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  16. data/lib/mongoid/clients/validators.rb +2 -0
  17. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  18. data/lib/mongoid/composable.rb +3 -3
  19. data/lib/mongoid/config.rb +39 -41
  20. data/lib/mongoid/config/environment.rb +1 -1
  21. data/lib/mongoid/config/validators.rb +1 -1
  22. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  23. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  24. data/lib/mongoid/contextual/atomic.rb +11 -11
  25. data/lib/mongoid/contextual/command.rb +9 -6
  26. data/lib/mongoid/contextual/geo_near.rb +17 -1
  27. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  28. data/lib/mongoid/contextual/memory.rb +2 -5
  29. data/lib/mongoid/contextual/mongo.rb +92 -82
  30. data/lib/mongoid/contextual/none.rb +13 -0
  31. data/lib/mongoid/copyable.rb +6 -1
  32. data/lib/mongoid/criteria.rb +36 -3
  33. data/lib/mongoid/document.rb +3 -4
  34. data/lib/mongoid/errors.rb +6 -6
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/no_client_config.rb +22 -0
  37. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  38. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  39. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  40. data/lib/mongoid/errors/no_default_client.rb +23 -0
  41. data/lib/mongoid/extensions/hash.rb +5 -1
  42. data/lib/mongoid/extensions/object.rb +3 -2
  43. data/lib/mongoid/extensions/set.rb +5 -5
  44. data/lib/mongoid/factory.rb +4 -2
  45. data/lib/mongoid/fields.rb +7 -2
  46. data/lib/mongoid/findable.rb +4 -1
  47. data/lib/mongoid/indexable.rb +15 -9
  48. data/lib/mongoid/persistable.rb +1 -2
  49. data/lib/mongoid/persistable/creatable.rb +2 -2
  50. data/lib/mongoid/persistable/deletable.rb +3 -3
  51. data/lib/mongoid/persistable/incrementable.rb +1 -1
  52. data/lib/mongoid/persistable/logical.rb +1 -1
  53. data/lib/mongoid/persistable/poppable.rb +1 -1
  54. data/lib/mongoid/persistable/pullable.rb +2 -2
  55. data/lib/mongoid/persistable/pushable.rb +2 -2
  56. data/lib/mongoid/persistable/renamable.rb +1 -1
  57. data/lib/mongoid/persistable/settable.rb +1 -1
  58. data/lib/mongoid/persistable/unsettable.rb +1 -1
  59. data/lib/mongoid/persistable/updatable.rb +2 -2
  60. data/lib/mongoid/persistable/upsertable.rb +1 -1
  61. data/lib/mongoid/query_cache.rb +98 -104
  62. data/lib/mongoid/railtie.rb +1 -21
  63. data/lib/mongoid/railties/database.rake +1 -1
  64. data/lib/mongoid/relations/builders.rb +3 -1
  65. data/lib/mongoid/relations/counter_cache.rb +1 -1
  66. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  67. data/lib/mongoid/relations/embedded/many.rb +4 -2
  68. data/lib/mongoid/relations/many.rb +1 -0
  69. data/lib/mongoid/relations/proxy.rb +6 -6
  70. data/lib/mongoid/relations/referenced/many.rb +2 -1
  71. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  72. data/lib/mongoid/relations/touchable.rb +1 -1
  73. data/lib/mongoid/reloadable.rb +2 -2
  74. data/lib/mongoid/scopable.rb +6 -17
  75. data/lib/mongoid/selectable.rb +1 -36
  76. data/lib/mongoid/serializable.rb +2 -2
  77. data/lib/mongoid/stateful.rb +0 -1
  78. data/lib/mongoid/tasks/database.rake +2 -2
  79. data/lib/mongoid/tasks/database.rb +23 -16
  80. data/lib/mongoid/threaded.rb +54 -33
  81. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  82. data/lib/mongoid/traversable.rb +16 -1
  83. data/lib/mongoid/validatable.rb +1 -1
  84. data/lib/mongoid/validatable/queryable.rb +1 -1
  85. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  86. data/lib/mongoid/version.rb +1 -1
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  88. data/lib/rails/mongoid.rb +2 -2
  89. data/spec/app/models/audio.rb +1 -1
  90. data/spec/app/models/band.rb +1 -0
  91. data/spec/app/models/company.rb +5 -0
  92. data/spec/app/models/label.rb +7 -0
  93. data/spec/app/models/pub.rb +6 -0
  94. data/spec/app/models/staff.rb +7 -0
  95. data/spec/app/models/store_as_dup_test1.rb +5 -0
  96. data/spec/app/models/store_as_dup_test2.rb +5 -0
  97. data/spec/config/mongoid.yml +7 -25
  98. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  99. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  100. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  101. data/spec/mongoid/attributes_spec.rb +3 -3
  102. data/spec/mongoid/changeable_spec.rb +70 -0
  103. data/spec/mongoid/clients/factory_spec.rb +284 -0
  104. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  105. data/spec/mongoid/clients_spec.rb +739 -0
  106. data/spec/mongoid/config/environment_spec.rb +14 -11
  107. data/spec/mongoid/config_spec.rb +33 -48
  108. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  109. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  110. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  111. data/spec/mongoid/contextual/none_spec.rb +15 -0
  112. data/spec/mongoid/copyable_spec.rb +35 -1
  113. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  114. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  115. data/spec/mongoid/criteria_spec.rb +74 -91
  116. data/spec/mongoid/document_spec.rb +1 -1
  117. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  118. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  119. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  120. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  121. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  122. data/spec/mongoid/fields/localized_spec.rb +1 -0
  123. data/spec/mongoid/fields_spec.rb +1 -0
  124. data/spec/mongoid/findable_spec.rb +2 -23
  125. data/spec/mongoid/indexable_spec.rb +12 -8
  126. data/spec/mongoid/interceptable_spec.rb +15 -0
  127. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  128. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  129. data/spec/mongoid/persistable_spec.rb +4 -4
  130. data/spec/mongoid/query_cache_spec.rb +13 -8
  131. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  132. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  133. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  134. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  135. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  136. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  137. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  138. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  139. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  140. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  141. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  142. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  143. data/spec/mongoid/reloadable_spec.rb +6 -6
  144. data/spec/mongoid/scopable_spec.rb +41 -28
  145. data/spec/mongoid/selectable_spec.rb +6 -16
  146. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  147. data/spec/mongoid/tasks/database_spec.rb +2 -2
  148. data/spec/mongoid/threaded_spec.rb +0 -7
  149. data/spec/mongoid/traversable_spec.rb +2 -2
  150. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  151. data/spec/mongoid_spec.rb +13 -15
  152. data/spec/rails/mongoid_spec.rb +13 -4
  153. data/spec/spec_helper.rb +44 -27
  154. data/spec/support/authorization.rb +12 -0
  155. data/spec/support/expectations.rb +14 -0
  156. metadata +52 -59
  157. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  158. data/lib/mongoid/contextual/text_search.rb +0 -178
  159. data/lib/mongoid/criteria/#findable.rb# +0 -141
  160. data/lib/mongoid/errors/no_default_session.rb +0 -23
  161. data/lib/mongoid/errors/no_session_config.rb +0 -22
  162. data/lib/mongoid/log_subscriber.rb +0 -55
  163. data/lib/mongoid/positional.rb +0 -71
  164. data/lib/mongoid/sessions.rb +0 -125
  165. data/lib/mongoid/sessions/factory.rb +0 -131
  166. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  167. data/lib/mongoid/sessions/validators.rb +0 -2
  168. data/lib/mongoid/support/query_counter.rb +0 -23
  169. data/spec/helpers.rb +0 -18
  170. data/spec/mongoid/#atomic_spec.rb# +0 -365
  171. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  172. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  173. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  174. data/spec/mongoid/positional_spec.rb +0 -222
  175. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  176. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  177. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -1,209 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Contextual::TextSearch do
4
-
5
- before do
6
- Word.with(database: "admin").mongo_session.command(setParameter: 1, textSearchEnabled: true)
7
- Word.create_indexes
8
- end
9
-
10
- after(:all) do
11
- Word.remove_indexes
12
- end
13
-
14
- describe "#each" do
15
-
16
- let(:collection) do
17
- Word.collection
18
- end
19
-
20
- let(:criteria) do
21
- Word.all
22
- end
23
-
24
- before do
25
- Word.create!(name: "phase", origin: "latin")
26
- Word.create!(name: "phazed", origin: "latin")
27
- end
28
-
29
- context "when the search is projecting" do
30
-
31
- let(:search) do
32
- described_class.new(collection, criteria, "phase").project(name: 1)
33
- end
34
-
35
- let(:documents) do
36
- search.entries
37
- end
38
-
39
- it "limits the fields to the projection" do
40
- expect {
41
- documents.first.origin
42
- }.to raise_error(ActiveModel::MissingAttributeError)
43
- end
44
- end
45
-
46
- context "when the search is not projecting" do
47
-
48
- let(:search) do
49
- described_class.new(collection, criteria, "phase")
50
- end
51
-
52
- let(:documents) do
53
- search.entries
54
- end
55
-
56
- it "returns all fields" do
57
- expect(documents.first.origin).to eq("latin")
58
- end
59
- end
60
- end
61
-
62
- describe "#execute" do
63
-
64
- let(:collection) do
65
- Word.collection
66
- end
67
-
68
- let(:criteria) do
69
- Word.all
70
- end
71
-
72
- let(:search) do
73
- described_class.new(collection, criteria, "phase")
74
- end
75
-
76
- before do
77
- Word.create!(name: "phase", origin: "latin")
78
- Word.create!(name: "phazed", origin: "latin")
79
- end
80
-
81
- let(:results) do
82
- search.execute
83
- end
84
-
85
- it "returns the raw results" do
86
- expect(results).to_not be_empty
87
- end
88
- end
89
-
90
- describe "#initialize" do
91
-
92
- let(:collection) do
93
- Word.collection
94
- end
95
-
96
- let(:criteria) do
97
- Word.limit(100)
98
- end
99
-
100
- let(:search) do
101
- described_class.new(collection, criteria, "phase")
102
- end
103
-
104
- it "sets the collection" do
105
- expect(search.collection).to eq(collection)
106
- end
107
-
108
- it "sets the criteria" do
109
- expect(search.criteria).to eq(criteria)
110
- end
111
-
112
- it "sets the text command" do
113
- expect(search.command[:text]).to eq(collection.name)
114
- end
115
-
116
- it "sets the text search parameter" do
117
- expect(search.command[:search]).to eq("phase")
118
- end
119
-
120
- it "sets the criteria" do
121
- expect(search.command[:filter]).to be_empty
122
- end
123
-
124
- it "sets the limit" do
125
- expect(search.command[:limit]).to eq(100)
126
- end
127
- end
128
-
129
- describe "#language" do
130
-
131
- let(:collection) do
132
- Word.collection
133
- end
134
-
135
- let(:criteria) do
136
- Word.limit(100)
137
- end
138
-
139
- let(:search) do
140
- described_class.new(collection, criteria, "phase")
141
- end
142
-
143
- let!(:text_search) do
144
- search.language("deutsch")
145
- end
146
-
147
- it "sets the search language" do
148
- expect(search.command[:language]).to eq("deutsch")
149
- end
150
-
151
- it "returns the text search" do
152
- expect(text_search).to equal(search)
153
- end
154
- end
155
-
156
- describe "#project" do
157
-
158
- let(:collection) do
159
- Word.collection
160
- end
161
-
162
- let(:criteria) do
163
- Word.limit(100)
164
- end
165
-
166
- let(:search) do
167
- described_class.new(collection, criteria, "phase")
168
- end
169
-
170
- let!(:text_search) do
171
- search.project(name: 1, title: 1)
172
- end
173
-
174
- it "sets the search field limitations" do
175
- expect(search.command[:project]).to eq(name: 1, title: 1)
176
- end
177
-
178
- it "returns the text search" do
179
- expect(text_search).to equal(search)
180
- end
181
- end
182
-
183
- describe "#stats" do
184
-
185
- let(:collection) do
186
- Word.collection
187
- end
188
-
189
- let(:criteria) do
190
- Word.all
191
- end
192
-
193
- let(:search) do
194
- described_class.new(collection, criteria, "phase")
195
- end
196
-
197
- before do
198
- Word.create!(name: "phase", origin: "latin")
199
- end
200
-
201
- let(:stats) do
202
- search.stats
203
- end
204
-
205
- it "returns the raw stats" do
206
- expect(stats["nscanned"]).to eq(1)
207
- end
208
- end
209
- end
@@ -1,75 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::LogSubscriber do
4
-
5
- describe ".query" do
6
-
7
- let!(:subscribe) do
8
- Mongoid::LogSubscriber.log_subscribers.first
9
- end
10
-
11
- before do
12
- @old_level, Moped.logger.level = Moped.logger.level, 0
13
- end
14
-
15
- after do
16
- Moped.logger.level = @old_level
17
- end
18
-
19
- context "when quering the database" do
20
-
21
- it "logs the operation" do
22
- expect(subscribe).to receive(:debug).once
23
- Band.all.to_a
24
- end
25
- end
26
-
27
- context "when creating a new subscriber" do
28
-
29
- class TestLogSubscriber < ActiveSupport::LogSubscriber
30
- attr_reader :debugs
31
-
32
- def initialize
33
- super
34
- @debugs = []
35
- end
36
-
37
- def query(event)
38
- @debugs << event
39
- end
40
-
41
- def logger
42
- Moped.logger
43
- end
44
- end
45
-
46
- let(:test_subscriber) do
47
- TestLogSubscriber.new
48
- end
49
-
50
- before do
51
- ActiveSupport::LogSubscriber.attach_to :moped, test_subscriber
52
- end
53
-
54
- after do
55
- TestLogSubscriber.log_subscribers.pop
56
- end
57
-
58
- it "pushes the new log subscriber" do
59
- expect(Mongoid::LogSubscriber.subscribers.last).to be_a TestLogSubscriber
60
- end
61
-
62
- context "when quering the database" do
63
-
64
- before do
65
- expect(subscribe).to receive(:debug).once
66
- PetOwner.all.to_a
67
- end
68
-
69
- it "sends operations logs to TestLogSubscriber" do
70
- expect(test_subscriber.debugs.size).to eq(1)
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,222 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Positional do
4
-
5
- describe "#positionally" do
6
-
7
- let(:positionable) do
8
- Class.new do
9
- include Mongoid::Positional
10
- end.new
11
- end
12
-
13
- let(:updates) do
14
- {
15
- "$set" => {
16
- "field" => "value",
17
- "children.0.field" => "value",
18
- "children.0.children.1.children.3.field" => "value"
19
- },
20
- "$pushAll" => {
21
- "children.0.children.1.children.3.fields" => [ "value", "value" ]
22
- }
23
- }
24
- end
25
-
26
- context "when a child has an embeds many under an embeds one" do
27
-
28
- context "when selector does not include the embeds one" do
29
-
30
- let(:selector) do
31
- { "_id" => 1, "child._id" => 2 }
32
- end
33
-
34
- let(:ops) do
35
- {
36
- "$set" => {
37
- "field" => "value",
38
- "child.children.1.children.3.field" => "value",
39
- }
40
- }
41
- end
42
-
43
- let(:processed) do
44
- positionable.positionally(selector, ops)
45
- end
46
-
47
- it "does not do any replacement" do
48
- expect(processed).to eq(ops)
49
- end
50
- end
51
-
52
- context "when selector includes the embeds one" do
53
-
54
- let(:selector) do
55
- { "_id" => 1, "child._id" => 2, "child.children._id" => 3 }
56
- end
57
-
58
- let(:ops) do
59
- {
60
- "$set" => {
61
- "field" => "value",
62
- "child.children.1.children.3.field" => "value",
63
- }
64
- }
65
- end
66
-
67
- let(:expected) do
68
- {
69
- "$set" => {
70
- "field" => "value",
71
- "child.children.$.children.3.field" => "value",
72
- }
73
- }
74
- end
75
-
76
-
77
- let(:processed) do
78
- positionable.positionally(selector, ops)
79
- end
80
-
81
- it "does not do any replacement" do
82
- expect(processed).to eq(expected)
83
- end
84
- end
85
- end
86
-
87
- context "when the selector has only 1 pair" do
88
-
89
- let(:selector) do
90
- { "_id" => 1 }
91
- end
92
-
93
- let(:processed) do
94
- positionable.positionally(selector, updates)
95
- end
96
-
97
- it "does not do any replacement" do
98
- expect(processed).to eq(updates)
99
- end
100
- end
101
-
102
- context "when the selector has 2 pairs" do
103
-
104
- context "when the second pair has an id" do
105
-
106
- let(:selector) do
107
- { "_id" => 1, "children._id" => 2 }
108
- end
109
-
110
- let(:expected) do
111
- {
112
- "$set" => {
113
- "field" => "value",
114
- "children.$.field" => "value",
115
- "children.$.children.1.children.3.field" => "value"
116
- },
117
- "$pushAll" => {
118
- "children.$.children.1.children.3.fields" => [ "value", "value" ]
119
- }
120
- }
121
- end
122
-
123
- let(:processed) do
124
- positionable.positionally(selector, updates)
125
- end
126
-
127
- it "replaces the first index with the positional operator" do
128
- expect(processed).to eq(expected)
129
- end
130
- end
131
-
132
- context "when the second pair has no id" do
133
-
134
- let(:selector) do
135
- { "_id" => 1, "children._id" => nil }
136
- end
137
-
138
- let(:expected) do
139
- {
140
- "$set" => {
141
- "field" => "value",
142
- "children.0.field" => "value",
143
- "children.0.children.1.children.3.field" => "value"
144
- },
145
- "$pushAll" => {
146
- "children.0.children.1.children.3.fields" => [ "value", "value" ]
147
- }
148
- }
149
- end
150
-
151
- let(:processed) do
152
- positionable.positionally(selector, updates)
153
- end
154
-
155
- it "replaces the first index with the positional operator" do
156
- expect(processed).to eq(expected)
157
- end
158
- end
159
- end
160
-
161
- context "when the selector has 3 pairs" do
162
-
163
- let(:selector) do
164
- { "_id" => 1, "children._id" => 2, "children.0.children._id" => 3 }
165
- end
166
-
167
- let(:expected) do
168
- {
169
- "$set" => {
170
- "field" => "value",
171
- "children.$.field" => "value",
172
- "children.0.children.$.children.3.field" => "value"
173
- },
174
- "$pushAll" => {
175
- "children.0.children.$.children.3.fields" => [ "value", "value" ]
176
- }
177
- }
178
- end
179
-
180
- let(:processed) do
181
- positionable.positionally(selector, updates)
182
- end
183
-
184
- it "replaces the first index with the positional operator" do
185
- expect(processed).to eq(expected)
186
- end
187
- end
188
-
189
- context "when the selector has 4 pairs" do
190
-
191
- let(:selector) do
192
- {
193
- "_id" => 1,
194
- "children._id" => 2,
195
- "children.0.children._id" => 3,
196
- "children.0.children.1.children._id" => 4
197
- }
198
- end
199
-
200
- let(:expected) do
201
- {
202
- "$set" => {
203
- "field" => "value",
204
- "children.$.field" => "value",
205
- "children.0.children.1.children.$.field" => "value"
206
- },
207
- "$pushAll" => {
208
- "children.0.children.1.children.$.fields" => [ "value", "value" ]
209
- }
210
- }
211
- end
212
-
213
- let(:processed) do
214
- positionable.positionally(selector, updates)
215
- end
216
-
217
- it "replaces the first index with the positional operator" do
218
- expect(processed).to eq(expected)
219
- end
220
- end
221
- end
222
- end