lotus-dynamodb 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,259 @@
1
+ require 'test_helper'
2
+
3
+ describe Lotus::Model::Adapters::Dynamodb::Query do
4
+ before do
5
+ MockResponse = Struct.new(:entities)
6
+
7
+ class MockDataset
8
+ include AWS::DynamoDB::Types
9
+
10
+ attr_accessor :entities
11
+ attr_accessor :records
12
+
13
+ def initialize(entities)
14
+ @entities = entities
15
+ @records = MockResponse.new(entities)
16
+ end
17
+
18
+ def query(options = {})
19
+ records
20
+ end
21
+
22
+ def scan(options = {})
23
+ records
24
+ end
25
+
26
+ def key?(column, index = nil)
27
+ return true if index.nil? && column == :id
28
+ false
29
+ end
30
+
31
+ def format_attribute(column, value)
32
+ value
33
+ end
34
+
35
+ def to_s
36
+ records.to_s
37
+ end
38
+ end
39
+
40
+ class MockCollection
41
+ def deserialize(array)
42
+ array
43
+ end
44
+ end
45
+
46
+ collection = MockCollection.new
47
+ @query = Lotus::Model::Adapters::Dynamodb::Query.new(dataset, collection)
48
+ end
49
+
50
+ after do
51
+ Object.send(:remove_const, :MockResponse)
52
+ Object.send(:remove_const, :MockDataset)
53
+ Object.send(:remove_const, :MockCollection)
54
+ end
55
+
56
+ let(:dataset) { MockDataset.new([]) }
57
+
58
+ describe '#negate!' do
59
+ it 'raises an error' do
60
+ -> { @query.negate! }.must_raise NotImplementedError
61
+ end
62
+ end
63
+
64
+ describe '#offset' do
65
+ it 'raises an error' do
66
+ -> { @query.offset(1) }.must_raise NotImplementedError
67
+ end
68
+ end
69
+
70
+ describe '#sum' do
71
+ it 'raises an error' do
72
+ -> { @query.sum(:id) }.must_raise NotImplementedError
73
+ end
74
+ end
75
+
76
+ describe '#average' do
77
+ it 'raises an error' do
78
+ -> { @query.average(:id) }.must_raise NotImplementedError
79
+ end
80
+ end
81
+
82
+ describe '#avg' do
83
+ it 'raises an error' do
84
+ -> { @query.avg(:id) }.must_raise NotImplementedError
85
+ end
86
+ end
87
+
88
+ describe '#max' do
89
+ it 'raises an error' do
90
+ -> { @query.max(:id) }.must_raise NotImplementedError
91
+ end
92
+ end
93
+
94
+ describe '#min' do
95
+ it 'raises an error' do
96
+ -> { @query.min(:id) }.must_raise NotImplementedError
97
+ end
98
+ end
99
+
100
+ describe '#interval' do
101
+ it 'raises an error' do
102
+ -> { @query.interval(:id) }.must_raise NotImplementedError
103
+ end
104
+ end
105
+
106
+ describe '#range' do
107
+ it 'raises an error' do
108
+ -> { @query.range(:id) }.must_raise NotImplementedError
109
+ end
110
+ end
111
+
112
+ describe '#to_s' do
113
+ let(:dataset) { MockDataset.new([1, 2, 3]) }
114
+
115
+ it 'must be array representation' do
116
+ @query.to_s.must_equal dataset.entities.to_s
117
+ end
118
+ end
119
+
120
+ describe '#empty?' do
121
+ describe "when it's empty" do
122
+ it 'returns true' do
123
+ @query.must_be_empty
124
+ end
125
+ end
126
+
127
+ describe "when it's filled with elements" do
128
+ let(:dataset) { MockDataset.new([1, 2, 3]) }
129
+
130
+ it 'returns false' do
131
+ @query.wont_be_empty
132
+ end
133
+ end
134
+ end
135
+
136
+ describe '#any?' do
137
+ describe "when it's empty" do
138
+ it 'returns false' do
139
+ assert !@query.any?
140
+ end
141
+ end
142
+
143
+ describe "when it's filled with elements" do
144
+ let(:dataset) { MockDataset.new([1, 2, 3]) }
145
+
146
+ it 'returns true' do
147
+ assert @query.any?
148
+ end
149
+
150
+ describe "when a block is passed" do
151
+ describe "and it doesn't match elements" do
152
+ it 'returns false' do
153
+ assert !@query.any? {|e| e > 100 }
154
+ end
155
+ end
156
+
157
+ describe "and it matches elements" do
158
+ it 'returns true' do
159
+ assert @query.any? {|e| e % 2 == 0 }
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ describe 'operation' do
167
+ describe 'scan' do
168
+ it 'equals by default' do
169
+ @query.operation.must_equal :scan
170
+ end
171
+
172
+ it 'equals after where call' do
173
+ @query.where(something: 'anything').operation.must_equal :scan
174
+ end
175
+
176
+ it 'equals after or call' do
177
+ @query.or.operation.must_equal :scan
178
+ end
179
+
180
+ it 'equals after exclude call' do
181
+ @query.exclude(something: 'anything').operation.must_equal :scan
182
+ end
183
+
184
+ it 'equals after select call' do
185
+ @query.select('wow').operation.must_equal :scan
186
+ end
187
+
188
+ it 'equals after limit call' do
189
+ @query.limit(1).operation.must_equal :scan
190
+ end
191
+
192
+ it 'equals after count call' do
193
+ @query.count
194
+ @query.operation.must_equal :scan
195
+ end
196
+ end
197
+
198
+ describe 'query' do
199
+ describe 'after query call' do
200
+ before do
201
+ @query = @query.query
202
+ end
203
+
204
+ it 'equals' do
205
+ @query.operation.must_equal :query
206
+ end
207
+
208
+ it 'equals after or call' do
209
+ @query.or.operation.must_equal :query
210
+ end
211
+
212
+ it 'equals after selet call' do
213
+ @query.select('wow').operation.must_equal :query
214
+ end
215
+
216
+ it 'equals after limit call' do
217
+ @query.limit(1).operation.must_equal :query
218
+ end
219
+
220
+ it 'equals after count call' do
221
+ @query.count
222
+ @query.operation.must_equal :query
223
+ end
224
+ end
225
+
226
+ describe 'after where with key schema call' do
227
+ before do
228
+ @query = @query.where(id: 1)
229
+ end
230
+
231
+ it 'equals' do
232
+ @query.operation.must_equal :query
233
+ end
234
+
235
+ it 'equals after exclude call' do
236
+ @query.exclude(something: 'anything').operation.must_equal :query
237
+ end
238
+ end
239
+
240
+ describe 'after order call' do
241
+ it 'equals after asc call' do
242
+ @query.asc.operation.must_equal :query
243
+ end
244
+
245
+ it 'equals after desc call' do
246
+ @query.desc.operation.must_equal :query
247
+ end
248
+ end
249
+
250
+ it 'equals after consistent call' do
251
+ @query.consistent.operation.must_equal :query
252
+ end
253
+
254
+ it 'equals after index call' do
255
+ @query.index('omg').operation.must_equal :query
256
+ end
257
+ end
258
+ end
259
+ end