def test_master_search_only_service(self, _calculate_eta): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order make_order(client=make_client(), master=master, service=service, order_date=timezone.now() + delta(days=1), order_time=datetime.time(hour=10, minute=30)) # assume all slots are reachable _calculate_eta.return_value = 10 url = reverse(MasterSearchView.view_name) resp = self.client.get(f"{url}?service={service.id}&coordinates=10,20") self.assertEqual(resp.status_code, status.HTTP_200_OK) # no favorites in this test favorites = resp.data['favorites'] self.assertEqual(len(favorites), 0) others = resp.data['others'] # both do at least one service in the following week self.assertEqual(len(others), 1) # two days with slots day_one_slots = others[0]['available_slots'] self.assertEqual(len(day_one_slots), 2)
def test_list_master_orders(self): master = Master.objects.get(first_name='VASYA') # logging in as a master token, _ = Token.objects.get_or_create(master=master) self.client = APIClient() self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}') service = master.services.all()[0] # manually creating an order order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(1), order_time=datetime.time(hour=11, minute=00)) # manually creating an order order_2, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(1), order_time=datetime.time(hour=12, minute=00)) resp = self.client.get(reverse(OrderListCreateView.view_name)) self.assertEqual(resp.status_code, status.HTTP_200_OK) # two orders # TODO test serializers active = resp.data['active'] history = resp.data['history'] self.assertEqual(len(active), 2)
def test_served_once(self): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order order_client = make_client() # manually creating an order make_order(client=order_client, master=master, service=service, order_date=timezone.now() + delta(days=1), order_time=datetime.time(hour=10, minute=30)) self.assertEqual(master.times_served(order_client), 1)
def test_list_client_orders(self): master = Master.objects.get(first_name='VASYA') schedule = master.get_schedule(timezone.now() + delta(days=2)) schedule.delete() schedule = Schedule.objects.create(master=master, date=timezone.now() + delta(days=2)) schedule.save() TimeSlot.objects.create(time=Time.objects.create(hour=12, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=13, minute=00), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=13, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=14, minute=00), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=14, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=15, minute=00), taken=False, schedule=schedule) service = master.services.all()[0] # manually creating an order order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(1), order_time=datetime.time(hour=11, minute=00)) # manually creating an order order_2, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(2), order_time=datetime.time(hour=12, minute=30)) order_2, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(2), order_time=datetime.time(hour=14, minute=30)) order_3, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(1), order_time=datetime.time(hour=11, minute=30), status=OrderStatus.DONE) resp = self.client.get(reverse(OrderListCreateView.view_name)) self.assertEqual(resp.status_code, status.HTTP_200_OK) # two orders # TODO test serializers active = resp.data['active'] history = resp.data['history'] self.assertEqual(len(active), 3) self.assertEqual(len(history), 1)
def test_update_comment(self): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order # manually creating an order order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(1), order_time=datetime.time(hour=11, minute=00), payment_type=PaymentType.CASH, comment='LOL') order_1.time_started = timezone.now() order_1.status = OrderStatus.DONE order_1.save() self.assertEqual(order_1.comment, 'LOL') resp = self.client.patch(reverse(OrderUpdateCommentView.view_name, args=[order_1.id]), data={'comment': 'A new comment'}, format='json') self.assertEqual(resp.status_code, status.HTTP_200_OK) order = Order.objects.get(pk=order_1.id) self.assertEqual(order.comment, 'A new comment')
def test_complete_order_cash(self): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(1), order_time=datetime.time(hour=11, minute=00), payment_type=PaymentType.CASH) order_1.time_started = timezone.now() order_1.status = OrderStatus.STARTED order_1.save() resp = self.client.patch( reverse(CompleteOrderView.view_name, args=[order_1.id])) self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(resp.data['transaction_id'], None) # TODO test serializers order = Order.objects.get(pk=order_1.id) self.assertIsNotNone(order.time_taken) self.assertEqual(order.status, OrderStatus.DONE) master = Master.objects.get(first_name='VASYA') self.assertEqual( master.balance.on_hold, service.masters_share(self.client_object.tip_multiplier())) self.assertEqual(master.balance.debt, service.service_share())
def test_cancel_order_cash(self): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(2), order_time=datetime.time(hour=12, minute=30), payment_type=PaymentType.CASH) self.assertNotEqual(master.balance.future, 0) self.assertNotEqual(master.balance.debt, 0) resp = self.client.delete( reverse(OrderCancelView.view_name, args=[order_1.id])) self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) # two orders with self.assertRaises(Order.DoesNotExist): Order.objects.get(pk=order_1.id) master = Master.objects.get(pk=master.id) self.assertEqual(master.balance.future, 0) self.assertEqual(master.balance.debt, 0)
def setUp(self): make_everything() self.master_object = Master.objects.get(first_name='VASYA') self.client_object = make_client() self.order, _ = make_order(self.client_object, self.master_object.services.all()[0], self.master_object, order_date=timezone.now() + delta(days=1), order_time='11:30') self.user = self.client_object.user token, _ = Token.objects.get_or_create(client=self.client_object) self.client = APIClient() self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
def test_filtering_date_favorites(self): # manually creating an order with vasya vasya = Master.objects.get(first_name='VASYA') make_order(client=self.client_object, master=vasya, service=vasya.services.all()[0], order_date=timezone.now() + delta(days=1), order_time=datetime.time(hour=10, minute=30)) url = f"{reverse(MasterListCreateView.view_name)}?" \ f"date_range={utils.get_date(1)},{utils.get_date(8)}&" \ f"coordinates=10.03,12.43" resp = self.client.get(url) self.assertEqual(resp.status_code, status.HTTP_200_OK) # VASYA is favorite favorites = resp.data['favorites'] self.assertEqual(len(favorites), 1) self.assertEqual(favorites[0]['first_name'], 'VASYA') others = resp.data['others'] # PETYA is not # both do at least one service in the following week self.assertEqual(len(others), 1) self.assertEqual(others[0]['first_name'], 'PETYA')
def test_cancel_someone_elses_order(self): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=utils.get_date(1), order_time=datetime.time(hour=11, minute=00)) token, _ = Token.objects.get_or_create(client=make_client()) self.client = APIClient() self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}') resp = self.client.delete( reverse(OrderCancelView.view_name, args=[order_1.id])) self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
def test_start_order(self): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order order_date = utils.get_date(1, format_string=False) order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=order_date, order_time=datetime.time(hour=11, minute=00)) # we can only start it on the right day frozen = freeze_time(order_date.replace(hour=10, minute=30)) frozen.start() resp = self.client.patch( reverse(StartOrderView.view_name, args=[order_1.id])) frozen.stop() self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) # two orders # TODO test serializers order = Order.objects.get(pk=order_1.id) self.assertEqual(order.status, OrderStatus.STARTED) self.assertIsNotNone(order.time_started)
def test_cancel_order_too_late(self): master = Master.objects.get(first_name='VASYA') service = master.services.all()[0] # manually creating an order target_date = timezone.now() + delta(days=1) order_1, _ = make_order(client=self.client_object, master=master, service=service, order_date=target_date, order_time=datetime.time(hour=11, minute=00)) frozen = freeze_time(target_date.replace(hour=9, minute=0)) frozen.start() resp = self.client.delete( reverse(OrderCancelView.view_name, args=[order_1.id])) frozen.stop() # too late self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
def _make_everything(): # making an auth token vasya = make_master("VASYA", 11.0, about='a terrible master') petya = make_master("PETYA", 12.0) hands = make_category("Маникюр") feet = make_category("Педикюр") make_display_item(hands) make_display_item(feet) make_display_item(hands, feet, name='4hands', special=True) for service in hands.services.all(): vasya.services.add(service) vasya.save() token, _ = AppToken.objects.get_or_create(master=vasya, key='master_token') for service in feet.services.all(): petya.services.add(service) petya.save() # VASYA works on +1,+2,+3 does manicure, got three slots schedule = Schedule.objects.create(master=vasya, date=utils.get_date(1)) schedule.save() TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=00), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=30), taken=False, schedule=schedule) schedule = Schedule.objects.create(master=vasya, date=utils.get_date(2)) schedule.save() TimeSlot.objects.create(time=Time.objects.create(hour=10, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=00), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=12, minute=00), taken=False, schedule=schedule) schedule = Schedule.objects.create(master=vasya, date=utils.get_date(3)) schedule.save() TimeSlot.objects.create(time=Time.objects.create(hour=12, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=13, minute=00), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=13, minute=30), taken=False, schedule=schedule) # PETYA works on +2th, +3th does pedicure, got all slots on +2, none on +3 schedule = Schedule.objects.create(master=petya, date=utils.get_date(2)) schedule.save() TimeSlot.objects.create(time=Time.objects.create(hour=10, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=00), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=30), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=12, minute=30), taken=False, schedule=schedule) schedule = Schedule.objects.create(master=petya, date=utils.get_date(3)) schedule.save() client = make_client(first_name='client') client2 = make_client(first_name='client2') client3 = make_client(first_name='john doe') token, _ = AppToken.objects.get_or_create(client=client, key='client_token') order, _ = make_order(client=client, service=hands.services.all()[0], order_date=utils.get_date(2), master=vasya, order_time='10:30') order, _ = make_order(client=client2, service=hands.services.all()[1], order_date=utils.get_date(2), master=vasya, order_time='11:30') # still got 2 slots on the first day order, _ = make_order(client=client3, service=hands.services.all()[0], master=vasya, order_time='11:00', order_date=utils.get_date(1), status=OrderStatus.DONE) order.start() order.complete() order.save()
def test_complete_order_4hands(self): # creating a new master sanya = make_master('SANYA', 100) feet = make_category("Педикюр") for service in feet.services.all(): sanya.services.add(service) sanya.save() # VASYA works on +1,+2 does manicure, got three slots date = utils.get_date(1) schedule = Schedule.objects.create(master=sanya, date=date) schedule.save() TimeSlot.objects.create(time=Time.objects.create(hour=10, minute=30), taken=True, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=00), taken=False, schedule=schedule) TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=30), taken=False, schedule=schedule) vasya = Master.objects.get(first_name='VASYA') # manually creating an order with two masters and two services order_1, _ = make_order(client=self.client_object, order_date=date, master=vasya, service=vasya.services.all()[0], order_time=datetime.time(hour=11, minute=00)) schedule = sanya.get_schedule(date) slot = schedule.get_slot(datetime.time(hour=11, minute=00)) order_item = OrderItem.objects.create(service=sanya.services.all()[0], master=sanya, order=order_1, locked=False) slot.order_item = order_item slot.taken = True slot.save() order_1.time_started = timezone.now() order_1.status = OrderStatus.STARTED order_1.transaction = CloudPaymentsTransaction.objects.create( transaction_id=1, transaction_info={'info': 'yeah'}) order_1.save() resp = self.client.patch( reverse(CompleteOrderView.view_name, args=[order_1.id])) self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(resp.data['transaction_id'], 1) order = Order.objects.get(pk=order_1.id) self.assertIsNotNone(order.time_taken) self.assertEqual(order.status, OrderStatus.DONE) vasya = Master.objects.get(first_name='VASYA') sanya = Master.objects.get(first_name='SANYA') self.assertEqual( vasya.balance.on_hold, int(vasya.services.all()[0].masters_share( self.client_object.tip_multiplier()))) self.assertEqual( sanya.balance.on_hold, int(sanya.services.all()[0].masters_share( self.client_object.tip_multiplier())))