Arjun Shahi
Arjun Shahi

Reputation: 7330

Api test case failed for user create view

I am writing the test case here for CreateUser view but the test is failing. It is throwing the following error

profile_data = validated_data.pop('profile') KeyError: 'profile'

What I am doing wrong here ?Am I doing wrong a=in my view/serializers or my test code is wrong? It creates the users perfectly.

models.py

class Profile(models.Model):
    user = models.OneToOneField(get_user_model(),on_delete=models.CASCADE)
    address = models.CharField(max_length=250,blank=True,null=True)
    contact = models.CharField(max_length=250,blank=True,null=True)

serializers.py

class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer(required=False)
    email = serializers.EmailField(validators=[UniqueValidator(queryset=get_user_model().objects.all())])
    password1 = serializers.CharField(required=True, write_only=True)
    password2 = serializers.CharField(required=True, write_only=True)

    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2', 'profile']

    def validate_password1(self, password):
        validators.validate_password(password=password)

    def validate_password2(self, password):
        validators.validate_password(password=password)

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError("The two password fields didn't match.")
        return data

    # def validate_username(self, validated_data):
    #     username = validated_data['username']
    #     print('usr',username)
    #     if len(username) < 6 and len(username) > 15:
    #         raise ValidationError('Username must be between 6 and 15 characters long')
    #     return username

    def create(self, validated_data):
        user = get_user_model().objects.create(
            username=validated_data['username'],
            email=validated_data['email'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],

        )

        user.set_password(validated_data['password2'])
        user.is_staff = True
        user.save()
        profile_data = validated_data.pop('profile')
        Profile.objects.create(
            user=user, address=profile_data['address'], contact=profile_data['contact']
        )

        return user

views.py

class CreateUser(generics.CreateAPIView):
    serializer_class = UserSerializer
    queryset = get_user_model().objects.all()

tests.py

class UserCreateListTest(APITestCase):
    def setUp(self):
        self.client = Client()


    def test_create_user(self):
        url = reverse('users:create_user')
        user = {'first_name':'first','last_name':'last','username':'username','email':'[email protected]',
                'password1':'[email protected]','password2':'[email protected]',
                "profile": {
            "user": 1,
            "address": "add",
            "contact": "cc"
        },
               }
        response = self.client.post(url,data=user,format='json')
        print(response.status_code)
        print(response.json())
        return self.assertEqual(response.status_code,status.HTTP_201_CREATED)

Upvotes: 0

Views: 116

Answers (2)

Marek
Marek

Reputation: 1249

    def setUp(self):
        self.client = Client()

this is unnecessary. APITestCase already provides self.client which is APIClient

Upvotes: 0

marxin
marxin

Reputation: 3922

In your test, replace Client class with rest_framework.test.APIClient

Upvotes: 1

Related Questions