Skip to content

Commit fb0c973

Browse files
committed
clean up reassignments of Encoding.default_internal to ensure it's set back to it's original value
1 parent d88dea2 commit fb0c973

File tree

4 files changed

+126
-92
lines changed

4 files changed

+126
-92
lines changed

spec/mysql2/client_spec.rb

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -656,18 +656,22 @@ def connect *args
656656
if defined? Encoding
657657
context "strings returned by #info" do
658658
it "should default to the connection's encoding if Encoding.default_internal is nil" do
659-
Encoding.default_internal = nil
660-
@client.info[:version].encoding.should eql(Encoding.find('utf-8'))
659+
with_internal_encoding nil do
660+
@client.info[:version].encoding.should eql(Encoding.find('utf-8'))
661661

662-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
663-
client2.info[:version].encoding.should eql(Encoding.find('us-ascii'))
662+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
663+
client2.info[:version].encoding.should eql(Encoding.find('us-ascii'))
664+
end
664665
end
665666

666667
it "should use Encoding.default_internal" do
667-
Encoding.default_internal = Encoding.find('utf-8')
668-
@client.info[:version].encoding.should eql(Encoding.default_internal)
669-
Encoding.default_internal = Encoding.find('us-ascii')
670-
@client.info[:version].encoding.should eql(Encoding.default_internal)
668+
with_internal_encoding 'utf-8' do
669+
@client.info[:version].encoding.should eql(Encoding.default_internal)
670+
end
671+
672+
with_internal_encoding 'us-ascii' do
673+
@client.info[:version].encoding.should eql(Encoding.default_internal)
674+
end
671675
end
672676
end
673677
end
@@ -695,18 +699,22 @@ def connect *args
695699
if defined? Encoding
696700
context "strings returned by #server_info" do
697701
it "should default to the connection's encoding if Encoding.default_internal is nil" do
698-
Encoding.default_internal = nil
699-
@client.server_info[:version].encoding.should eql(Encoding.find('utf-8'))
702+
with_internal_encoding nil do
703+
@client.server_info[:version].encoding.should eql(Encoding.find('utf-8'))
700704

701-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
702-
client2.server_info[:version].encoding.should eql(Encoding.find('us-ascii'))
705+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
706+
client2.server_info[:version].encoding.should eql(Encoding.find('us-ascii'))
707+
end
703708
end
704709

705710
it "should use Encoding.default_internal" do
706-
Encoding.default_internal = Encoding.find('utf-8')
707-
@client.server_info[:version].encoding.should eql(Encoding.default_internal)
708-
Encoding.default_internal = Encoding.find('us-ascii')
709-
@client.server_info[:version].encoding.should eql(Encoding.default_internal)
711+
with_internal_encoding 'utf-8' do
712+
@client.server_info[:version].encoding.should eql(Encoding.default_internal)
713+
end
714+
715+
with_internal_encoding 'us-ascii' do
716+
@client.server_info[:version].encoding.should eql(Encoding.default_internal)
717+
end
710718
end
711719
end
712720
end

spec/mysql2/error_spec.rb

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@
5454
end
5555

5656
it "returns error messages as UTF-8 by default" do
57-
Encoding.default_internal = nil
57+
with_internal_encoding nil do
58+
error.message.encoding.should eql(Encoding::UTF_8)
59+
error.message.valid_encoding?
5860

59-
error.message.encoding.should eql(Encoding::UTF_8)
60-
error.message.valid_encoding?
61+
bad_err.message.encoding.should eql(Encoding::UTF_8)
62+
bad_err.message.valid_encoding?
6163

62-
bad_err.message.encoding.should eql(Encoding::UTF_8)
63-
bad_err.message.valid_encoding?
64-
65-
bad_err.message.should include("??}\u001F")
64+
bad_err.message.should include("??}\u001F")
65+
end
6666
end
6767

6868
it "returns sql state as ASCII" do
@@ -71,16 +71,13 @@
7171
end
7272

7373
it "returns error messages and sql state in Encoding.default_internal if set" do
74-
interal_before = Encoding.default_internal
75-
Encoding.default_internal = 'UTF-16LE'
76-
77-
error.message.encoding.should eql(Encoding.default_internal)
78-
error.message.valid_encoding?
74+
with_internal_encoding 'UTF-16LE' do
75+
error.message.encoding.should eql(Encoding.default_internal)
76+
error.message.valid_encoding?
7977

80-
bad_err.message.encoding.should eql(Encoding.default_internal)
81-
bad_err.message.valid_encoding?
82-
83-
Encoding.default_internal = interal_before
78+
bad_err.message.encoding.should eql(Encoding.default_internal)
79+
bad_err.message.valid_encoding?
80+
end
8481
end
8582
end
8683
end

spec/mysql2/result_spec.rb

Lines changed: 80 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -338,23 +338,27 @@
338338
if defined? Encoding
339339
context "string encoding for ENUM values" do
340340
it "should default to the connection's encoding if Encoding.default_internal is nil" do
341-
Encoding.default_internal = nil
342-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
343-
result['enum_test'].encoding.should eql(Encoding.find('utf-8'))
344-
345-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
346-
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
347-
result['enum_test'].encoding.should eql(Encoding.find('us-ascii'))
348-
client2.close
341+
with_internal_encoding nil do
342+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
343+
result['enum_test'].encoding.should eql(Encoding.find('utf-8'))
344+
345+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
346+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
347+
result['enum_test'].encoding.should eql(Encoding.find('us-ascii'))
348+
client2.close
349+
end
349350
end
350351

