Skip to content

Commit 600eea5

Browse files
committed
Emit warnings in tests
Also re-paste result_spec into statement_spec, it was stale.
1 parent acabc42 commit 600eea5

File tree

5 files changed

+125
-73
lines changed

5 files changed

+125
-73
lines changed

.rspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
--format documentation
21
--colour
32
--fail-fast
3+
--format documentation
4+
--warnings

spec/mysql2/client_spec.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,13 @@ def run_gc
193193
end
194194

195195
it "should be able to connect to database with numeric-only name" do
196-
expect {
197-
creds = DatabaseCredentials['numericuser']
198-
@client.query "CREATE DATABASE IF NOT EXISTS `#{creds['database']}`"
199-
@client.query "GRANT ALL ON `#{creds['database']}`.* TO #{creds['username']}@`#{creds['host']}`"
200-
client = Mysql2::Client.new creds
201-
@client.query "DROP DATABASE IF EXISTS `#{creds['database']}`"
202-
}.not_to raise_error
196+
creds = DatabaseCredentials['numericuser']
197+
@client.query "CREATE DATABASE IF NOT EXISTS `#{creds['database']}`"
198+
@client.query "GRANT ALL ON `#{creds['database']}`.* TO #{creds['username']}@`#{creds['host']}`"
199+
200+
expect { Mysql2::Client.new(creds) }.not_to raise_error
201+
202+
@client.query "DROP DATABASE IF EXISTS `#{creds['database']}`"
203203
end
204204

205205
it "should respond to #close" do

spec/mysql2/error_spec.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
expect(error).to respond_to(:error)
2727
end
2828

29-
if "".respond_to? :encoding
29+
context 'encoding' do
3030
let :error do
3131
client = Mysql2::Client.new(DatabaseCredentials['root'])
3232
begin
@@ -54,6 +54,7 @@
5454
end
5555

5656
it "returns error messages as UTF-8 by default" do
57+
pending('String#encoding is not defined') unless String.public_method_defined?(:encoding)
5758
with_internal_encoding nil do
5859
expect(error.message.encoding).to eql(Encoding::UTF_8)
5960
error.message.valid_encoding?
@@ -66,11 +67,13 @@
6667
end
6768

6869
it "returns sql state as ASCII" do
70+
pending('String#encoding is not defined') unless String.public_method_defined?(:encoding)
6971
expect(error.sql_state.encoding).to eql(Encoding::US_ASCII)
7072
error.sql_state.valid_encoding?
7173
end
7274

7375
it "returns error messages and sql state in Encoding.default_internal if set" do
76+
pending('String#encoding is not defined') unless String.public_method_defined?(:encoding)
7477
with_internal_encoding 'UTF-16LE' do
7578
expect(error.message.encoding).to eql(Encoding.default_internal)
7679
error.message.valid_encoding?

spec/mysql2/statement_spec.rb

Lines changed: 107 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,16 @@
244244
expect(@test_result['null_test']).to eql(nil)
245245
end
246246

247-
it "should return Fixnum for a BIT value" do
247+
it "should return String for a BIT(64) value" do
248248
expect(@test_result['bit_test'].class).to eql(String)
249249
expect(@test_result['bit_test']).to eql("\000\000\000\000\000\000\000\005")
250250
end
251251

252+
it "should return String for a BIT(1) value" do
253+
expect(@test_result['single_bit_test'].class).to eql(String)
254+
expect(@test_result['single_bit_test']).to eql("\001")
255+
end
256+
252257
it "should return Fixnum for a TINYINT value" do
253258
expect([Fixnum, Bignum]).to include(@test_result['tiny_int_test'].class)
254259
expect(@test_result['tiny_int_test']).to eql(1)
@@ -272,6 +277,20 @@
272277
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2},#{id3})"
273278
end
274279

