Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django : Testing if the page has redirected to the desired url

In my django app, I have an authentication system. So, If I do not log in and try to access some profile's personal info, I get redirected to a login page.

Now, I need to write a test case for this. The responses from the browsers I get is :

GET /myprofile/data/some_id/ HTTP/1.1 302 0 GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 301 0 GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 200 6533 

How do I write my test ? This what I have so far:

self.client.login(user="user", password="passwd") response = self.client.get('/myprofile/data/some_id/') self.assertEqual(response.status,200) self.client.logout() response = self.client.get('/myprofile/data/some_id/') 

What could possibly come next ?

like image 962
Deepankar Bajpeyi Avatar asked Feb 19 '13 06:02

Deepankar Bajpeyi


People also ask

What is HTTP Response redirect in Django?

HttpResponseRedirect is a subclass of HttpResponse (source code) in the Django web framework that returns the HTTP 302 status code, indicating the URL resource was found but temporarily moved to a different URL. This class is most frequently used as a return object from a Django view.

Which Django function returns an HttpResponseRedirect to the appropriate URL for the arguments passed?

redirect() Returns an HttpResponseRedirect to the appropriate URL for the arguments passed. The arguments could be: A model: the model's get_absolute_url() function will be called.

How pass data redirect Django?

Django Redirects: A Super Simple Example Just call redirect() with a URL in your view. It will return a HttpResponseRedirect class, which you then return from your view. Assuming this is the main urls.py of your Django project, the URL /redirect/ now redirects to /redirect-success/ .


2 Answers

Django 1.4:

https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.TestCase.assertRedirects

Django 2.0:

https://docs.djangoproject.com/en/2.0/topics/testing/tools/#django.test.SimpleTestCase.assertRedirects

SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)

Asserts that the response returned a status_code redirect status, redirected to expected_url (including any GET data), and that the final page was received with target_status_code.

If your request used the follow argument, the expected_url and target_status_code will be the url and status code for the final point of the redirect chain.

If fetch_redirect_response is False, the final page won’t be loaded. Since the test client can’t fetch external URLs, this is particularly useful if expected_url isn’t part of your Django app.

Scheme is handled correctly when making comparisons between two URLs. If there isn’t any scheme specified in the location where we are redirected to, the original request’s scheme is used. If present, the scheme in expected_url is the one used to make the comparisons to.

like image 149
imposeren Avatar answered Sep 20 '22 15:09

imposeren


You could also follow the redirect with:

response = self.client.get('/myprofile/data/some_id/', follow=True) 

which would mirror the user experience in the browser and make assertions of what you expect to find there, such as:

self.assertContains(response, "You must be logged in", status_code=401) 
like image 22
igniteflow Avatar answered Sep 21 '22 15:09

igniteflow