|
9 | 9 | from datahub.core.test.support.models import MetadataModel
|
10 | 10 | from datahub.core.utils import (
|
11 | 11 | force_uuid,
|
| 12 | + format_currency, |
| 13 | + format_currency_range, |
| 14 | + format_currency_range_string, |
12 | 15 | get_financial_year,
|
13 | 16 | join_truthy_strings,
|
14 | 17 | load_constants_to_database,
|
15 | 18 | log_to_sentry,
|
16 | 19 | reverse_with_query_string,
|
17 | 20 | slice_iterable_into_chunks,
|
| 21 | + upper_snake_case_to_sentence_case, |
18 | 22 | )
|
19 | 23 |
|
20 | 24 |
|
@@ -59,6 +63,170 @@ def test_join_truthy_strings(args, sep, res):
|
59 | 63 | assert join_truthy_strings(*args, sep=sep) == res
|
60 | 64 |
|
61 | 65 |
|
| 66 | +@pytest.mark.parametrize( |
| 67 | + 'string,glue,expected', |
| 68 | + ( |
| 69 | + ('UPPER_SNAKE_CASE', '+', 'Upper snake case'), |
| 70 | + (['UPPER_SNAKE_CASE', 'LINE_2'], '+', 'Upper snake case+Line 2'), |
| 71 | + (['UPPER_SNAKE_CASE', 'LINE_2'], '\n', 'Upper snake case\nLine 2'), |
| 72 | + (['UPPER_SNAKE_CASE', 'LINE_2'], '. ', 'Upper snake case. Line 2'), |
| 73 | + ), |
| 74 | +) |
| 75 | +def test_upper_snake_case_to_sentence_case(string, glue, expected): |
| 76 | + """Test formatting currency""" |
| 77 | + assert upper_snake_case_to_sentence_case(string, glue) == expected |
| 78 | + |
| 79 | + |
| 80 | +@pytest.mark.parametrize( |
| 81 | + 'string,expected', |
| 82 | + ( |
| 83 | + ('UPPER_SNAKE_CASE', 'Upper snake case'), |
| 84 | + (['UPPER_SNAKE_CASE', 'LINE_2'], 'Upper snake case Line 2'), |
| 85 | + ), |
| 86 | +) |
| 87 | +def test_default_glue_upper_snake_case_to_sentence_case(string, expected): |
| 88 | + """Test formatting currency""" |
| 89 | + assert upper_snake_case_to_sentence_case(string) == expected |
| 90 | + |
| 91 | + |
| 92 | +@pytest.mark.parametrize( |
| 93 | + 'value,expected', |
| 94 | + ( |
| 95 | + (0, '£0'), |
| 96 | + (1, '£1'), |
| 97 | + (1.5, '£1.50'), |
| 98 | + (999999, '£999,999'), |
| 99 | + (1000000, '£1 million'), |
| 100 | + (1234567, '£1.23 million'), |
| 101 | + (7000000, '£7 million'), |
| 102 | + (999990000, '£999.99 million'), |
| 103 | + (999999999, '£1 billion'), |
| 104 | + (1000000000, '£1 billion'), |
| 105 | + (1200000000, '£1.2 billion'), |
| 106 | + (1234567890, '£1.23 billion'), |
| 107 | + (7000000000, '£7 billion'), |
| 108 | + (123000000000, '£123 billion'), |
| 109 | + (1234000000000, '£1,234 billion'), |
| 110 | + (1234500000000, '£1,234.5 billion'), |
| 111 | + ), |
| 112 | +) |
| 113 | +def test_format_currency(value, expected): |
| 114 | + """Test formatting currency""" |
| 115 | + assert format_currency(str(value)) == expected |
| 116 | + assert format_currency(value) == expected |
| 117 | + |
| 118 | + # Test without currency symbols |
| 119 | + assert format_currency(str(value), symbol='') == expected.replace('£', '') |
| 120 | + assert format_currency(value, symbol='') == expected.replace('£', '') |
| 121 | + |
| 122 | + # Test with different currency symbols |
| 123 | + assert format_currency(str(value), symbol='A$') == expected.replace('£', 'A$') |
| 124 | + assert format_currency(value, symbol='A$') == expected.replace('£', 'A$') |
| 125 | + |
| 126 | + |
| 127 | +@pytest.mark.parametrize( |
| 128 | + 'values,expected', |
| 129 | + ( |
| 130 | + ([0, 1.5], '£0 to £1.50'), |
| 131 | + ([999999, 1000000], '£999,999 to £1 million'), |
| 132 | + ([1234567, 7000000], '£1.23 million to £7 million'), |
| 133 | + ([999990000, 999999999], '£999.99 million to £1 billion'), |
| 134 | + ([1200000000, 0.01], '£1.2 billion to £0.01'), |
| 135 | + ), |
| 136 | +) |
| 137 | +def test_format_currency_range(values, expected): |
| 138 | + assert format_currency_range(values) == expected |
| 139 | + assert format_currency_range(values, symbol='') == expected.replace('£', '') |
| 140 | + assert format_currency_range(values, symbol='A$') == expected.replace('£', 'A$') |
| 141 | + |
| 142 | + |
| 143 | +@pytest.mark.parametrize( |
| 144 | + 'string,expected', |
| 145 | + ( |
| 146 | + ('0-9999', 'Less than £10,000'), |
| 147 | + ('0-10000', 'Less than £10,000'), |
| 148 | + ('0-1000000', 'Less than £1 million'), |
| 149 | + ('10000-500000', '£10,000 to £500,000'), |
| 150 | + ('500001-1000000', '£500,001 to £1 million'), |
| 151 | + ('1000001-2000000', '£1 million to £2 million'), |
| 152 | + ('2000001-5000000', '£2 million to £5 million'), |
| 153 | + ('5000001-10000000', '£5 million to £10 million'), |
| 154 | + ('10000001+', 'More than £10 million'), |
| 155 | + ('SPECIFIC_AMOUNT', 'Specific amount'), |
| 156 | + ), |
| 157 | +) |
| 158 | +def test_format_currency_range_string(string, expected): |
| 159 | + """ |
| 160 | + Test range with and without currency symbol. |
| 161 | + """ |
| 162 | + assert format_currency_range_string(string) == expected |
| 163 | + assert format_currency_range_string(string, symbol='') == expected.replace('£', '') |
| 164 | + assert format_currency_range_string(string, symbol='A$') == expected.replace('£', 'A$') |
| 165 | + |
| 166 | + |
| 167 | +@pytest.mark.parametrize( |
| 168 | + 'string,expected', |
| 169 | + ( |
| 170 | + ('0...9999', 'Less than £10,000'), |
| 171 | + ('0...10000', 'Less than £10,000'), |
| 172 | + ('0...1000000', 'Less than £1 million'), |
| 173 | + ('10000...500000', '£10,000 to £500,000'), |
| 174 | + ('500001...1000000', '£500,001 to £1 million'), |
| 175 | + ('1000001...2000000', '£1 million to £2 million'), |
| 176 | + ('2000001...5000000', '£2 million to £5 million'), |
| 177 | + ('5000001...10000000', '£5 million to £10 million'), |
| 178 | + ('10000001+', 'More than £10 million'), |
| 179 | + ('SPECIFIC_AMOUNT', 'Specific amount'), |
| 180 | + ), |
| 181 | +) |
| 182 | +def test_format_currency_range_string_separator(string, expected): |
| 183 | + """ |
| 184 | + Test range with separator symbol. |
| 185 | + """ |
| 186 | + assert format_currency_range_string(string, separator='...') == expected |
| 187 | + |
| 188 | + |
| 189 | +@pytest.mark.parametrize( |
| 190 | + 'string,more_or_less,smart_more_or_less,expected', |
| 191 | + ( |
| 192 | + ('0-9999', True, True, 'Less than £10,000'), |
| 193 | + ('0-10000', True, True, 'Less than £10,000'), |
| 194 | + ('0-1000000', True, True, 'Less than £1 million'), |
| 195 | + ('10000001+', True, True, 'More than £10 million'), |
| 196 | + ('SPECIFIC_AMOUNT', True, True, 'Specific amount'), |
| 197 | + ('0-9999', True, False, 'Less than £9,999'), |
| 198 | + ('0-10000', True, False, 'Less than £10,000'), |
| 199 | + ('0-1000000', True, False, 'Less than £1 million'), |
| 200 | + ('10000001+', True, False, 'More than £10 million'), |
| 201 | + ('SPECIFIC_AMOUNT', True, False, 'Specific amount'), |
| 202 | + # smart_more_or_less is not used when more_or_less is False. |
| 203 | + ('0-9999', False, False, '£0 to £9,999'), |
| 204 | + ('0-10000', False, False, '£0 to £10,000'), |
| 205 | + ('0-1000000', False, False, '£0 to £1 million'), |
| 206 | + ('10000001+', False, False, '£10 million+'), |
| 207 | + # Return string as Sentence case for invalid numbers |
| 208 | + ('SPECIFIC_AMOUNT', False, False, 'Specific amount'), |
| 209 | + ), |
| 210 | +) |
| 211 | +def test_format_currency_range_string_more_or_less_parameters( |
| 212 | + string, |
| 213 | + more_or_less, |
| 214 | + smart_more_or_less, |
| 215 | + expected, |
| 216 | +): |
| 217 | + """ |
| 218 | + Test range with and without currency symbol. |
| 219 | + """ |
| 220 | + assert format_currency_range_string( |
| 221 | + string, more_or_less=more_or_less, smart_more_or_less=smart_more_or_less) == expected |
| 222 | + assert format_currency_range_string( |
| 223 | + string, more_or_less=more_or_less, smart_more_or_less=smart_more_or_less, symbol='') == \ |
| 224 | + expected.replace('£', '') |
| 225 | + assert format_currency_range_string( |
| 226 | + string, more_or_less=more_or_less, smart_more_or_less=smart_more_or_less, symbol='A$') == \ |
| 227 | + expected.replace('£', 'A$') |
| 228 | + |
| 229 | + |
62 | 230 | def test_slice_iterable_into_chunks():
|
63 | 231 | """Test slice iterable into chunks."""
|
64 | 232 | size = 2
|
|
0 commit comments