Skip to content

Commit 0fedea1

Browse files
committed
Rewrite the error encoding specs
1 parent eb03953 commit 0fedea1

File tree

1 file changed

+55
-50
lines changed

1 file changed

+55
-50
lines changed

spec/mysql2/error_spec.rb

Lines changed: 55 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,78 @@
11
# encoding: UTF-8
22
require 'spec_helper'
33

4+
# The matrix of error encoding tests:
5+
# ('Enc = X' means 'Encoding.default_internal = X')
6+
# MySQL < 5.5 MySQL >= 5.5
7+
# Ruby 1.8 N/A N/A
8+
# Ruby 1.9+
9+
# Enc = nil
10+
# :enc = nil BINARY UTF-8
11+
#
12+
# Enc = XYZ
13+
# :enc = XYZ BINARY XYZ
14+
#
15+
# Enc = FOO
16+
# :enc = BAR BINARY FOO
17+
#
18+
19+
420
describe Mysql2::Error do
5-
before(:each) do
21+
shared_examples "mysql2 error" do
622
begin
7-
@err_client = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "utf8"))
8-
@err_client.query("HAHAHA")
23+
err_client = Mysql2::Client.new(DatabaseCredentials['root'])
24+
err_client.query("HAHAHA")
925
rescue Mysql2::Error => e
10-
@error = e
26+
error = e
1127
ensure
12-
@err_client.close
28+
err_client.close
1329
end
1430

31+
subject { error }
32+
it { should respond_to(:error_number) }
33+
it { should respond_to(:sql_state) }
34+
35+
# Mysql gem compatibility
36+
it { should respond_to(:errno) }
37+
it { should respond_to(:error) }
38+
end
39+
40+
shared_examples "mysql2 error encoding" do |db_enc, def_enc, err_enc|
41+
Encoding.default_internal = def_enc
42+
1543
begin
16-
@err_client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "big5"))
17-
@err_client2.query("HAHAHA")
44+
err_client = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => db_enc))
45+
err_client.query("造字")
1846
rescue Mysql2::Error => e
19-
@error2 = e
47+
error = e
2048
ensure
21-
@err_client2.close
49+
err_client.close
2250
end
23-
end
2451

25-
it "should respond to #error_number" do
26-
@error.should respond_to(:error_number)
27-
end
52+
subject { error.message.encoding }
53+
it { should eql(err_enc) }
2854

29-
it "should respond to #sql_state" do
30-
@error.should respond_to(:sql_state)
31-
end
55+
subject { error.error.encoding }
56+
it { should eql(err_enc) }
3257

33-
# Mysql gem compatibility
34-
it "should alias #error_number to #errno" do
35-
@error.should respond_to(:errno)
58+
subject { error.sql_state.encoding }
59+
it { should eql(err_enc) }
3660
end
3761

38-
it "should alias #message to #error" do
39-
@error.should respond_to(:error)
40-
end
62+
it_behaves_like "mysql2 error"
4163

4264
unless RUBY_VERSION =~ /1.8/
43-
it "#message encoding should match the connection's encoding, or Encoding.default_internal if set" do
44-
if Encoding.default_internal.nil?
45-
@error.message.encoding.should eql(@err_client.encoding)
46-
@error2.message.encoding.should eql(@err_client2.encoding)
47-
else
48-
@error.message.encoding.should eql(Encoding.default_internal)
49-
@error2.message.encoding.should eql(Encoding.default_internal)
50-
end
51-
end
52-
53-
it "#error encoding should match the connection's encoding, or Encoding.default_internal if set" do
54-
if Encoding.default_internal.nil?
55-
@error.error.encoding.should eql(@err_client.encoding)
56-
@error2.error.encoding.should eql(@err_client2.encoding)
57-
else
58-
@error.error.encoding.should eql(Encoding.default_internal)
59-
@error2.error.encoding.should eql(Encoding.default_internal)
60-
end
61-
end
62-
63-
it "#sql_state encoding should match the connection's encoding, or Encoding.default_internal if set" do
64-
if Encoding.default_internal.nil?
65-
@error.sql_state.encoding.should eql(@err_client.encoding)
66-
@error2.sql_state.encoding.should eql(@err_client2.encoding)
67-
else
68-
@error.sql_state.encoding.should eql(Encoding.default_internal)
69-
@error2.sql_state.encoding.should eql(Encoding.default_internal)
70-
end
65+
mysql_ver = Mysql2::Client.new(DatabaseCredentials['root']).server_info[:id]
66+
if mysql_ver < 50505
67+
it_behaves_like "mysql2 error encoding", nil, nil, Encoding::ASCII_8BIT
68+
it_behaves_like "mysql2 error encoding", 'utf8', Encoding::UTF_8, Encoding::ASCII_8BIT
69+
it_behaves_like "mysql2 error encoding", 'big5', Encoding::Big5, Encoding::ASCII_8BIT
70+
it_behaves_like "mysql2 error encoding", 'big5', Encoding::US_ASCII, Encoding::ASCII_8BIT
71+
else
72+
it_behaves_like "mysql2 error encoding", nil, nil, Encoding::UTF_8
73+
it_behaves_like "mysql2 error encoding", 'utf8', Encoding::UTF_8, Encoding::UTF_8
74+
it_behaves_like "mysql2 error encoding", 'big5', Encoding::Big5, Encoding::Big5
75+
it_behaves_like "mysql2 error encoding", 'big5', Encoding::US_ASCII, Encoding::US_ASCII
7176
end
7277
end
7378
end

0 commit comments

Comments
 (0)