parent
ed183c988d
commit
3f7dd2bcdd
@ -0,0 +1,149 @@ |
||||
defmodule Explorer.Chain.Address.CurrentTokenBalanceTest do |
||||
use Explorer.DataCase |
||||
|
||||
alias Explorer.{Chain, PagingOptions, Repo} |
||||
alias Explorer.Chain.Token |
||||
alias Explorer.Chain.Address.CurrentTokenBalance |
||||
|
||||
describe "token_holders_ordered_by_value/2" do |
||||
test "returns the last value for each address" do |
||||
%Token{contract_address_hash: contract_address_hash} = insert(:token) |
||||
address_a = insert(:address) |
||||
address_b = insert(:address) |
||||
|
||||
insert( |
||||
:address_current_token_balance, |
||||
address: address_a, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 5000 |
||||
) |
||||
|
||||
insert( |
||||
:address_current_token_balance, |
||||
address: address_b, |
||||
block_number: 1001, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 4000 |
||||
) |
||||
|
||||
token_holders_count = |
||||
contract_address_hash |
||||
|> CurrentTokenBalance.token_holders_ordered_by_value() |
||||
|> Repo.all() |
||||
|> Enum.count() |
||||
|
||||
assert token_holders_count == 2 |
||||
end |
||||
|
||||
test "sort by the highest value" do |
||||
%Token{contract_address_hash: contract_address_hash} = insert(:token) |
||||
address_a = insert(:address) |
||||
address_b = insert(:address) |
||||
address_c = insert(:address) |
||||
|
||||
insert( |
||||
:address_current_token_balance, |
||||
address: address_a, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 5000 |
||||
) |
||||
|
||||
insert( |
||||
:address_current_token_balance, |
||||
address: address_b, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 4000 |
||||
) |
||||
|
||||
insert( |
||||
:address_current_token_balance, |
||||
address: address_c, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 15000 |
||||
) |
||||
|
||||
token_holders_values = |
||||
contract_address_hash |
||||
|> CurrentTokenBalance.token_holders_ordered_by_value() |
||||
|> Repo.all() |
||||
|> Enum.map(&Decimal.to_integer(&1.value)) |
||||
|
||||
assert token_holders_values == [15_000, 5_000, 4_000] |
||||
end |
||||
|
||||
test "returns only token balances that have value greater than 0" do |
||||
%Token{contract_address_hash: contract_address_hash} = insert(:token) |
||||
|
||||
insert( |
||||
:address_current_token_balance, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 0 |
||||
) |
||||
|
||||
result = |
||||
contract_address_hash |
||||
|> CurrentTokenBalance.token_holders_ordered_by_value() |
||||
|> Repo.all() |
||||
|
||||
assert result == [] |
||||
end |
||||
|
||||
test "ignores the burn address" do |
||||
{:ok, burn_address_hash} = Chain.string_to_address_hash("0x0000000000000000000000000000000000000000") |
||||
|
||||
burn_address = insert(:address, hash: burn_address_hash) |
||||
|
||||
%Token{contract_address_hash: contract_address_hash} = insert(:token) |
||||
|
||||
insert( |
||||
:address_current_token_balance, |
||||
address: burn_address, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 1000 |
||||
) |
||||
|
||||
result = |
||||
contract_address_hash |
||||
|> CurrentTokenBalance.token_holders_ordered_by_value() |
||||
|> Repo.all() |
||||
|
||||
assert result == [] |
||||
end |
||||
|
||||
test "paginates the result by value and different address" do |
||||
address_a = build(:address, hash: "0xcb2cf1fd3199584ac5faa16c6aca49472dc6495a") |
||||
address_b = build(:address, hash: "0x5f26097334b6a32b7951df61fd0c5803ec5d8354") |
||||
|
||||
%Token{contract_address_hash: contract_address_hash} = insert(:token) |
||||
|
||||
first_page = |
||||
insert( |
||||
:address_current_token_balance, |
||||
address: address_a, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 4000 |
||||
) |
||||
|
||||
second_page = |
||||
insert( |
||||
:address_current_token_balance, |
||||
address: address_b, |
||||
token_contract_address_hash: contract_address_hash, |
||||
value: 4000 |
||||
) |
||||
|
||||
paging_options = %PagingOptions{ |
||||
key: {first_page.value, first_page.address_hash}, |
||||
page_size: 2 |
||||
} |
||||
|
||||
result_paginated = |
||||
contract_address_hash |
||||
|> CurrentTokenBalance.token_holders_ordered_by_value(paging_options: paging_options) |
||||
|> Repo.all() |
||||
|> Enum.map(& &1.address_hash) |
||||
|
||||
assert result_paginated == [second_page.address_hash] |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue