jeudi 3 septembre 2020

Django Rest Framework Testing - OrderedDict instead of a number Error

So, I'm building an API with Django and rest-framework and when I try to send a post test request it keep getting this error where it's expecting a number but got a OrderedDict, if someone could help me it would be great.

test_api.py

def setUp(self):
    self.client = APIClient()
    self.sensor = Sensor(54545)
    self.sensor.save()
    self.company = Company(name='MOCK')
    self.company.save()

def test_create_valid_user_success(self):
    """Test creating a user with valid payload is successful"""
    payload = {
        'email': 'test@gmail.com',
        'password': 'pass123',
        'name': 'Test',
        'registration': 144545,
        'sensor': {
            'id': 455465,
            'battery': 100
        },
        'company': self.company.id
    }

    res = self.client.post(CREATE_USER_URL, payload, format='json')

    self.assertEqual(res.status_code, status.HTTP_201_CREATED)
    user = get_user_model().objects.get(**res.data)
    self.assertTrue(user.check_password(payload['password']))
    self.assertNotIn('password', res.data)
    self.assertNotIn('id', res.data)

*already tried json.dumps(payload), content_type='application/json' for the post

serializers.py

class SensorSerializer(serializers.ModelSerializer): 

    class Meta:
        model = Sensor
        fields = ('id', 'battery',)

class UserSerializer(serializers.ModelSerializer): """Serializer for the user object""" sensor = SensorSerializer()

class Meta:
    model = get_user_model()
    fields = (
        'email',
        'password',
        'name',
        'registration',
        'sensor',
        'company',
        )
    extra_kwargs = {
        'password': {'write_only': True, 'min_length': 5},
        'id': {'write_only': True}
        }

def create(self, validated_data):
    """Create a new user with encrypt password and return it"""
    sensor_data = validated_data.pop('sensor')
    sensor = SensorSerializer.create(SensorSerializer(), validated_data=sensor_data)

    return get_user_model().objects.create_user(sensor=sensor, **validated_data)

views.py

class CreateUserView(generics.CreateAPIView):
    """Create a new user in the system view"""
    serializer_class = UserSerializer

Error:

TypeError: Field 'id' expected a number but got OrderedDict([('id', 455465), ('battery', 100)].

Aucun commentaire:

Enregistrer un commentaire