Skip to content

Commit c549493

Browse files
committed
Repair Model .consistent/.delete_all/.destroy_all calls
1 parent 8423724 commit c549493

File tree

3 files changed

+186
-1
lines changed

3 files changed

+186
-1
lines changed

lib/dynamoid/criteria.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module Criteria
99

1010
# @private
1111
module ClassMethods
12-
%i[where all first last each record_limit scan_limit batch start scan_index_forward find_by_pages project pluck].each do |meth|
12+
%i[where consistent all first last delete_all destroy_all each record_limit scan_limit batch start scan_index_forward find_by_pages project pluck].each do |meth|
1313
# Return a criteria chain in response to a method that will begin or end a chain. For more information,
1414
# see Dynamoid::Criteria::Chain.
1515
#

spec/dynamoid/criteria_new_spec.rb

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe Dynamoid::Criteria do
6+
it 'supports querying with .where method' do
7+
klass = new_class do
8+
field :name
9+
end
10+
11+
objects = klass.create([{ name: 'Alex' }, { name: 'Bob' }, { name: 'Alex' }])
12+
expect(klass.where(name: 'Alex')).to contain_exactly(objects[0], objects[2])
13+
end
14+
15+
it 'supports querying with .all method' do
16+
klass = new_class do
17+
field :name
18+
end
19+
20+
objects = klass.create([{ name: 'Alex' }, { name: 'Bob' }])
21+
expect(klass.all).to match_array(objects)
22+
end
23+
24+
it 'supports querying with .first method' do
25+
klass = new_class do
26+
range :name
27+
end
28+
29+
object = klass.create(name: 'Alex')
30+
expect(klass.first).to eq object
31+
end
32+
33+
it 'supports querying with .last method' do
34+
klass = new_class do
35+
range :name
36+
end
37+
38+
object = klass.create(name: 'Alex')
39+
expect(klass.last).to eq object
40+
end
41+
42+
it 'supports querying with .each method' do
43+
klass = new_class do
44+
range :name
45+
end
46+
47+
result = []
48+
objects = klass.create([{ name: 'Alex' }, { name: 'Bob' }])
49+
klass.each { |obj| result << obj }
50+
51+
expect(result).to match_array(objects)
52+
end
53+
54+
it 'supports querying with .record_limit method' do
55+
klass = new_class do
56+
field :name
57+
end
58+
59+
objects = klass.create([{ name: 'Alex' }, { name: 'Bob' }])
60+
actual = klass.record_limit(1).all.to_a
61+
62+
expect(actual.size).to eq 1
63+
expect(actual[0]).to satisfy { |v| v.name == 'Alex' || v.name == 'Bob' }
64+
end
65+
66+
it 'supports querying with .scan_limit method' do
67+
klass = new_class do
68+
field :name
69+
end
70+
71+
objects = klass.create([{ name: 'Alex' }, { name: 'Bob' }])
72+
actual = klass.scan_limit(1).all.to_a
73+
74+
expect(actual.size).to eq 1
75+
expect(actual[0]).to satisfy { |v| v.name == 'Alex' || v.name == 'Bob' }
76+
end
77+
78+
it 'supports querying with .batch method' do
79+
klass = new_class do
80+
field :name
81+
end
82+
83+
objects = klass.create([{ name: 'Alex' }, { name: 'Bob' }, { name: 'Alex' }])
84+
expect(klass.batch(2).all).to match_array(objects)
85+
end
86+
87+
it 'supports querying with .start method' do
88+
klass = new_class do
89+
table key: :age
90+
range :name
91+
field :age, :integer
92+
end
93+
94+
objects = klass.create([{ age: 20, name: 'Alex' }, { age: 20, name: 'Bob' }, { age: 20, name: 'Michael' }])
95+
96+
actual = klass.start(objects[0]).all.to_a
97+
expect(actual).to eq objects[1..2]
98+
end
99+
100+
it 'supports querying with .scan_index_forward method' do
101+
klass = new_class do
102+
table key: :age
103+
range :name
104+
field :age, :integer
105+
end
106+
107+
objects = klass.create([{ age: 20, name: 'Alex' }, { age: 20, name: 'Bob' }, { age: 20, name: 'Michael' }])
108+
109+
# force Query with age: 20 partition key condition
110+
actual = klass.scan_index_forward(true).where(age: 20).all.to_a
111+
expect(actual).to eq objects
112+
113+
# force Query with age: 20 partition key condition
114+
actual = klass.scan_index_forward(false).where(age: 20).all.to_a
115+
expect(actual).to eq objects.reverse
116+
end
117+
118+
it 'supports querying with .find_by_pages method' do
119+
klass = new_class
120+
objects = klass.create([{}, {}, {}])
121+
122+
pages = []
123+
klass.find_by_pages do |models, options|
124+
pages << models # actually there is only one page
125+
end
126+
127+
expect(pages.flatten).to match_array(objects)
128+
end
129+
130+
it 'supports querying with .project method' do
131+
klass = new_class do
132+
field :age, :integer
133+
field :name, :string
134+
end
135+
klass.create(age: 20, name: 'Alex')
136+
137+
objects_with_name = klass.project(:name).to_a
138+
expect(objects_with_name.size).to eq 1
139+
140+
object_with_name = objects_with_name[0]
141+
expect(object_with_name.name).to eq 'Alex'
142+
expect(object_with_name.age).to eq nil
143+
end
144+
145+
it 'supports querying with .pluck method' do
146+
klass = new_class do
147+
field :age, :integer
148+
field :name, :string
149+
end
150+
151+
klass.create([{ age: 20, name: 'Alex' }, { age: 20, name: 'Bob' }])
152+
expect(klass.pluck(:name)).to contain_exactly('Alex', 'Bob')
153+
end
154+
155+
it 'supports querying with .consistent method' do
156+
klass = new_class do
157+
field :age, :integer
158+
end
159+
160+
objects = klass.create([{ age: 20 }, { age: 30 }])
161+
actual = klass.consistent.all.to_a
162+
expect(actual).to match_array(objects)
163+
end
164+
165+
it 'supports .delete_all method' do
166+
klass = new_class do
167+
field :age, :integer
168+
end
169+
170+
objects = klass.create([{ age: 20 }, { age: 30 }])
171+
expect { klass.delete_all }.to change { klass.all.to_a.size }.from(2).to(0)
172+
end
173+
174+
it 'supports .destroy_all method' do
175+
klass = new_class do
176+
field :age, :integer
177+
end
178+
179+
objects = klass.create([{ age: 20 }, { age: 30 }])
180+
expect { klass.destroy_all }.to change { klass.all.to_a.size }.from(2).to(0)
181+
end
182+
end

spec/dynamoid/criteria_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
require 'spec_helper'
44

5+
# This file contains legacy specs. They should be revised and moved to the
6+
# criteria_new_spec.rb file.
7+
58
describe Dynamoid::Criteria do
69
let!(:user1) { User.create(name: 'Josh', email: '[email protected]', admin: true) }
710
let!(:user2) { User.create(name: 'Justin', email: '[email protected]', admin: false) }

0 commit comments

Comments
 (0)