104 lines
5.5 KiB
Ruby
104 lines
5.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
describe API::V2::Account::Stats, type: :request do
|
|
let(:member) { create(:member, :level_3) }
|
|
let(:token) { jwt_for(member) }
|
|
|
|
before do
|
|
Ability.stubs(:user_permissions).returns({'member'=>{'read'=>['StatsMemberPnl']}})
|
|
end
|
|
|
|
describe 'GET /api/v2/account/stats/pnl' do
|
|
let!(:eth) { Currency.find('eth') }
|
|
let!(:btc) { Currency.find('btc') }
|
|
let!(:pnl1) { create(:stats_member_pnl, pnl_currency_id: eth.id, currency_id: btc.id,
|
|
total_credit: 0.1, total_credit_fees: 0.01, total_debit_fees: 0.02, total_credit_value: 0.3, total_debit: 0.2,
|
|
total_debit_value: 10.0, average_balance_price: 0.42, member: member)}
|
|
|
|
let!(:pnl2) { create(:stats_member_pnl, pnl_currency_id: btc.id, currency_id: eth.id,
|
|
total_credit: 0.1, total_credit_fees: 0.01, total_debit_fees: 0.02, total_credit_value: 0.3, total_debit: 0.2,
|
|
total_debit_value: 10.0, average_balance_price: 0.21, member: member)}
|
|
|
|
it 'returns all user pnls for all pnl currencies' do
|
|
api_get '/api/v2/account/stats/pnl', token: token
|
|
|
|
expect(response).to be_successful
|
|
|
|
expect(response_body.count).to eq 2
|
|
expect(response_body[0]['currency']).to eq(pnl1.currency_id)
|
|
expect(response_body[0]['pnl_currency']).to eq(pnl1.pnl_currency_id)
|
|
expect(response_body[0]['total_credit'].to_f).to eq(pnl1.total_credit)
|
|
expect(response_body[0]['total_credit_value'].to_f).to eq(pnl1.total_credit_value)
|
|
expect(response_body[0]['total_debit'].to_f).to eq(pnl1.total_debit)
|
|
expect(response_body[0]['total_debit_value'].to_f).to eq(pnl1.total_debit_value)
|
|
expect(response_body[0]['average_buy_price'].to_f.round(9)).to eq( (pnl1.total_credit_value / (pnl1.total_credit)).to_f)
|
|
expect(response_body[0]['average_sell_price'].to_f.round(9)).to eq(pnl1.total_debit_value / (pnl1.total_debit))
|
|
expect(response_body[0]['average_balance_price'].to_f).to eq(0.42)
|
|
|
|
expect(response_body[1]['currency']).to eq(pnl2.currency_id)
|
|
expect(response_body[1]['pnl_currency']).to eq(pnl2.pnl_currency_id)
|
|
expect(response_body[1]['total_credit'].to_f).to eq(pnl2.total_credit)
|
|
expect(response_body[1]['total_credit_value'].to_f).to eq(pnl2.total_credit_value)
|
|
expect(response_body[1]['total_debit'].to_f).to eq(pnl2.total_debit)
|
|
expect(response_body[1]['total_debit_value'].to_f).to eq(pnl2.total_debit_value)
|
|
expect(response_body[1]['average_buy_price'].to_f.round(9)).to eq( (pnl2.total_credit_value / (pnl2.total_credit)).to_f)
|
|
expect(response_body[1]['average_sell_price'].to_f.round(9)).to eq(pnl2.total_debit_value / (pnl2.total_debit))
|
|
expect(response_body[1]['average_balance_price'].to_f).to eq(0.21)
|
|
end
|
|
|
|
it 'returns user pnls for pnl currency eth' do
|
|
api_get '/api/v2/account/stats/pnl?pnl_currency=eth', token: token
|
|
|
|
expect(response).to be_successful
|
|
|
|
expect(response_body.count).to eq 1
|
|
expect(response_body[0]['currency']).to eq(pnl1.currency_id)
|
|
expect(response_body[0]['pnl_currency']).to eq(pnl1.pnl_currency_id)
|
|
expect(response_body[0]['total_credit'].to_f).to eq(pnl1.total_credit)
|
|
expect(response_body[0]['total_credit_value'].to_f).to eq(pnl1.total_credit_value)
|
|
expect(response_body[0]['total_debit'].to_f).to eq(pnl1.total_debit)
|
|
expect(response_body[0]['total_debit_value'].to_f).to eq(pnl1.total_debit_value)
|
|
expect(response_body[0]['average_buy_price'].to_f.round(9)).to eq( (pnl1.total_credit_value / (pnl1.total_credit)).to_f)
|
|
expect(response_body[0]['average_sell_price'].to_f.round(9)).to eq(pnl1.total_debit_value / (pnl1.total_debit))
|
|
expect(response_body[0]['average_balance_price'].to_f).to eq(0.42)
|
|
end
|
|
|
|
context 'avarage sell price equal to 0' do
|
|
let!(:usd) { Currency.find('usd') }
|
|
let!(:pnl) { create(:stats_member_pnl, pnl_currency_id: usd.id, currency_id: btc.id,
|
|
total_credit: 0.1, total_credit_fees: 0.01, total_debit_fees: 0.0, total_credit_value: 0.3, total_debit: 0.0,
|
|
total_debit_value: 0.0, average_balance_price: 0.12, member: member)}
|
|
|
|
it 'return user pnl with zero avarage sell price' do
|
|
api_get '/api/v2/account/stats/pnl?pnl_currency=usd', token: token
|
|
|
|
expect(response).to be_successful
|
|
|
|
expect(response_body.count).to eq 1
|
|
expect(response_body[0]['currency']).to eq(pnl.currency_id)
|
|
expect(response_body[0]['pnl_currency']).to eq(pnl.pnl_currency_id)
|
|
expect(response_body[0]['total_credit'].to_f).to eq(pnl.total_credit)
|
|
expect(response_body[0]['total_credit_value'].to_f).to eq(pnl.total_credit_value)
|
|
expect(response_body[0]['total_debit'].to_f).to eq(pnl.total_debit)
|
|
expect(response_body[0]['total_debit_value'].to_f).to eq(pnl.total_debit_value)
|
|
expect(response_body[0]['average_buy_price'].to_f.round(9)).to eq( (pnl.total_credit_value / (pnl.total_credit)).to_f)
|
|
expect(response_body[0]['average_sell_price'].to_f.round(9)).to eq 0
|
|
expect(response_body[0]['average_balance_price'].to_f).to eq(0.12)
|
|
end
|
|
end
|
|
|
|
context 'unauthorized' do
|
|
before do
|
|
Ability.stubs(:user_permissions).returns([])
|
|
end
|
|
|
|
it 'renders unauthorized error' do
|
|
api_get '/api/v2/account/stats/pnl?pnl_currency=usd', token: token
|
|
|
|
expect(response).to have_http_status 403
|
|
expect(response).to include_api_error('user.ability.not_permitted')
|
|
end
|
|
end
|
|
end
|
|
end
|