Sending JSON using the django test client
Question: 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'...
    


Answer: @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`

