def test_get_field_names_with_include(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = ('id', 'name')

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field_names = serializer.get_field_names([], info)
        self.assertEqual(set(field_names), {Vehicle.id.key, Vehicle.name.key})
    def test_build_unknows_field(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = '__all__'

        serializer = VehicleSerializer()
        info = model_info(Vehicle)

        with self.assertRaises(ImproperlyConfigured):
            serializer.build_field('abcde', info, 0)
    def test_build_property_field(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = '__all__'

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field = serializer.build_field('lower_name', info, 0)

        self.assertIsInstance(field, fields.ReadOnlyField)
    def test_get_field_names_includes_all_required_fields(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = ('id', 'name')

        serializer = VehicleSerializer()
        info = model_info(Vehicle)

        with self.assertRaises(AssertionError):
            serializer.get_field_names(['type'], info)
    def test_build_composite_field(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = '__all__'

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field = serializer.build_field(Vehicle.engine.key, info, 0)

        self.assertIsInstance(field, CompositeSerializer)
        self.assertEqual(len(field.fields), 4)
    def test_build_one_to_many_relationship_field(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = '__all__'

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        nested_serializer = serializer.build_field(Vehicle.owner.key, info, 0)

        self.assertIsNotNone(nested_serializer)
        self.assertIsInstance(nested_serializer, ModelSerializer)
        self.assertEqual(len(nested_serializer.fields), 2)
    def test_build_enum_field(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = ('type', )

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field = serializer.build_field(Vehicle.type.key, info, 0)

        self.assertEqual(field.help_text, Vehicle.type.doc)
        self.assertEqual(field.label, 'Type')
        self.assertTrue(field.required)
        self.assertIsInstance(field, fields.ChoiceField)
        self.assertFalse(field.allow_null)
    def test_build_standard_char_field(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = '__all__'

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field = serializer.build_field(Vehicle.name.key, info, 0)

        self.assertEqual(field.help_text, Vehicle.name.doc)
        self.assertEqual(field.label, 'Name')
        self.assertFalse(field.required)
        self.assertIsInstance(field, fields.CharField)
        self.assertTrue(field.allow_null)
    def test_get_field_names_with_exclude(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                exclude = ('type', 'options')

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field_names = serializer.get_field_names([], info)
        self.assertEqual(
            set(field_names), {
                Vehicle.created_at.key, Vehicle.engine.key, Vehicle.id.key,
                Vehicle.name.key, Vehicle.other.key, Vehicle.owner.key,
                Vehicle.paint.key, Vehicle.is_used.key, 'url'
            })
    def test_build_one_to_many_relationship_field_with_nested_updates_disabled(
            self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = '__all__'
                extra_kwargs = {'owner': {'allow_nested_updates': False}}

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        nested_serializer = serializer.build_field(Vehicle.owner.key, info, 0)

        self.assertIsNotNone(nested_serializer)
        self.assertIsInstance(nested_serializer, ModelSerializer)
        self.assertEqual(len(nested_serializer.fields), 2)
        self.assertTrue(nested_serializer.fields['name'].read_only)
    def test_get_default_field_names_should_get_all_field_names(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = ('id', 'name')

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field_names = serializer.get_default_field_names([], info)
        self.assertEqual(
            set(field_names), {
                Vehicle.created_at.key, Vehicle.engine.key, Vehicle.id.key,
                Vehicle.name.key, Vehicle.options.key, Vehicle.other.key,
                Vehicle.owner.key, Vehicle.paint.key, Vehicle.type.key,
                Vehicle.is_used.key, 'url'
            })
    def test_build_choice_field(self):
        class VehicleSerializer(ModelSerializer):
            class Meta:
                model = Vehicle
                session = session
                fields = ('paint', )

        serializer = VehicleSerializer()
        info = model_info(Vehicle)
        field = serializer.build_field(Vehicle.paint.key, info, 0)

        self.assertEqual(field.help_text, Vehicle.paint.doc)
        self.assertEqual(field.label, 'Paint')
        self.assertFalse(field.required)
        self.assertIsInstance(field, fields.ChoiceField)
        self.assertEqual(field.choices,
                         OrderedDict([(color, color) for color in COLORS]))
        self.assertTrue(field.allow_null)