Browse Source

Make acl, admin and categories tests use assertContains instead of assertIn and be compatible with Python 3

TheKit 9 years ago
parent
commit
ffb5d945d1

+ 5 - 3
misago/acl/tests/test_roleadmin_views.py

@@ -16,6 +16,8 @@ class RoleAdminViewsTests(AdminTestCase):
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
         self.assertIn(reverse('misago:admin:permissions:users:index'), response.content)
         self.assertIn(reverse('misago:admin:permissions:users:index'), response.content)
 
 
+        self.assertContains(response, reverse('misago:admin:permissions:users:index'))
+
     def test_list_view(self):
     def test_list_view(self):
         """roles list view returns 200"""
         """roles list view returns 200"""
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
@@ -35,7 +37,7 @@ class RoleAdminViewsTests(AdminTestCase):
         test_role = Role.objects.get(name='Test Role')
         test_role = Role.objects.get(name='Test Role')
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertIn(test_role.name, response.content)
+        self.assertContains(response, test_role.name)
 
 
     def test_edit_view(self):
     def test_edit_view(self):
         """edit role view has no showstoppers"""
         """edit role view has no showstoppers"""
@@ -48,7 +50,7 @@ class RoleAdminViewsTests(AdminTestCase):
 
 
         response = self.client.get(reverse('misago:admin:permissions:users:edit', kwargs={'pk': test_role.pk}))
         response = self.client.get(reverse('misago:admin:permissions:users:edit', kwargs={'pk': test_role.pk}))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertIn('Test Role', response.content)
+        self.assertContains(response, 'Test Role')
 
 
         response = self.client.post(
         response = self.client.post(
             reverse('misago:admin:permissions:users:edit', kwargs={'pk': test_role.pk}),
             reverse('misago:admin:permissions:users:edit', kwargs={'pk': test_role.pk}),
@@ -59,7 +61,7 @@ class RoleAdminViewsTests(AdminTestCase):
         test_role = Role.objects.get(name='Top Lel')
         test_role = Role.objects.get(name='Top Lel')
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
         response = self.client.get(reverse('misago:admin:permissions:users:index'))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertIn(test_role.name, response.content)
+        self.assertContains(response, test_role.name)
 
 
     def test_users_view(self):
     def test_users_view(self):
         """users with this role view has no showstoppers"""
         """users with this role view has no showstoppers"""

+ 1 - 1
misago/acl/testutils.py

@@ -30,7 +30,7 @@ def override_acl(user, new_acl):
 
 
     if user.is_authenticated():
     if user.is_authenticated():
         user._acl_cache = final_cache
         user._acl_cache = final_cache
-        user.acl_key = md5(unicode(user.pk)).hexdigest()[:8]
+        user.acl_key = md5(str(user.pk).encode()).hexdigest()[:8]
         user.save(update_fields=['acl_key'])
         user.save(update_fields=['acl_key'])
 
 
         threadstore.set('acl_%s' % user.acl_key, final_cache)
         threadstore.set('acl_%s' % user.acl_key, final_cache)

+ 12 - 19
misago/admin/tests/test_admin_views.py

@@ -44,10 +44,9 @@ class AdminLoginViewTests(TestCase):
         """unauthenticated request to admin index produces login form"""
         """unauthenticated request to admin index produces login form"""
         response = self.client.get(reverse('misago:admin:index'))
         response = self.client.get(reverse('misago:admin:index'))
 
 
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('Sign in', response.content)
-        self.assertIn('Username or e-mail', response.content)
-        self.assertIn('Password', response.content)
+        self.assertContains(response, 'Sign in')
+        self.assertContains(response, 'Username or e-mail')
+        self.assertContains(response, 'Password')
 
 
     def test_login_returns_200_on_invalid_post(self):
     def test_login_returns_200_on_invalid_post(self):
         """form handles invalid data gracefully"""
         """form handles invalid data gracefully"""
@@ -55,11 +54,10 @@ class AdminLoginViewTests(TestCase):
             reverse('misago:admin:index'),
             reverse('misago:admin:index'),
             data={'username': 'Nope', 'password': 'Nope'})
             data={'username': 'Nope', 'password': 'Nope'})
 
 
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('Login or password is incorrect.', response.content)
-        self.assertIn('Sign in', response.content)
-        self.assertIn('Username or e-mail', response.content)
-        self.assertIn('Password', response.content)
+        self.assertContains(response, 'Login or password is incorrect.')
+        self.assertContains(response, 'Sign in')
+        self.assertContains(response, 'Username or e-mail')
+        self.assertContains(response, 'Password')
 
 
     def test_login_returns_200_on_valid_post(self):
     def test_login_returns_200_on_valid_post(self):
         """form handles valid data correctly"""
         """form handles valid data correctly"""
