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
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"},
)
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.