spec/mysql2/error_spec.rb in mysql2-0.2.21 vs spec/mysql2/error_spec.rb in mysql2-0.2.22

- old
+ new

@@ -1,73 +1,83 @@ # encoding: UTF-8 + require 'spec_helper' describe Mysql2::Error do - before(:each) do - begin - @err_client = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "utf8")) - @err_client.query("HAHAHA") - rescue Mysql2::Error => e - @error = e - ensure - @err_client.close - end + let(:client) { Mysql2::Client.new(DatabaseCredentials['root']) } + let :error do begin - @err_client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "big5")) - @err_client2.query("HAHAHA") + client.query("HAHAHA") rescue Mysql2::Error => e - @error2 = e + error = e ensure - @err_client2.close + client.close end - end - it "should respond to #error_number" do - @error.should respond_to(:error_number) + error end - it "should respond to #sql_state" do - @error.should respond_to(:sql_state) - end + it "responds to error_number and sql_state, with aliases" do + error.should respond_to(:error_number) + error.should respond_to(:sql_state) - # Mysql gem compatibility - it "should alias #error_number to #errno" do - @error.should respond_to(:errno) + # Mysql gem compatibility + error.should respond_to(:errno) + error.should respond_to(:error) end - it "should alias #message to #error" do - @error.should respond_to(:error) - end + if "".respond_to? :encoding + let :error do + client = Mysql2::Client.new(DatabaseCredentials['root']) + begin + client.query("\xE9\x80\xA0\xE5\xAD\x97") + rescue Mysql2::Error => e + error = e + ensure + client.close + end - unless RUBY_VERSION =~ /1.8/ - it "#message encoding should match the connection's encoding, or Encoding.default_internal if set" do - if Encoding.default_internal.nil? - @error.message.encoding.should eql(@err_client.encoding) - @error2.message.encoding.should eql(@err_client2.encoding) - else - @error.message.encoding.should eql(Encoding.default_internal) - @error2.message.encoding.should eql(Encoding.default_internal) + error + end + + let :bad_err do + client = Mysql2::Client.new(DatabaseCredentials['root']) + begin + client.query("\xE5\xC6\x7D\x1F") + rescue Mysql2::Error => e + error = e + ensure + client.close end + + error end - it "#error encoding should match the connection's encoding, or Encoding.default_internal if set" do - if Encoding.default_internal.nil? - @error.error.encoding.should eql(@err_client.encoding) - @error2.error.encoding.should eql(@err_client2.encoding) - else - @error.error.encoding.should eql(Encoding.default_internal) - @error2.error.encoding.should eql(Encoding.default_internal) + it "returns error messages as UTF-8 by default" do + with_internal_encoding nil do + error.message.encoding.should eql(Encoding::UTF_8) + error.message.valid_encoding? + + bad_err.message.encoding.should eql(Encoding::UTF_8) + bad_err.message.valid_encoding? + + bad_err.message.should include("??}\u001F") end end - it "#sql_state encoding should match the connection's encoding, or Encoding.default_internal if set" do - if Encoding.default_internal.nil? - @error.sql_state.encoding.should eql(@err_client.encoding) - @error2.sql_state.encoding.should eql(@err_client2.encoding) - else - @error.sql_state.encoding.should eql(Encoding.default_internal) - @error2.sql_state.encoding.should eql(Encoding.default_internal) + it "returns sql state as ASCII" do + error.sql_state.encoding.should eql(Encoding::US_ASCII) + error.sql_state.valid_encoding? + end + + it "returns error messages and sql state in Encoding.default_internal if set" do + with_internal_encoding 'UTF-16LE' do + error.message.encoding.should eql(Encoding.default_internal) + error.message.valid_encoding? + + bad_err.message.encoding.should eql(Encoding.default_internal) + bad_err.message.valid_encoding? end end end end