@@ -80,12 +78,10 @@ class AdminLogoutTests(AdminTestCase):
         self.assertEqual(response.status_code, 302)
         self.assertEqual(response.status_code, 302)
 
 
         response = self.client.get(reverse('misago:admin:index'))
         response = self.client.get(reverse('misago:admin:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn("Your admin session has been closed.", response.content)
+        self.assertContains(response, "Your admin session has been closed.")
 
 
         response = self.client.get(reverse('misago:index'))
         response = self.client.get(reverse('misago:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn(self.user.username, response.content)
+        self.assertContains(response, self.user.username)
 
 
     def test_complete_logout(self):
     def test_complete_logout(self):
         """complete logout logged from both admin and site"""
         """complete logout logged from both admin and site"""
@@ -93,12 +89,10 @@ class AdminLogoutTests(AdminTestCase):
         self.assertEqual(response.status_code, 302)
         self.assertEqual(response.status_code, 302)
 
 
         response = self.client.get(reverse('misago:admin:index'))
         response = self.client.get(reverse('misago:admin:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn("Sign in", response.content)
+        self.assertContains(response, "Sign in")
 
 
         response = self.client.get(reverse('misago:index'))
         response = self.client.get(reverse('misago:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn("Sign in", response.content)
+        self.assertContains(response, "Sign in")
 
 
 
 
 class AdminIndexViewTests(AdminTestCase):
 class AdminIndexViewTests(AdminTestCase):
@@ -106,5 +100,4 @@ class AdminIndexViewTests(AdminTestCase):
         """admin index view returns 200"""
         """admin index view returns 200"""
         response = self.client.get(reverse('misago:admin:index'))
         response = self.client.get(reverse('misago:admin:index'))
 
 
-        self.assertEqual(response.status_code, 200)
-        self.assertIn(self.user.username, response.content)
+        self.assertContains(response, self.user.username)

+ 15 - 21
misago/categories/tests/test_categories_admin_views.py

@@ -11,16 +11,14 @@ class CategoryAdminViewsTests(AdminTestCase):
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
 
 
-        self.assertIn(reverse('misago:admin:categories:nodes:index'),
-                      response.content)
+        self.assertContains(response, reverse('misago:admin:categories:nodes:index'))
 
 
     def test_list_view(self):
     def test_list_view(self):
         """categories list view returns 200"""
         """categories list view returns 200"""
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
 
 
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('First category', response.content)
+        self.assertContains(response, 'First category')
 
 
         # Now test that empty categories list contains message
         # Now test that empty categories list contains message
         root = Category.objects.root_category()
         root = Category.objects.root_category()
@@ -31,7 +29,7 @@ class CategoryAdminViewsTests(AdminTestCase):
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
 
 
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertIn('No categories', response.content)
+        self.assertContains(response, 'No categories')
 
 
     def test_new_view(self):
     def test_new_view(self):
         """new category view has no showstoppers"""
         """new category view has no showstoppers"""
@@ -54,8 +52,7 @@ class CategoryAdminViewsTests(AdminTestCase):
 
 
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('Test Category', response.content)
+        self.assertContains(response, 'Test Category')
 
 
         test_category = Category.objects.get(slug='test-category')
         test_category = Category.objects.get(slug='test-category')
 
 
@@ -72,8 +69,7 @@ class CategoryAdminViewsTests(AdminTestCase):
 
 
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('Test Subcategory', response.content)
+        self.assertContains(response, 'Test Subcategory')
 
 
     def test_edit_view(self):
     def test_edit_view(self):
         """edit category view has no showstoppers"""
         """edit category view has no showstoppers"""
@@ -109,8 +105,7 @@ class CategoryAdminViewsTests(AdminTestCase):
                 'pk': test_category.pk
                 'pk': test_category.pk
             }))
             }))
 
 
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('Test Category', response.content)
+        self.assertContains(response, 'Test Category')
 
 
         response = self.client.post(
         response = self.client.post(
             reverse('misago:admin:categories:nodes:edit', kwargs={
             reverse('misago:admin:categories:nodes:edit', kwargs={
@@ -127,8 +122,7 @@ class CategoryAdminViewsTests(AdminTestCase):
 
 
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('Test Category Edited', response.content)
+        self.assertContains(response, 'Test Category Edited')
 
 
     def test_move_views(self):
     def test_move_views(self):
         """move up/down views have no showstoppers"""
         """move up/down views have no showstoppers"""
@@ -161,8 +155,8 @@ class CategoryAdminViewsTests(AdminTestCase):
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        position_a = response.content.find('Category A')
-        position_b = response.content.find('Category B')
+        position_a = response.content.find(b'Category A')
+        position_b = response.content.find(b'Category B')
         self.assertTrue(position_a > position_b)
         self.assertTrue(position_a > position_b)
 
 
         response = self.client.post(
         response = self.client.post(
@@ -175,8 +169,8 @@ class CategoryAdminViewsTests(AdminTestCase):
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        position_a = response.content.find('Category A')
-        position_b = response.content.find('Category B')
+        position_a = response.content.find(b'Category A')
+        position_b = response.content.find(b'Category B')
         self.assertTrue(position_a > position_b)
         self.assertTrue(position_a > position_b)
 
 
         response = self.client.post(
         response = self.client.post(
@@ -189,8 +183,8 @@ class CategoryAdminViewsTests(AdminTestCase):
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        position_a = response.content.find('Category A')
-        position_b = response.content.find('Category B')
+        position_a = response.content.find(b'Category A')
+        position_b = response.content.find(b'Category B')
         self.assertTrue(position_a > position_b)
         self.assertTrue(position_a > position_b)
 
 
         response = self.client.post(
         response = self.client.post(
@@ -203,8 +197,8 @@ class CategoryAdminViewsTests(AdminTestCase):
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:index'))
             reverse('misago:admin:categories:nodes:index'))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        position_a = response.content.find('Category A')
-        position_b = response.content.find('Category B')
+        position_a = response.content.find(b'Category A')
+        position_b = response.content.find(b'Category B')
         self.assertTrue(position_a < position_b)
         self.assertTrue(position_a < position_b)
 
 
 
 

+ 2 - 2
misago/categories/tests/test_category_model.py

@@ -114,7 +114,7 @@ class CategoryModelTests(MisagoTestCase):
 
 
     def test_delete_content(self):
     def test_delete_content(self):
         """delete_content empties category"""
         """delete_content empties category"""
-        for i in xrange(10):
+        for i in range(10):
             self.create_thread()
             self.create_thread()
 
 
         self.category.synchronize()
         self.category.synchronize()
@@ -131,7 +131,7 @@ class CategoryModelTests(MisagoTestCase):
 
 
     def test_move_content(self):
     def test_move_content(self):
         """move_content moves category threads and posts to other category"""
         """move_content moves category threads and posts to other category"""
-        for i in xrange(10):
+        for i in range(10):
             self.create_thread()
             self.create_thread()
         self.category.synchronize()
         self.category.synchronize()
 
 

+ 16 - 24
misago/categories/tests/test_permissions_admin_views.py

@@ -17,8 +17,7 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:permissions:categories:index'))
             reverse('misago:admin:permissions:categories:index'))
 
 
-        self.assertIn(reverse('misago:admin:permissions:categories:index'),
-                      response.content)
+        self.assertContains(response, reverse('misago:admin:permissions:categories:index'))
 
 
     def test_list_view(self):
     def test_list_view(self):
         """roles list view returns 200"""
         """roles list view returns 200"""
@@ -41,8 +40,7 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
         test_role = CategoryRole.objects.get(name='Test CategoryRole')
         test_role = CategoryRole.objects.get(name='Test CategoryRole')
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:permissions:categories:index'))
             reverse('misago:admin:permissions:categories:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn(test_role.name, response.content)
+        self.assertContains(response, test_role.name)
 
 
     def test_edit_view(self):
     def test_edit_view(self):
         """edit role view has no showstoppers"""
         """edit role view has no showstoppers"""
@@ -56,8 +54,7 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
             reverse('misago:admin:permissions:categories:edit', kwargs={
             reverse('misago:admin:permissions:categories:edit', kwargs={
                 'pk': test_role.pk
                 'pk': test_role.pk
             }))
             }))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn('Test CategoryRole', response.content)
+        self.assertContains(response, 'Test CategoryRole')
 
 
         response = self.client.post(
         response = self.client.post(
             reverse('misago:admin:permissions:categories:edit', kwargs={
             reverse('misago:admin:permissions:categories:edit', kwargs={
@@ -69,8 +66,7 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
         test_role = CategoryRole.objects.get(name='Top Lel')
         test_role = CategoryRole.objects.get(name='Top Lel')
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:permissions:categories:index'))
             reverse('misago:admin:permissions:categories:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn(test_role.name, response.content)
+        self.assertContains(response, test_role.name)
 
 
     def test_delete_view(self):
     def test_delete_view(self):
         """delete role view has no showstoppers"""
         """delete role view has no showstoppers"""
@@ -88,8 +84,7 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
         self.client.get(reverse('misago:admin:permissions:categories:index'))
         self.client.get(reverse('misago:admin:permissions:categories:index'))
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:permissions:categories:index'))
             reverse('misago:admin:permissions:categories:index'))
-        self.assertEqual(response.status_code, 200)
-        self.assertTrue(test_role.name not in response.content)
+        self.assertNotContains(response, test_role.name)
 
 
     def test_change_category_roles_view(self):
     def test_change_category_roles_view(self):
         """change category roles perms view works"""
         """change category roles perms view works"""
@@ -146,12 +141,11 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
         response = self.client.get(
         response = self.client.get(
             reverse('misago:admin:categories:nodes:permissions',
             reverse('misago:admin:categories:nodes:permissions',
                     kwargs={'pk': test_category.pk}))
                     kwargs={'pk': test_category.pk}))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn(test_category.name, response.content)
-        self.assertIn(test_role_a.name, response.content)
-        self.assertIn(test_role_b.name, response.content)
-        self.assertIn(role_comments.name, response.content)
-        self.assertIn(role_full.name, response.content)
+        self.assertContains(response, test_category.name)
+        self.assertContains(response, test_role_a.name)
+        self.assertContains(response, test_role_b.name)
+        self.assertContains(response, role_comments.name)
+        self.assertContains(response, role_full.name)
 
 
         # Assign roles to categories
         # Assign roles to categories
         response = self.client.post(
         response = self.client.post(
@@ -239,11 +233,10 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
             reverse('misago:admin:permissions:users:categories', kwargs={
             reverse('misago:admin:permissions:users:categories', kwargs={
                 'pk': test_role.pk
                 'pk': test_role.pk
             }))
             }))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn(category_a.name, response.content)
-        self.assertIn(category_b.name, response.content)
-        self.assertIn(category_c.name, response.content)
-        self.assertIn(category_d.name, response.content)
+        self.assertContains(response, category_a.name)
+        self.assertContains(response, category_b.name)
+        self.assertContains(response, category_c.name)
+        self.assertContains(response, category_d.name)
 
 
         # Set test roles
         # Set test roles
         self.client.post(
         self.client.post(
@@ -261,9 +254,8 @@ class CategoryRoleAdminViewsTests(AdminTestCase):
             reverse('misago:admin:permissions:users:categories', kwargs={
             reverse('misago:admin:permissions:users:categories', kwargs={
                 'pk': test_role.pk
                 'pk': test_role.pk
             }))
             }))
-        self.assertEqual(response.status_code, 200)
-        self.assertIn(role_comments.name, response.content)
-        self.assertIn(role_full.name, response.content)
+        self.assertContains(response, role_comments.name)
+        self.assertContains(response, role_full.name)
 
 
         # Assign roles to categories
         # Assign roles to categories
         response = self.client.post(
         response = self.client.post(

+ 9 - 8
misago/categories/tests/test_prunecategories.py

@@ -3,6 +3,7 @@ from datetime import timedelta
 from django.test import TestCase
 from django.test import TestCase
 from django.utils import timezone
 from django.utils import timezone
 from django.utils.six import StringIO
 from django.utils.six import StringIO
+from django.utils.six.moves import range
 
 
 from misago.threads import testutils
 from misago.threads import testutils
 
 
@@ -21,12 +22,12 @@ class PruneCategoriesTests(TestCase):
         # post old threads with recent replies
         # post old threads with recent replies
         started_on = timezone.now() - timedelta(days=30)
         started_on = timezone.now() - timedelta(days=30)
         posted_on = timezone.now()
         posted_on = timezone.now()
-        for t in xrange(10):
+        for t in range(10):
             thread = testutils.post_thread(category, started_on=started_on)
             thread = testutils.post_thread(category, started_on=started_on)
             testutils.reply_thread(thread, posted_on=posted_on)
             testutils.reply_thread(thread, posted_on=posted_on)
 
 
         # post recent threads that will be preserved
         # post recent threads that will be preserved
-        threads = [testutils.post_thread(category) for t in xrange(10)]
+        threads = [testutils.post_thread(category) for t in range(10)]
 
 
         category.synchronize()
         category.synchronize()
         self.assertEqual(category.threads, 20)
         self.assertEqual(category.threads, 20)
@@ -57,12 +58,12 @@ class PruneCategoriesTests(TestCase):
 
 
         # post old threads with recent replies
         # post old threads with recent replies
         started_on = timezone.now() - timedelta(days=30)
         started_on = timezone.now() - timedelta(days=30)
-        for t in xrange(10):
+        for t in range(10):
             thread = testutils.post_thread(category, started_on=started_on)
             thread = testutils.post_thread(category, started_on=started_on)
             testutils.reply_thread(thread)
             testutils.reply_thread(thread)
 
 
         # post recent threads that will be preserved
         # post recent threads that will be preserved
-        threads = [testutils.post_thread(category) for t in xrange(10)]
+        threads = [testutils.post_thread(category) for t in range(10)]
 
 
         category.synchronize()
         category.synchronize()
         self.assertEqual(category.threads, 20)
         self.assertEqual(category.threads, 20)
@@ -103,12 +104,12 @@ class PruneCategoriesTests(TestCase):
         # post old threads with recent replies
         # post old threads with recent replies
         started_on = timezone.now() - timedelta(days=30)
         started_on = timezone.now() - timedelta(days=30)
         posted_on = timezone.now()
         posted_on = timezone.now()
-        for t in xrange(10):
+        for t in range(10):
             thread = testutils.post_thread(category, started_on=started_on)
             thread = testutils.post_thread(category, started_on=started_on)
             testutils.reply_thread(thread, posted_on=posted_on)
             testutils.reply_thread(thread, posted_on=posted_on)
 
 
         # post recent threads that will be preserved
         # post recent threads that will be preserved
-        threads = [testutils.post_thread(category) for t in xrange(10)]
+        threads = [testutils.post_thread(category) for t in range(10)]
 
 
         category.synchronize()
         category.synchronize()
         self.assertEqual(category.threads, 20)
         self.assertEqual(category.threads, 20)
@@ -152,12 +153,12 @@ class PruneCategoriesTests(TestCase):
 
 
         # post old threads with recent replies
         # post old threads with recent replies
         started_on = timezone.now() - timedelta(days=30)
         started_on = timezone.now() - timedelta(days=30)
-        for t in xrange(10):
+        for t in range(10):
             thread = testutils.post_thread(category, started_on=started_on)
             thread = testutils.post_thread(category, started_on=started_on)
             testutils.reply_thread(thread)
             testutils.reply_thread(thread)
 
 
         # post recent threads that will be preserved
         # post recent threads that will be preserved
-        threads = [testutils.post_thread(category) for t in xrange(10)]
+        threads = [testutils.post_thread(category) for t in range(10)]
 
 
         category.synchronize()
         category.synchronize()
         self.assertEqual(category.threads, 20)
         self.assertEqual(category.threads, 20)

+ 3 - 2
misago/categories/tests/test_synchronizecategories.py

@@ -1,5 +1,6 @@
 from django.test import TestCase
 from django.test import TestCase
 from django.utils.six import StringIO
 from django.utils.six import StringIO
+from django.utils.six.moves import range
 
 
 from misago.threads import testutils
 from misago.threads import testutils
 
 
@@ -12,9 +13,9 @@ class SynchronizeCategoriesTests(TestCase):
         """command synchronizes categories"""
         """command synchronizes categories"""
         category = Category.objects.all_categories()[:1][0]
         category = Category.objects.all_categories()[:1][0]
 
 
-        threads = [testutils.post_thread(category) for t in xrange(10)]
+        threads = [testutils.post_thread(category) for t in range(10)]
         for thread in threads:
         for thread in threads:
-            [testutils.reply_thread(thread) for r in xrange(5)]
+            [testutils.reply_thread(thread) for r in range(5)]
 
 
         category.threads = 0
         category.threads = 0
         category.posts = 0
         category.posts = 0

+ 13 - 13
misago/categories/tests/test_views.py

@@ -13,9 +13,9 @@ class CategoryViewsTests(AuthenticatedUserTestCase):
         response = self.client.get(reverse('misago:categories'))
         response = self.client.get(reverse('misago:categories'))
 
 
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
-            self.assertIn(node.name, response.content)
+            self.assertContains(response, node.name)
             if node.level > 1:
             if node.level > 1:
-                self.assertIn(node.get_absolute_url(), response.content)
+                self.assertContains(response, node.get_absolute_url())
 
 
     def test_index_renders_for_guest(self):
     def test_index_renders_for_guest(self):
         """categories list renders for guest"""
         """categories list renders for guest"""
@@ -24,9 +24,9 @@ class CategoryViewsTests(AuthenticatedUserTestCase):
         response = self.client.get(reverse('misago:categories'))
         response = self.client.get(reverse('misago:categories'))
 
 
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
-            self.assertIn(node.name, response.content)
+            self.assertContains(response, node.name)
             if node.level > 1:
             if node.level > 1:
-                self.assertIn(node.get_absolute_url(), response.content)
+                self.assertContains(response, node.get_absolute_url())
 
 
     def test_index_no_perms_renders(self):
     def test_index_no_perms_renders(self):
         """categories list renders no visible categories for authenticated"""
         """categories list renders no visible categories for authenticated"""
@@ -36,7 +36,7 @@ class CategoryViewsTests(AuthenticatedUserTestCase):
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
             self.assertNotIn(node.name, response.content)
             self.assertNotIn(node.name, response.content)
             if node.level > 1:
             if node.level > 1:
-                self.assertNotIn(node.get_absolute_url(), response.content)
+                self.assertNotContains(response, node.get_absolute_url())
 
 
     def test_index_no_perms_renders_for_guest(self):
     def test_index_no_perms_renders_for_guest(self):
         """categories list renders no visible categories for guest"""
         """categories list renders no visible categories for guest"""
@@ -48,7 +48,7 @@ class CategoryViewsTests(AuthenticatedUserTestCase):
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
             self.assertNotIn(node.name, response.content)
             self.assertNotIn(node.name, response.content)
             if node.level > 1:
             if node.level > 1:
-                self.assertNotIn(node.get_absolute_url(), response.content)
+                self.assertNotContains(response, node.get_absolute_url())
 
 
 
 
 class CategoryAPIViewsTests(AuthenticatedUserTestCase):
 class CategoryAPIViewsTests(AuthenticatedUserTestCase):
@@ -57,9 +57,9 @@ class CategoryAPIViewsTests(AuthenticatedUserTestCase):
         response = self.client.get(reverse('misago:api:categories'))
         response = self.client.get(reverse('misago:api:categories'))
 
 
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
-            self.assertIn(node.name, response.content)
+            self.assertContains(response, node.name)
             if node.level > 1:
             if node.level > 1:
-                self.assertIn(node.get_absolute_url(), response.content)
+                self.assertNotContains(response, node.get_absolute_url())
 
 
     def test_index_renders_for_guest(self):
     def test_index_renders_for_guest(self):
         """api returns categories for guest"""
         """api returns categories for guest"""
@@ -68,9 +68,9 @@ class CategoryAPIViewsTests(AuthenticatedUserTestCase):
         response = self.client.get(reverse('misago:api:categories'))
         response = self.client.get(reverse('misago:api:categories'))
 
 
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
-            self.assertIn(node.name, response.content)
+            self.assertContains(response, node.name)
             if node.level > 1:
             if node.level > 1:
-                self.assertIn(node.get_absolute_url(), response.content)
+                self.assertNotContains(response, node.get_absolute_url())
 
 
     def test_index_no_perms_renders(self):
     def test_index_no_perms_renders(self):
         """api returns no categories for authenticated"""
         """api returns no categories for authenticated"""
@@ -80,7 +80,7 @@ class CategoryAPIViewsTests(AuthenticatedUserTestCase):
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
             self.assertNotIn(node.name, response.content)
             self.assertNotIn(node.name, response.content)
             if node.level > 1:
             if node.level > 1:
-                self.assertNotIn(node.get_absolute_url(), response.content)
+                self.assertNotContains(response, node.get_absolute_url())
 
 
     def test_index_no_perms_renders_for_guest(self):
     def test_index_no_perms_renders_for_guest(self):
         """api returns no categories for guest"""
         """api returns no categories for guest"""
@@ -90,6 +90,6 @@ class CategoryAPIViewsTests(AuthenticatedUserTestCase):
         response = self.client.get(reverse('misago:api:categories'))
         response = self.client.get(reverse('misago:api:categories'))
 
 
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
-            self.assertNotIn(node.name, response.content)
+            self.assertNotContains(response, node.name)
             if node.level > 1:
             if node.level > 1:
-                self.assertNotIn(node.get_absolute_url(), response.content)
+                self.assertNotContains(response, node.get_absolute_url())

+ 3 - 3
misago/core/management/progressbar.py

@@ -2,8 +2,8 @@ import time
 
 
 
 
 def show_progress(command, step, total, since=None):
 def show_progress(command, step, total, since=None):
-    progress = step * 100 / total
-    filled = progress / 2
+    progress = step * 100 // total
+    filled = progress // 2
     blank = 50 - filled
     blank = 50 - filled
 
 
     line = '\r%s%% [%s%s]'
     line = '\r%s%% [%s%s]'
@@ -11,7 +11,7 @@ def show_progress(command, step, total, since=None):
 
 
     if since:
     if since:
         if step > 0:
         if step > 0:
-            estimated_time = ((time.time() - since) / step) * (total - step)
+            estimated_time = ((time.time() - since) // step) * (total - step)
             clock = time.strftime('%H:%M:%S', time.gmtime(estimated_time))
             clock = time.strftime('%H:%M:%S', time.gmtime(estimated_time))
             rendered_line = '%s %s est.' % (rendered_line, clock)
             rendered_line = '%s %s est.' % (rendered_line, clock)
         else:
         else: