def test_cancel_outage(self): # create outage start = datetime.now() end = start + timedelta(hours=1) data = self.get_outage_data(title="Outage", start=start, end=end, tool_name=tool.name) login_as_staff(self.client) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEquals(response.status_code, 200) outage = ScheduledOutage.objects.get(title="Outage") self.assertTrue(outage.id) # regular user should not be able to delete outage login_as_user(self.client) response = self.client.get(reverse('cancel_outage', kwargs={'outage_id': 999}), {}, follow=True) test_response_is_landing_page(self, response) self.assertTrue(ScheduledOutage.objects.get(pk=outage.id).id, outage.id) login_as_staff(self.client) # get should fail response = self.client.get(reverse('cancel_outage', kwargs={'outage_id': 999}), {}, follow=True) self.assertEquals(response.status_code, 405) # test wrong id response = self.client.post(reverse('cancel_outage', kwargs={'outage_id':999}), {}, follow=True) self.assertEquals(response.status_code, 404) response = self.client.post(reverse('cancel_outage', kwargs={'outage_id': outage.id}), {}, follow=True) self.assertEquals(response.status_code, 200) self.assertEquals(ScheduledOutage.objects.all().count(), 0)
def test_farewell_screen_fails(self): response = self.client.post(reverse('farewell_screen', kwargs={'door_id': door.id}), follow=True) test_response_is_failed_login(self, response) login_as_user(self.client) response = self.client.post(reverse('farewell_screen', kwargs={'door_id': door.id}), follow=True) test_response_is_landing_page( self, response) # landing since we don't have the right credentials login_as_user_with_permissions(self.client, ['change_areaaccessrecord']) response = self.client.post(reverse('farewell_screen', kwargs={'door_id': door.id}), follow=True) self.assertEqual(response.status_code, 405) # POST isn't accepted, only GET response = self.client.get(reverse('farewell_screen', kwargs={'door_id': 999}), follow=True) self.assertEqual(response.status_code, 404) # wrong door id response = self.client.get(reverse('farewell_screen', kwargs={'door_id': door.id}), follow=True) self.assertEqual(response.status_code, 200) # All good now self.assertTrue("farewell_screen" in response.request['PATH_INFO'])
def test_resize_outage(self): # create outage start = datetime.now() end = start + timedelta(hours=1) data = self.get_outage_data(title="Outage", start=start, end=end, tool_name=tool.name) login_as_staff(self.client) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEquals(response.status_code, 200) outage = ScheduledOutage.objects.get(title="Outage") self.assertTrue(outage.id) # regular user should not be able to resize outage login_as_user(self.client) response = self.client.get(reverse('resize_outage'), {}, follow=True) test_response_is_landing_page(self, response) self.assertTrue(ScheduledOutage.objects.get(pk=outage.id).id, outage.id) # back to staff mode login_as_staff(self.client) # test wrong delta response = self.client.post(reverse('resize_outage'), {'delta':'asd', 'id': outage.id}, follow=True) self.assertEquals(response.status_code, 400) self.assertEquals(response.content.decode(), "Invalid delta") # test no outage id response = self.client.post(reverse('resize_outage'), {'delta': 10}, follow=True) self.assertEquals(response.status_code, 404) self.assertEquals(response.content.decode(), "The outage that you wish to modify doesn't exist!") # test resize to less than original time response = self.client.post(reverse('resize_outage'), {'delta': -60, 'id': outage.id}, follow=True) self.assertEquals(response.status_code, 400) self.assertTrue('Outage start time' in response.content.decode()) self.assertTrue('must be before the end time' in response.content.decode()) # create a reservation and try to resize outage to overlap reservation start_reservation = end + timedelta(hours=1) end_reservation = start_reservation + timedelta(hours=1) Reservation.objects.create(user=owner, creator=owner, tool=tool, start=start_reservation, end=end_reservation, short_notice=False) response = self.client.post(reverse('resize_outage'), {'delta': 61, 'id': outage.id}, follow=True) self.assertEquals(response.status_code, 400) self.assertEquals(response.content.decode(), "Your scheduled outage coincides with a reservation that already exists. Please choose a different time.") # test reduce outage time by 10 min response = self.client.post(reverse('resize_outage'), {'delta': -10, 'id':outage.id}, follow=True) self.assertEquals(response.status_code, 200) self.assertEquals(ScheduledOutage.objects.get(pk=outage.id).end, outage.end - timedelta(minutes=10)) # test increase outage time by 10 min outage = ScheduledOutage.objects.get(pk=outage.id) response = self.client.post(reverse('resize_outage'), {'delta': 10, 'id': outage.id}, follow=True) self.assertEquals(response.status_code, 200) self.assertEquals(ScheduledOutage.objects.get(pk=outage.id).end, outage.end + timedelta(minutes=10))
def test_new_area_record_get(self): user = login_as_user(self.client) response = self.client.get(reverse('new_area_access_record'), data={'customer': user.id}, follow=True) test_response_is_landing_page(self, response) staff = login_as_staff(self.client) user.is_active = False user.save() response = self.client.get(reverse('new_area_access_record'), data={'customer': user.id}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue("Oops! Something went wrong" in str(response.content)) self.assertTrue("is inactive" in str(response.content)) # user is inactive user.is_active = True user.save() response = self.client.get(reverse('new_area_access_record'), data={'customer': user.id}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue("Oops! Something went wrong" in str(response.content)) self.assertTrue( "does not have any active projects to bill area access" in str(response.content)) # user does not have active projects user.projects.add( Project.objects.create( name="Project1", account=Account.objects.create(name="Account1"))) user.save() response = self.client.get(reverse('new_area_access_record'), data={'customer': user.id}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue("Oops! Something went wrong" in str(response.content)) self.assertTrue("does not have access to any billable NanoFab areas" in str(response.content)) # user does not have access user.physical_access_levels.add( PhysicalAccessLevel.objects.create( name="cleanroom access", area=area, schedule=PhysicalAccessLevel.Schedule.ALWAYS)) user.save() response = self.client.get(reverse('new_area_access_record'), data={'customer': user.id}, follow=True) self.assertEqual(response.status_code, 200) self.assertFalse("Oops! Something went wrong" in str(response.content))
def test_outage_policy_problems(self): start = datetime.now() end = start - timedelta(hours=1) data = self.get_outage_data(start=start, end=end, tool_name=tool.name) # regular user should not be able to create outage login_as_user(self.client) response = self.client.get(reverse('create_outage'), {}, follow=True) test_response_is_landing_page(self, response) # back to staff mode login_as_staff(self.client) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEquals(response.status_code, 400) self.assertEquals(response.content.decode(), "The request parameters have an end time that precedes the start time.") # fix time end = (start + timedelta(hours=1)) # Create a reservation and try to schedule an outage at the same time Reservation.objects.create(user=owner, creator=owner, tool=tool, start=start, end=end, short_notice=False) data = self.get_outage_data(start=start, end=end, tool_name=tool.name) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEquals(response.status_code, 400) self.assertEquals(response.content.decode(), "Your scheduled outage coincides with a reservation that already exists. Please choose a different time.") # try to schedule an outage that starts before but ends slightly after the reservation starts data = self.get_outage_data(start=start-timedelta(hours=1), end=end-timedelta(minutes=59), tool_name=tool.name) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEquals(response.status_code, 400) self.assertEquals(response.content.decode(), "Your scheduled outage coincides with a reservation that already exists. Please choose a different time.") # try to schedule an outage that starts slightly before the reservation ends data = self.get_outage_data(start=start + timedelta(minutes=59), end=end + timedelta(hours=1), tool_name=tool.name) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEquals(response.status_code, 400) self.assertEquals(response.content.decode(), "Your scheduled outage coincides with a reservation that already exists. Please choose a different time.") # no title start = start + timedelta(hours=2) end = end + timedelta(hours=2) data = self.get_outage_data(start=start, end=end, tool_name=tool.name) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEquals(response.status_code, 200) # response code valid but form is sent back. let's make sure the outage was indeed NOT created self.assertEquals(ScheduledOutage.objects.all().count(), 0)
def move_outage(self, item_id: int, item_type: ReservationItemType): # create outage start = datetime.now() end = start + timedelta(hours=1) data = self.get_outage_data(title="Outage", start=start, end=end, item_id=item_id, item_type=item_type) login_as_staff(self.client) response = self.client.post(reverse('create_outage'), data, follow=True) self.assertEqual(response.status_code, 200) outage = ScheduledOutage.objects.get(title="Outage") self.assertTrue(outage.id) # regular user should not be able to move outage login_as_user(self.client) response = self.client.get(reverse('move_outage'), {}, follow=True) test_response_is_landing_page(self, response) self.assertTrue( ScheduledOutage.objects.get(pk=outage.id).id, outage.id) # back to staff mode login_as_staff(self.client) # test wrong delta response = self.client.post(reverse('move_outage'), { 'delta': 'asd', 'id': outage.id }, follow=True) self.assertEqual(response.status_code, 400) self.assertEqual(response.content.decode(), "Invalid delta") # test no outage id response = self.client.post(reverse('move_outage'), {'delta': 10}, follow=True) self.assertEqual(response.status_code, 404) self.assertEqual(response.content.decode(), "The outage that you wish to modify doesn't exist!") # create a reservation and try to move outage to overlap reservation start_reservation = end + timedelta(hours=1) end_reservation = start_reservation + timedelta(hours=1) if item_type == ReservationItemType.TOOL: Reservation.objects.create(user=owner, creator=owner, tool=tool, start=start_reservation, end=end_reservation, short_notice=False) elif item_type == ReservationItemType.AREA: Reservation.objects.create(user=owner, creator=owner, area=area, start=start_reservation, end=end_reservation, short_notice=False) response = self.client.post(reverse('move_outage'), { 'delta': 61, 'id': outage.id }, follow=True) self.assertEqual(response.status_code, 400) self.assertEqual( response.content.decode(), "Your scheduled outage coincides with a reservation that already exists. Please choose a different time." ) # test move outage 10 min earlier response = self.client.post(reverse('move_outage'), { 'delta': -10, 'id': outage.id }, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual( ScheduledOutage.objects.get(pk=outage.id).end, outage.end - timedelta(minutes=10)) self.assertEqual( ScheduledOutage.objects.get(pk=outage.id).start, outage.start - timedelta(minutes=10)) # test move outage 10 min later outage = ScheduledOutage.objects.get(pk=outage.id) response = self.client.post(reverse('move_outage'), { 'delta': 10, 'id': outage.id }, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual( ScheduledOutage.objects.get(pk=outage.id).end, outage.end + timedelta(minutes=10)) self.assertEqual( ScheduledOutage.objects.get(pk=outage.id).start, outage.start + timedelta(minutes=10)) outage.delete()
def test_staff_login_to_area(self): staff = login_as_staff(self.client) tablet_user = login_as_user_with_permissions(self.client, ['add_areaaccessrecord']) response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue("You are not a member of any active projects" in str( response.content)) # user does not have active projects staff.projects.add( Project.objects.create( name="Maintenance", account=Account.objects.create(name="Maintenance Account"))) staff.save() response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertTrue("Physical access denied" in str(response.content)) # create an area an allow staff access without granting it to them access = PhysicalAccessLevel.objects.create( allow_staff_access=True, name="cleanroom access", area=door.area, schedule=PhysicalAccessLevel.Schedule.ALWAYS) response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertTrue("You're logged in to the " in str(response.content)) # try to login again response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertTrue("already logged into" in str(response.content)) # user already logged in response = self.client.post(reverse('logout_of_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertEqual(response.status_code, 200) test_response_is_landing_page( self, response) # tablet user does not have permission to logout tablet_user.user_permissions.add( Permission.objects.get(codename='change_areaaccessrecord')) tablet_user.save() response = self.client.post(reverse('logout_of_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertTrue("now logged out of the" in str(response.content)) # now undo access and try explicitly access.allow_staff_access = False access.save() response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertTrue("Physical access denied" in str(response.content)) # also work by explicitly giving access to staff staff.physical_access_levels.add(access) staff.save() response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertTrue("You're logged in to the " in str(response.content)) self.assertTrue( AreaAccessRecord.objects.filter( area=door.area, customer=User.objects.get( badge_number=staff.badge_number)).exists())
def test_area_access_page_by_user(self): login_as_user(self.client) response = self.client.get(reverse('area_access'), {}, follow=True) test_response_is_landing_page( self, response) # since user is not staff, it should redirect to landing
def test_login_to_area(self): response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), follow=True) test_response_is_failed_login(self, response) login_as_user(self.client) response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), follow=True) test_response_is_landing_page( self, response) # landing since we don't have the right credentials user = login_as_user_with_permissions(self.client, ['add_areaaccessrecord']) response = self.client.get(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertEqual(response.status_code, 405) # GET isn't accepted, only POST response = self.client.post(reverse('login_to_area', kwargs={'door_id': 999}), follow=True) self.assertEqual(response.status_code, 404) # wrong door id response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), follow=True) self.assertContains(response, "Your badge wasn't recognized") response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': 999}, follow=True) self.assertContains(response, "Your badge wasn't recognized") response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertContains( response=response, text="You are not a member of any active projects", status_code=200) # user does not have active projects user.projects.add( Project.objects.create( name="Project1", account=Account.objects.create(name="Account1"))) user.save() response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertContains(response=response, text="Physical access denied", status_code=200) # user does not have access user.physical_access_levels.add( PhysicalAccessLevel.objects.create( name="cleanroom access", area=door.area, schedule=PhysicalAccessLevel.Schedule.ALWAYS)) user.save() door.area.maximum_capacity = 1 door.area.save() # add a logged in person so capacity is reached AreaAccessRecord.objects.create( area=door.area, customer=User.objects.create(username='******', first_name='Test', last_name='Staff', is_staff=True, badge_number=2222), project=Project.objects.get(name="Project1"), start=datetime.now()) staff = User.objects.create(username='******', first_name='Test', last_name='Staff', is_staff=True, badge_number=11111) staff.projects.add(Project.objects.get(name="Project1")) staff.physical_access_levels.add( PhysicalAccessLevel.objects.get(name="cleanroom access")) staff.save() self.client.force_login(user=user) response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertContains(response, "This area has reached its maximum capacity.") # staff can still login response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': staff.badge_number}, follow=True) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertContains(response=response, text="You're logged in to the ", status_code=200) self.assertTrue( AreaAccessRecord.objects.filter( area=door.area, customer=User.objects.get( badge_number=staff.badge_number)).exists()) # try again user, should fail response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertContains(response, "This area has reached its maximum capacity.") # increase capacity so user can login door.area.maximum_capacity = 5 door.area.save() response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertContains(response=response, text="You're logged in to the ", status_code=200) self.assertTrue( AreaAccessRecord.objects.filter( area=door.area, customer=User.objects.get( badge_number=user.badge_number)).exists())
def test_login_to_area(self): response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), follow=True) test_response_is_login_page(self, response) login_as_user(self.client) response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), follow=True) test_response_is_landing_page( self, response) # landing since we don't have the right credentials user = login_as_user_with_permissions(self.client, ['add_areaaccessrecord']) response = self.client.get(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertEqual(response.status_code, 405) # GET isn't accepted, only POST response = self.client.post(reverse('login_to_area', kwargs={'door_id': 999}), follow=True) self.assertEqual(response.status_code, 404) # wrong door id response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), follow=True) self.assertTrue( "Your badge wasn\\'t recognized" in str(response.content)) response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': 999}, follow=True) self.assertTrue( "Your badge wasn\\'t recognized" in str(response.content)) response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertTrue("You are not a member of any active projects" in str( response.content)) # user does not have active projects user.projects.add( Project.objects.create( name="Project1", account=Account.objects.create(name="Account1"))) user.save() response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertTrue("Physical access denied" in str(response.content)) # user does not have access user.physical_access_levels.add( PhysicalAccessLevel.objects.create( name="cleanroom access", area=door.area, schedule=PhysicalAccessLevel.Schedule.ALWAYS)) user.save() response = self.client.post(reverse('login_to_area', kwargs={'door_id': door.id}), data={'badge_number': user.badge_number}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue( f"login_to_area/{door.id}" in response.request['PATH_INFO']) self.assertTrue("You're logged in to the " in str(response.content)) self.assertTrue( AreaAccessRecord.objects.filter( area=door.area, customer=User.objects.get( badge_number=user.badge_number)).exists())