cql-rb 1.1.3 → 1.2.0.pre0
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.
- checksums.yaml +4 -4
- data/README.md +19 -11
- data/lib/cql.rb +1 -0
- data/lib/cql/client.rb +41 -9
- data/lib/cql/client/asynchronous_client.rb +9 -4
- data/lib/cql/client/asynchronous_prepared_statement.rb +2 -2
- data/lib/cql/client/connection_helper.rb +43 -20
- data/lib/cql/client/execute_options_decoder.rb +4 -1
- data/lib/cql/client/query_result.rb +7 -3
- data/lib/cql/client/query_trace.rb +46 -0
- data/lib/cql/client/request_runner.rb +7 -2
- data/lib/cql/client/void_result.rb +42 -0
- data/lib/cql/compression.rb +53 -0
- data/lib/cql/compression/snappy_compressor.rb +42 -0
- data/lib/cql/io/io_reactor.rb +9 -4
- data/lib/cql/protocol.rb +5 -3
- data/lib/cql/protocol/cql_protocol_handler.rb +14 -9
- data/lib/cql/protocol/frame_decoder.rb +106 -0
- data/lib/cql/protocol/frame_encoder.rb +31 -0
- data/lib/cql/protocol/request.rb +7 -11
- data/lib/cql/protocol/requests/execute_request.rb +2 -2
- data/lib/cql/protocol/requests/options_request.rb +4 -0
- data/lib/cql/protocol/requests/prepare_request.rb +2 -2
- data/lib/cql/protocol/requests/query_request.rb +2 -2
- data/lib/cql/protocol/requests/startup_request.rb +12 -5
- data/lib/cql/protocol/response.rb +13 -2
- data/lib/cql/protocol/responses/authenticate_response.rb +5 -1
- data/lib/cql/protocol/responses/detailed_error_response.rb +2 -2
- data/lib/cql/protocol/responses/error_response.rb +7 -2
- data/lib/cql/protocol/responses/event_response.rb +4 -2
- data/lib/cql/protocol/responses/prepared_result_response.rb +20 -4
- data/lib/cql/protocol/responses/ready_response.rb +5 -1
- data/lib/cql/protocol/responses/result_response.rb +10 -2
- data/lib/cql/protocol/responses/rows_result_response.rb +5 -4
- data/lib/cql/protocol/responses/schema_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/schema_change_result_response.rb +5 -4
- data/lib/cql/protocol/responses/set_keyspace_result_response.rb +4 -3
- data/lib/cql/protocol/responses/{status_change_event_result_response.rb → status_change_event_response.rb} +1 -1
- data/lib/cql/protocol/responses/supported_response.rb +5 -1
- data/lib/cql/protocol/responses/{topology_change_event_result_response.rb → topology_change_event_response.rb} +0 -0
- data/lib/cql/protocol/responses/void_result_response.rb +2 -2
- data/lib/cql/version.rb +1 -1
- data/spec/cql/client/asynchronous_client_spec.rb +52 -31
- data/spec/cql/client/asynchronous_prepared_statement_spec.rb +16 -2
- data/spec/cql/client/connection_helper_spec.rb +90 -12
- data/spec/cql/client/query_trace_spec.rb +138 -0
- data/spec/cql/client/request_runner_spec.rb +44 -7
- data/spec/cql/client/void_result_spec.rb +43 -0
- data/spec/cql/compression/compression_common.rb +59 -0
- data/spec/cql/compression/snappy_compressor_spec.rb +23 -0
- data/spec/cql/io/io_reactor_spec.rb +8 -1
- data/spec/cql/protocol/cql_protocol_handler_spec.rb +40 -0
- data/spec/cql/protocol/frame_decoder_spec.rb +132 -0
- data/spec/cql/protocol/frame_encoder_spec.rb +105 -0
- data/spec/cql/protocol/requests/credentials_request_spec.rb +2 -4
- data/spec/cql/protocol/requests/execute_request_spec.rb +5 -5
- data/spec/cql/protocol/requests/options_request_spec.rb +10 -4
- data/spec/cql/protocol/requests/prepare_request_spec.rb +3 -3
- data/spec/cql/protocol/requests/query_request_spec.rb +10 -5
- data/spec/cql/protocol/requests/register_request_spec.rb +3 -3
- data/spec/cql/protocol/requests/startup_request_spec.rb +11 -5
- data/spec/cql/protocol/responses/authenticate_response_spec.rb +27 -0
- data/spec/cql/protocol/responses/detailed_error_response_spec.rb +78 -0
- data/spec/cql/protocol/responses/error_response_spec.rb +36 -0
- data/spec/cql/protocol/responses/event_response_spec.rb +40 -0
- data/spec/cql/protocol/responses/prepared_result_response_spec.rb +108 -0
- data/spec/cql/protocol/responses/ready_response_spec.rb +39 -0
- data/spec/cql/protocol/responses/result_response_spec.rb +57 -0
- data/spec/cql/protocol/responses/rows_result_response_spec.rb +273 -0
- data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +93 -0
- data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +51 -19
- data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +34 -0
- data/spec/cql/protocol/responses/status_change_event_response_spec.rb +35 -0
- data/spec/cql/protocol/responses/supported_response_spec.rb +27 -0
- data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +35 -0
- data/spec/cql/protocol/responses/void_result_response_spec.rb +29 -0
- data/spec/integration/client_spec.rb +45 -0
- data/spec/integration/protocol_spec.rb +46 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/fake_io_reactor.rb +1 -1
- metadata +51 -10
- data/lib/cql/protocol/response_frame.rb +0 -129
- data/spec/cql/protocol/request_spec.rb +0 -45
- data/spec/cql/protocol/response_frame_spec.rb +0 -811
@@ -0,0 +1,273 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
module Cql
|
7
|
+
module Protocol
|
8
|
+
describe RowsResultResponse do
|
9
|
+
describe '.decode!' do
|
10
|
+
context 'with rows from the same table' do
|
11
|
+
let :response do
|
12
|
+
described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01\x00\x00\x00\x03\x00\ncql_rb_126\x00\x05users\x00\tuser_name\x00\r\x00\x05email\x00\r\x00\bpassword\x00\r\x00\x00\x00\x02\x00\x00\x00\x04phil\x00\x00\x00\rphil@heck.com\xFF\xFF\xFF\xFF\x00\x00\x00\x03sue\x00\x00\x00\rsue@inter.net\xFF\xFF\xFF\xFF"))
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'decodes the rows as hashes of column name => column value' do
|
16
|
+
response.rows.should == [
|
17
|
+
{'user_name' => 'phil', 'email' => 'phil@heck.com', 'password' => nil},
|
18
|
+
{'user_name' => 'sue', 'email' => 'sue@inter.net', 'password' => nil}
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'decodes column metadata' do
|
23
|
+
response.metadata.should == [
|
24
|
+
['cql_rb_126', 'users', 'user_name', :varchar],
|
25
|
+
['cql_rb_126', 'users', 'email', :varchar],
|
26
|
+
['cql_rb_126', 'users', 'password', :varchar]
|
27
|
+
]
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'is not void' do
|
31
|
+
response.should_not be_void
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'with rows from different keyspaces' do
|
36
|
+
let :response do
|
37
|
+
# TODO: not sure if this is really how it would be for real
|
38
|
+
# this frame was constructed from the spec not from an actual result
|
39
|
+
buffer = ByteBuffer.new
|
40
|
+
buffer << "\x00\x00\x00\x00"
|
41
|
+
buffer << "\x00\x00\x00\x03"
|
42
|
+
buffer << "\x00\ncql_rb_126\x00\x06users1\x00\tuser_name\x00\r"
|
43
|
+
buffer << "\x00\ncql_rb_127\x00\x06users2\x00\x05email\x00\r"
|
44
|
+
buffer << "\x00\ncql_rb_128\x00\x06users3\x00\bpassword\x00\r"
|
45
|
+
buffer << "\x00\x00\x00\x02\x00\x00\x00\x04phil\x00\x00\x00\rphil@heck.com\xFF\xFF\xFF\xFF\x00\x00\x00\x03sue\x00\x00\x00\rsue@inter.net\xFF\xFF\xFF\xFF"
|
46
|
+
described_class.decode!(buffer)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'decodes the rows' do
|
50
|
+
response.rows.should == [
|
51
|
+
{'user_name' => 'phil', 'email' => 'phil@heck.com', 'password' => nil},
|
52
|
+
{'user_name' => 'sue', 'email' => 'sue@inter.net', 'password' => nil}
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'decodes the column metadata' do
|
57
|
+
response.metadata.should == [
|
58
|
+
['cql_rb_126', 'users1', 'user_name', :varchar],
|
59
|
+
['cql_rb_127', 'users2', 'email', :varchar],
|
60
|
+
['cql_rb_128', 'users3', 'password', :varchar]
|
61
|
+
]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with different column types' do
|
66
|
+
let :response do
|
67
|
+
# The following test was created by intercepting the frame for the
|
68
|
+
# SELECT statement in this CQL exchange
|
69
|
+
#
|
70
|
+
# CREATE TABLE lots_of_types (
|
71
|
+
# ascii_column ASCII,
|
72
|
+
# bigint_column BIGINT,
|
73
|
+
# blob_column BLOB,
|
74
|
+
# boolean_column BOOLEAN,
|
75
|
+
# decimal_column DECIMAL,
|
76
|
+
# double_column DOUBLE,
|
77
|
+
# float_column FLOAT,
|
78
|
+
# int_column INT,
|
79
|
+
# text_column TEXT,
|
80
|
+
# timestamp_column TIMESTAMP,
|
81
|
+
# uuid_column UUID,
|
82
|
+
# varchar_column VARCHAR,
|
83
|
+
# varint_column VARINT,
|
84
|
+
# timeuuid_column TIMEUUID,
|
85
|
+
# inet_column INET,
|
86
|
+
# list_column LIST<ASCII>,
|
87
|
+
# map_column MAP<TEXT, BOOLEAN>,
|
88
|
+
# set_column SET<BLOB>,
|
89
|
+
#
|
90
|
+
# PRIMARY KEY (ascii_column)
|
91
|
+
# );
|
92
|
+
#
|
93
|
+
# INSERT INTO lots_of_types (ascii_column, bigint_column, blob_column, boolean_column, decimal_column, double_column, float_column, int_column, text_column, timestamp_column, uuid_column, varchar_column, varint_column, timeuuid_column, inet_column, list_column, map_column, set_column)
|
94
|
+
# VALUES (
|
95
|
+
# 'hello',
|
96
|
+
# 1012312312414123,
|
97
|
+
# 'fab45e3456',
|
98
|
+
# true,
|
99
|
+
# 1042342234234.123423435647768234,
|
100
|
+
# 10000.123123123,
|
101
|
+
# 12.13,
|
102
|
+
# 12348098,
|
103
|
+
# 'hello world',
|
104
|
+
# 1358013521.123,
|
105
|
+
# cfd66ccc-d857-4e90-b1e5-df98a3d40cd6,
|
106
|
+
# 'foo',
|
107
|
+
# 1231312312331283012830129382342342412123,
|
108
|
+
# a4a70900-24e1-11df-8924-001ff3591711,
|
109
|
+
# 167772418,
|
110
|
+
# ['foo', 'foo', 'bar'],
|
111
|
+
# {'foo': true, 'hello': false},
|
112
|
+
# {'ab4321', 'afd87ecd'}
|
113
|
+
# );
|
114
|
+
#
|
115
|
+
# SELECT * FROM lots_of_types WHERE ascii_column = 'hello';
|
116
|
+
|
117
|
+
described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01\x00\x00\x00\x12\x00\x04test\x00\rlots_of_types\x00\fascii_column\x00\x01\x00\rbigint_column\x00\x02\x00\vblob_column\x00\x03\x00\x0Eboolean_column\x00\x04\x00\x0Edecimal_column\x00\x06\x00\rdouble_column\x00\a\x00\ffloat_column\x00\b\x00\vinet_column\x00\x10\x00\nint_column\x00\t\x00\vlist_column\x00 \x00\x01\x00\nmap_column\x00!\x00\r\x00\x04\x00\nset_column\x00\"\x00\x03\x00\vtext_column\x00\r\x00\x10timestamp_column\x00\v\x00\x0Ftimeuuid_column\x00\x0F\x00\vuuid_column\x00\f\x00\x0Evarchar_column\x00\r\x00\rvarint_column\x00\x0E\x00\x00\x00\x01\x00\x00\x00\x05hello\x00\x00\x00\b\x00\x03\x98\xB1S\xC8\x7F\xAB\x00\x00\x00\x05\xFA\xB4^4V\x00\x00\x00\x01\x01\x00\x00\x00\x11\x00\x00\x00\x12\r'\xFDI\xAD\x80f\x11g\xDCfV\xAA\x00\x00\x00\b@\xC3\x88\x0F\xC2\x7F\x9DU\x00\x00\x00\x04AB\x14{\x00\x00\x00\x04\n\x00\x01\x02\x00\x00\x00\x04\x00\xBCj\xC2\x00\x00\x00\x11\x00\x03\x00\x03foo\x00\x03foo\x00\x03bar\x00\x00\x00\x14\x00\x02\x00\x03foo\x00\x01\x01\x00\x05hello\x00\x01\x00\x00\x00\x00\r\x00\x02\x00\x03\xABC!\x00\x04\xAF\xD8~\xCD\x00\x00\x00\vhello world\x00\x00\x00\b\x00\x00\x01</\xE9\xDC\xE3\x00\x00\x00\x10\xA4\xA7\t\x00$\xE1\x11\xDF\x89$\x00\x1F\xF3Y\x17\x11\x00\x00\x00\x10\xCF\xD6l\xCC\xD8WN\x90\xB1\xE5\xDF\x98\xA3\xD4\f\xD6\x00\x00\x00\x03foo\x00\x00\x00\x11\x03\x9EV \x15\f\x03\x9DK\x18\xCDI\\$?\a["))
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'decodes ASCII as an ASCII encoded string' do
|
121
|
+
response.rows.first['ascii_column'].should == 'hello'
|
122
|
+
response.rows.first['ascii_column'].encoding.should == ::Encoding::ASCII
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'decodes BIGINT as a number' do
|
126
|
+
response.rows.first['bigint_column'].should == 1012312312414123
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'decodes BLOB as a ASCII-8BIT string' do
|
130
|
+
response.rows.first['blob_column'].should == "\xfa\xb4\x5e\x34\x56"
|
131
|
+
response.rows.first['blob_column'].encoding.should == ::Encoding::BINARY
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'decodes BOOLEAN as a boolean' do
|
135
|
+
response.rows.first['boolean_column'].should equal(true)
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'decodes DECIMAL as a number' do
|
139
|
+
response.rows.first['decimal_column'].should == BigDecimal.new('1042342234234.123423435647768234')
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'decodes DOUBLE as a number' do
|
143
|
+
response.rows.first['double_column'].should == 10000.123123123
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'decodes FLOAT as a number' do
|
147
|
+
response.rows.first['float_column'].should be_within(0.001).of(12.13)
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'decodes INT as a number' do
|
151
|
+
response.rows.first['int_column'].should == 12348098
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'decodes TEXT as a UTF-8 encoded string' do
|
155
|
+
response.rows.first['text_column'].should == 'hello world'
|
156
|
+
response.rows.first['text_column'].encoding.should == ::Encoding::UTF_8
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'decodes TIMESTAMP as a Time' do
|
160
|
+
response.rows.first['timestamp_column'].should == Time.at(1358013521.123)
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'decodes UUID as a Uuid' do
|
164
|
+
response.rows.first['uuid_column'].should == Uuid.new('cfd66ccc-d857-4e90-b1e5-df98a3d40cd6')
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'decodes VARCHAR as a UTF-8 encoded string' do
|
168
|
+
response.rows.first['varchar_column'].should == 'foo'
|
169
|
+
response.rows.first['varchar_column'].encoding.should == ::Encoding::UTF_8
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'decodes VARINT as a number' do
|
173
|
+
response.rows.first['varint_column'].should == 1231312312331283012830129382342342412123
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'decodes TIMEUUID as a TimeUuid' do
|
177
|
+
response.rows.first['timeuuid_column'].should == TimeUuid.new('a4a70900-24e1-11df-8924-001ff3591711')
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'decodes INET as a IPAddr' do
|
181
|
+
response.rows.first['inet_column'].should == IPAddr.new('10.0.1.2')
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'decodes LIST<ASCII> as an array of ASCII strings' do
|
185
|
+
response.rows.first['list_column'].should == ['foo', 'foo', 'bar'].map { |s| s.force_encoding(::Encoding::ASCII) }
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'decodes MAP<TEXT, BOOLEAN> as a hash of UTF-8 strings to booleans' do
|
189
|
+
response.rows.first['map_column'].should == {'foo' => true, 'hello' => false}
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'decodes SET<BLOB> as a set of binary strings' do
|
193
|
+
response.rows.first['set_column'].should == Set.new(["\xab\x43\x21", "\xaf\xd8\x7e\xcd"].map { |s| s.force_encoding(::Encoding::BINARY) })
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context 'with null values' do
|
198
|
+
it 'decodes nulls' do
|
199
|
+
response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01\x00\x00\x00\x13\x00\x12cql_rb_client_spec\x00\rlots_of_types\x00\x02id\x00\t\x00\fascii_column\x00\x01\x00\rbigint_column\x00\x02\x00\vblob_column\x00\x03\x00\x0Eboolean_column\x00\x04\x00\x0Edecimal_column\x00\x06\x00\rdouble_column\x00\a\x00\ffloat_column\x00\b\x00\vinet_column\x00\x10\x00\nint_column\x00\t\x00\vlist_column\x00 \x00\x01\x00\nmap_column\x00!\x00\r\x00\x04\x00\nset_column\x00\"\x00\x03\x00\vtext_column\x00\r\x00\x10timestamp_column\x00\v\x00\x0Ftimeuuid_column\x00\x0F\x00\vuuid_column\x00\f\x00\x0Evarchar_column\x00\r\x00\rvarint_column\x00\x0E\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x03\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"))
|
200
|
+
response.rows.first.should eql(
|
201
|
+
'id' => 3,
|
202
|
+
'ascii_column' => nil,
|
203
|
+
'bigint_column' => nil,
|
204
|
+
'blob_column' => nil,
|
205
|
+
'boolean_column' => nil,
|
206
|
+
'decimal_column' => nil,
|
207
|
+
'double_column' => nil,
|
208
|
+
'float_column' => nil,
|
209
|
+
'int_column' => nil,
|
210
|
+
'text_column' => nil,
|
211
|
+
'timestamp_column' => nil,
|
212
|
+
'uuid_column' => nil,
|
213
|
+
'varchar_column' => nil,
|
214
|
+
'varint_column' => nil,
|
215
|
+
'timeuuid_column' => nil,
|
216
|
+
'inet_column' => nil,
|
217
|
+
'list_column' => nil,
|
218
|
+
'map_column' => nil,
|
219
|
+
'set_column' => nil,
|
220
|
+
)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
context 'with COUNTER columns' do
|
225
|
+
it 'decodes COUNTER as a number' do
|
226
|
+
response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01\x00\x00\x00\x03\x00\x04test\x00\x04cnts\x00\x02id\x00\r\x00\x02c1\x00\x05\x00\x02c2\x00\x05\x00\x00\x00\x01\x00\x00\x00\x04theo\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x01"))
|
227
|
+
response.rows.first['c1'].should == 3
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'decodes a null COUNTER as nil' do
|
231
|
+
response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01\x00\x00\x00\x02\x00\x12cql_rb_client_spec\x00\bcounters\x00\bcounter1\x00\x05\x00\bcounter2\x00\x05\x00\x00\x00\x01\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x01\xFF\xFF\xFF\xFF"))
|
232
|
+
response.rows.first['counter2'].should be_nil
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context 'with an INET column' do
|
237
|
+
let :response do
|
238
|
+
described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01\x00\x00\x00\x01\x00\ntest_types\x00\rlots_of_types\x00\vinet_column\x00\x10\x00\x00\x00\x02\x00\x00\x00\x04\x7F\x00\x00\x01\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"))
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'decodes IPv4 values' do
|
242
|
+
response.rows[0]['inet_column'].should == IPAddr.new('127.0.0.1')
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'decodes IPv6 values' do
|
246
|
+
response.rows[1]['inet_column'].should == IPAddr.new('::1')
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
context 'with an unknown column type' do
|
251
|
+
it 'raises an error when encountering an unknown column type' do
|
252
|
+
buffer = ByteBuffer.new("\x00\x00\x00\x01\x00\x00\x00\x03\x00\ncql_rb_328\x00\x05users\x00\tuser_name\x00\xff\x00\x05email\x00\r\x00\bpassword\x00\r\x00\x00\x00\x00")
|
253
|
+
expect { described_class.decode!(buffer) }.to raise_error(UnsupportedColumnTypeError)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
describe '#void?' do
|
259
|
+
it 'is not void' do
|
260
|
+
response = RowsResultResponse.new([{'col' => 'foo'}], [['ks', 'tbl', 'col', :varchar]], nil)
|
261
|
+
response.should_not be_void
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
describe '#to_s' do
|
266
|
+
it 'returns a string with metadata and rows' do
|
267
|
+
response = RowsResultResponse.new([{'col' => 'foo'}], [['ks', 'tbl', 'col', :varchar]], nil)
|
268
|
+
response.to_s.should == 'RESULT ROWS [["ks", "tbl", "col", :varchar]] [{"col"=>"foo"}]'
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
module Cql
|
7
|
+
module Protocol
|
8
|
+
describe SchemaChangeEventResponse do
|
9
|
+
describe '.decode!' do
|
10
|
+
let :response do
|
11
|
+
described_class.decode!(ByteBuffer.new("\x00\aDROPPED\x00\ncql_rb_609\x00\x05users"))
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'decodes the change' do
|
15
|
+
response.change.should == 'DROPPED'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'decodes the keyspace' do
|
19
|
+
response.keyspace.should == 'cql_rb_609'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'decodes the table' do
|
23
|
+
response.table.should == 'users'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#to_s' do
|
28
|
+
it 'returns a string with the change, keyspace and table' do
|
29
|
+
response = described_class.new('DROPPED', 'ks', 'tbl')
|
30
|
+
response.to_s.should == 'EVENT SCHEMA_CHANGE DROPPED "ks" "tbl"'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#eql?' do
|
35
|
+
it 'is equal to an identical response' do
|
36
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
37
|
+
r2 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
38
|
+
r1.should eql(r2)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'is not equal when the change is different' do
|
42
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
43
|
+
r2 = described_class.new('CREATED', 'keyspace_name', 'table_name')
|
44
|
+
r1.should_not eql(r2)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'is not equal when the keyspace is different' do
|
48
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
49
|
+
r2 = described_class.new('DELETED', 'eman_ecapsyek', 'table_name')
|
50
|
+
r1.should_not eql(r2)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'is not equal when the table is different' do
|
54
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
55
|
+
r2 = described_class.new('DELETED', 'keyspace_name', 'eman_elbat')
|
56
|
+
r1.should_not eql(r2)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'is aliased as ==' do
|
60
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
61
|
+
r2 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
62
|
+
r1.should == r2
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#hash' do
|
67
|
+
it 'is the same for an identical response' do
|
68
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
69
|
+
r2 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
70
|
+
r1.hash.should == r2.hash
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'is not the same when the change is different' do
|
74
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
75
|
+
r2 = described_class.new('CREATED', 'keyspace_name', 'table_name')
|
76
|
+
r1.hash.should_not == r2.hash
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'is not the same when the keyspace is different' do
|
80
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
81
|
+
r2 = described_class.new('DELETED', 'eman_ecapsyek', 'table_name')
|
82
|
+
r1.hash.should_not == r2.hash
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'is not the same when the table is different' do
|
86
|
+
r1 = described_class.new('DELETED', 'keyspace_name', 'table_name')
|
87
|
+
r2 = described_class.new('DELETED', 'keyspace_name', 'eman_elbat')
|
88
|
+
r1.hash.should_not == r2.hash
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -6,35 +6,67 @@ require 'spec_helper'
|
|
6
6
|
module Cql
|
7
7
|
module Protocol
|
8
8
|
describe SchemaChangeResultResponse do
|
9
|
+
describe '.decode!' do
|
10
|
+
let :response do
|
11
|
+
described_class.decode!(ByteBuffer.new("\x00\aUPDATED\x00\ncql_rb_973\x00\x05users"))
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'decodes the description' do
|
15
|
+
response.change.should == 'UPDATED'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'decodes the keyspace' do
|
19
|
+
response.keyspace.should == 'cql_rb_973'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'decodes the table' do
|
23
|
+
response.table.should == 'users'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#void?' do
|
28
|
+
it 'is not void' do
|
29
|
+
response = described_class.new('CREATED', 'ks', 'tbl', nil)
|
30
|
+
response.should_not be_void
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#to_s' do
|
35
|
+
it 'returns a string with the description, keyspace and table' do
|
36
|
+
response = described_class.new('CREATED', 'ks', 'tbl', nil)
|
37
|
+
response.to_s.should == 'RESULT SCHEMA_CHANGE CREATED "ks" "tbl"'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
9
41
|
describe '#eql?' do
|
10
42
|
it 'is equal to another response with the same change, keyspace and table names' do
|
11
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
12
|
-
response2 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
43
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
44
|
+
response2 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
13
45
|
response1.should eql(response2)
|
14
46
|
end
|
15
47
|
|
16
48
|
it 'is not equal to another response with another change' do
|
17
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
18
|
-
response2 = described_class.new('CREATED', 'some_keyspace', 'a_table')
|
49
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
50
|
+
response2 = described_class.new('CREATED', 'some_keyspace', 'a_table', nil)
|
19
51
|
response1.should_not eql(response2)
|
20
52
|
end
|
21
53
|
|
22
54
|
it 'is not equal to another response with another keyspace name' do
|
23
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
24
|
-
response2 = described_class.new('DROPPED', 'another_keyspace', 'a_table')
|
55
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
56
|
+
response2 = described_class.new('DROPPED', 'another_keyspace', 'a_table', nil)
|
25
57
|
response1.should_not eql(response2)
|
26
58
|
end
|
27
59
|
|
28
60
|
it 'is not equal to another response with another table name' do
|
29
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
30
|
-
response2 = described_class.new('DROPPED', 'some_keyspace', 'another_table')
|
61
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
62
|
+
response2 = described_class.new('DROPPED', 'some_keyspace', 'another_table', nil)
|
31
63
|
response1.should_not eql(response2)
|
32
64
|
end
|
33
65
|
|
34
66
|
it 'is aliased as ==' do
|
35
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
36
|
-
response2 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
37
|
-
response3 = described_class.new('DROPPED', 'some_keyspace', 'another_table')
|
67
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
68
|
+
response2 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
69
|
+
response3 = described_class.new('DROPPED', 'some_keyspace', 'another_table', nil)
|
38
70
|
response1.should == response2
|
39
71
|
response2.should_not == response3
|
40
72
|
end
|
@@ -42,26 +74,26 @@ module Cql
|
|
42
74
|
|
43
75
|
describe '#hash' do
|
44
76
|
it 'is the same when the change, keyspace and table names are the same' do
|
45
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
46
|
-
response2 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
77
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
78
|
+
response2 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
47
79
|
response1.hash.should == response2.hash
|
48
80
|
end
|
49
81
|
|
50
82
|
it 'is not the same when the change is different' do
|
51
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
52
|
-
response2 = described_class.new('CREATED', 'some_keyspace', 'a_table')
|
83
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
84
|
+
response2 = described_class.new('CREATED', 'some_keyspace', 'a_table', nil)
|
53
85
|
response1.hash.should_not == response2.hash
|
54
86
|
end
|
55
87
|
|
56
88
|
it 'is not the same when the keyspace name is different' do
|
57
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
58
|
-
response2 = described_class.new('DROPPED', 'another_keyspace', 'a_table')
|
89
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
90
|
+
response2 = described_class.new('DROPPED', 'another_keyspace', 'a_table', nil)
|
59
91
|
response1.hash.should_not == response2.hash
|
60
92
|
end
|
61
93
|
|
62
94
|
it 'is not the same when the table name is different' do
|
63
|
-
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table')
|
64
|
-
response2 = described_class.new('DROPPED', 'some_keyspace', 'another_table')
|
95
|
+
response1 = described_class.new('DROPPED', 'some_keyspace', 'a_table', nil)
|
96
|
+
response2 = described_class.new('DROPPED', 'some_keyspace', 'another_table', nil)
|
65
97
|
response1.hash.should_not == response2.hash
|
66
98
|
end
|
67
99
|
end
|