def test_get_rtt_usage(self): from pyvac.models import User user = User.by_login(self.session, 'jdoe') self.assertIsInstance(user, User) self.assertEqual(user.login, 'jdoe') self.assertEqual(user.name, 'John Doe') self.assertEqual(user.role, 'user') with freeze_time( '2014-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime(2014, 1, 1) expected = { 'allowed': 10, 'left': 9.5, 'state': 'warning', 'taken': 0.5, 'year': 2014 } self.assertEqual(user.get_rtt_usage(self.session), expected) # no RTT for us country user = User.by_login(self.session, 'manager3') self.assertIsInstance(user, User) self.assertEqual(user.country, 'us') self.assertIsNone(user.get_rtt_usage(self.session))
def test_cp_validate_request(self): from pyvac.models import CPVacation, User date_start = datetime.now() - relativedelta(months=3) date_end = datetime.now() + relativedelta(months=3) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=7) with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool1 = mock_pool(12.48, date_start, date_end) mocked_pool2 = mock_pool(0, date_start, date_end) mock_foo.return_value = { 'CP acquis': mocked_pool1, 'CP restant': mocked_pool2 } user = User.by_login(self.session, 'jdoe') self.assertIsInstance(user, User) cp_pool = user.pool.get('CP acquis') self.assertTrue(cp_pool) cp_pool = user.pool.get('CP restant') self.assertTrue(cp_pool) days = 3 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPVacation.validate_request(user, None, days, date_from, date_to) self.assertEqual(err, None) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=7) with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool1 = mock_pool(12.48, date_start, date_end) mocked_pool2 = mock_pool(0, date_start, date_end) mock_foo.return_value = { 'CP acquis': mocked_pool1, 'CP restant': mocked_pool2 } user = User.by_login(self.session, 'jdoe') self.assertIsInstance(user, User) cp_pool = user.pool.get('CP acquis') self.assertTrue(cp_pool) cp_pool = user.pool.get('CP restant') self.assertTrue(cp_pool) days = 3 date_from = datetime.now().replace(year=datetime.now().year + 2) # noqa date_to = date_from + relativedelta(days=3) err = CPVacation.validate_request(user, None, days, date_from, date_to) msg = 'CP can only be used until %s.' % user.pool[ 'CP acquis'].date_end.strftime('%d/%m/%Y') # noqa self.assertEqual(err, msg)
def test_get_rtt_taken_year(self): from pyvac.models import User user = User.by_login(self.session, u'jdoe') self.assertIsInstance(user, User) self.assertEqual(user.login, u'jdoe') self.assertEqual(user.name, u'John Doe') self.assertEqual(user.role, u'user') self.assertEqual(user.get_rtt_taken_year(self.session, 2014), 0.5) # no RTT for us country user = User.by_login(self.session, u'manager3') self.assertIsInstance(user, User) self.assertEqual(user.country, u'us') self.assertEqual(user.get_rtt_taken_year(self.session, 2014), 0)
def test_by_name_country_rtt_ok(self): from pyvac.models import User, VacationType jdoe = User.by_login(self.session, u"jdoe") with freeze_time("2014-12-25", ignore=["celery", "psycopg2", "sqlalchemy", "icalendar"]): vac = VacationType.by_name_country(self.session, u"RTT", jdoe.country) self.assertEqual(vac, 10)
def test_get_rtt_usage(self): from pyvac.models import User user = User.by_login(self.session, u"jdoe") self.assertIsInstance(user, User) self.assertEqual(user.login, u"jdoe") self.assertEqual(user.name, u"John Doe") self.assertEqual(user.role, u"user") with freeze_time("2014-12-25", ignore=["celery", "psycopg2", "sqlalchemy", "icalendar"]): expected = {"allowed": 10, "left": 9.5, "state": "warning", "taken": 0.5, "year": 2014} self.assertEqual(user.get_rtt_usage(self.session), expected) # no RTT for us country user = User.by_login(self.session, u"manager3") self.assertIsInstance(user, User) self.assertEqual(user.country, u"us") self.assertIsNone(user.get_rtt_usage(self.session))
def test_post_send_rtt_usage_not_enough_ko(self): self.config.testing_securitypolicy(userid=u'janedoe', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool = mock_pool(0.5, datetime(2014, 1, 1), datetime(2014, 12, 31)) mock_foo.return_value = {'RTT': mocked_pool} user = User.by_login(self.session, u'janedoe') rtt_pool = user.pool.get('RTT') self.assertTrue(rtt_pool) request = self.create_request({'days': 1, 'date_from': '05/05/2015 - 05/05/2015', # noqa 'type': '2', 'breakdown': 'FULL', }) view = Send(request)() self.assertIsRedirect(view) # no new requests were made self.assertEqual(Request.find(self.session, count=True), total_req) expected = ['error;You only have 0.5 RTT to use.'] self.assertEqual(request.session.pop_flash(), expected)
def test_post_send_rtt_holiday_ok(self): self.config.testing_securitypolicy(userid=u'janedoe', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) janedoe = User.by_login(self.session, u'janedoe') old_created_at = janedoe.created_at janedoe.created_at = janedoe.created_at.replace(month=1) janedoe.get_rtt_usage(self.session) with freeze_time('2016-12-01', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): request = self.create_request({ 'days': 5, 'date_from': '11/07/2016 - 15/07/2016', 'type': '2', 'breakdown': 'FULL', }) view = Send(request)() self.assertIsRedirect(view) self.assertEqual(Request.find(self.session, count=True), total_req + 1) last_req = Request.find(self.session)[-1] self.assertEqual(last_req.status, u'PENDING') self.assertEqual(last_req.days, 4.0) janedoe.created_at = old_created_at self.delete_last_req(last_req)
def test_post_send_rtt_usage_not_enough_ko(self): self.config.testing_securitypolicy(userid=u'janedoe', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) def mock_get_rtt_usage(self, session): """ Get rrt usage for a user """ return {'allowed': 10, 'left': 0.5, 'state': 'error', 'taken': 9.5, 'year': 2014} orig_get_rtt_usage = User.get_rtt_usage User.get_rtt_usage = mock_get_rtt_usage user = User.by_login(self.session, u'janedoe') rtt_data = user.get_rtt_usage(self.session) self.assertTrue(rtt_data) request = self.create_request({'days': 1, 'date_from': '05/05/2015 - 05/05/2015', 'type': '2', 'breakdown': 'FULL', }) view = Send(request)() self.assertIsRedirect(view) # no new requests were made self.assertEqual(Request.find(self.session, count=True), total_req) expected = ['error;You only have 0.5 RTT to use.'] self.assertEqual(request.session.pop_flash(), expected) User.get_rtt_usage = orig_get_rtt_usage
def test_post_send_rtt_year_ko(self): self.config.testing_securitypolicy(userid=u'janedoe', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool = mock_pool(10, datetime(2015, 1, 1), datetime(2015, 12, 31)) mock_foo.return_value = {'RTT': mocked_pool} user = User.by_login(self.session, u'janedoe') rtt_pool = user.pool.get('RTT') self.assertTrue(rtt_pool) request = self.create_request({ 'days': 1, 'date_from': '06/05/2016 - 06/05/2016', 'type': '2', 'breakdown': 'AM', }) view = Send(request)() self.assertIsRedirect(view) # no new requests were made self.assertEqual(Request.find(self.session, count=True), total_req) expected = ['error;RTT can only be used between 01/01/2015 and 31/12/2015'] # noqa self.assertEqual(request.session.pop_flash(), expected)
def test_post_send_rtt_usage_empty_ok(self): self.config.testing_securitypolicy(userid=u'janedoe', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) def mock_get_rtt_usage(self, session): """ Get rrt usage for a user """ return orig_get_rtt_usage = User.get_rtt_usage User.get_rtt_usage = mock_get_rtt_usage user = User.by_login(self.session, u'janedoe') rtt_data = user.get_rtt_usage(self.session) self.assertIsNone(rtt_data) view = Send(self.create_request({ 'days': 1, 'date_from': '05/05/2015 - 05/05/2015', 'type': '2', 'breakdown': 'AM', }))() self.assertIsRedirect(view) self.assertEqual(Request.find(self.session, count=True), total_req + 1) User.get_rtt_usage = orig_get_rtt_usage
def test_cp_validate_request(self): from pyvac.models import CPVacation, User user = User.by_login(self.session, u'jdoe') self.assertIsInstance(user, User) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=7) pool = user.get_cp_usage(self.session) days = 3 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPVacation.validate_request(user, pool, days, date_from, date_to) self.assertEqual(err, None) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=7) pool = user.get_cp_usage(self.session) days = 3 date_from = datetime.now().replace(year=datetime.now().year + 2) date_to = date_from + relativedelta(days=3) err = CPVacation.validate_request(user, pool, days, date_from, date_to) msg = 'CP can only be used until 31/05/%d.' % pool['acquis']['expire'].year # noqa self.assertEqual(err, msg)
def test_by_manager(self): from pyvac.models import User, Request manager1 = User.by_login(self.session, u'manager1') requests = Request.by_manager(self.session, manager1) self.assertEqual(len(requests), 2) # take the first request = requests.pop() self.assertIsInstance(request, Request)
def test_by_country_ok(self): from pyvac.models import User, VacationType manager3 = User.by_login(self.session, u'manager3') vac_types = VacationType.by_country(self.session, manager3.country) self.assertEqual(len(vac_types), 5) # take the first vac_type = vac_types.pop() self.assertIsInstance(vac_type, VacationType)
def test_alias_ko(self): from pyvac.models import Sudoer from pyvac.models import User user = User.by_login(self.session, u'jdoe') self.assertIsInstance(user, User) sudoers = Sudoer.alias(self.session, user) self.assertEqual(sudoers, [])
def test_by_name_country_rtt_ok(self): from pyvac.models import User, VacationType jdoe = User.by_login(self.session, u'jdoe') with freeze_time('2014-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): vac = VacationType.by_name_country(self.session, u'RTT', jdoe.country) self.assertEqual(vac, 10)
def test_get_rtt_usage(self): from pyvac.models import User user = User.by_login(self.session, u'jdoe') self.assertIsInstance(user, User) self.assertEqual(user.login, u'jdoe') self.assertEqual(user.name, u'John Doe') self.assertEqual(user.role, u'user') with freeze_time('2014-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): expected = {'allowed': 10, 'left': 9.5, 'state': 'warning', 'taken': 0.5, 'year': 2014} self.assertEqual(user.get_rtt_usage(self.session), expected) # no RTT for us country user = User.by_login(self.session, u'manager3') self.assertIsInstance(user, User) self.assertEqual(user.country, u'us') self.assertIsNone(user.get_rtt_usage(self.session))
def test_by_name_country_rtt_ok(self): from pyvac.models import User, VacationType jdoe = User.by_login(self.session, u'jdoe') with freeze_time('2014-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): kwargs = {'session': self.session, 'name': u'RTT', 'country': jdoe.country} vac = VacationType.by_name_country(**kwargs) self.assertEqual(vac.acquired(**kwargs), 10)
def test_alias(self): from pyvac.models import Sudoer from pyvac.models import User user = User.by_login(self.session, u'janedoe') self.assertIsInstance(user, User) sudoers = Sudoer.alias(self.session, user) self.assertEqual(len(sudoers), 1) sudoer = sudoers[0] self.assertIsInstance(sudoer, User)
def test_by_user_outdated(self): from pyvac.models import User, Request user1 = User.by_login(self.session, u"jdoe") requests = Request.by_user(self.session, user1) self.assertEqual(len(requests), 5) outdated = Request.by_id(self.session, 7) self.assertIsInstance(outdated, Request) self.assertEqual(outdated.user, user1) self.assertFalse(outdated in requests)
def test_by_manager(self): from pyvac.models import User, Request manager1 = User.by_login(self.session, u'manager1') with freeze_time('2015-03-01', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): requests = Request.by_manager(self.session, manager1) self.assertEqual(len(requests), 8) # take the first request = requests.pop() self.assertIsInstance(request, Request)
def test_by_manager(self): from pyvac.models import User, Request manager1 = User.by_login(self.session, u'manager1') with freeze_time('2015-03-01', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): requests = Request.by_manager(self.session, manager1) self.assertEqual(len(requests), 10) # take the first request = requests.pop() self.assertIsInstance(request, Request)
def test_lu_holidays_recovered(self): from pyvac.models import User user = User.by_login(self.session, u'sarah.doe') self.assertIsInstance(user, User) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mockfoo: mockfoo.return_value = datetime.now() - relativedelta(months=5) to_recover = user.get_lu_holiday(datetime(2017, 1, 25, 0, 0)) # there is a holiday on 25 dec. which should be available self.assertEqual(to_recover, [datetime(2016, 12, 25, 0, 0), datetime(2017, 1, 1, 0, 0)])
def test_by_user_outdated(self): from pyvac.models import User, Request user1 = User.by_login(self.session, u'jdoe') with freeze_time('2015-08-01', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): requests = Request.by_user(self.session, user1) self.assertEqual(len(requests), 8) outdated = Request.by_id(self.session, 7) self.assertIsInstance(outdated, Request) self.assertEqual(outdated.user, user1) self.assertFalse(outdated in requests)
def test_by_user(self): from pyvac.models import User, Request user1 = User.by_login(self.session, u'jdoe') requests = Request.by_user(self.session, user1) self.assertEqual(len(requests), 2) # take the first request = requests[0] self.assertIsInstance(request, Request) self.assertEqual(request.days, 5) self.assertEqual(request.type, u'CP') self.assertEqual(request.status, u'PENDING') self.assertEqual(request.notified, False) self.assertEqual(request.date_from, datetime(2014, 4, 10, 0, 0)) self.assertEqual(request.date_to, datetime(2014, 4, 14, 0, 0))
def test_post_create_ok(self): from pyvac.views.account import Create from pyvac.models import User view = Create(self.create_request({'form.submitted': u'1', 'user.login': u'dummy_new', 'user.password': u'secret', 'user.firstname': u'', 'user.lastname': u'', 'user.email': u'*****@*****.**', 'confirm_password': u'secret', 'groups': [u'1', u'2'] }))() self.assertIsRedirect(view) self.account_todelete.append(User.by_login(self.session, u'dummy_new').id)
def test_by_user(self): from pyvac.models import User, Request user1 = User.by_login(self.session, u'jdoe') with freeze_time('2015-08-01', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): requests = Request.by_user(self.session, user1) self.assertEqual(len(requests), 8) # take the first request = requests[-1] self.assertIsInstance(request, Request) self.assertEqual(request.days, 5) self.assertEqual(request.type, u'CP') self.assertEqual(request.status, u'PENDING') self.assertEqual(request.notified, False) self.assertEqual(request.date_from, datetime(2015, 4, 10, 0, 0)) self.assertEqual(request.date_to, datetime(2015, 4, 14, 0, 0))
def test_post_create_ok(self): from pyvac.views.account import Create from pyvac.models import User view = Create( self.create_request({ 'form.submitted': u'1', 'user.login': u'dummy_new', 'user.password': u'secret', 'user.firstname': u'', 'user.lastname': u'', 'user.email': u'*****@*****.**', 'confirm_password': u'secret', 'groups': [u'1', u'2'] }))() self.assertIsRedirect(view) self.account_todelete.append( User.by_login(self.session, u'dummy_new').id)
def populate(engine, ldap): """ Retrieve users from ldap directory and import them in local database """ session = DBSession() # retrieve managers from dedicated group managers = ldap.list_manager() # retrieve users searchFilter = '(&(objectClass=inetOrgPerson)(employeetype=Employee))' required = ['objectClass', 'employeeType', 'cn', 'givenName', 'sn', 'manager', 'mail', 'ou', 'uid', 'userPassword'] users = ldap._search(searchFilter, required) for user_dn, user_entry in users: user_data = ldap.parse_ldap_entry(user_dn, user_entry) if not user_data or not user_data.get('login'): continue login = user_data['login'].decode('utf-8') # check what type of user it is group = 'user' # if it's a manager he should be in manager group if user_data['dn'] in managers: group = 'manager' # if it's an admin he should be in admin group what = '(member=%s)' % user_data['dn'] if len(ldap._search_admin(what, None)) > 0: group = 'admin' user = User.by_login(session, login) if not user: user = User.create_from_ldap(session, user_data, group) else: # update user with ldap informations in case it changed user.email = user_data['email'].decode('utf-8') user.firstname = user_data['firstname'].decode('utf-8') user.lastname = user_data['lastname'].decode('utf-8') user.manager_dn = user_data['manager_dn'].decode('utf-8') user.dn = user_data['dn'].decode('utf-8') user.role = group session.add(user) session.commit()
def populate(engine, ldap): """ Retrieve users from ldap directory and import them in local database """ session = DBSession() # retrieve managers from dedicated group managers = ldap.list_manager() # retrieve users searchFilter = '(&(objectClass=inetOrgPerson)(employeetype=Employee))' required = ['objectClass', 'employeeType', 'cn', 'givenName', 'sn', 'manager', 'mail', 'ou', 'uid', 'userPassword'] users = ldap._search(searchFilter, required) for user_dn, user_entry in users: user_data = ldap.parse_ldap_entry(user_dn, user_entry) login = user_data['login'].decode('utf-8') # check what type of user it is group = u'user' # if it's a manager he should be in manager group if user_data['dn'] in managers: group = u'manager' # if it's an admin he should be in admin group what = '(member=%s)' % user_data['dn'] if len(ldap._search_admin(what, None)) > 0: group = u'admin' user = User.by_login(session, login) if not user: user = User.create_from_ldap(session, user_data, group) else: # update user with ldap informations in case it changed user.email = user_data['email'].decode('utf-8') user.firstname = user_data['firstname'].decode('utf-8') user.lastname = user_data['lastname'].decode('utf-8') user.manager_dn = user_data['manager_dn'].decode('utf-8') user.dn = user_data['dn'].decode('utf-8') user.role = group session.add(user) session.commit()
def locale_negotiator(request): """ Locale negotiator for pyramid views. This version differs from Pyramid's :py:func:`default_locale_negotiator <pyramid.i18n.default_locale_negotiator>` in that it gets the locale from the url parameter or the cookie, and fallbacks to the user's lang. """ login = authenticated_userid(request) if login: from pyvac.models import DBSession, User session = DBSession() user = User.by_login(session, login) if user.country == 'us': return 'en' return user.country return None
def test_post_send_sudo_unknown_ok(self): self.config.testing_securitypolicy(userid=u'admin', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) view = Send(self.create_request({'days': 4, 'date_from': '05/05/2015 - 10/05/2015', 'type': '1', 'breakdown': 'FULL', 'sudo_user': '******', }))() self.assertIsRedirect(view) self.assertEqual(Request.find(self.session, count=True), total_req + 1) last_req = Request.find(self.session)[-1] admin_user = User.by_login(self.session, u'admin') self.assertEqual(last_req.user_id, admin_user.id) self.assertEqual(last_req.status, u'PENDING') self.assertFalse(last_req.notified)
def test_post_send_sudo_unknown_ok(self): self.config.testing_securitypolicy(userid=u'admin', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) view = Send(self.create_request({ 'days': 4, 'date_from': '05/05/2015 - 10/05/2015', 'type': '1', 'breakdown': 'FULL', 'sudo_user': '******', }))() self.assertIsRedirect(view) self.assertEqual(Request.find(self.session, count=True), total_req + 1) last_req = Request.find(self.session)[-1] admin_user = User.by_login(self.session, u'admin') self.assertEqual(last_req.user_id, admin_user.id) self.assertEqual(last_req.status, u'PENDING') self.assertFalse(last_req.notified) self.delete_last_req(last_req)
def locale_negotiator(request): """ Locale negotiator for pyramid views. This version differs from Pyramid's :py:func:`default_locale_negotiator <pyramid.i18n.default_locale_negotiator>` in that it gets the locale from the url parameter or the cookie, and fallbacks to the user's lang. """ login = authenticated_userid(request) if login: from pyvac.models import DBSession, User session = DBSession() user = User.by_login(session, login) if user.country == 'us': return 'en' if user.country == 'zh': return 'en' return user.country return None
def test_post_send_sudo_other_ok(self): self.config.testing_securitypolicy(userid='admin', permissive=True) from pyvac.models import Request, User from pyvac.views.request import Send total_req = Request.find(self.session, count=True) view = Send(self.create_request({ 'days': 4, 'date_from': '05/05/2015 - 10/05/2015', 'type': '1', 'breakdown': 'FULL', 'sudo_user': '******', }))() self.assertIsRedirect(view) self.assertEqual(Request.find(self.session, count=True), total_req + 1) last_req = Request.find(self.session)[-1] target_user = User.by_login(self.session, 'manager1') self.assertEqual(last_req.user_id, target_user.id) self.assertEqual(last_req.status, 'APPROVED_ADMIN') self.assertTrue(last_req.notified) self.delete_last_req(last_req)
def test_lu_validate_request(self): from pyvac.models import CPLUVacation, CompensatoireVacation, User user = User.by_login(self.session, u'sarah.doe') self.assertIsInstance(user, User) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) pool = user.get_cp_usage(self.session) days = 3 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, pool, days, date_from, date_to) self.assertEqual(err, None) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=2) pool = user.get_cp_usage(self.session) days = 3 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, pool, days, date_from, date_to) msg = 'You need 3 months of seniority before using your CP' self.assertEqual(err, msg) with freeze_time('2017-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) # noqa pool = user.get_cp_usage(self.session) days = 3 date_from = datetime.now().replace(year=datetime.now().year + 1) # noqa date_to = date_from + relativedelta(days=3) err = CPLUVacation.validate_request(user, pool, days, date_from, date_to) msg = 'CP can only be used until 31/03/%d.' % pool['acquis']['expire'].year # noqa self.assertEqual(err, msg) with freeze_time('2016-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) # noqa pool = user.get_cp_usage(self.session) days = 250 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, pool, days, date_from, date_to) msg = 'You only have 164 CP to use.' self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) pool = user.get_cp_usage(self.session) # lower the amount of pool left pool['acquis']['left'] = 0 pool['restant']['left'] = 0 days = 20 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, pool, days, date_from, date_to) msg = 'No CP left to take.' self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 3 date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, None) msg = ('You can only use 1 Compensatory holiday at a time, ' 'for a full day.') self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 0.5 date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, None) msg = ('You can only use 1 Compensatory holiday at a time, ' 'for a full day.') self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 1 date_from = datetime(2016, 12, 30) err = CompensatoireVacation.validate_request(user, None, days, date_from, None) msg = '30/12/2016 is not a valid value for Compensatory vacation' self.assertEqual(err, msg) with freeze_time('2017-01-20', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 1 date_to = datetime(2016, 12, 20) date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, date_to) msg = 'You must request a date after 25/12/2016' self.assertEqual(err, msg) with freeze_time('2017-01-20', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 1 date_to = datetime(2017, 4, 1) date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, date_to) msg = ('You must request a date in the following 3 months ' 'after 25/12/2016') self.assertEqual(err, msg)
def test_post_send_n_1_ok(self): self.config.testing_securitypolicy(userid=u'admin', permissive=True) from pyvac.models import Request, User, CPVacation from pyvac.views.request import Send total_req = Request.find(self.session, count=True) jdoe = User.by_login(self.session, u'jdoe') with freeze_time('2016-12-23', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) # noqa CPVacation.users_base = {'jdoe': {'n_1': 20, 'restants': 25}} CPVacation.epoch = datetime(2016, 6, 1) pool = jdoe.get_cp_usage(self.session) self.assertEqual(pool['n_1']['left'], 20) request = self.create_request({ 'days': 5, 'date_from': '09/01/2017 - 13/01/2017', 'type': '1', 'breakdown': 'FULL', 'sudo_user': '******', }) view = Send(request)() self.session.commit() self.assertIsRedirect(view) self.assertEqual(Request.find(self.session, count=True), total_req + 1) # noqa last_req = Request.find(self.session)[-1] self.assertEqual(last_req.user_id, jdoe.id) self.assertEqual(last_req.status, u'APPROVED_ADMIN') self.assertEqual(last_req.days, 5.0) pool = jdoe.get_cp_usage(self.session) self.assertEqual(pool['n_1']['left'], 15) self.delete_last_req(last_req) self.session.flush() self.session.commit() with freeze_time('2017-01-02', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) # noqa CPVacation.users_base = {'jdoe': {'n_1': 20, 'restants': 25}} CPVacation.epoch = datetime(2016, 6, 1) pool = jdoe.get_cp_usage(self.session) self.assertEqual(pool['n_1']['left'], 0) self.assertEqual(pool['restant']['left'], 25) request = self.create_request({ 'days': 5, 'date_from': '16/01/2017 - 20/01/2017', 'type': '1', 'breakdown': 'FULL', 'sudo_user': '******', }) view = Send(request)() self.session.commit() self.assertIsRedirect(view) self.assertEqual(Request.find(self.session, count=True), total_req + 1) # noqa last_req = Request.find(self.session)[-1] self.assertEqual(last_req.user_id, jdoe.id) self.assertEqual(last_req.status, u'APPROVED_ADMIN') self.assertEqual(last_req.days, 5.0) pool = jdoe.get_cp_usage(self.session) self.assertEqual(pool['n_1']['left'], 0) self.assertEqual(pool['restant']['left'], 20.0) self.delete_last_req(last_req)
def test_by_name_country_no_rtt_ko(self): from pyvac.models import User, VacationType manager3 = User.by_login(self.session, u'manager3') vac = VacationType.by_name_country(self.session, u'RTT', manager3.country) self.assertIsNone(vac)
def test_by_login_ko_mirrored(self): from pyvac.models import User user = User.by_login(self.session, u'johndo') self.assertEqual(user, None)
def test_lu_validate_request(self): from pyvac.models import CPLUVacation, CompensatoireVacation, User date_start = datetime.now() - relativedelta(months=3) date_end = datetime.now() + relativedelta(months=3) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool1 = mock_pool(200, date_start, date_end) mocked_pool2 = mock_pool(0, date_start, date_end) mock_foo.return_value = {'CP acquis': mocked_pool1, 'CP restant': mocked_pool2} user = User.by_login(self.session, u'sarah.doe') self.assertIsInstance(user, User) days = 3 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, None, days, date_from, date_to) self.assertEqual(err, None) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=2) with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool1 = mock_pool(200, date_start, date_end) mocked_pool2 = mock_pool(0, date_start, date_end) mock_foo.return_value = {'CP acquis': mocked_pool1, 'CP restant': mocked_pool2} user = User.by_login(self.session, u'sarah.doe') self.assertIsInstance(user, User) days = 3 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, None, days, date_from, date_to) msg = 'You need 3 months of seniority before using your CP' self.assertEqual(err, msg) with freeze_time('2017-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) # noqa with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool1 = mock_pool(200, date_start, date_end) mocked_pool2 = mock_pool(0, date_start, date_end) mock_foo.return_value = {'CP acquis': mocked_pool1, 'CP restant': mocked_pool2} user = User.by_login(self.session, u'sarah.doe') self.assertIsInstance(user, User) days = 3 date_from = datetime.now().replace(year=datetime.now().year + 1) # noqa date_to = date_from + relativedelta(days=3) err = CPLUVacation.validate_request(user, None, days, date_from, date_to) msg = 'CP can only be used until %s.' % user.pool['CP acquis'].date_end.strftime('%d/%m/%Y') # noqa self.assertEqual(err, msg) with freeze_time('2016-12-25', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) # noqa with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool1 = mock_pool(200, date_start, date_end) mocked_pool2 = mock_pool(0, date_start, date_end) mock_foo.return_value = {'CP acquis': mocked_pool1, 'CP restant': mocked_pool2} user = User.by_login(self.session, u'sarah.doe') self.assertIsInstance(user, User) days = 250 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, None, days, date_from, date_to) msg = 'You only have 200 CP to use.' self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) with patch('pyvac.models.User.pool', new_callable=PropertyMock) as mock_foo: mocked_pool1 = mock_pool(0, date_start, date_end) mocked_pool2 = mock_pool(0, date_start, date_end) mock_foo.return_value = {'CP acquis': mocked_pool1, 'CP restant': mocked_pool2} user = User.by_login(self.session, u'sarah.doe') self.assertIsInstance(user, User) days = 20 date_from = datetime.now() date_to = datetime.now() + relativedelta(days=3) err = CPLUVacation.validate_request(user, None, days, date_from, date_to) msg = 'No CP left to take.' self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 3 date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, None) msg = ('You can only use 1 Compensatory holiday at a time, ' 'for a full day.') self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 0.5 date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, None) msg = ('You can only use 1 Compensatory holiday at a time, ' 'for a full day.') self.assertEqual(err, msg) with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 1 date_from = datetime(2016, 12, 30) err = CompensatoireVacation.validate_request(user, None, days, date_from, None) msg = '30/12/2016 is not a valid value for Compensatory vacation' self.assertEqual(err, msg) with freeze_time('2017-01-20', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 1 date_to = datetime(2016, 12, 20) date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, date_to) msg = 'You must request a date after 25/12/2016' self.assertEqual(err, msg) with freeze_time('2017-01-20', ignore=['celery', 'psycopg2', 'sqlalchemy', 'icalendar']): with patch('pyvac.models.User.arrival_date', new_callable=PropertyMock) as mock_foo: mock_foo.return_value = datetime.now() - relativedelta(months=5) days = 1 date_to = datetime(2017, 4, 1) date_from = datetime(2016, 12, 25) err = CompensatoireVacation.validate_request(user, None, days, date_from, date_to) msg = ('You must request a date in the following 3 months ' 'after 25/12/2016') self.assertEqual(err, msg)