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)
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
    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())
Пример #7
0
    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)
Пример #8
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}')
Пример #9
0
    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')
Пример #10
0
    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)
Пример #11
0
 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)
Пример #12
0
    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)
Пример #13
0
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())))