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'...
@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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With