@ -7,13 +7,14 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
alias Ecto.Multi
alias Explorer.Chain.Import.Runner . { Blocks , Transactions }
alias Explorer.Chain . { Address , Block , Transaction }
alias Explorer.Chain . { Address , Block , Log , Transaction , TokenTransfer }
alias Explorer.Chain
alias Explorer.Repo
describe " run/1 " do
setup do
block = insert ( :block , consensus : true )
miner = insert ( :address )
block = params_for ( :block , consensus : true , miner_hash : miner . hash )
timestamp = DateTime . utc_now ( )
options = %{ timestamps : %{ inserted_at : timestamp , updated_at : timestamp } }
@ -22,9 +23,11 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
end
test " derive_transaction_forks replaces hash on conflicting (uncle_hash, index) " , %{
consensus_block : % Block { hash : block_hash , miner_hash : miner_hash , number : block_number } = consensus_block ,
consensus_block : %{ hash : block_hash , miner_hash : miner_hash , number : block_number } ,
options : options
} do
consensus_block = insert ( :block , %{ hash : block_hash , number : block_number } )
transaction =
:transaction
|> insert ( )
@ -81,7 +84,7 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
end
test " delete_address_current_token_balances deletes rows with matching block number when consensus is true " ,
%{ consensus_block : % Block { number : block_number } = block , options : options } do
%{ consensus_block : %{ number : block_number } = block , options : options } do
% Address.CurrentTokenBalance { address_hash : address_hash , token_contract_address_hash : token_contract_address_hash } =
insert ( :address_current_token_balance , block_number : block_number )
@ -98,7 +101,7 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
end
test " delete_address_current_token_balances does not delete rows with matching block number when consensus is false " ,
%{ consensus_block : % Block { number : block_number } = block , options : options } do
%{ consensus_block : %{ number : block_number } = block , options : options } do
% Address.CurrentTokenBalance { } = insert ( :address_current_token_balance , block_number : block_number )
count = 1
@ -113,8 +116,69 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
assert count ( Address.CurrentTokenBalance ) == count
end
test " remove_nonconsensus_data deletes token transfer rows with matching block number when new consensus block is inserted " ,
%{ consensus_block : %{ number : block_number } = block , options : options } do
insert ( :block , number : block_number , consensus : true )
% TokenTransfer { transaction_hash : transaction_hash , log_index : log_index } =
insert ( :token_transfer , block_number : block_number , transaction : insert ( :transaction ) )
assert count ( TokenTransfer ) == 1
assert { :ok ,
%{
remove_nonconsensus_data : %{
token_transfers : [
%{ transaction_hash : ^ transaction_hash , log_index : ^ log_index }
]
}
} } = run_block_consensus_change ( block , true , options )
assert count ( TokenTransfer ) == 0
end
test " remove_nonconsensus_data does not delete token transfer rows with matching block number when new consensus block wasn't inserted " ,
%{ consensus_block : %{ number : block_number } = block , options : options } do
insert ( :token_transfer , block_number : block_number , transaction : insert ( :transaction ) )
count = 1
assert count ( TokenTransfer ) == count
assert { :ok ,
%{
remove_nonconsensus_data : %{
token_transfers : [ ]
}
} } = run_block_consensus_change ( block , false , options )
assert count ( TokenTransfer ) == count
end
test " remove_nonconsensus_data deletes nonconsensus logs " , %{
consensus_block : %{ number : block_number } = block ,
options : options
} do
old_block = insert ( :block , number : block_number , consensus : true )
forked_transaction = :transaction |> insert ( ) |> with_block ( old_block )
% Log { transaction_hash : hash , index : index } = insert ( :log , transaction : forked_transaction )
assert count ( Log ) == 1
assert { :ok ,
%{
remove_nonconsensus_data : %{
logs : [
%{ transaction_hash : ^ hash , index : ^ index }
]
}
} } = run_block_consensus_change ( block , true , options )
assert count ( Log ) == 0
end
test " derive_address_current_token_balances inserts rows if there is an address_token_balance left for the rows deleted by delete_address_current_token_balances " ,
%{ consensus_block : % Block { number : block_number } = block , options : options } do
%{ consensus_block : %{ number : block_number } = block , options : options } do
token = insert ( :token )
token_contract_address_hash = token . contract_address_hash
@ -172,7 +236,7 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
end
test " a non-holder reverting to a holder increases the holder_count " ,
%{ consensus_block : % Block { hash : block_hash , miner_hash : miner_hash , number : block_number } , options : options } do
%{ consensus_block : %{ hash : block_hash , miner_hash : miner_hash , number : block_number } , options : options } do
token = insert ( :token )
token_contract_address_hash = token . contract_address_hash
@ -204,7 +268,7 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
end
test " a holder reverting to a non-holder decreases the holder_count " ,
%{ consensus_block : % Block { hash : block_hash , miner_hash : miner_hash , number : block_number } , options : options } do
%{ consensus_block : %{ hash : block_hash , miner_hash : miner_hash , number : block_number } , options : options } do
token = insert ( :token )
token_contract_address_hash = token . contract_address_hash
@ -236,7 +300,7 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
end
test " a non-holder becoming and a holder becoming while a holder becomes a non-holder cancels out and holder_count does not change " ,
%{ consensus_block : % Block { number : block_number } = block , options : options } do
%{ consensus_block : %{ number : block_number } = block , options : options } do
token = insert ( :token )
token_contract_address_hash = token . contract_address_hash
@ -262,7 +326,8 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
# Regression test for https://github.com/poanetwork/blockscout/issues/1644
test " discards neighbouring blocks if they aren't related to the current one because of reorg and/or import timeout " ,
%{ consensus_block : % Block { number : block_number , hash : block_hash , miner_hash : miner_hash } , options : options } do
%{ consensus_block : %{ number : block_number , hash : block_hash , miner_hash : miner_hash } , options : options } do
insert ( :block , %{ number : block_number , hash : block_hash } )
old_block1 = params_for ( :block , miner_hash : miner_hash , parent_hash : block_hash , number : block_number + 1 )
new_block1 = params_for ( :block , miner_hash : miner_hash , parent_hash : block_hash , number : block_number + 1 )
@ -286,7 +351,8 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
# Regression test for https://github.com/poanetwork/blockscout/issues/1911
test " forces block refetch if transaction is re-collated in a different block " ,
%{ consensus_block : % Block { number : block_number , hash : block_hash , miner_hash : miner_hash } , options : options } do
%{ consensus_block : %{ number : block_number , hash : block_hash , miner_hash : miner_hash } , options : options } do
insert ( :block , %{ number : block_number , hash : block_hash } )
new_block1 = params_for ( :block , miner_hash : miner_hash , parent_hash : block_hash , number : block_number + 1 )
new_block2 = params_for ( :block , miner_hash : miner_hash , parent_hash : new_block1 . hash , number : block_number + 2 )
@ -365,7 +431,7 @@ defmodule Explorer.Chain.Import.Runner.BlocksTest do
end
defp run_block_consensus_change (
% Block { hash : block_hash , miner_hash : miner_hash , number : block_number } ,
%{ hash : block_hash , miner_hash : miner_hash , number : block_number } ,
consensus ,
options
) do