kpsul/kfet/tests/test_views.py
2017-08-10 15:02:08 +02:00

376 lines
11 KiB
Python

import json
from decimal import Decimal
from django.contrib.auth.models import Group, Permission
from django.core.urlresolvers import reverse
from django.test import Client, TestCase
from django.utils import timezone
from ..models import Account, Checkout, Operation, OperationGroup
from .testcases import ViewTestCaseMixin
from .utils import create_team, create_user
class LoginGenericTeamViewTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.login.genericteam'
url_expected = '/k-fet/login/genericteam'
auth_user = 'team'
auth_forbidden = [None, 'user']
def test_ok(self):
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
logged_in_username = r.wsgi_request.user.username
self.assertEqual(logged_in_username, 'kfet_genericteam')
class AccountListViewTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.account'
url_expected = '/k-fet/accounts/'
auth_user = 'team'
auth_forbidden = [None, 'user']
def test_ok(self):
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
class AccountValidFreeTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.account.is_validandfree.ajax'
url_expected = '/k-fet/accounts/is_validandfree'
auth_user = 'team'
auth_forbidden = [None, 'user']
def test_ok_isvalid_isfree(self):
"""Upper case trigramme not taken is valid and free."""
r = self.client.get(self.url, {'trigramme': 'AAA'})
self.assertDictEqual(json.loads(r.content.decode('utf-8')), {
'is_valid': True,
'is_free': True,
})
def test_ok_isvalid_notfree(self):
"""Already taken trigramme is not free, but valid."""
r = self.client.get(self.url, {'trigramme': '000'})
self.assertDictEqual(json.loads(r.content.decode('utf-8')), {
'is_valid': True,
'is_free': False,
})
def test_ok_notvalid_isfree(self):
"""Lower case if forbidden but free."""
r = self.client.get(self.url, {'trigramme': 'aaa'})
self.assertDictEqual(json.loads(r.content.decode('utf-8')), {
'is_valid': False,
'is_free': True,
})
class AccountCreateViewTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.account.create'
url_expected = '/k-fet/accounts/new'
auth_user = 'team'
auth_forbidden = [None, 'user']
@property
def users_extra(self):
return {
'team__add_account': create_team(
'team__add_account', '101',
perms=['kfet.add_account'],
),
}
def test_get_ok(self):
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
def test_post_ok(self):
post_data = {
'trigramme': 'AAA',
'username': 'plopplopplop',
'first_name': 'first',
'last_name': 'last',
'email': 'email@domain.net',
}
client = Client()
client.login(
username='team__add_account',
password='team__add_account',
)
r = client.post(self.url, post_data)
self.assertRedirects(r, self.url)
a = Account.objects.get(trigramme='AAA')
self.assertEqual(a.username, 'plopplopplop')
def test_post_forbidden(self):
post_data = {
'trigramme': 'AAA',
'username': 'plopplopplop',
'first_name': 'first',
'last_name': 'last',
'email': 'email@domain.net',
}
# A team member (without kfet.add_account) is authenticated with
# self.client.
r = self.client.post(self.url, post_data)
self.assertEqual(r.status_code, 200)
with self.assertRaises(Account.DoesNotExist):
Account.objects.get(trigramme='AAA')
class AccountCreateAjaxViewTests(ViewTestCaseMixin, TestCase):
urls_conf = [
{
'name': 'kfet.account.create.fromuser',
'kwargs': {'username': 'user'},
'expected': '/k-fet/accounts/new/user/user',
},
{
'name': 'kfet.account.create.fromclipper',
'kwargs': {
'login_clipper': 'myclipper',
'fullname': 'first last1 last2',
},
'expected': (
'/k-fet/accounts/new/clipper/myclipper/first%20last1%20last2'
),
},
{
'name': 'kfet.account.create.empty',
'expected': '/k-fet/accounts/new/empty',
},
]
auth_user = 'team'
auth_forbidden = [None, 'user']
def test_fromuser(self):
r = self.client.get(self.t_urls[0])
user = self.users['user']
self.assertEqual(r.status_code, 200)
self.assertEqual(r.context['user_form'].instance, user)
self.assertEqual(r.context['cof_form'].instance, user.profile)
self.assertIn('account_form', r.context)
def test_fromclipper(self):
r = self.client.get(self.t_urls[1])
self.assertEqual(r.status_code, 200)
self.assertIn('user_form', r.context)
self.assertIn('cof_form', r.context)
self.assertIn('account_form', r.context)
def test_empty(self):
r = self.client.get(self.t_urls[0])
self.assertEqual(r.status_code, 200)
self.assertIn('user_form', r.context)
self.assertIn('cof_form', r.context)
self.assertIn('account_form', r.context)
class AccountCreateAutocompleteViewTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.account.create.autocomplete'
url_expected = '/k-fet/autocomplete/account_new'
auth_user = 'team'
auth_forbidden = [None, 'user']
def test_ok(self):
r = self.client.get(self.url, {'q': 'first'})
self.assertEqual(r.status_code, 200)
self.assertListEqual(list(r.context['users_notcof']), [])
self.assertListEqual(list(r.context['users_cof']), [])
self.assertListEqual(
list(r.context['kfet']),
[(self.accounts['user'], self.users['user'])],
)
class AccountSearchViewTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.account.search.autocomplete'
url_expected = '/k-fet/autocomplete/account_search'
auth_user = 'team'
auth_forbidden = [None, 'user']
def test_ok(self):
r = self.client.get(self.url, {'q': 'first'})
self.assertEqual(r.status_code, 200)
self.assertListEqual(
list(r.context['accounts']),
[('000', 'first last')],
)
class AccountReadViewTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.account.read'
url_kwargs = {'trigramme': '001'}
url_expected = '/k-fet/accounts/001'
auth_user = 'team'
auth_forbidden = [None, 'user']
@property
def users_extra(self):
return {
'user1': create_user('user1', '001'),
}
def setUp(self):
super().setUp()
user1_acc = self.accounts['user1']
team_acc = self.accounts['team']
# Dummy operations and operation groups
checkout = Checkout.objects.create(
created_by=team_acc, name="checkout",
valid_from=timezone.now(),
valid_to=timezone.now() + timezone.timedelta(days=365)
)
opeg_data = [
(timezone.now(), Decimal('10')),
(timezone.now() - timezone.timedelta(days=3), Decimal('3')),
]
OperationGroup.objects.bulk_create([
OperationGroup(
on_acc=user1_acc, checkout=checkout, at=at, is_cof=False,
amount=amount
)
for (at, amount) in opeg_data
])
self.operation_groups = OperationGroup.objects.order_by("-amount")
Operation.objects.create(
group=self.operation_groups[0],
type=Operation.PURCHASE,
amount=Decimal('10')
)
Operation.objects.create(
group=self.operation_groups[1],
type=Operation.PURCHASE,
amount=Decimal('3')
)
def test_ok(self):
"""We can query the "Account - Read" page."""
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
def test_ok_self(self):
client = Client()
client.login(username='user1', password='user1')
r = client.get(self.url)
self.assertEqual(r.status_code, 200)
class AccountUpdateViewTests(ViewTestCaseMixin, TestCase):
url_name = 'kfet.account.update'
url_kwargs = {'trigramme': '001'}
url_expected = '/k-fet/accounts/001/edit'
auth_user = 'team'
auth_forbidden = [None, 'user']
@property
def users_extra(self):
return {
'user1': create_user('user1', '001'),
}
def test_ok(self):
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
def test_ok_self(self):
client = Client()
client.login(username='user1', password='user1')
r = client.get(self.url)
self.assertEqual(r.status_code, 200)
class BaseAccountGroupViewTests(ViewTestCaseMixin):
auth_user = 'team__manage_perms'
auth_forbidden = [None, 'user', 'team']
@property
def users_extra(self):
return {
'team__manage_perms': create_team(
'team__manage_perms', '101',
perms=['kfet.manage_perms'],
),
}
class AccountGroupListViewTests(BaseAccountGroupViewTests, TestCase):
url_name = 'kfet.account.group'
url_expected = '/k-fet/accounts/groups'
def test_ok(self):
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
self.assertQuerysetEqual(
r.context['groups'],
Group.objects.filter(name__icontains='K-Fêt'),
ordered=False,
)
class AccountGroupCreateViewTests(BaseAccountGroupViewTests, TestCase):
url_name = 'kfet.account.group.create'
url_expected = '/k-fet/accounts/groups/new'
def test_ok(self):
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
class AccountGroupUpdateViewTests(BaseAccountGroupViewTests, TestCase):
url_name = 'kfet.account.group.update'
url_kwargs = {'pk': 42}
url_expected = '/k-fet/accounts/groups/42/edit'
def setUp(self):
super().setUp()
self.group1 = Group.objects.create(pk=42, name='K-Fêt - Group')
self.group1.permissions = [
Permission.objects.get(
content_type__app_label='kfet',
codename='is_team',
)
]
def test_get_ok(self):
r = self.client.get(self.url)
self.assertEqual(r.status_code, 200)
def test_post_ok(self):
post_data = {
'name': 'Group42',
'permissions': (
self.group1.permissions
.values_list('pk', flat=True)
),
}
r = self.client.post(self.url, post_data)
self.assertRedirects(r, reverse('kfet.account.group'))
self.group1.refresh_from_db()
self.assertEqual(self.group1.name, 'K-Fêt Group42')