Skip to content

Commit 2fde1c7

Browse files
committed
Add real transaction to E2E setup and clean up query tests
1 parent 2492898 commit 2fde1c7

File tree

4 files changed

+46
-22
lines changed

4 files changed

+46
-22
lines changed

tests/e2e/conftest.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from .helpers.process_manager import (
1616
get_free_port,
1717
mine_blocks,
18+
send_eth,
1819
spawn_ampd,
1920
spawn_anvil,
2021
wait_for_ampd_ready,
@@ -57,6 +58,13 @@ def _setup_amp_stack(num_blocks: int = 10, end_block: str | None = 'latest'):
5758
}
5859

5960
anvil_proc, anvil_url = spawn_anvil(log_dir)
61+
# Send a transaction so transactions table has data
62+
send_eth(
63+
anvil_url,
64+
from_addr='0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
65+
to_addr='0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
66+
value_wei=10**18,
67+
)
6068
mine_blocks(anvil_url, num_blocks)
6169

6270
config_path = generate_ampd_config(

tests/e2e/helpers/process_manager.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,22 @@ def mine_blocks(anvil_url: str, count: int) -> None:
105105
resp.raise_for_status()
106106

107107

108+
def send_eth(anvil_url: str, from_addr: str, to_addr: str, value_wei: int) -> str:
109+
"""Send an ETH transfer on Anvil. Returns the transaction hash."""
110+
with httpx.Client() as client:
111+
resp = client.post(
112+
anvil_url,
113+
json={
114+
'jsonrpc': '2.0',
115+
'method': 'eth_sendTransaction',
116+
'params': [{'from': from_addr, 'to': to_addr, 'value': hex(value_wei)}],
117+
'id': 1,
118+
},
119+
)
120+
resp.raise_for_status()
121+
return resp.json()['result']
122+
123+
108124
def evm_snapshot(anvil_url: str) -> str:
109125
"""Take a snapshot of the current anvil state. Returns snapshot ID."""
110126
with httpx.Client() as client:

tests/e2e/test_queries.py

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55

66
pytestmark = pytest.mark.e2e
77

8+
# genesis + 1 tx block (auto-mined) + 10 mined blocks
9+
EXPECTED_BLOCKS = 12
10+
811

912
def test_query_blocks(e2e_client):
1013
table = e2e_client.sql('SELECT block_num, hash FROM anvil.blocks ORDER BY block_num').to_arrow()
1114

12-
assert len(table) == 11
15+
assert len(table) == EXPECTED_BLOCKS
1316
block_nums = table.column('block_num').to_pylist()
14-
assert block_nums == list(range(11))
17+
assert block_nums == list(range(EXPECTED_BLOCKS))
1518
assert all(h is not None for h in table.column('hash').to_pylist())
1619

1720

@@ -29,29 +32,19 @@ def test_blocks_schema(e2e_client):
2932

3033
def test_query_transactions(e2e_client):
3134
table = e2e_client.sql('SELECT * FROM anvil.transactions LIMIT 5').to_arrow()
35+
assert len(table) >= 1
3236
expected_cols = {'block_num', 'tx_hash', 'from', 'to', 'value', 'gas_used'}
3337
assert expected_cols.issubset(set(table.column_names))
3438

3539

36-
def test_query_logs(e2e_client):
37-
table = e2e_client.sql('SELECT * FROM anvil.logs LIMIT 5').to_arrow()
38-
expected_cols = {'block_num', 'log_index', 'address', 'data'}
39-
assert expected_cols.issubset(set(table.column_names))
40-
41-
4240
def test_query_with_where_clause(e2e_client):
4341
table = e2e_client.sql('SELECT block_num FROM anvil.blocks WHERE block_num > 5 ORDER BY block_num').to_arrow()
4442

45-
assert len(table) == 5
46-
assert table.column('block_num').to_pylist() == [6, 7, 8, 9, 10]
47-
48-
49-
def test_query_with_aggregation(e2e_client):
50-
table = e2e_client.sql('SELECT COUNT(*) AS cnt FROM anvil.blocks').to_arrow()
51-
assert table.column('cnt').to_pylist()[0] == 11
43+
assert len(table) == EXPECTED_BLOCKS - 6
44+
assert table.column('block_num').to_pylist() == list(range(6, EXPECTED_BLOCKS))
5245

5346

5447
def test_isolated_server(amp_test_server):
5548
"""Verify function-scoped stack works on its own ports."""
5649
table = amp_test_server.client.sql('SELECT COUNT(*) AS cnt FROM anvil.blocks').to_arrow()
57-
assert table.column('cnt').to_pylist()[0] == 11
50+
assert table.column('cnt').to_pylist()[0] == EXPECTED_BLOCKS

tests/e2e/test_streaming.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,22 @@ def test_reorg_detection(reorg_server):
7979
flight_port = reorg_server.ports['flight']
8080
client = reorg_server.client
8181

82-
# Snapshot at block 10
82+
# Find current chain tip
83+
tip = client.sql('SELECT MAX(block_num) AS tip FROM anvil.blocks').to_arrow()
84+
tip_block = tip.column('tip').to_pylist()[0]
85+
8386
snapshot_id = evm_snapshot(anvil_url)
8487

85-
# Mine blocks 11-15, wait for ingestion
88+
# Mine 5 blocks past the tip, wait for ingestion
8689
mine_blocks(anvil_url, 5)
87-
wait_for_block(flight_port, 15)
90+
first_new = tip_block + 1
91+
last_new = tip_block + 5
92+
wait_for_block(flight_port, last_new)
8893

8994
# Capture pre-reorg hashes
9095
pre_reorg = client.sql(
91-
'SELECT block_num, hash FROM anvil.blocks WHERE block_num >= 11 ORDER BY block_num'
96+
f'SELECT block_num, hash FROM anvil.blocks '
97+
f'WHERE block_num >= {first_new} ORDER BY block_num'
9298
).to_arrow()
9399
assert len(pre_reorg) == 5
94100
pre_hashes = pre_reorg.column('hash').to_pylist()
@@ -97,15 +103,16 @@ def test_reorg_detection(reorg_server):
97103
# writes new blocks whose prev_hash won't match the stored hash,
98104
# triggering fork detection and re-materialization.
99105
evm_revert(anvil_url, snapshot_id)
100-
mine_blocks(anvil_url, 10) # blocks 11-20, different hashes
106+
mine_blocks(anvil_url, 10)
101107

102108
# Wait for ampd to detect reorg and re-ingest
103109
timeout = 30
104110
post_hashes = None
105111
start = time.monotonic()
106112
while time.monotonic() - start < timeout:
107113
post_reorg = client.sql(
108-
'SELECT block_num, hash FROM anvil.blocks WHERE block_num >= 11 AND block_num <= 15 ORDER BY block_num'
114+
f'SELECT block_num, hash FROM anvil.blocks '
115+
f'WHERE block_num >= {first_new} AND block_num <= {last_new} ORDER BY block_num'
109116
).to_arrow()
110117
if len(post_reorg) == 5:
111118
post_hashes = post_reorg.column('hash').to_pylist()

0 commit comments

Comments
 (0)