Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending JSON using the django test client

I'm working on a django a project that will serve as the endpoint for a webhook. The webhook will POST some JSON data to my endpoint, which will then parse that data. I'm trying to write unit tests for it, but I'm not sure if I'm sending the JSON properly.

I keep getting "TypeError: string indices must be integers" in pipeline_endpoint

Here's the code:

# tests.py from django.test import TestCase from django.test.client import Client import simplejson  class TestPipeline(TestCase):      def setUp(self):         """initialize the Django test client"""         self.c = Client()      def test_200(self):         json_string = u'{"1": {"guid": "8a40135230f21bdb0130f21c255c0007", "portalId": 999, "email": "fake@email"}}'         json_data = simplejson.loads(json_string)         self.response = self.c.post('/pipeline-endpoint', json_data, content_type="application/json")         self.assertEqual(self.response.status_code, "200") 

and

# views.py from pipeline.prospect import Prospect import simplejson  def pipeline_endpoint(request):      #get the data from the json object that came in     prospects_json = simplejson.loads(request.raw_post_data)     for p in prospects_json:         prospect = {             'email'          : p['email'],             'hs_id'          : p['guid'],             'portal'         : p['portalId'],         } 

Edit: whole traceback.

====================================================================== ERROR: test_200 (pipeline.tests.TestPipeline) ---------------------------------------------------------------------- Traceback (most recent call last):   File "F:\......\pipeline\tests.py", line 31, in test_200     self.response = self.c.post('/pipeline-endpoint', json_string, content_type="application/json")   File "C:\Python27\lib\site-packages\django\test\client.py", line 455, in post     response = super(Client, self).post(path, data=data, content_type=content_type, **extra)   File "C:\Python27\lib\site-packages\django\test\client.py", line 256, in post     return self.request(**r)   File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 111, in get_response     response = callback(request, *callback_args, **callback_kwargs)   File "F:\......\pipeline\views.py", line 18, in pipeline_endpoint     'email'          : p['email'], TypeError: string indices must be integers  ---------------------------------------------------------------------- Ran 1 test in 0.095s  FAILED (errors=1) Destroying test database for alias 'default'... 
like image 207
Hartley Brody Avatar asked Dec 20 '11 23:12

Hartley Brody


1 Answers

@mrmagooey is right

def test_your_test(self):     python_dict = {         "1": {             "guid": "8a40135230f21bdb0130f21c255c0007",             "portalId": 999,             "email": "fake@email"         }     }     response = self.client.post('/pipeline-endpoint/',                                 json.dumps(python_dict),                                 content_type="application/json") 

use json.dumps instead of json.loads

like image 171
Guillaume Vincent Avatar answered Sep 20 '22 18:09

Guillaume Vincent