Skip to content

Commit 7fef203

Browse files
Analyze tests (#53)
* Simplify db helper API for fetching entries * Update tests for analyze * Test analyze function
1 parent 3b48045 commit 7fef203

File tree

3 files changed

+123
-12
lines changed

3 files changed

+123
-12
lines changed

tests/test_analyze.py

Lines changed: 115 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
from tokenomics_decentralization.analyze import get_output_row
1+
from tokenomics_decentralization.analyze import get_output_row, analyze_snapshot, analyze
2+
import pathlib
23

34

45
def test_get_output_row(mocker):
5-
get_metrics_mock = mocker.patch("tokenomics_decentralization.helper.get_metrics")
6+
get_metrics_mock = mocker.patch('tokenomics_decentralization.helper.get_metrics')
67
get_metrics_mock.return_value = ['hhi', 'gini']
78

8-
get_no_clustering_mock = mocker.patch("tokenomics_decentralization.helper.get_no_clustering_flag")
9-
get_exclude_contracts_mock = mocker.patch("tokenomics_decentralization.helper.get_exclude_contracts_flag")
10-
get_exclude_below_fees_mock = mocker.patch("tokenomics_decentralization.helper.get_exclude_below_fees_flag")
11-
get_top_limit_type_mock = mocker.patch("tokenomics_decentralization.helper.get_top_limit_type")
12-
get_top_limit_value_mock = mocker.patch("tokenomics_decentralization.helper.get_top_limit_value")
9+
get_no_clustering_mock = mocker.patch('tokenomics_decentralization.helper.get_no_clustering_flag')
10+
get_exclude_contracts_mock = mocker.patch('tokenomics_decentralization.helper.get_exclude_contracts_flag')
11+
get_exclude_below_fees_mock = mocker.patch('tokenomics_decentralization.helper.get_exclude_below_fees_flag')
12+
get_top_limit_type_mock = mocker.patch('tokenomics_decentralization.helper.get_top_limit_type')
13+
get_top_limit_value_mock = mocker.patch('tokenomics_decentralization.helper.get_top_limit_value')
1314

1415
get_no_clustering_mock.return_value = False
1516
get_exclude_contracts_mock.return_value = False
@@ -35,3 +36,110 @@ def test_get_output_row(mocker):
3536
metrics = {'top-1_absolute exclude_contracts non-clustered hhi': 1, 'top-1_absolute exclude_contracts non-clustered gini': 0}
3637
csv_row = get_output_row('bitcoin', '2010-01-01', metrics)
3738
assert csv_row == ['bitcoin', '2010-01-01', True, True, 'absolute', 1, 1, 0]
39+
40+
41+
def test_analyze_snapshot(mocker):
42+
get_force_analyze_mock = mocker.patch('tokenomics_decentralization.helper.get_force_analyze_flag')
43+
get_no_clustering_mock = mocker.patch('tokenomics_decentralization.helper.get_no_clustering_flag')
44+
get_exclude_contracts_mock = mocker.patch('tokenomics_decentralization.helper.get_exclude_contracts_flag')
45+
get_exclude_below_fees_mock = mocker.patch('tokenomics_decentralization.helper.get_exclude_below_fees_flag')
46+
get_median_tx_fee_mock = mocker.patch('tokenomics_decentralization.helper.get_median_tx_fee')
47+
get_top_limit_type_mock = mocker.patch('tokenomics_decentralization.helper.get_top_limit_type')
48+
get_top_limit_value_mock = mocker.patch('tokenomics_decentralization.helper.get_top_limit_value')
49+
get_metrics_mock = mocker.patch('tokenomics_decentralization.helper.get_metrics')
50+
get_snapshot_info_mock = mocker.patch('tokenomics_decentralization.db_helper.get_snapshot_info')
51+
get_metric_value_mock = mocker.patch('tokenomics_decentralization.db_helper.get_metric_value')
52+
get_clustered_entries_mock = mocker.patch('tokenomics_decentralization.db_helper.get_balance_entries')
53+
get_nonclustered_entries_mock = mocker.patch('tokenomics_decentralization.db_helper.get_non_clustered_balance_entries')
54+
db_insert_mock = mocker.patch('tokenomics_decentralization.db_helper.insert_metric')
55+
db_commit_mock = mocker.patch('tokenomics_decentralization.db_helper.commit_database')
56+
57+
get_force_analyze_mock.return_value = False
58+
get_no_clustering_mock.return_value = False
59+
get_exclude_contracts_mock.return_value = False
60+
get_exclude_below_fees_mock.return_value = False
61+
get_median_tx_fee_mock.return_value = 0
62+
get_top_limit_type_mock.return_value = 'absolute'
63+
get_top_limit_value_mock.return_value = 0
64+
65+
get_snapshot_info_mock .return_value = [1, 1, '2010-01-01', 8]
66+
67+
get_metrics_mock.return_value = ['hhi']
68+
69+
get_metric_value_mock.return_value = [1]
70+
71+
output = analyze_snapshot(None, 'bitcoin', '2010-01-01')
72+
assert output == {'hhi': 1}
73+
74+
get_no_clustering_mock.return_value = True
75+
get_exclude_contracts_mock.return_value = True
76+
get_exclude_below_fees_mock.return_value = True
77+
get_top_limit_type_mock.return_value = 'absolute'
78+
get_top_limit_value_mock.return_value = 1
79+
80+
output = analyze_snapshot(None, 'bitcoin', '2010-01-01')
81+
assert output == {'top-1_absolute exclude_below_fees exclude_contracts non-clustered hhi': 1}
82+
83+
get_clustered_entries_mock.return_value = [['entity', 4], ['entity 2', 4]]
84+
get_nonclustered_entries_mock.return_value = [['address', 4], ['address 2', 4]]
85+
86+
get_force_analyze_mock.return_value = True
87+
88+
db_insert_mock.return_value = None
89+
db_commit_mock.return_value = None
90+
91+
output = analyze_snapshot(None, 'bitcoin', '2010-01-01')
92+
assert output == {'top-1_absolute exclude_below_fees exclude_contracts non-clustered hhi': 10000}
93+
94+
get_no_clustering_mock.return_value = False
95+
96+
output = analyze_snapshot(None, 'bitcoin', '2010-01-01')
97+
assert output == {'top-1_absolute exclude_below_fees exclude_contracts hhi': 10000}
98+
99+
get_top_limit_value_mock.return_value = 0
100+
101+
output = analyze_snapshot(None, 'bitcoin', '2010-01-01')
102+
assert output == {'exclude_below_fees exclude_contracts hhi': 5000}
103+
104+
get_top_limit_type_mock.return_value = 'percentage'
105+
get_top_limit_value_mock.return_value = 0.5
106+
107+
output = analyze_snapshot(None, 'bitcoin', '2010-01-01')
108+
assert output == {'top-0.5_percentage exclude_below_fees exclude_contracts hhi': 10000}
109+
110+
get_top_limit_value_mock.return_value = 0
111+
get_metrics_mock.return_value = ['tau=0.5']
112+
113+
output = analyze_snapshot(None, 'bitcoin', '2010-01-01')
114+
assert output == {'exclude_below_fees exclude_contracts tau=0.5': 1}
115+
116+
117+
def test_analyze(mocker):
118+
get_output_directories_mock = mocker.patch('tokenomics_decentralization.helper.get_output_directories')
119+
get_output_directories_mock.return_value = [pathlib.Path(__file__).resolve()]
120+
121+
is_file_mock = mocker.patch('os.path.isfile')
122+
is_file_mock.return_value = True
123+
124+
get_db_connector_mock = mocker.patch('tokenomics_decentralization.schema.get_connector')
125+
get_db_connector_mock.return_value = None
126+
127+
analyze_snapshot_mock = mocker.patch('tokenomics_decentralization.analyze.analyze_snapshot')
128+
analyze_snapshot_mock.return_value = {'hhi': 1}
129+
130+
write_csv_output_mock = mocker.patch('tokenomics_decentralization.analyze.write_csv_output')
131+
write_csv_output_mock.return_value = None
132+
133+
get_output_row_mock = mocker.patch('tokenomics_decentralization.analyze.get_output_row')
134+
get_output_row_mock.return_value = 'row'
135+
136+
output_rows = analyze(['bitcoin'], ['2010-01-01'])
137+
assert output_rows == ['row']
138+
analyze_snapshot_mock.assert_called_with(None, 'bitcoin', '2010-01-01')
139+
140+
output_rows = analyze(['bitcoin', 'ethereum'], ['2010-01-01', '2011-01-01'])
141+
assert output_rows == ['row', 'row', 'row', 'row']
142+
143+
is_file_mock.return_value = False
144+
output_rows = analyze(['bitcoin', 'ethereum'], ['2010-01-01', '2011-01-01'])
145+
assert output_rows == []

tokenomics_decentralization/analyze.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ def analyze_snapshot(conn, ledger, snapshot):
1818
exclude_below_fees_flag = hlp.get_exclude_below_fees_flag()
1919

2020
snapshot_info = db_hlp.get_snapshot_info(conn, ledger, snapshot)
21-
snapshot_id = snapshot_info[0]
2221
circulation = int(float(snapshot_info[3]))
2322

2423
snapshot_date = snapshot_info[1]
@@ -56,9 +55,9 @@ def analyze_snapshot(conn, ledger, snapshot):
5655
else:
5756
if not entries:
5857
if no_clustering:
59-
entries = db_hlp.get_non_clustered_balance_entries(conn, snapshot_id, ledger, balance_threshold=median_tx_fee)
58+
entries = db_hlp.get_non_clustered_balance_entries(conn, snapshot, ledger, balance_threshold=median_tx_fee)
6059
else:
61-
entries = db_hlp.get_balance_entries(conn, snapshot_id, ledger, balance_threshold=median_tx_fee)
60+
entries = db_hlp.get_balance_entries(conn, snapshot, ledger, balance_threshold=median_tx_fee)
6261

6362
if top_limit_value > 0:
6463
if top_limit_type == 'percentage':

tokenomics_decentralization/db_helper.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,11 @@ def insert_metric(conn, ledger, snapshot, metric_name, metric_value):
137137
raise e
138138

139139

140-
def get_non_clustered_balance_entries(conn, snapshot_id, ledger, balance_threshold):
140+
def get_non_clustered_balance_entries(conn, snapshot, ledger, balance_threshold):
141141
cursor = conn.cursor()
142142

143+
snapshot_id = get_snapshot_info(conn, ledger, snapshot)[0]
144+
143145
exclude_contract_addresses_clause = 'AND addresses.is_contract=0' if hlp.get_exclude_contracts_flag() else ''
144146
exclude_below_threshold_clause = f'AND balance >= {balance_threshold}' if balance_threshold >= 0 else ''
145147
special_addresses = hlp.get_special_addresses(ledger)
@@ -168,9 +170,11 @@ def get_non_clustered_balance_entries(conn, snapshot_id, ledger, balance_thresho
168170
return entries
169171

170172

171-
def get_balance_entries(conn, snapshot_id, ledger, balance_threshold):
173+
def get_balance_entries(conn, snapshot, ledger, balance_threshold):
172174
cursor = conn.cursor()
173175

176+
snapshot_id = get_snapshot_info(conn, ledger, snapshot)[0]
177+
174178
exclude_contract_addresses_clause = 'AND addresses.is_contract=0' if hlp.get_exclude_contracts_flag() else ''
175179
exclude_below_threshold_clause = f'AND balance >= {balance_threshold}' if balance_threshold >= 0 else ''
176180
special_addresses = hlp.get_special_addresses(ledger)

0 commit comments

Comments
 (0)