280+
it "should return TrueClass or FalseClass for a BIT(1) value if :cast_booleans is enabled" do
281+
@client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (1)'
282+
id1 = @client.last_id
283+
@client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (0)'
284+
id2 = @client.last_id
285+
286+
result1 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id1}", :cast_booleans => true
287+
result2 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id2}", :cast_booleans => true
288+
expect(result1.first['single_bit_test']).to be true
289+
expect(result2.first['single_bit_test']).to be false
290+
291+
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2})"
292+
end
293+
275294
it "should return Fixnum for a SMALLINT value" do
276295
expect([Fixnum, Bignum]).to include(@test_result['small_int_test'].class)
277296
expect(@test_result['small_int_test']).to eql(10)
@@ -309,7 +328,7 @@
309328

310329
it "should return Float for a DOUBLE value" do
311330
expect(@test_result['double_test'].class).to eql(Float)
312-
expect(@test_result['double_test']).to be_within(1e-5).of(10.3)
331+
expect(@test_result['double_test']).to eql(10.3)
313332
end
314333

315334
it "should return Time for a DATETIME value when within the supported range" do
@@ -318,7 +337,7 @@
318337
end
319338

320339
if 1.size == 4 # 32bit
321-
if RUBY_VERSION =~ /1.8/
340+
unless RUBY_VERSION =~ /1.8/
322341
klass = Time
323342
else
324343
klass = DateTime
@@ -384,26 +403,35 @@
384403
expect(@test_result['enum_test']).to eql('val1')
385404
end
386405

406+
it "should raise an error given an invalid DATETIME" do
407+
expect { @client.query("SELECT CAST('1972-00-27 00:00:00' AS DATETIME) as bad_datetime").each }.to \
408+
raise_error(Mysql2::Error, "Invalid date in field 'bad_datetime': 1972-00-27 00:00:00")
409+
end
410+
387411
if defined? Encoding
388412
context "string encoding for ENUM values" do
389413
it "should default to the connection's encoding if Encoding.default_internal is nil" do
390-
Encoding.default_internal = nil
391-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
392-
expect(result['enum_test'].encoding).to eql(Encoding.find('utf-8'))
393-
394-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "ascii"))
395-
client2.query "USE test"
396-
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
397-
expect(result['enum_test'].encoding).to eql(Encoding.find('us-ascii'))
414+
with_internal_encoding nil do
415+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
416+
expect(result['enum_test'].encoding).to eql(Encoding.find('utf-8'))
417+
418+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
419+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
420+
expect(result['enum_test'].encoding).to eql(Encoding.find('us-ascii'))
421+
client2.close
422+
end
398423
end
399424

400425
it "should use Encoding.default_internal" do
401-
Encoding.default_internal = Encoding.find('utf-8')
402-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
403-
expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
404-
Encoding.default_internal = Encoding.find('us-ascii')
405-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
406-
expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
426+
with_internal_encoding 'utf-8' do
427+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
428+
expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
429+
end
430+
431+
with_internal_encoding 'us-ascii' do
432+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
433+
expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
434+
end
407435
end
408436
end
409437
end
@@ -416,23 +444,27 @@
416444
if defined? Encoding
417445
context "string encoding for SET values" do
418446
it "should default to the connection's encoding if Encoding.default_internal is nil" do
419-
Encoding.default_internal = nil
420-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
421-
expect(result['set_test'].encoding).to eql(Encoding.find('utf-8'))
422-
423-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "ascii"))
424-
client2.query "USE test"
425-
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
426-
expect(result['set_test'].encoding).to eql(Encoding.find('us-ascii'))
447+
with_internal_encoding nil do
448+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
449+
expect(result['set_test'].encoding).to eql(Encoding.find('utf-8'))
450+
451+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
452+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
453+
expect(result['set_test'].encoding).to eql(Encoding.find('us-ascii'))
454+
client2.close
455+
end
427456
end
428457

