1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
require 'spec_helper'
begin
require 'eventmachine'
require 'mysql2/em'
RSpec.describe Mysql2::EM::Client do
it "should support async queries" do
results = []
EM.run do
client1 = Mysql2::EM::Client.new DatabaseCredentials['root']
defer1 = client1.query "SELECT sleep(0.1) as first_query"
defer1.callback do |result|
results << result.first
client1.close
EM.stop_event_loop
end
client2 = Mysql2::EM::Client.new DatabaseCredentials['root']
defer2 = client2.query "SELECT sleep(0.025) second_query"
defer2.callback do |result|
results << result.first
client2.close
end
end
expect(results[0].keys).to include("second_query")
expect(results[1].keys).to include("first_query")
end
it "should support queries in callbacks" do
results = []
EM.run do
client = Mysql2::EM::Client.new DatabaseCredentials['root']
defer1 = client.query "SELECT sleep(0.025) as first_query"
defer1.callback do |result|
results << result.first
defer2 = client.query "SELECT sleep(0.025) as second_query"
defer2.callback do |r|
results << r.first
client.close
EM.stop_event_loop
end
end
end
expect(results[0].keys).to include("first_query")
expect(results[1].keys).to include("second_query")
end
it "should not swallow exceptions raised in callbacks" do
expect do
EM.run do
client = Mysql2::EM::Client.new DatabaseCredentials['root']
defer = client.query "SELECT sleep(0.1) as first_query"
defer.callback do
client.close
raise 'some error'
end
defer.errback do
# This _shouldn't_ be run, but it needed to prevent the specs from
# freezing if this test fails.
EM.stop_event_loop
end
end
end.to raise_error('some error')
end
context 'when an exception is raised by the client' do
let(:client) { Mysql2::EM::Client.new DatabaseCredentials['root'] }
let(:error) { StandardError.new('some error') }
before { allow(client).to receive(:async_result).and_raise(error) }
after { client.close }
it "should swallow exceptions raised in by the client" do
errors = []
EM.run do
defer = client.query "SELECT sleep(0.1) as first_query"
defer.callback do
# This _shouldn't_ be run, but it is needed to prevent the specs from
# freezing if this test fails.
EM.stop_event_loop
end
defer.errback do |err|
errors << err
EM.stop_event_loop
end
end
expect(errors).to eq([error])
end
it "should fail the deferrable" do
callbacks_run = []
EM.run do
defer = client.query "SELECT sleep(0.025) as first_query"
EM.add_timer(0.1) do
defer.callback do
callbacks_run << :callback
# This _shouldn't_ be run, but it is needed to prevent the specs from
# freezing if this test fails.
EM.stop_event_loop
end
defer.errback do
callbacks_run << :errback
EM.stop_event_loop
end
end
end
expect(callbacks_run).to eq([:errback])
end
end
it "should not raise error when closing client with no query running" do
callbacks_run = []
EM.run do
client = Mysql2::EM::Client.new DatabaseCredentials['root']
defer = client.query("select sleep(0.025)")
defer.callback do
callbacks_run << :callback
end
defer.errback do
callbacks_run << :errback
end
EM.add_timer(0.1) do
expect(callbacks_run).to eq([:callback])
expect do
client.close
end.not_to raise_error
EM.stop_event_loop
end
end
end
end
rescue LoadError
puts "EventMachine not installed, skipping the specs that use it"
end
|