# frozen_string_literal: true RSpec.describe StrikeMe::API::Account do subject { described_class.new } describe 'profile' do subject { described_class.new.profile } it 'works with STRIKE_ACCOUNT_ID' do allow(ENV).to receive(:[]) expect(ENV).to receive(:[]).with('STRIKE_ACCOUNT_ID').and_return 'abc' stub_request(:get, %r{https://api.strike.me/v1/accounts/abc/profile}) .to_return(status: 200, body: '{"id":"abc44"}', headers: {'Content-Type' => 'application/json'}) expect(subject.id).to eq 'abc44' end it 'works with STRIKE_ACCOUNT_HANDLE without account id' do allow(ENV).to receive(:[]) allow(ENV).to receive(:fetch) expect(ENV).to receive(:fetch).with('STRIKE_ACCOUNT_HANDLE').and_return 'abcd' stub_request(:get, %r{https://api.strike.me/v1/accounts/handles/abcd/profile}) .to_return(status: 200, body: '{"id":"abc44"}', headers: {'Content-Type' => 'application/json'}) expect(subject.id).to eq 'abc44' end it 'throws exception when unauthorized' do allow(ENV).to receive(:[]) expect(ENV).to receive(:[]).with('STRIKE_ACCOUNT_ID').and_return 'abc' stub_request(:get, %r{https://api.strike.me/v1/accounts/abc/profile}) .to_return(status: 401, body: '{"data":{"status":401,"code":"UNAUTHORIZED","message":"Invalid or unspecified identity."}}', headers: {'Content-Type' => 'application/json'}) expect { subject.id }.to raise_error '[401, {}, ["Invalid or unspecified identity."]]' end end describe 'balances' do subject { described_class.new.balances } before { stub_request(:get, 'https://api.strike.me/v1/balances').to_return(status: 200, body: '[{"currency":"BTC","current":"0.00085408","pending":"0.000023","outgoing":"0.00000532","reserved":"0.00234","available":"0.00085408","total":"0.00085408"},{"currency":"USDT","current":"50.04","pending":"40.06","outgoing":"60.15","reserved":"0.00","available":"0.00","total":"0.00"}]', headers: {'Content-Type' => 'application/json'}) } it { is_expected.to be_an_instance_of StrikeMe::API::Account::Balances } it '#to_a properly returns the attributes' do expect(subject.to_a).to eq [ { 'currency' => 'BTC', 'current' => 0.00085408, 'pending' => 2.3e-05, 'outgoing' => 5.32e-06, 'reserved' => 0.00234, 'available' => 0.00085408, 'total' => 0.00085408 }, { 'currency' => 'USDT', 'current' => 50.04, 'pending' => 40.06, 'outgoing' => 60.15, 'reserved' => 0.0, 'available' => 0.0, 'total' => 0.0 } ] end it '#btc returns the BTC balance' do btc = subject.btc expect(btc).to be_present expect(btc).to be_a StrikeMe::API::Account::Balance expect(btc.attributes).to eq( 'available' => 0.00085408, 'currency' => 'BTC', 'current' => 0.00085408, 'outgoing' => 5.32e-06, 'pending' => 2.3e-05, 'reserved' => 0.00234, 'total' => 0.00085408 ) end it 'raises error when not authorized' do stub_request(:get, %r{https://api.strike.me/v1/balances}) .to_return(status: 401, body: '{"data":{"status":403,"code":"FORBIDDEN","message":"Insufficient permissions."}}', headers: {'Content-Type' => 'application/json'}) expect { subject }.to raise_error '[403, {}, ["Insufficient permissions."]]' end end end