|
@@ -1,72 +1,87 @@
|
|
|
+import json
|
|
|
+
|
|
|
from django.contrib.auth import get_user_model
|
|
|
from django.core.urlresolvers import reverse
|
|
|
from django.test import TestCase
|
|
|
|
|
|
-from misago.users.models import Ban, BAN_USERNAME
|
|
|
-
|
|
|
|
|
|
-class LoginViewTests(TestCase):
|
|
|
- def test_view_get_returns_200(self):
|
|
|
- """login view returns 200 on GET"""
|
|
|
+class AuthViewsTests(TestCase):
|
|
|
+ def test_auth_views_return_302(self):
|
|
|
+ """auth views should always return redirect"""
|
|
|
response = self.client.get(reverse('misago:login'))
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
- def test_view_invalid_credentials(self):
|
|
|
- """login view returns 200 on invalid POST"""
|
|
|
- response = self.client.post(
|
|
|
- reverse('misago:login'),
|
|
|
- data={'username': 'nope', 'password': 'nope'})
|
|
|
+ response = self.client.post(reverse('misago:login'))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
- self.assertIn("Your login or password is incorrect.", response.content)
|
|
|
+ response = self.client.get(reverse('misago:logout'))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
- def test_view_signin(self):
|
|
|
- """login view signs user in"""
|
|
|
- User = get_user_model()
|
|
|
- User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
|
|
|
+ response = self.client.post(reverse('misago:logout'))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
- response = self.client.post(
|
|
|
- reverse('misago:login'),
|
|
|
- data={'username': 'Bob', 'password': 'Pass.123'})
|
|
|
+ def test_login_view_redirect_to(self):
|
|
|
+ """login view respects redirect_to POST"""
|
|
|
+ # valid redirect
|
|
|
+ response = self.client.post(reverse('misago:login'), data={
|
|
|
+ 'redirect_to': '/redirect/'
|
|
|
+ })
|
|
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertEqual(response['location'], 'http://testserver/redirect/')
|
|
|
|
|
|
- response = self.client.get(reverse('misago:index'))
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
- self.assertIn('Bob', response.content)
|
|
|
-
|
|
|
- def test_view_signin_banned(self):
|
|
|
- """login view fails to sign banned user in"""
|
|
|
- User = get_user_model()
|
|
|
- User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
|
|
|
- Ban.objects.create(check_type=BAN_USERNAME,
|
|
|
- banned_value='bob',
|
|
|
- user_message='Nope!')
|
|
|
+ # invalid redirect (redirects to other site)
|
|
|
+ response = self.client.post(reverse('misago:login'), data={
|
|
|
+ 'redirect_to': 'http://somewhereelse.com/page.html'
|
|
|
+ })
|
|
|
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertEqual(response['location'], 'http://testserver/')
|
|
|
+
|
|
|
+ # in-dev ember-cli redirect
|
|
|
+ conf_overrides = {
|
|
|
+ 'DEBUG': True,
|
|
|
+ 'MISAGO_EMBER_CLI_ORIGIN': 'http://localhost:4200'
|
|
|
+ }
|
|
|
+
|
|
|
+ with self.settings(**conf_overrides):
|
|
|
+ # valid request, has Origin header
|
|
|
+ response = self.client.post(reverse('misago:login'), data={
|
|
|
+ 'redirect_to': 'http://localhost:4200/page.html'
|
|
|
+ }, HTTP_ORIGIN='http://localhost:4200')
|
|
|
+
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertEqual(response['location'],
|
|
|
+ 'http://localhost:4200/page.html')
|
|
|
+
|
|
|
+ # invalid request, different Origin header
|
|
|
+ response = self.client.post(reverse('misago:login'), data={
|
|
|
+ 'redirect_to': 'http://localhost:4200/page.html'
|
|
|
+ }, HTTP_ORIGIN='http://somewhere.com/')
|
|
|
+
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
+ self.assertEqual(response['location'], 'http://testserver/')
|
|
|
+
|
|
|
+ def test_logout_view(self):
|
|
|
+ """logout view logs user out on post"""
|
|
|
response = self.client.post(
|
|
|
- reverse('misago:login'),
|
|
|
- data={'username': 'Bob', 'password': 'Pass.123'})
|
|
|
+ reverse('misago:api:login'),
|
|
|
+ data={'username': 'nope', 'password': 'nope'})
|
|
|
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
- self.assertIn('Nope!', response.content)
|
|
|
+ self.assertEqual(response.status_code, 400)
|
|
|
+ self.assertIn("Login or password is incorrect.", response.content)
|
|
|
|
|
|
- response = self.client.get(reverse('misago:index'))
|
|
|
+ response = self.client.get(reverse('misago:api:auth_user'))
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
- self.assertNotIn('Bob', response.content)
|
|
|
|
|
|
- def test_view_signin_inactive(self):
|
|
|
- """login view fails to sign inactive user in"""
|
|
|
- User = get_user_model()
|
|
|
- User.objects.create_user('Bob', 'bob@test.com', 'Pass.123',
|
|
|
- requires_activation=1)
|
|
|
+ user_json = json.loads(response.content)
|
|
|
+ self.assertIsNone(user_json['id'])
|
|
|
|
|
|
- response = self.client.post(
|
|
|
- reverse('misago:login'),
|
|
|
- data={'username': 'Bob', 'password': 'Pass.123'})
|
|
|
+ response = self.client.post(reverse('misago:logout'))
|
|
|
+ self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
+ response = self.client.get(reverse('misago:api:auth_user'))
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
- self.assertIn('activate', response.content)
|
|
|
|
|
|
- response = self.client.get(reverse('misago:index'))
|
|
|
- self.assertEqual(response.status_code, 200)
|
|
|
- self.assertNotIn('Bob', response.content)
|
|
|
+ user_json = json.loads(response.content)
|
|
|
+ self.assertIsNone(user_json['id'])
|