Merge pull request #1271 from poanetwork/1262
Add ON CONFLICT to derive_transaction_forkspull/1273/head
commit
331b4ed26a
@ -0,0 +1,84 @@ |
|||||||
|
defmodule Explorer.Chain.Import.Runner.BlocksTest do |
||||||
|
use Explorer.DataCase |
||||||
|
|
||||||
|
import Ecto.Query, only: [from: 2, select: 2, where: 2] |
||||||
|
|
||||||
|
alias Ecto.Multi |
||||||
|
alias Explorer.Chain.Import.Runner.{Blocks, Transaction} |
||||||
|
alias Explorer.Chain.{Block, Transaction} |
||||||
|
alias Explorer.Repo |
||||||
|
|
||||||
|
describe "run/1" do |
||||||
|
setup do |
||||||
|
block = insert(:block, consensus: true) |
||||||
|
|
||||||
|
transaction = |
||||||
|
:transaction |
||||||
|
|> insert() |
||||||
|
|> with_block(block) |
||||||
|
|
||||||
|
%{consensus_block: block, transaction: transaction} |
||||||
|
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}, |
||||||
|
transaction: transaction |
||||||
|
} do |
||||||
|
block_params = |
||||||
|
params_for(:block, hash: block_hash, miner_hash: miner_hash, number: block_number, consensus: false) |
||||||
|
|
||||||
|
%Ecto.Changeset{valid?: true, changes: block_changes} = Block.changeset(%Block{}, block_params) |
||||||
|
changes_list = [block_changes] |
||||||
|
|
||||||
|
timestamp = DateTime.utc_now() |
||||||
|
options = %{timestamps: %{inserted_at: timestamp, updated_at: timestamp}} |
||||||
|
|
||||||
|
assert Repo.aggregate(from(transaction in Transaction, where: is_nil(transaction.block_number)), :count, :hash) == |
||||||
|
0 |
||||||
|
|
||||||
|
assert count(Transaction.Fork) == 0 |
||||||
|
|
||||||
|
# re-org consensus_block to uncle |
||||||
|
|
||||||
|
assert {:ok, %{derive_transaction_forks: [_]}} = |
||||||
|
Multi.new() |
||||||
|
|> Blocks.run(changes_list, options) |
||||||
|
|> Repo.transaction() |
||||||
|
|
||||||
|
assert Repo.aggregate(where(Block, consensus: false), :count, :number) == 1 |
||||||
|
|
||||||
|
assert Repo.aggregate(from(transaction in Transaction, where: is_nil(transaction.block_number)), :count, :hash) == |
||||||
|
1 |
||||||
|
|
||||||
|
assert count(Transaction.Fork) == 1 |
||||||
|
|
||||||
|
non_consensus_transaction = Repo.get(Transaction, transaction.hash) |
||||||
|
non_consensus_block = Repo.get(Block, block_hash) |
||||||
|
|
||||||
|
# Make it consensus again |
||||||
|
new_consensus_block = |
||||||
|
non_consensus_block |
||||||
|
|> Block.changeset(%{consensus: true}) |
||||||
|
|> Repo.update!() |
||||||
|
|
||||||
|
with_block(non_consensus_transaction, new_consensus_block) |
||||||
|
|
||||||
|
ctid = Repo.one!(from(transaction_fork in Transaction.Fork, select: "ctid")) |
||||||
|
|
||||||
|
assert Repo.aggregate(from(transaction in Transaction, where: is_nil(transaction.block_number)), :count, :hash) == |
||||||
|
0 |
||||||
|
|
||||||
|
assert {:ok, %{derive_transaction_forks: []}} = |
||||||
|
Multi.new() |
||||||
|
|> Blocks.run(changes_list, options) |
||||||
|
|> Repo.transaction() |
||||||
|
|
||||||
|
assert Repo.one!(from(transaction_fork in Transaction.Fork, select: "ctid")) == ctid, |
||||||
|
"Tuple was written even though it is not distinct" |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
defp count(schema) do |
||||||
|
Repo.one!(select(schema, fragment("COUNT(*)"))) |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue