cassanity 0.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.
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +11 -0
- data/Guardfile +17 -0
- data/LICENSE.txt +22 -0
- data/README.md +99 -0
- data/Rakefile +16 -0
- data/cassanity.gemspec +21 -0
- data/examples/_shared.rb +8 -0
- data/examples/batch.rb +40 -0
- data/examples/column_families.rb +68 -0
- data/examples/keyspaces.rb +57 -0
- data/lib/cassanity/argument_generators/batch.rb +52 -0
- data/lib/cassanity/argument_generators/column_family_alter.rb +47 -0
- data/lib/cassanity/argument_generators/column_family_create.rb +44 -0
- data/lib/cassanity/argument_generators/column_family_delete.rb +65 -0
- data/lib/cassanity/argument_generators/column_family_drop.rb +18 -0
- data/lib/cassanity/argument_generators/column_family_insert.rb +53 -0
- data/lib/cassanity/argument_generators/column_family_select.rb +34 -0
- data/lib/cassanity/argument_generators/column_family_truncate.rb +18 -0
- data/lib/cassanity/argument_generators/column_family_update.rb +69 -0
- data/lib/cassanity/argument_generators/index_create.rb +22 -0
- data/lib/cassanity/argument_generators/index_drop.rb +13 -0
- data/lib/cassanity/argument_generators/keyspace_create.rb +51 -0
- data/lib/cassanity/argument_generators/keyspace_drop.rb +13 -0
- data/lib/cassanity/argument_generators/keyspace_use.rb +13 -0
- data/lib/cassanity/argument_generators/keyspaces.rb +12 -0
- data/lib/cassanity/argument_generators/set_clause.rb +30 -0
- data/lib/cassanity/argument_generators/using_clause.rb +24 -0
- data/lib/cassanity/argument_generators/where_clause.rb +29 -0
- data/lib/cassanity/argument_generators/with_clause.rb +32 -0
- data/lib/cassanity/column_family.rb +233 -0
- data/lib/cassanity/connection.rb +88 -0
- data/lib/cassanity/error.rb +28 -0
- data/lib/cassanity/executors/cassandra_cql.rb +120 -0
- data/lib/cassanity/keyspace.rb +118 -0
- data/lib/cassanity/result_transformers/column_family_select.rb +15 -0
- data/lib/cassanity/result_transformers/mirror.rb +12 -0
- data/lib/cassanity/schema.rb +26 -0
- data/lib/cassanity/version.rb +3 -0
- data/lib/cassanity.rb +5 -0
- data/spec/helper.rb +27 -0
- data/spec/integration/cassanity/column_family_spec.rb +243 -0
- data/spec/integration/cassanity/connection_spec.rb +87 -0
- data/spec/integration/cassanity/keyspace_spec.rb +64 -0
- data/spec/support/cassanity_helpers.rb +35 -0
- data/spec/unit/cassanity/argument_generators/batch_spec.rb +36 -0
- data/spec/unit/cassanity/argument_generators/column_family_alter_spec.rb +85 -0
- data/spec/unit/cassanity/argument_generators/column_family_create_spec.rb +107 -0
- data/spec/unit/cassanity/argument_generators/column_family_delete_spec.rb +92 -0
- data/spec/unit/cassanity/argument_generators/column_family_drop_spec.rb +25 -0
- data/spec/unit/cassanity/argument_generators/column_family_insert_spec.rb +70 -0
- data/spec/unit/cassanity/argument_generators/column_family_select_spec.rb +113 -0
- data/spec/unit/cassanity/argument_generators/column_family_truncate_spec.rb +25 -0
- data/spec/unit/cassanity/argument_generators/column_family_update_spec.rb +109 -0
- data/spec/unit/cassanity/argument_generators/index_create_spec.rb +39 -0
- data/spec/unit/cassanity/argument_generators/index_drop_spec.rb +14 -0
- data/spec/unit/cassanity/argument_generators/keyspace_create_spec.rb +53 -0
- data/spec/unit/cassanity/argument_generators/keyspace_drop_spec.rb +14 -0
- data/spec/unit/cassanity/argument_generators/keyspace_use_spec.rb +14 -0
- data/spec/unit/cassanity/argument_generators/keyspaces_spec.rb +12 -0
- data/spec/unit/cassanity/argument_generators/set_clause_spec.rb +85 -0
- data/spec/unit/cassanity/argument_generators/using_clause_spec.rb +44 -0
- data/spec/unit/cassanity/argument_generators/where_clause_spec.rb +57 -0
- data/spec/unit/cassanity/argument_generators/with_clause_spec.rb +63 -0
- data/spec/unit/cassanity/column_family_spec.rb +250 -0
- data/spec/unit/cassanity/connection_spec.rb +75 -0
- data/spec/unit/cassanity/error_spec.rb +35 -0
- data/spec/unit/cassanity/executors/cassandra_cql_spec.rb +178 -0
- data/spec/unit/cassanity/keyspace_spec.rb +137 -0
- data/spec/unit/cassanity/result_transformers/column_family_select_spec.rb +0 -0
- data/spec/unit/cassanity/result_transformers/mirror_spec.rb +12 -0
- data/spec/unit/cassanity/schema_spec.rb +23 -0
- data/spec/unit/cassanity_spec.rb +5 -0
- metadata +172 -0
@@ -0,0 +1,250 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'cassanity/column_family'
|
3
|
+
|
4
|
+
describe Cassanity::ColumnFamily do
|
5
|
+
let(:column_family_name) { 'analytics' }
|
6
|
+
let(:keyspace_name) { 'foo' }
|
7
|
+
|
8
|
+
let(:keyspace) {
|
9
|
+
double('Keyspace', {
|
10
|
+
executor: executor,
|
11
|
+
name: keyspace_name,
|
12
|
+
})
|
13
|
+
}
|
14
|
+
|
15
|
+
let(:executor) {
|
16
|
+
lambda { |args| ['GOTTA KEEP EM EXECUTED', args] }
|
17
|
+
}
|
18
|
+
|
19
|
+
let(:schema) { double('Schema') }
|
20
|
+
|
21
|
+
let(:required_arguments) {
|
22
|
+
{
|
23
|
+
name: column_family_name,
|
24
|
+
keyspace: keyspace,
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
subject { described_class.new(required_arguments) }
|
29
|
+
|
30
|
+
it { should respond_to(:name) }
|
31
|
+
it { should respond_to(:keyspace) }
|
32
|
+
|
33
|
+
describe "#initialize" do
|
34
|
+
it "sets name" do
|
35
|
+
subject.name.should eq(column_family_name)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "sets keyspace" do
|
39
|
+
subject.keyspace.should eq(keyspace)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "defaults executor to keyspace's executor" do
|
43
|
+
subject.executor.should eq(keyspace.executor)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "sets schema if provided" do
|
47
|
+
instance = described_class.new(required_arguments.merge({
|
48
|
+
schema: schema,
|
49
|
+
}))
|
50
|
+
instance.schema.should eq(schema)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "allows overriding executor" do
|
54
|
+
other_executor = lambda { |args| }
|
55
|
+
column_family = described_class.new(required_arguments.merge({
|
56
|
+
executor: other_executor,
|
57
|
+
}))
|
58
|
+
column_family.executor.should eq(other_executor)
|
59
|
+
end
|
60
|
+
|
61
|
+
[:name, :keyspace].each do |key|
|
62
|
+
it "raises error without :#{key} key" do
|
63
|
+
args = required_arguments.reject { |k, v| k == key }
|
64
|
+
expect { described_class.new(args) }.to raise_error(KeyError)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#schema" do
|
70
|
+
it "returns schema if set" do
|
71
|
+
described_class.new(required_arguments.merge({
|
72
|
+
schema: schema,
|
73
|
+
})).schema.should eq(schema)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "raises error if not set" do
|
77
|
+
expect {
|
78
|
+
subject.schema
|
79
|
+
}.to raise_error(Cassanity::Error, "No schema found to create #{column_family_name} column family. Please set :schema during initialization or include it as a key in #create call.")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#create" do
|
84
|
+
context "with schema set during initialization" do
|
85
|
+
subject {
|
86
|
+
described_class.new(required_arguments.merge({
|
87
|
+
schema: schema,
|
88
|
+
}))
|
89
|
+
}
|
90
|
+
|
91
|
+
it "sends command and arguments, including schema, to executor" do
|
92
|
+
args = {something: 'else'}
|
93
|
+
executor.should_receive(:call).with({
|
94
|
+
command: :column_family_create,
|
95
|
+
arguments: args.merge({
|
96
|
+
name: column_family_name,
|
97
|
+
keyspace_name: keyspace_name,
|
98
|
+
schema: schema,
|
99
|
+
}),
|
100
|
+
})
|
101
|
+
subject.create(args)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "uses passed in :schema if present" do
|
105
|
+
schema_argument = double('Schema')
|
106
|
+
args = {schema: schema_argument}
|
107
|
+
executor.should_receive(:call).with({
|
108
|
+
command: :column_family_create,
|
109
|
+
arguments: args.merge({
|
110
|
+
name: column_family_name,
|
111
|
+
keyspace_name: keyspace_name,
|
112
|
+
schema: schema_argument,
|
113
|
+
}),
|
114
|
+
})
|
115
|
+
subject.create(args)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "with no schema" do
|
120
|
+
it "raises error" do
|
121
|
+
expect {
|
122
|
+
subject.create
|
123
|
+
}.to raise_error(Cassanity::Error, "No schema found to create #{column_family_name} column family. Please set :schema during initialization or include it as a key in #create call.")
|
124
|
+
end
|
125
|
+
|
126
|
+
it "sends passed in schema if present" do
|
127
|
+
args = {schema: schema}
|
128
|
+
command_arguments = args.merge({
|
129
|
+
name: column_family_name,
|
130
|
+
keyspace_name: keyspace_name,
|
131
|
+
schema: schema,
|
132
|
+
})
|
133
|
+
executor.should_receive(:call).with({
|
134
|
+
command: :column_family_create,
|
135
|
+
arguments: command_arguments,
|
136
|
+
})
|
137
|
+
subject.create(args)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "#truncate" do
|
143
|
+
it "sends command and arguments, including :name, to executor" do
|
144
|
+
args = {something: 'else'}
|
145
|
+
executor.should_receive(:call).with({
|
146
|
+
command: :column_family_truncate,
|
147
|
+
arguments: args.merge({
|
148
|
+
name: column_family_name,
|
149
|
+
keyspace_name: keyspace_name,
|
150
|
+
}),
|
151
|
+
})
|
152
|
+
subject.truncate(args)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "#drop" do
|
157
|
+
it "sends command and arguments, including :name, to executor" do
|
158
|
+
args = {something: 'else'}
|
159
|
+
executor.should_receive(:call).with({
|
160
|
+
command: :column_family_drop,
|
161
|
+
arguments: args.merge({
|
162
|
+
name: column_family_name,
|
163
|
+
keyspace_name: keyspace_name,
|
164
|
+
}),
|
165
|
+
})
|
166
|
+
subject.drop(args)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "#alter" do
|
171
|
+
it "sends command and arguments, including :name and :keyspace_name, to executor" do
|
172
|
+
args = {drop: :name, something: 'else'}
|
173
|
+
executor.should_receive(:call).with({
|
174
|
+
command: :column_family_alter,
|
175
|
+
arguments: args.merge({
|
176
|
+
name: column_family_name,
|
177
|
+
keyspace_name: keyspace_name,
|
178
|
+
}),
|
179
|
+
})
|
180
|
+
subject.alter(args)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "#create_index" do
|
185
|
+
it "sends command and arguments, including :name, to executor" do
|
186
|
+
args = {something: 'else'}
|
187
|
+
executor.should_receive(:call).with({
|
188
|
+
command: :index_create,
|
189
|
+
arguments: args.merge({
|
190
|
+
column_family_name: column_family_name,
|
191
|
+
keyspace_name: keyspace_name,
|
192
|
+
}),
|
193
|
+
})
|
194
|
+
subject.create_index(args)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe "#drop_index" do
|
199
|
+
it "sends command and arguments, including :name, to executor" do
|
200
|
+
args = {something: 'else', name: 'users_state_idx'}
|
201
|
+
executor.should_receive(:call).with({
|
202
|
+
command: :index_drop,
|
203
|
+
arguments: args,
|
204
|
+
})
|
205
|
+
subject.drop_index(args)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe "#insert" do
|
210
|
+
it "sends command and arguments, including :name, to executor" do
|
211
|
+
args = {data: {id: '1', name: 'GitHub'}}
|
212
|
+
executor.should_receive(:call).with({
|
213
|
+
command: :column_family_insert,
|
214
|
+
arguments: args.merge({
|
215
|
+
name: column_family_name,
|
216
|
+
keyspace_name: keyspace_name,
|
217
|
+
}),
|
218
|
+
})
|
219
|
+
subject.insert(args)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe "#update" do
|
224
|
+
it "sends command and arguments, including :name, to executor" do
|
225
|
+
args = {set: {name: 'GitHub'}, where: {id: '1'}}
|
226
|
+
executor.should_receive(:call).with({
|
227
|
+
command: :column_family_update,
|
228
|
+
arguments: args.merge({
|
229
|
+
name: column_family_name,
|
230
|
+
keyspace_name: keyspace_name,
|
231
|
+
}),
|
232
|
+
})
|
233
|
+
subject.update(args)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "#delete" do
|
238
|
+
it "sends command and arguments, including :name, to executor" do
|
239
|
+
args = {where: {id: '1'}}
|
240
|
+
executor.should_receive(:call).with({
|
241
|
+
command: :column_family_delete,
|
242
|
+
arguments: args.merge({
|
243
|
+
name: column_family_name,
|
244
|
+
keyspace_name: keyspace_name,
|
245
|
+
}),
|
246
|
+
})
|
247
|
+
subject.delete(args)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'cassanity/connection'
|
3
|
+
|
4
|
+
describe Cassanity::Connection do
|
5
|
+
let(:keyspace_name) { 'analytics' }
|
6
|
+
let(:executor) {
|
7
|
+
double('Executor', {
|
8
|
+
call: nil,
|
9
|
+
})
|
10
|
+
}
|
11
|
+
|
12
|
+
let(:required_arguments) {
|
13
|
+
{
|
14
|
+
executor: executor,
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
subject { described_class.new(required_arguments) }
|
19
|
+
|
20
|
+
it { should respond_to(:executor) }
|
21
|
+
|
22
|
+
[:executor].each do |key|
|
23
|
+
it "raises error if initialized without :#{key} key" do
|
24
|
+
args = required_arguments.reject { |k, v| k == key }
|
25
|
+
expect { described_class.new(args) }.to raise_error(KeyError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#batch" do
|
30
|
+
it "sends command and arguments, including :name, to executor" do
|
31
|
+
args = {modifications: [[:insert, data: {id: '1', name: 'GitHub'}]]}
|
32
|
+
executor.should_receive(:call).with({
|
33
|
+
command: :batch,
|
34
|
+
arguments: args,
|
35
|
+
})
|
36
|
+
subject.batch(args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#keyspace" do
|
41
|
+
before do
|
42
|
+
@return_value = subject.keyspace(keyspace_name)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns instance of keyspace" do
|
46
|
+
@return_value.should be_instance_of(Cassanity::Keyspace)
|
47
|
+
end
|
48
|
+
|
49
|
+
context "with args" do
|
50
|
+
before do
|
51
|
+
@return_value = subject.keyspace(keyspace_name, {
|
52
|
+
strategy_class: 'NetworkTopologyStrategy',
|
53
|
+
})
|
54
|
+
end
|
55
|
+
|
56
|
+
it "passes args to initialization" do
|
57
|
+
@return_value.strategy_class.should eq('NetworkTopologyStrategy')
|
58
|
+
end
|
59
|
+
|
60
|
+
it "returns instance of keyspace" do
|
61
|
+
@return_value.should be_instance_of(Cassanity::Keyspace)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#[]" do
|
67
|
+
before do
|
68
|
+
@return_value = subject[keyspace_name]
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns instance of keyspace" do
|
72
|
+
@return_value.should be_instance_of(Cassanity::Keyspace)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'cassanity/error'
|
3
|
+
|
4
|
+
describe Cassanity::Error do
|
5
|
+
HorribleBadThing = Class.new(Exception)
|
6
|
+
|
7
|
+
it "can wrap original error" do
|
8
|
+
original = HorribleBadThing.new
|
9
|
+
error = described_class.new(original: original)
|
10
|
+
error.original.should eq(original)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "defaults original to last raised exception" do
|
14
|
+
begin
|
15
|
+
begin
|
16
|
+
raise HorribleBadThing, 'Yep, really bad'
|
17
|
+
rescue Exception => e
|
18
|
+
raise described_class
|
19
|
+
end
|
20
|
+
rescue described_class => e
|
21
|
+
e.original.should be_instance_of(HorribleBadThing)
|
22
|
+
e.message.should eq("Original Exception: HorribleBadThing: Yep, really bad")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "does not require original error" do
|
27
|
+
error = described_class.new(:message => 'Is this thing on?')
|
28
|
+
error.message.should eq('Is this thing on?')
|
29
|
+
end
|
30
|
+
|
31
|
+
it "does not require any arguments" do
|
32
|
+
error = described_class.new
|
33
|
+
error.message.should eq("Something truly horrible went wrong")
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'cassanity/executors/cassandra_cql'
|
3
|
+
|
4
|
+
describe Cassanity::Executors::CassandraCql do
|
5
|
+
let(:client) { double('Client', :execute => nil) }
|
6
|
+
|
7
|
+
let(:required_arguments) {
|
8
|
+
{
|
9
|
+
client: client,
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
let(:argument_generators) {
|
14
|
+
{
|
15
|
+
:foo => lambda { |args| ['mapped', args] },
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
let(:result_transformers) {
|
20
|
+
{
|
21
|
+
:foo => lambda { |args| ['transformed', args] }
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
subject { described_class.new(required_arguments) }
|
26
|
+
|
27
|
+
describe "#initialize" do
|
28
|
+
[:client].each do |key|
|
29
|
+
it "raises error without :#{key} key" do
|
30
|
+
args = required_arguments.reject { |k, v| k == key }
|
31
|
+
expect { described_class.new(args) }.to raise_error(KeyError)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "sets client" do
|
36
|
+
subject.client.should eq(client)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "defaults :argument_generators" do
|
40
|
+
subject.argument_generators.should eq(described_class::ArgumentGenerators)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "defaults :result_transformers" do
|
44
|
+
subject.result_transformers.should eq(described_class::ResultTransformers)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "allows overriding :argument_generators" do
|
48
|
+
instance = described_class.new(required_arguments.merge({
|
49
|
+
argument_generators: argument_generators
|
50
|
+
}))
|
51
|
+
|
52
|
+
instance.argument_generators.should eq(argument_generators)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "allows overriding :result_transformers" do
|
56
|
+
instance = described_class.new(required_arguments.merge({
|
57
|
+
result_transformers: result_transformers
|
58
|
+
}))
|
59
|
+
|
60
|
+
instance.result_transformers.should eq(result_transformers)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
KnownCommands = [
|
65
|
+
:keyspaces,
|
66
|
+
:keyspace_create,
|
67
|
+
:keyspace_drop,
|
68
|
+
:keyspace_use,
|
69
|
+
:column_family_create,
|
70
|
+
:column_family_drop,
|
71
|
+
:column_family_truncate,
|
72
|
+
:column_family_select,
|
73
|
+
:column_family_insert,
|
74
|
+
:column_family_update,
|
75
|
+
:column_family_delete,
|
76
|
+
:column_family_alter,
|
77
|
+
:index_create,
|
78
|
+
:index_drop,
|
79
|
+
:batch,
|
80
|
+
]
|
81
|
+
|
82
|
+
KnownCommands.each do |key|
|
83
|
+
it "responds to #{key} command by default" do
|
84
|
+
subject.argument_generators.should have_key(key)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "#call" do
|
89
|
+
subject {
|
90
|
+
described_class.new(required_arguments.merge({
|
91
|
+
argument_generators: argument_generators,
|
92
|
+
}))
|
93
|
+
}
|
94
|
+
|
95
|
+
context "for known command" do
|
96
|
+
it "generates arguments based on command to argument map and passes generated arguments client execute method" do
|
97
|
+
args = {
|
98
|
+
command: :foo,
|
99
|
+
arguments: {
|
100
|
+
something: 'else',
|
101
|
+
},
|
102
|
+
}
|
103
|
+
|
104
|
+
client.should_receive(:execute).with('mapped', args[:arguments])
|
105
|
+
subject.call(args)
|
106
|
+
end
|
107
|
+
|
108
|
+
context "with result transformer" do
|
109
|
+
subject {
|
110
|
+
described_class.new(required_arguments.merge({
|
111
|
+
argument_generators: argument_generators,
|
112
|
+
result_transformers: result_transformers,
|
113
|
+
}))
|
114
|
+
}
|
115
|
+
|
116
|
+
it "returns result transformed" do
|
117
|
+
result = double('Result')
|
118
|
+
client.stub(:execute => result)
|
119
|
+
tranformer = result_transformers[:foo]
|
120
|
+
|
121
|
+
args = {
|
122
|
+
command: :foo,
|
123
|
+
arguments: {
|
124
|
+
something: 'else',
|
125
|
+
},
|
126
|
+
}
|
127
|
+
|
128
|
+
subject.call(args).should eq(['transformed', result])
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "without result transformer" do
|
133
|
+
subject {
|
134
|
+
described_class.new(required_arguments.merge({
|
135
|
+
argument_generators: argument_generators,
|
136
|
+
result_transformers: {},
|
137
|
+
}))
|
138
|
+
}
|
139
|
+
|
140
|
+
it "returns result transformed" do
|
141
|
+
result = double('Result')
|
142
|
+
client.stub(:execute => result)
|
143
|
+
tranformer = result_transformers[:foo]
|
144
|
+
|
145
|
+
args = {
|
146
|
+
command: :foo,
|
147
|
+
arguments: {
|
148
|
+
something: 'else',
|
149
|
+
},
|
150
|
+
}
|
151
|
+
|
152
|
+
subject.call(args).should eq(result)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context "for unknown command" do
|
158
|
+
it "generates arguments based on command to argument map and passes generated arguments client execute method" do
|
159
|
+
expect {
|
160
|
+
subject.call({
|
161
|
+
command: :surprise,
|
162
|
+
})
|
163
|
+
}.to raise_error(Cassanity::UnknownCommand, 'Original Exception: KeyError: key not found: :surprise')
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context "when client raises exception" do
|
168
|
+
it "raises Cassanity::Error" do
|
169
|
+
client.should_receive(:execute).and_raise(Exception.new)
|
170
|
+
expect {
|
171
|
+
subject.call({
|
172
|
+
command: :foo,
|
173
|
+
})
|
174
|
+
}.to raise_error(Cassanity::Error, /Exception: Exception/)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'cassanity/keyspace'
|
3
|
+
|
4
|
+
describe Cassanity::Keyspace do
|
5
|
+
let(:keyspace_name) { 'analytics' }
|
6
|
+
|
7
|
+
let(:executor) {
|
8
|
+
lambda { |args| ['GOTTA KEEP EM EXECUTED', args] }
|
9
|
+
}
|
10
|
+
|
11
|
+
let(:required_arguments) {
|
12
|
+
{
|
13
|
+
name: keyspace_name,
|
14
|
+
executor: executor,
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
subject { described_class.new(required_arguments) }
|
19
|
+
|
20
|
+
it { should respond_to(:name) }
|
21
|
+
it { should respond_to(:executor) }
|
22
|
+
|
23
|
+
describe "#initialize" do
|
24
|
+
it "sets name" do
|
25
|
+
subject.name.should eq(keyspace_name)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "sets executor" do
|
29
|
+
subject.executor.should eq(executor)
|
30
|
+
end
|
31
|
+
|
32
|
+
[:name, :executor].each do |key|
|
33
|
+
it "raises error without :#{key} key" do
|
34
|
+
args = required_arguments.reject { |k, v| k == key }
|
35
|
+
expect { described_class.new(args) }.to raise_error(KeyError)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets strategy_class if provided" do
|
40
|
+
instance = described_class.new(required_arguments.merge({
|
41
|
+
strategy_class: 'NetworkTopologyStrategy',
|
42
|
+
}))
|
43
|
+
|
44
|
+
instance.strategy_class.should eq('NetworkTopologyStrategy')
|
45
|
+
end
|
46
|
+
|
47
|
+
it "sets strategy_options if provided" do
|
48
|
+
instance = described_class.new(required_arguments.merge({
|
49
|
+
strategy_options: {
|
50
|
+
dc1: 3,
|
51
|
+
dc2: 5,
|
52
|
+
},
|
53
|
+
}))
|
54
|
+
|
55
|
+
instance.strategy_options.should eq({
|
56
|
+
dc1: 3,
|
57
|
+
dc2: 5,
|
58
|
+
})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#column_family" do
|
63
|
+
let(:column_family_name) { 'apps' }
|
64
|
+
|
65
|
+
before do
|
66
|
+
@return_value = subject.column_family(column_family_name)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "returns instance of column family" do
|
70
|
+
@return_value.should be_instance_of(Cassanity::ColumnFamily)
|
71
|
+
end
|
72
|
+
|
73
|
+
context "with args" do
|
74
|
+
let(:schema) { double('Schema') }
|
75
|
+
|
76
|
+
before do
|
77
|
+
@return_value = subject.column_family(column_family_name, {
|
78
|
+
schema: schema,
|
79
|
+
})
|
80
|
+
end
|
81
|
+
|
82
|
+
it "passes args to initialization" do
|
83
|
+
@return_value.schema.should eq(schema)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns instance of column family" do
|
87
|
+
@return_value.should be_instance_of(Cassanity::ColumnFamily)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "#table" do
|
93
|
+
let(:column_family_name) { 'apps' }
|
94
|
+
|
95
|
+
before do
|
96
|
+
@return_value = subject.table(column_family_name)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "returns instance of column family" do
|
100
|
+
@return_value.should be_instance_of(Cassanity::ColumnFamily)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "#[]" do
|
105
|
+
let(:column_family_name) { 'apps' }
|
106
|
+
|
107
|
+
before do
|
108
|
+
@return_value = subject[column_family_name]
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns instance of column family" do
|
112
|
+
@return_value.should be_instance_of(Cassanity::ColumnFamily)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#use" do
|
117
|
+
it "sends command and arguments, including :name, to executor" do
|
118
|
+
args = {something: 'else'}
|
119
|
+
executor.should_receive(:call).with({
|
120
|
+
command: :keyspace_use,
|
121
|
+
arguments: args.merge(name: keyspace_name),
|
122
|
+
})
|
123
|
+
subject.use(args)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "#drop" do
|
128
|
+
it "sends command and arguments, including :name, to executor" do
|
129
|
+
args = {something: 'else'}
|
130
|
+
executor.should_receive(:call).with({
|
131
|
+
command: :keyspace_drop,
|
132
|
+
arguments: args.merge(name: keyspace_name),
|
133
|
+
})
|
134
|
+
subject.drop(args)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'cassanity/result_transformers/mirror'
|
3
|
+
|
4
|
+
describe Cassanity::ResultTransformers::Mirror do
|
5
|
+
describe "#call" do
|
6
|
+
it "returns whatever is passed it" do
|
7
|
+
[1, '2', ['something'], {something: 'else'}].each do |result|
|
8
|
+
subject.call(result).should be(result)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'cassanity/schema'
|
3
|
+
|
4
|
+
describe Cassanity::Schema do
|
5
|
+
let(:required_arguments) {
|
6
|
+
{
|
7
|
+
primary_key: :id,
|
8
|
+
columns: {
|
9
|
+
id: :text,
|
10
|
+
name: :text,
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
describe "#initialize" do
|
16
|
+
[:primary_key, :columns].each do |key|
|
17
|
+
it "raises error without :#{key} key" do
|
18
|
+
args = required_arguments.reject { |k, v| k == key }
|
19
|
+
expect { described_class.new(args) }.to raise_error(KeyError)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|