def test_one_to_one(self): """ Test a related ToOne resource with a nested full ToOne resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Company.objects.count(), 0) self.assertEqual(Address.objects.count(), 0) pr = PersonResource() data = { 'name': 'Joan Rivers', 'company': { 'name': 'Yum Yum Pie Factory!', 'address': { 'line': 'Somewhere, Utah' } } } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) pk = Person.objects.all()[0].pk request = MockRequest() request.method = 'GET' request.path = reverse('api_dispatch_detail', kwargs={ 'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name }) resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person['name'], 'Joan Rivers') company = person['company'] self.assertEqual(company['name'], 'Yum Yum Pie Factory!') address = company['address'] self.assertEqual(address['line'], 'Somewhere, Utah') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.path = reverse('api_dispatch_detail', kwargs={ 'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name }) request.raw_post_data = resp.content resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_many_to_many(self): """ Test a related ToMany resource with a nested full ToMany resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Dog.objects.count(), 0) self.assertEqual(Bone.objects.count(), 0) pr = PersonResource() data = { 'name': 'Joan Rivers', 'dogs': [ { 'name': 'Snoopy', 'bones': [ { 'color': 'white' } ] } ] } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.path = reverse('api_dispatch_list', kwargs={'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name}) request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Person.objects.count(), 1) self.assertEqual(Dog.objects.count(), 1) self.assertEqual(Bone.objects.count(), 1) pk = Person.objects.all()[0].pk request = MockRequest() request.method = 'GET' request.path = reverse('api_dispatch_detail', kwargs={'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name}) resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person['name'], 'Joan Rivers') self.assertEqual(len(person['dogs']), 1) dog = person['dogs'][0] self.assertEqual(dog['name'], 'Snoopy') self.assertEqual(len(dog['bones']), 1) bone = dog['bones'][0] self.assertEqual(bone['color'], 'white') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = json.dumps(person) request.path = reverse('api_dispatch_detail', kwargs={'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name}) resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_one_to_many(self): """ Test a related ToOne resource with a nested full ToMany resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Company.objects.count(), 0) self.assertEqual(Product.objects.count(), 0) pr = PersonResource() data = { 'name': 'Joan Rivers', 'company': { 'name': 'Yum Yum Pie Factory!', 'products': [ { 'name': 'Tasty Pie' } ] } } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Person.objects.count(), 1) self.assertEqual(Company.objects.count(), 1) self.assertEqual(Product.objects.count(), 1) pk = Person.objects.all()[0].pk request = MockRequest() request.method = 'GET' request.path = reverse('api_dispatch_detail', kwargs={'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name}) resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person['name'], 'Joan Rivers') company = person['company'] self.assertEqual(company['name'], 'Yum Yum Pie Factory!') self.assertEqual(len(company['products']), 1) product = company['products'][0] self.assertEqual(product['name'], 'Tasty Pie') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.path = reverse('api_dispatch_detail', kwargs={'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name}) request.raw_post_data = json.dumps(person) resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_many_to_one(self): """ Test a related ToMany resource with a nested full ToOne resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Dog.objects.count(), 0) self.assertEqual(DogHouse.objects.count(), 0) pr = PersonResource() data = { 'name': 'Joan Rivers', 'dogs': [ { 'name': 'Snoopy', 'house': { 'color': 'Red' } } ] } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) pk = Person.objects.all()[0].pk request = MockRequest() request.method = 'GET' resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person['name'], 'Joan Rivers') self.assertEqual(len(person['dogs']), 1) dog = person['dogs'][0] self.assertEqual(dog['name'], 'Snoopy') house = dog['house'] self.assertEqual(house['color'], 'Red') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = resp.content resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_one_to_one(self): """ Test a related ToOne resource with a nested full ToOne resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Company.objects.count(), 0) self.assertEqual(Address.objects.count(), 0) pr = PersonResource() data = { 'name': 'Joan Rivers', 'company': { 'name': 'Yum Yum Pie Factory!', 'address': { 'line': 'Somewhere, Utah' } } } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) pk = Person.objects.all()[0].pk request = MockRequest() request.method = 'GET' request.path = reverse('api_dispatch_detail', kwargs={'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name}) resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person['name'], 'Joan Rivers') company = person['company'] self.assertEqual(company['name'], 'Yum Yum Pie Factory!') address = company['address'] self.assertEqual(address['line'], 'Somewhere, Utah') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.path = reverse('api_dispatch_detail', kwargs={'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name}) request.raw_post_data = resp.content resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_one_to_many(self): # Sanity checks. self.assertEqual(Note.objects.count(), 2) self.assertEqual(MediaBit.objects.count(), 0) fnr = FreshNoteResource() data = { 'title': 'Create with related URIs', 'slug': 'create-with-related-uris', 'content': 'Some content here', 'is_active': True, 'media_bits': [ { 'title': 'Picture #1' } ] } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = json.dumps(data) resp = fnr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Note.objects.count(), 3) note = Note.objects.latest('created') self.assertEqual(note.media_bits.count(), 1) self.assertEqual(note.media_bits.all()[0].title, u'Picture #1')
def test_one_to_many(self): # Sanity checks. self.assertEqual(Note.objects.count(), 2) self.assertEqual(MediaBit.objects.count(), 0) fnr = FreshNoteResource() data = { 'title': 'Create with related URIs', 'slug': 'create-with-related-uris', 'content': 'Some content here', 'is_active': True, 'media_bits': [{ 'title': 'Picture #1' }] } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = json.dumps(data) resp = fnr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Note.objects.count(), 3) note = Note.objects.latest('created') self.assertEqual(note.media_bits.count(), 1) self.assertEqual(note.media_bits.all()[0].title, u'Picture #1')
def test_one_to_many(self): # Sanity checks. self.assertEqual(Note.objects.count(), 2) self.assertEqual(MediaBit.objects.count(), 0) fnr = FreshNoteResource() data = { "title": "Create with related URIs", "slug": "create-with-related-uris", "content": "Some content here", "is_active": True, "media_bits": [{"title": "Picture #1"}], } request = MockRequest() request.GET = {"format": "json"} request.method = "POST" request.raw_post_data = json.dumps(data) resp = fnr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Note.objects.count(), 3) note = Note.objects.latest("created") self.assertEqual(note.media_bits.count(), 1) self.assertEqual(note.media_bits.all()[0].title, u"Picture #1")
def test_many_to_many(self): """ Test a related ToMany resource with a nested full ToMany resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Dog.objects.count(), 0) self.assertEqual(Bone.objects.count(), 0) pr = PersonResource() data = {"name": "Joan Rivers", "dogs": [{"name": "Snoopy", "bones": [{"color": "white"}]}]} request = MockRequest() request.GET = {"format": "json"} request.method = "POST" request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Person.objects.count(), 1) self.assertEqual(Dog.objects.count(), 1) self.assertEqual(Bone.objects.count(), 1) pk = Person.objects.all()[0].pk request = MockRequest() request.method = "GET" resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person["name"], "Joan Rivers") self.assertEqual(len(person["dogs"]), 1) dog = person["dogs"][0] self.assertEqual(dog["name"], "Snoopy") self.assertEqual(len(dog["bones"]), 1) bone = dog["bones"][0] self.assertEqual(bone["color"], "white") request = MockRequest() request.GET = {"format": "json"} request.method = "PUT" request.raw_post_data = json.dumps(person) resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_related_resource_fk_lookup(self): resource = api.canonical_resource_for('tag') request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"extradata": {"non_existent_field": "foobar"}, "taggabletags": [ ]}' response = resource.post_list(request) self.assertEqual(response.status_code, 201)
def test_one_to_many(self): """ Test a related ToOne resource with a nested full ToMany resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Company.objects.count(), 0) self.assertEqual(Product.objects.count(), 0) pr = PersonResource() data = {"name": "Joan Rivers", "company": {"name": "Yum Yum Pie Factory!", "products": [{"name": "Tasty Pie"}]}} request = MockRequest() request.GET = {"format": "json"} request.method = "POST" request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Person.objects.count(), 1) self.assertEqual(Company.objects.count(), 1) self.assertEqual(Product.objects.count(), 1) pk = Person.objects.all()[0].pk request = MockRequest() request.method = "GET" resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person["name"], "Joan Rivers") company = person["company"] self.assertEqual(company["name"], "Yum Yum Pie Factory!") self.assertEqual(len(company["products"]), 1) product = company["products"][0] self.assertEqual(product["name"], "Tasty Pie") request = MockRequest() request.GET = {"format": "json"} request.method = "PUT" request.raw_post_data = json.dumps(person) resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_post_by_uri(self): """Create a new GenericTag item using POST request. Point content_object to a category by it's uri""" new_category = Category.objects.create(name="Design") self.assertEqual(new_category.name, "Design") request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"name": "Photoshop", "content_object": "%s"}' % CategoryResource().get_resource_uri(new_category) resource = api.canonical_resource_for('generictag') resp = resource.wrap_view('dispatch_list')(request) self.assertEqual(resp.status_code, 201) # get newly created object via headers.locaion self.assertTrue(resp.has_header('location')) location = resp['location'] resp = self.client.get(location, data={"format": "json"}) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) self.assertEqual(data['name'], 'Photoshop') self.assertEqual(data['content_object'], CategoryResource().get_resource_uri(new_category)) # now try doing this with a TaggableObject instead new_taggable = Taggable.objects.create(name="Design Post") request.raw_post_data = '{"name": "UX", "content_object": "%s"}' % TaggableResource().get_resource_uri(new_taggable) resp = resource.wrap_view('dispatch_list')(request) self.assertEqual(resp.status_code, 201) self.assertTrue(resp.has_header('location')) location = resp['location'] resp = self.client.get(location, data={"format" : "json"}) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) self.assertEqual(data['name'], 'UX') self.assertEqual(data['content_object'], TaggableResource().get_resource_uri(new_taggable))
def test_cannot_access_user_resource(self): resource = api.canonical_resource_for('users') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = '{"username": "******"}' resp = resource.wrap_view('dispatch_detail')(request, pk=self.user.pk) self.assertEqual(resp.status_code, 405) self.assertEqual(User.objects.get(id=self.user.id).username, self.user.username)
def test_one_to_one(self): """ Test a related ToOne resource with a nested full ToOne resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Company.objects.count(), 0) self.assertEqual(Address.objects.count(), 0) pr = PersonResource() data = { "name": "Joan Rivers", "company": {"name": "Yum Yum Pie Factory!", "address": {"line": "Somewhere, Utah"}}, } request = MockRequest() request.GET = {"format": "json"} request.method = "POST" request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) pk = Person.objects.all()[0].pk request = MockRequest() request.method = "GET" resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person["name"], "Joan Rivers") company = person["company"] self.assertEqual(company["name"], "Yum Yum Pie Factory!") address = company["address"] self.assertEqual(address["line"], "Somewhere, Utah") request = MockRequest() request.GET = {"format": "json"} request.method = "PUT" request.raw_post_data = resp.content resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_related_resource_authorization(self): resource = api.canonical_resource_for('notes') request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"content": "The cat is back. The dog coughed him up out back.", "created": "2010-04-03 20:05:00", "is_active": true, "slug": "cat-is-back", "title": "The Cat Is Back", "updated": "2010-04-03 20:05:00", "author": {"id": %s, "username": "******"}}' % self.user.id resp = resource.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(User.objects.get(id=self.user.id).username, 'foobar')
def test_related_resource_partial_update(self): note = Note.objects.create(author=self.user, content="Note Content", title="Note Title", slug="note-title") resource = api.canonical_resource_for('notes') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = '{"content": "The note has been changed"}' resp = resource.put_detail(request, pk=note.pk) self.assertEqual(resp.status_code, 201) self.assertEqual(Note.objects.get(id=note.id).content, "The note has been changed")
def test_related_resource_authorization(self): resource = api.canonical_resource_for('notes') request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"content": "The cat is back. The dog coughed him up out back.", "created": "2010-04-03 20:05:00", "is_active": true, "slug": "cat-is-back", "title": "The Cat Is Back", "updated": "2010-04-03 20:05:00", "author": {"id": %s, "username": "******"}}' % self.user.id resp = resource.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(User.objects.get(id=self.user.id).username, 'foobar')
def test_cannot_access_user_resource(self): resource = api.canonical_resource_for('users') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = '{"username": "******"}' resp = resource.wrap_view('dispatch_detail')(request, pk=self.user.pk) self.assertEqual(resp.status_code, 405) self.assertEqual( User.objects.get(id=self.user.id).username, self.user.username)
def test_post_by_data_requires_content_type(self): """Make sure 400 (BadRequest) is the response if an attempt is made to post with data for the GenericForeignKey without providing a content_type """ request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"name": "Photoshop", "content_object": %s}' % '{"name": "Design"}' resource = api.canonical_resource_for('generictag') resp = resource.wrap_view('dispatch_list')(request) self.assertTrue(resp.status_code, 400)
def test_put(self): new_category = Category.objects.create(name="Design") self.assertEqual(new_category.name, "Design") request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"name": "Photoshop", "content_object": "%s"}' % CategoryResource().get_resource_uri(new_category) resource = api.canonical_resource_for('generictag') resp = resource.wrap_view('dispatch_list')(request) self.assertEqual(resp.status_code, 201) # get newly created object via headers.locaion self.assertTrue(resp.has_header('location')) location = resp['location'] # put to this location and replace the name of content_object with "Web Design" resp = self.client.get(location, data={"format": "json"}) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) self.assertEqual(data['name'], 'Photoshop') self.assertEqual(data['content_object'], CategoryResource().get_resource_uri(new_category)) # now put the new data request.raw_post_data = '{"content_object": {"name": "Web Design"}}' request.method = 'PUT' resp = resource.put_detail(request, pk=data['id']) self.assertEqual(resp.status_code, 204) # test putting a different content type request.raw_post_data = ('{"content_type": "%s", "content_object": {"name": "Web Design"}}' % (ContentTypeResource().get_resource_uri( ContentType.objects.get_for_model(Taggable)))) resp = resource.put_detail(request, pk=data['id']) self.assertEqual(resp.status_code, 204) self.assertEqual(GenericTag.objects.get(pk=data['id']).content_type, ContentType.objects.get_for_model(Taggable))
def test_related_resource_partial_update(self): note = Note.objects.create(author=self.user, content="Note Content", title="Note Title", slug="note-title") resource = api.canonical_resource_for('notes') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = '{"content": "The note has been changed"}' resp = resource.put_detail(request, pk=note.pk) self.assertEqual(resp.status_code, 201) self.assertEqual( Note.objects.get(id=note.id).content, "The note has been changed")
def test_put_null(self): resource = api.canonical_resource_for('category') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = '{"parent": null, "name": "Son"}' # Before the PUT, there should be a parent. self.assertEqual(Category.objects.get(pk=self.child_cat_1.pk).parent.pk, self.parent_cat_1.pk) # After the PUT, the parent should be ``None``. resp = resource.put_detail(request, pk=self.child_cat_1.pk) self.assertEqual(resp.status_code, 204) self.assertEqual(Category.objects.get(pk=self.child_cat_1.pk).name, 'Son') self.assertEqual(Category.objects.get(pk=self.child_cat_1.pk).parent, None)
def test_put_null(self): resource = api.canonical_resource_for('category') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = '{"parent": null, "name": "Son"}' # Before the PUT, there should be a parent. self.assertEqual( Category.objects.get(pk=self.child_cat_1.pk).parent.pk, self.parent_cat_1.pk) # After the PUT, the parent should be ``None``. resp = resource.put_detail(request, pk=self.child_cat_1.pk) self.assertEqual(resp.status_code, 204) self.assertEqual( Category.objects.get(pk=self.child_cat_1.pk).name, 'Son') self.assertEqual( Category.objects.get(pk=self.child_cat_1.pk).parent, None)
def test_post_new_tag(self): resource = api.canonical_resource_for('tag') request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"name": "school", "taggabletags": [ ]}' # Prior to the addition of ``blank=True``, this would # fail badly. resp = resource.wrap_view('dispatch_list')(request) self.assertEqual(resp.status_code, 201) # GET the created object (through its headers.location) self.assertTrue(resp.has_header('location')) location = resp['Location'] resp = self.client.get(location, data={'format': 'json'}) self.assertEqual(resp.status_code, 200) deserialized = json.loads(resp.content) self.assertEqual(len(deserialized), 5) self.assertEqual(deserialized['name'], 'school')
def test_post_new_tag(self): resource = api.canonical_resource_for('tag') request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = '{"name": "school", "taggabletags": [ ]}' # Prior to the addition of ``blank=True``, this would # fail badly. resp = resource.wrap_view('dispatch_list')(request) self.assertEqual(resp.status_code, 201) # GET the created object (through its headers.location) self.assertTrue(resp.has_header('location')) location = resp['Location'] resp = self.client.get(location, data={'format': 'json'}) self.assertEqual(resp.status_code, 200) deserialized = json.loads(resp.content) self.assertEqual(len(deserialized), 5) self.assertEqual(deserialized['name'], 'school')
def test_many_to_many(self): """ Test a related ToMany resource with a nested full ToMany resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Dog.objects.count(), 0) self.assertEqual(Bone.objects.count(), 0) pr = PersonResource() data = { 'name': 'Joan Rivers', 'dogs': [{ 'name': 'Snoopy', 'bones': [{ 'color': 'white' }] }] } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.path = reverse('api_dispatch_list', kwargs={ 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name }) request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Person.objects.count(), 1) self.assertEqual(Dog.objects.count(), 1) self.assertEqual(Bone.objects.count(), 1) pk = Person.objects.all()[0].pk request = MockRequest() request.method = 'GET' request.path = reverse('api_dispatch_detail', kwargs={ 'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name }) resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person['name'], 'Joan Rivers') self.assertEqual(len(person['dogs']), 1) dog = person['dogs'][0] self.assertEqual(dog['name'], 'Snoopy') self.assertEqual(len(dog['bones']), 1) bone = dog['bones'][0] self.assertEqual(bone['color'], 'white') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.raw_post_data = json.dumps(person) request.path = reverse('api_dispatch_detail', kwargs={ 'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name }) resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_one_to_many(self): """ Test a related ToOne resource with a nested full ToMany resource """ self.assertEqual(Person.objects.count(), 0) self.assertEqual(Company.objects.count(), 0) self.assertEqual(Product.objects.count(), 0) pr = PersonResource() data = { 'name': 'Joan Rivers', 'company': { 'name': 'Yum Yum Pie Factory!', 'products': [{ 'name': 'Tasty Pie' }] } } request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = json.dumps(data) resp = pr.post_list(request) self.assertEqual(resp.status_code, 201) self.assertEqual(Person.objects.count(), 1) self.assertEqual(Company.objects.count(), 1) self.assertEqual(Product.objects.count(), 1) pk = Person.objects.all()[0].pk request = MockRequest() request.method = 'GET' request.path = reverse('api_dispatch_detail', kwargs={ 'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name }) resp = pr.get_detail(request, pk=pk) self.assertEqual(resp.status_code, 200) person = json.loads(resp.content) self.assertEqual(person['name'], 'Joan Rivers') company = person['company'] self.assertEqual(company['name'], 'Yum Yum Pie Factory!') self.assertEqual(len(company['products']), 1) product = company['products'][0] self.assertEqual(product['name'], 'Tasty Pie') request = MockRequest() request.GET = {'format': 'json'} request.method = 'PUT' request.path = reverse('api_dispatch_detail', kwargs={ 'pk': pk, 'resource_name': pr._meta.resource_name, 'api_name': pr._meta.api_name }) request.raw_post_data = json.dumps(person) resp = pr.put_detail(request, pk=pk) self.assertEqual(resp.status_code, 204)
def test_post_by_data(self): """Create a new GenericTag item using a POST request. content_type must be set on the new object and the serialized data for the GenericForeignKey will be included in the POST """ new_category = Category(name="Design") self.assertEqual(new_category.name, "Design") request = MockRequest() request.GET = {'format': 'json'} request.method = 'POST' request.raw_post_data = ( '{"name": "Photoshop", "content_type": "%s", "content_object": {"name": "Design"}}' % (ContentTypeResource().get_resource_uri( ContentType.objects.get_for_model(Category)))) resource = api.canonical_resource_for('generictag') resp = resource.wrap_view('dispatch_list')(request) self.assertEqual(resp.status_code, 201) # get newly created object via headers.locaion self.assertTrue(resp.has_header('location')) location = resp['location'] resp = self.client.get(location, data={"format": "json"}) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) self.assertEqual(data['name'], 'Photoshop') self.assertTrue(data['content_object']) resp = self.client.get(data['content_object'], data={'format': 'json'}) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) self.assertEqual(data['name'], new_category.name) # make sure this represents a category self.assertEqual(type(resource.get_via_uri(data['resource_uri'])), Category) # test posting taggable data instead of category this time request.raw_post_data = ( '{"name": "Photoshop", "content_type": "%s", "content_object": {"name": "Design Post"}}' % (ContentTypeResource().get_resource_uri( ContentType.objects.get_for_model(Taggable)))) resp = resource.wrap_view('dispatch_list')(request) self.assertEqual(resp.status_code, 201) # get newly created object via headers.locaion self.assertTrue(resp.has_header('location')) location = resp['location'] resp = self.client.get(location, data={"format": "json"}) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) self.assertEqual(data['name'], 'Photoshop') self.assertTrue(data['content_object']) resp = self.client.get(data['content_object'], data={'format': 'json'}) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content) self.assertEqual(data['name'], "Design Post") # make sure this represents a category self.assertEqual(type(resource.get_via_uri(data['resource_uri'])), Taggable)