Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Test post django function

I have django function, that takes JSON-data from request, validates it and save to db.
I want to test this func, but POST request doesn’t work, error

‘json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)’.

I guess it’s some wrong with my data in post request, because if I add print(request.body) in func, I see

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

b’–BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="model"\r\n\r\nX5\r\n–BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="version"\r\n\r\nLT\r\n–BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="serial"\r\n\r\nDD\r\n–BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="created"\r\n\r\n2023-01-01 00:00:01\r\n–BoUnDaRyStRiNg–\r\n’

views.py

def add_robot_in_db(request):
    if request.method == 'POST':
        print(request.body)
        json_data = json.loads(request.body)
        data = RobotForm(json_data)
        data.is_valid()
        if data.errors:
            return JsonResponse(json.loads(data.errors.as_json()),
                                status=HTTPStatus.BAD_REQUEST)
        data.save()
        return JsonResponse(data.cleaned_data,
                            status=HTTPStatus.CREATED)

    return JsonResponse({'error': 'Wrong request, only POST'},
                        status=HTTPStatus.BAD_REQUEST)

tests.py

class TaskURLTests(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()

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

    def test_url(self):
        response = self.guest_client.post('/add_robot/',
                                          {"model":"X5", "version":"LT", "serial": "DD",
                                           "created":"2023-01-01 00:00:01"},
                                          )

>Solution :

You’re receiving that error because your not sending JSON data, What your sending is form-data, Here is how to fix it:

def test_url(self):
     json_data = {
         "model": "X5",
         "version": "LT",
         ...
     }
     response  = self.guest_client.post('/add_robot/',
                                        data= json.dumps(json_data),
                                        content_type='application/json')

Using json.dumps will convert the python dictionary to JSON string and with setting the content_type as application/json you’re specifying the format you’re sending.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading