2017-08-10 15:02:08 +02:00
|
|
|
import json
|
2017-05-23 21:38:53 +02:00
|
|
|
from decimal import Decimal
|
|
|
|
|
2017-08-10 15:02:08 +02:00
|
|
|
from django.contrib.auth.models import Group, Permission
|
|
|
|
from django.core.urlresolvers import reverse
|
|
|
|
from django.test import Client, TestCase
|
2017-05-23 21:38:53 +02:00
|
|
|
from django.utils import timezone
|
|
|
|
|
2017-08-10 15:02:08 +02:00
|
|
|
from ..models import Account, Checkout, Operation, OperationGroup
|
2017-05-23 21:38:53 +02:00
|
|
|
|
2017-08-10 15:02:08 +02:00
|
|
|
from .testcases import ViewTestCaseMixin
|
|
|
|
from .utils import create_team, create_user
|
2017-05-23 21:38:53 +02:00
|
|
|
|
|
|
|
|
2017-08-10 15:02:08 +02:00
|
|
|
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')],
|
2017-05-23 21:38:53 +02:00
|
|
|
)
|
|
|
|
|
2017-08-10 15:02:08 +02:00
|
|
|
|
|
|
|
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']
|
|
|
|
|
2017-05-23 21:38:53 +02:00
|
|
|
# Dummy operations and operation groups
|
|
|
|
checkout = Checkout.objects.create(
|
2017-08-10 15:02:08 +02:00
|
|
|
created_by=team_acc, name="checkout",
|
2017-05-23 21:38:53 +02:00
|
|
|
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(
|
2017-08-10 15:02:08 +02:00
|
|
|
on_acc=user1_acc, checkout=checkout, at=at, is_cof=False,
|
2017-05-23 21:38:53 +02:00
|
|
|
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')
|
|
|
|
)
|
|
|
|
|
2017-08-10 15:02:08 +02:00
|
|
|
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):
|
2017-05-23 21:38:53 +02:00
|
|
|
client = Client()
|
2017-08-10 15:02:08 +02:00
|
|
|
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')
|