429458
it "should use Encoding.default_internal" do
430-
Encoding.default_internal = Encoding.find('utf-8')
431-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
432-
expect(result['set_test'].encoding).to eql(Encoding.default_internal)
433-
Encoding.default_internal = Encoding.find('us-ascii')
434-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
435-
expect(result['set_test'].encoding).to eql(Encoding.default_internal)
459+
with_internal_encoding 'utf-8' do
460+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
461+
expect(result['set_test'].encoding).to eql(Encoding.default_internal)
462+
end
463+
464+
with_internal_encoding 'us-ascii' do
465+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
466+
expect(result['set_test'].encoding).to eql(Encoding.default_internal)
467+
end
436468
end
437469
end
438470
end
@@ -445,18 +477,22 @@
445477
if defined? Encoding
446478
context "string encoding for BINARY values" do
447479
it "should default to binary if Encoding.default_internal is nil" do
448-
Encoding.default_internal = nil
449-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
450-
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
480+
with_internal_encoding nil do
481+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
482+
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
483+
end
451484
end
452485

453486
it "should not use Encoding.default_internal" do
454-
Encoding.default_internal = Encoding.find('utf-8')
455-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
456-
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
457-
Encoding.default_internal = Encoding.find('us-ascii')
458-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
459-
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
487+
with_internal_encoding 'utf-8' do
488+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
489+
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
490+
end
491+
492+
with_internal_encoding 'us-ascii' do
493+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
494+
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
495+
end
460496
end
461497
end
462498
end
@@ -483,43 +519,50 @@
483519
context "string encoding for #{type} values" do
484520
if ['VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB'].include?(type)
485521
it "should default to binary if Encoding.default_internal is nil" do
486-
Encoding.default_internal = nil
487-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
488-
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
522+
with_internal_encoding nil do
523+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
524+
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
525+
end
489526
end
490527

491528
it "should not use Encoding.default_internal" do
492-
Encoding.default_internal = Encoding.find('utf-8')
493-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
494-
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
495-
Encoding.default_internal = Encoding.find('us-ascii')
496-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
497-
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
529+
with_internal_encoding 'utf-8' do
530+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
531+
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
532+
end
533+
534+
with_internal_encoding 'us-ascii' do
535+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
536+
expect(result['binary_test'].encoding).to eql(Encoding.find('binary'))
537+
end
498538
end
499539
else
500540
it "should default to utf-8 if Encoding.default_internal is nil" do
501-
Encoding.default_internal = nil
502-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
503-
expect(result[field].encoding).to eql(Encoding.find('utf-8'))
504-
505-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "ascii"))
506-
client2.query "USE test"
507-
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
508-
expect(result[field].encoding).to eql(Encoding.find('us-ascii'))
541+
with_internal_encoding nil do
542+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
543+
expect(result[field].encoding).to eql(Encoding.find('utf-8'))
544+
545+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
546+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
547+
expect(result[field].encoding).to eql(Encoding.find('us-ascii'))
548+
client2.close
549+
end
509550
end
510551

511552
it "should use Encoding.default_internal" do
512-
Encoding.default_internal = Encoding.find('utf-8')
513-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
514-
expect(result[field].encoding).to eql(Encoding.default_internal)
515-
Encoding.default_internal = Encoding.find('us-ascii')
516-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
517-
expect(result[field].encoding).to eql(Encoding.default_internal)
553+
with_internal_encoding 'utf-8' do
554+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
555+
expect(result[field].encoding).to eql(Encoding.default_internal)
556+
end
557+
558+
with_internal_encoding 'us-ascii' do
559+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
560+
expect(result[field].encoding).to eql(Encoding.default_internal)
561+
end
518562
end
519563
end
520564
end
521565
end
522566
end
523567
end
524-
525568
end

spec/spec_helper.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@
1111

1212
def with_internal_encoding(encoding)
1313
old_enc = Encoding.default_internal
14+
old_verbose = $VERBOSE
15+
$VERBOSE = nil
1416
Encoding.default_internal = encoding
17+
$VERBOSE = old_verbose
1518

1619
yield
1720
ensure
21+
$VERBOSE = nil
1822
Encoding.default_internal = old_enc
23+
$VERBOSE = old_verbose
1924
end
2025

2126
config.before :each do

0 commit comments

Comments
 (0)