From a5bd6d7ae3ffa72be7284c0b4480146128e23780 Mon Sep 17 00:00:00 2001 From: Kevin Georgy Date: Tue, 18 Oct 2016 08:42:08 +0200 Subject: [PATCH] Add specific test for coerced to string and localized float and integer fields --- rest_framework/fields.py | 4 +-- tests/test_fields.py | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 9c034da95..eadd799ac 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -930,7 +930,7 @@ class IntegerField(NumberField): if self.localize: return number_format(value) if self.coerce_to_string: - return str(value) + return str(int(value)) return int(value) @@ -953,7 +953,7 @@ class FloatField(NumberField): if self.localize: return number_format(value) if self.coerce_to_string: - return str(value) + return str(float(value)) return float(value) diff --git a/tests/test_fields.py b/tests/test_fields.py index 6fea249ba..5a5e9b49e 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -850,6 +850,37 @@ class TestMinMaxIntegerField(FieldValues): field = serializers.IntegerField(min_value=1, max_value=3) +class TestCoerceToStringIntegerField(FieldValues): + valid_inputs = {} + invalid_inputs = {} + outputs = { + '1': '1', + '0': '0', + 1: '1', + 0: '0', + 1.0: '1', + 0.0: '0', + } + field = serializers.IntegerField(coerce_to_string=True) + + +class TestLocalizedIntegerField(TestCase): + @override_settings(USE_L10N=True, LANGUAGE_CODE='it') + def test_to_internal_value(self): + field = serializers.IntegerField(localize=True) + self.assertEqual(field.to_internal_value('1,0'), 1) + + @override_settings(USE_L10N=True, LANGUAGE_CODE=None, DECIMAL_SEPARATOR=',', THOUSAND_SEPARATOR='\'', + NUMBER_GROUPING=3, USE_THOUSAND_SEPARATOR=True) + def test_to_representation(self): + field = serializers.IntegerField(localize=True) + self.assertEqual(field.to_representation(1000), '1\'000') + + def test_localize_forces_coerce_to_string(self): + field = serializers.IntegerField(localize=True) + self.assertTrue(isinstance(field.to_representation(3), six.string_types)) + + class TestFloatField(FieldValues): """ Valid and invalid values for `FloatField`. @@ -898,6 +929,36 @@ class TestMinMaxFloatField(FieldValues): field = serializers.FloatField(min_value=1, max_value=3) +class TestCoerceToStringFloatField(FieldValues): + valid_inputs = {} + invalid_inputs = {} + outputs = { + '1': str(1.0), + '0': str(0.0), + 1: str(1.0), + 0: str(0.0), + 1.5: str(1.5), + } + field = serializers.FloatField(coerce_to_string=True) + + +class TestLocalizedFloatField(TestCase): + @override_settings(USE_L10N=True, LANGUAGE_CODE='it') + def test_to_internal_value(self): + field = serializers.FloatField(localize=True) + self.assertEqual(field.to_internal_value('1,5'), 1.5) + + @override_settings(USE_L10N=True, LANGUAGE_CODE=None, DECIMAL_SEPARATOR=',', THOUSAND_SEPARATOR='\'', + NUMBER_GROUPING=3, USE_THOUSAND_SEPARATOR=True) + def test_to_representation(self): + field = serializers.FloatField(localize=True) + self.assertEqual(field.to_representation(1000.75), '1\'000,75') + + def test_localize_forces_coerce_to_string(self): + field = serializers.FloatField(localize=True) + self.assertTrue(isinstance(field.to_representation(3), six.string_types)) + + class TestDecimalField(FieldValues): """ Valid and invalid values for `DecimalField`.