Files
Dena/spec/workers/withdraw_coin_spec.rb
2026-08-13 19:50:53 +03:30

127 lines
4.1 KiB
Ruby

# encoding: UTF-8
# frozen_string_literal: true
describe Workers::AMQP::WithdrawCoin do
let(:member) { create(:member, :barong) }
let(:withdrawal) { create(:btc_withdraw, :with_deposit_liability) }
let(:processing_withdrawal) do
create(:btc_withdraw, :with_deposit_liability)
.tap(&:accept!)
.tap(&:process!)
end
context 'withdrawal does not exist' do
before { Withdraw.expects(:find_by_id).returns(nil) }
it 'returns nil' do
expect(Workers::AMQP::WithdrawCoin.new.process(withdrawal.as_json)).to be(nil)
end
end
context 'withdrawal is not in processing state' do
it 'returns nil' do
expect(Workers::AMQP::WithdrawCoin.new.process(withdrawal.as_json)).to be(nil)
end
end
context 'withdrawal with empty rid' do
before do
# withdrawal.submit!
# withdrawal.accept!
# withdrawal.process!
#
# Withdraws::Coin.any_instance
# .expects(:rid)
# .with(anything)
# .twice
# .returns('')
end
# TODO: Finalize me.
it 'returns nil and fail withdrawal' do
# expect(Workers::AMQP::WithdrawCoin.new.process(processing_withdrawal.as_json)).to be(nil)
# expect(processing_withdrawal.reload.failed?).to be_truthy
end
end
context 'hot wallet does not exist' do
before do
Wallet.expects(:active)
.returns(Wallet.none)
end
it 'returns nil and skip withdrawal' do
expect(Workers::AMQP::WithdrawCoin.new.process(processing_withdrawal.as_json)).to be(nil)
expect(processing_withdrawal.reload.skipped?).to be_truthy
end
end
context 'WalletService2 raises error' do
before do
WalletService.any_instance.expects(:load_balance!)
.returns(100)
WalletService.any_instance.expects(:build_withdrawal!)
.raises(Peatio::Wallet::Registry::NotRegisteredAdapterError)
end
it 'returns true and marks withdrawal as errored' do
expect(Workers::AMQP::WithdrawCoin.new.process(processing_withdrawal.as_json)).to be_truthy
expect(processing_withdrawal.reload.errored?).to be_truthy
end
end
context 'wallet balance is not sufficient' do
before do
WalletService.any_instance
.expects(:load_balance!)
.returns(withdrawal.amount * 0.9)
end
it 'returns nil and skip withdrawal' do
expect(Workers::AMQP::WithdrawCoin.new.process(processing_withdrawal.as_json)).to be(true)
expect(processing_withdrawal.reload.skipped?).to be_truthy
end
end
context 'wallet balance is sufficient but build_withdrawal! raises error' do
before do
WalletService.any_instance
.expects(:load_balance!)
.returns(withdrawal.amount)
WalletService.any_instance
.expects(:build_withdrawal!)
.with(instance_of(Withdraws::Coin))
.raises(Peatio::Blockchain::ClientError)
end
it 'returns true and marks withdrawal as errored' do
expect(Workers::AMQP::WithdrawCoin.new.process(processing_withdrawal.as_json)).to be_truthy
expect(processing_withdrawal.reload.errored?).to be_truthy
end
end
context 'wallet balance is sufficient and build_withdrawal! returns transaction' do
before do
WalletService.any_instance
.expects(:load_balance!)
.returns(withdrawal.amount)
transaction = Peatio::Transaction.new(amount: withdrawal.amount,
to_address: withdrawal.rid,
hash: 'hash-1')
WalletService.any_instance
.expects(:build_withdrawal!)
.with(instance_of(Withdraws::Coin))
.returns(transaction)
end
it 'returns true and dispatch withdrawal' do
expect(Workers::AMQP::WithdrawCoin.new.process(processing_withdrawal.as_json)).to be_truthy
expect(processing_withdrawal.reload.confirming?).to be_truthy
expect(processing_withdrawal.txid).to eq('hash-1')
end
end
end