1- from tokenomics_decentralization .analyze import get_output_row , analyze_snapshot , analyze
1+ from tokenomics_decentralization .analyze import get_output_row , analyze_snapshot , analyze , write_csv_output
22import pathlib
3+ import os
34
45
56def test_get_output_row (mocker ):
@@ -20,22 +21,28 @@ def test_get_output_row(mocker):
2021
2122 metrics = {'hhi' : 1 , 'gini' : 0 }
2223 csv_row = get_output_row ('bitcoin' , '2010-01-01' , metrics )
23- assert csv_row == ['bitcoin' , '2010-01-01' , False , False , 'absolute' , 0 , 1 , 0 ]
24+ assert csv_row == ['bitcoin' , '2010-01-01' , False , False , 'absolute' , 0 , False , 1 , 0 ]
2425
2526 get_no_clustering_mock .return_value = True
2627 metrics = {'non-clustered hhi' : 1 , 'non-clustered gini' : 0 }
2728 csv_row = get_output_row ('bitcoin' , '2010-01-01' , metrics )
28- assert csv_row == ['bitcoin' , '2010-01-01' , True , False , 'absolute' , 0 , 1 , 0 ]
29+ assert csv_row == ['bitcoin' , '2010-01-01' , True , False , 'absolute' , 0 , False , 1 , 0 ]
2930
3031 get_exclude_contracts_mock .return_value = True
3132 metrics = {'exclude_contracts non-clustered hhi' : 1 , 'exclude_contracts non-clustered gini' : 0 }
3233 csv_row = get_output_row ('bitcoin' , '2010-01-01' , metrics )
33- assert csv_row == ['bitcoin' , '2010-01-01' , True , True , 'absolute' , 0 , 1 , 0 ]
34+ assert csv_row == ['bitcoin' , '2010-01-01' , True , True , 'absolute' , 0 , False , 1 , 0 ]
3435
3536 get_top_limit_value_mock .return_value = 1
3637 metrics = {'top-1_absolute exclude_contracts non-clustered hhi' : 1 , 'top-1_absolute exclude_contracts non-clustered gini' : 0 }
3738 csv_row = get_output_row ('bitcoin' , '2010-01-01' , metrics )
38- assert csv_row == ['bitcoin' , '2010-01-01' , True , True , 'absolute' , 1 , 1 , 0 ]
39+ assert csv_row == ['bitcoin' , '2010-01-01' , True , True , 'absolute' , 1 , False , 1 , 0 ]
40+
41+ get_exclude_below_fees_mock .return_value = True
42+ get_top_limit_value_mock .return_value = 1
43+ metrics = {'top-1_absolute exclude_below_fees exclude_contracts non-clustered hhi' : 1 , 'top-1_absolute exclude_below_fees exclude_contracts non-clustered gini' : 0 }
44+ csv_row = get_output_row ('bitcoin' , '2010-01-01' , metrics )
45+ assert csv_row == ['bitcoin' , '2010-01-01' , True , True , 'absolute' , 1 , True , 1 , 0 ]
3946
4047
4148def test_analyze_snapshot (mocker ):
@@ -54,6 +61,9 @@ def test_analyze_snapshot(mocker):
5461 db_insert_mock = mocker .patch ('tokenomics_decentralization.db_helper.insert_metric' )
5562 db_commit_mock = mocker .patch ('tokenomics_decentralization.db_helper.commit_database' )
5663
64+ compute_hhi_mock = mocker .patch ('tokenomics_decentralization.analyze.compute_hhi' )
65+ compute_tau_mock = mocker .patch ('tokenomics_decentralization.analyze.compute_tau' )
66+
5767 get_force_analyze_mock .return_value = False
5868 get_no_clustering_mock .return_value = False
5969 get_exclude_contracts_mock .return_value = False
@@ -88,41 +98,94 @@ def test_analyze_snapshot(mocker):
8898 db_insert_mock .return_value = None
8999 db_commit_mock .return_value = None
90100
101+ compute_hhi_mock .return_value = 2
91102 output = analyze_snapshot (None , 'bitcoin' , '2010-01-01' )
92- assert output == {'top-1_absolute exclude_below_fees exclude_contracts non-clustered hhi' : 10000 }
103+ assert output == {'top-1_absolute exclude_below_fees exclude_contracts non-clustered hhi' : 2 }
93104
94105 get_no_clustering_mock .return_value = False
95106
107+ compute_hhi_mock .return_value = 3
96108 output = analyze_snapshot (None , 'bitcoin' , '2010-01-01' )
97- assert output == {'top-1_absolute exclude_below_fees exclude_contracts hhi' : 10000 }
109+ assert output == {'top-1_absolute exclude_below_fees exclude_contracts hhi' : 3 }
98110
99111 get_top_limit_value_mock .return_value = 0
100112
113+ compute_hhi_mock .return_value = 4
101114 output = analyze_snapshot (None , 'bitcoin' , '2010-01-01' )
102- assert output == {'exclude_below_fees exclude_contracts hhi' : 5000 }
115+ assert output == {'exclude_below_fees exclude_contracts hhi' : 4 }
103116
104117 get_top_limit_type_mock .return_value = 'percentage'
105118 get_top_limit_value_mock .return_value = 0.5
106119
120+ compute_hhi_mock .return_value = 5
107121 output = analyze_snapshot (None , 'bitcoin' , '2010-01-01' )
108- assert output == {'top-0.5_percentage exclude_below_fees exclude_contracts hhi' : 10000 }
122+ assert output == {'top-0.5_percentage exclude_below_fees exclude_contracts hhi' : 5 }
109123
110124 get_top_limit_value_mock .return_value = 0
111125 get_metrics_mock .return_value = ['tau=0.5' ]
112126
127+ compute_tau_mock .return_value = [100 , None ]
113128 output = analyze_snapshot (None , 'bitcoin' , '2010-01-01' )
114- assert output == {'exclude_below_fees exclude_contracts tau=0.5' : 1 }
129+ assert output == {'exclude_below_fees exclude_contracts tau=0.5' : 100 }
130+
131+
132+ def test_write_csv_output (mocker ):
133+ get_metrics_mock = mocker .patch ('tokenomics_decentralization.helper.get_metrics' )
134+ get_metrics_mock .return_value = ['hhi' ]
135+
136+ get_output_directories_mock = mocker .patch ('tokenomics_decentralization.helper.get_output_directories' )
137+ get_output_directories_mock .return_value = [pathlib .Path (__file__ ).resolve ().parent ]
138+
139+ get_no_clustering_mock = mocker .patch ('tokenomics_decentralization.helper.get_no_clustering_flag' )
140+ get_exclude_contracts_mock = mocker .patch ('tokenomics_decentralization.helper.get_exclude_contracts_flag' )
141+ get_exclude_below_fees_mock = mocker .patch ('tokenomics_decentralization.helper.get_exclude_below_fees_flag' )
142+ get_top_limit_type_mock = mocker .patch ('tokenomics_decentralization.helper.get_top_limit_type' )
143+ get_top_limit_value_mock = mocker .patch ('tokenomics_decentralization.helper.get_top_limit_value' )
144+
145+ get_no_clustering_mock .return_value = False
146+ get_exclude_contracts_mock .return_value = False
147+ get_exclude_below_fees_mock .return_value = False
148+ get_top_limit_type_mock .return_value = 'absolute'
149+ get_top_limit_value_mock .return_value = 0
150+
151+ write_csv_output ([
152+ ['bitcoin' , '2010-01-01' , False , False , 'absolute' , 0 , False , 100 ],
153+ ['ethereum' , '2010-01-01' , False , False , 'absolute' , 0 , False , 200 ],
154+ ])
155+ with open (pathlib .Path (__file__ ).resolve ().parent / 'output.csv' ) as f :
156+ lines = f .readlines ()
157+ assert lines [0 ] == ',' .join (['ledger' , 'snapshot date' , 'no_clustering' , 'exclude_contract_addresses' , 'top_limit_type' , 'top_limit_value' , 'exclude_below_fees' , 'hhi' ]) + '\n '
158+ assert lines [1 ] == ',' .join (['bitcoin' , '2010-01-01' , 'False' , 'False' , 'absolute' , '0' , 'False' , '100' ]) + '\n '
159+ assert lines [2 ] == ',' .join (['ethereum' , '2010-01-01' , 'False' , 'False' , 'absolute' , '0' , 'False' , '200' ]) + '\n '
160+ os .remove (pathlib .Path (__file__ ).resolve ().parent / 'output.csv' )
161+
162+ get_no_clustering_mock .return_value = True
163+ get_exclude_contracts_mock .return_value = True
164+ get_exclude_below_fees_mock .return_value = True
165+ get_top_limit_type_mock .return_value = 'absolute'
166+ get_top_limit_value_mock .return_value = 10
167+
168+ write_csv_output ([
169+ ['bitcoin' , '2010-01-01' , False , False , 'absolute' , 0 , False , 100 ],
170+ ['ethereum' , '2010-01-01' , False , False , 'absolute' , 0 , False , 200 ],
171+ ])
172+ with open (pathlib .Path (__file__ ).resolve ().parent / 'output-no_clustering-exclude_contract_addresses-absolute_10-exclude_below_fees.csv' ) as f :
173+ lines = f .readlines ()
174+ assert lines [0 ] == ',' .join (['ledger' , 'snapshot date' , 'no_clustering' , 'exclude_contract_addresses' , 'top_limit_type' , 'top_limit_value' , 'exclude_below_fees' , 'hhi' ]) + '\n '
175+ assert lines [1 ] == ',' .join (['bitcoin' , '2010-01-01' , 'False' , 'False' , 'absolute' , '0' , 'False' , '100' ]) + '\n '
176+ assert lines [2 ] == ',' .join (['ethereum' , '2010-01-01' , 'False' , 'False' , 'absolute' , '0' , 'False' , '200' ]) + '\n '
177+ os .remove (pathlib .Path (__file__ ).resolve ().parent / 'output-no_clustering-exclude_contract_addresses-absolute_10-exclude_below_fees.csv' )
115178
116179
117180def test_analyze (mocker ):
118181 get_output_directories_mock = mocker .patch ('tokenomics_decentralization.helper.get_output_directories' )
119- get_output_directories_mock .return_value = [pathlib .Path (__file__ ).resolve ()]
182+ get_output_directories_mock .return_value = [pathlib .Path (__file__ ).resolve (). parent ]
120183
121184 is_file_mock = mocker .patch ('os.path.isfile' )
122185 is_file_mock .return_value = True
123186
124- get_db_connector_mock = mocker .patch ('tokenomics_decentralization.schema .get_connector' )
125- get_db_connector_mock .return_value = None
187+ get_db_connector_mock = mocker .patch ('tokenomics_decentralization.analyze .get_connector' )
188+ get_db_connector_mock .return_value = 'connector'
126189
127190 analyze_snapshot_mock = mocker .patch ('tokenomics_decentralization.analyze.analyze_snapshot' )
128191 analyze_snapshot_mock .return_value = {'hhi' : 1 }
@@ -135,7 +198,7 @@ def test_analyze(mocker):
135198
136199 output_rows = analyze (['bitcoin' ], ['2010-01-01' ])
137200 assert output_rows == ['row' ]
138- analyze_snapshot_mock .assert_called_with (None , 'bitcoin' , '2010-01-01' )
201+ analyze_snapshot_mock .assert_called_with ('connector' , 'bitcoin' , '2010-01-01' )
139202
140203 output_rows = analyze (['bitcoin' , 'ethereum' ], ['2010-01-01' , '2011-01-01' ])
141204 assert output_rows == ['row' , 'row' , 'row' , 'row' ]
0 commit comments