351352
it "should use Encoding.default_internal" do
352-
Encoding.default_internal = Encoding.find('utf-8')
353-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
354-
result['enum_test'].encoding.should eql(Encoding.default_internal)
355-
Encoding.default_internal = Encoding.find('us-ascii')
356-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
357-
result['enum_test'].encoding.should eql(Encoding.default_internal)
353+
with_internal_encoding 'utf-8' do
354+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
355+
result['enum_test'].encoding.should eql(Encoding.default_internal)
356+
end
357+
358+
with_internal_encoding 'us-ascii' do
359+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
360+
result['enum_test'].encoding.should eql(Encoding.default_internal)
361+
end
358362
end
359363
end
360364
end
@@ -367,23 +371,27 @@
367371
if defined? Encoding
368372
context "string encoding for SET values" do
369373
it "should default to the connection's encoding if Encoding.default_internal is nil" do
370-
Encoding.default_internal = nil
371-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
372-
result['set_test'].encoding.should eql(Encoding.find('utf-8'))
373-
374-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
375-
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
376-
result['set_test'].encoding.should eql(Encoding.find('us-ascii'))
377-
client2.close
374+
with_internal_encoding nil do
375+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
376+
result['set_test'].encoding.should eql(Encoding.find('utf-8'))
377+
378+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
379+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
380+
result['set_test'].encoding.should eql(Encoding.find('us-ascii'))
381+
client2.close
382+
end
378383
end
379384

380385
it "should use Encoding.default_internal" do
381-
Encoding.default_internal = Encoding.find('utf-8')
382-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
383-
result['set_test'].encoding.should eql(Encoding.default_internal)
384-
Encoding.default_internal = Encoding.find('us-ascii')
385-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
386-
result['set_test'].encoding.should eql(Encoding.default_internal)
386+
with_internal_encoding 'utf-8' do
387+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
388+
result['set_test'].encoding.should eql(Encoding.default_internal)
389+
end
390+
391+
with_internal_encoding 'us-ascii' do
392+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
393+
result['set_test'].encoding.should eql(Encoding.default_internal)
394+
end
387395
end
388396
end
389397
end
@@ -396,18 +404,22 @@
396404
if defined? Encoding
397405
context "string encoding for BINARY values" do
398406
it "should default to binary if Encoding.default_internal is nil" do
399-
Encoding.default_internal = nil
400-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
401-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
407+
with_internal_encoding nil do
408+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
409+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
410+
end
402411
end
403412

404413
it "should not use Encoding.default_internal" do
405-
Encoding.default_internal = Encoding.find('utf-8')
406-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
407-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
408-
Encoding.default_internal = Encoding.find('us-ascii')
409-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
410-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
414+
with_internal_encoding 'utf-8' do
415+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
416+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
417+
end
418+
419+
with_internal_encoding 'us-ascii' do
420+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
421+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
422+
end
411423
end
412424
end
413425
end
@@ -434,38 +446,46 @@
434446
context "string encoding for #{type} values" do
435447
if ['VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB'].include?(type)
436448
it "should default to binary if Encoding.default_internal is nil" do
437-
Encoding.default_internal = nil
438-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
439-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
449+
with_internal_encoding nil do
450+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
451+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
452+
end
440453
end
441454

442455
it "should not use Encoding.default_internal" do
443-
Encoding.default_internal = Encoding.find('utf-8')
444-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
445-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
446-
Encoding.default_internal = Encoding.find('us-ascii')
447-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
448-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
456+
with_internal_encoding 'utf-8' do
457+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
458+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
459+
end
460+
461+
with_internal_encoding 'us-ascii' do
462+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
463+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
464+
end
449465
end
450466
else
451467
it "should default to utf-8 if Encoding.default_internal is nil" do
452-
Encoding.default_internal = nil
453-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
454-
result[field].encoding.should eql(Encoding.find('utf-8'))
455-
456-
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
457-
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
458-
result[field].encoding.should eql(Encoding.find('us-ascii'))
459-
client2.close
468+
with_internal_encoding nil do
469+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
470+
result[field].encoding.should eql(Encoding.find('utf-8'))
471+
472+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
473+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
474+
result[field].encoding.should eql(Encoding.find('us-ascii'))
475+
client2.close
476+
end
460477
end
461478

462479
it "should use Encoding.default_internal" do
463-
Encoding.default_internal = Encoding.find('utf-8')
464-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
465-
result[field].encoding.should eql(Encoding.default_internal)
466-
Encoding.default_internal = Encoding.find('us-ascii')
467-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
468-
result[field].encoding.should eql(Encoding.default_internal)
480+
with_internal_encoding 'utf-8' do
481+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
482+
result[field].encoding.should eql(Encoding.default_internal)
483+
end
484+
485+
with_internal_encoding 'us-ascii' do
486+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
487+
result[field].encoding.should eql(Encoding.default_internal)
488+
end
469489
end
470490
end
471491
end

spec/spec_helper.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@
77
DatabaseCredentials = YAML.load_file('spec/configuration.yml')
88

99
RSpec.configure do |config|
10+
def with_internal_encoding(encoding)
11+
old_enc = Encoding.default_internal
12+
Encoding.default_internal = encoding
13+
14+
yield
15+
ensure
16+
Encoding.default_internal = old_enc
17+
end
18+
1019
config.before :each do
1120
@client = Mysql2::Client.new DatabaseCredentials['root']
1221
end

0 commit comments

Comments
 (0)