Exemple #1
0
    def test_master_exists(self):
        # old schedule
        Schedule.objects.create(master=self.master_object,
                                date=utils.get_date(-2))
        # new schedule
        Schedule.objects.create(master=self.master_object,
                                date=utils.get_date(2))
        # new schedule
        Schedule.objects.create(master=self.master_object,
                                date=utils.get_date(1))
        # today's schedule
        Schedule.objects.create(master=self.master_object,
                                date=utils.get_date(0))
        resp = self.client.get(
            reverse(MasterDetailUpdateView.view_name,
                    args=[self.master_object.id]))
        self.assertEqual(resp.status_code, status.HTTP_200_OK)

        # only new schedules are returned
        self.assertEqual(len(resp.data['schedule']), 3)
        # ASC sorted
        self.assertLess(resp.data['schedule'][0]['date'],
                        resp.data['schedule'][1]['date'])
        self.assertLess(resp.data['schedule'][1]['date'],
                        resp.data['schedule'][2]['date'])
    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_create_order__one_master_many_services(self):
        master = Master.objects.get(first_name='VASYA')
        schedule = master.get_schedule(utils.get_date(1))
        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)
        services = master.services.all()
        # two services, 5 slots, no+1
        target_date = utils.get_date(1)
        resp = self.client.post(
            reverse(OrderListCreateView.view_name),
            data={
                'date':
                target_date,
                'payment_type':
                'CARD',
                'time':
                '11:00',
                'order_items': [
                    {
                        'locked': False,
                        'master_id': master.id,
                        'service_ids': [service.id for service in services]
                    },
                ]
            },
            format='json')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
        master = Master.objects.get(first_name='VASYA')
        schedule = master.schedule.get(date=target_date)
        # assert timeslots are correctly set
        slots = schedule.time_slots.filter(
            time__value__in=['11:00', '11:30', '12:00', '12:30', '13:00'],
            taken=True)
        self.assertEqual(len(slots), 5)
        # assert order is created
        orders = Order.objects.all()
        self.assertTrue(len(orders), 1)
        order = orders[0]
        self.assertEqual(order.client, self.client_object)
        self.assertEqual(order.date.strftime('%Y-%m-%d'), target_date)
        self.assertEqual(order.time, datetime.time(hour=11, minute=0))
        self.assertEqual(len(order.order_items.all()), 2)

        # assert future balance is correct
        self.assertEqual(
            master.balance.future,
            sum(
                map(
                    lambda s: int(
                        s.masters_share(self.client_object.tip_multiplier())),
                    services)))
    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_master_best_match(self, _calculate_eta):
        master = Master.objects.get(first_name='VASYA')
        schedule = master.get_schedule(utils.get_date(1))
        schedule.delete()

        schedule = Schedule.objects.create(master=master,
                                           date=timezone.now() + delta(days=1))
        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)

        service = master.services.all()[0]

        # assume all slots are reachable
        _calculate_eta.return_value = 10

        url = reverse(MasterBestMatchView.view_name)
        resp = self.client.get(f"{url}?service={service.id}"
                               f"&date={utils.get_date(1)}&time=11:00"
                               f"&coordinates=10,20")
        self.assertEqual(resp.status_code, status.HTTP_200_OK)

        # no favorites in this test
        master_data = resp.data
        self.assertEqual(master_data['first_name'], master.first_name)
    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())
Exemple #7
0
    def test_create_client_existing_master(self):
        make_master('mas', 10, user=self.user)
        client = make_client(user=self.user, activated=False)
        token, _ = Token.objects.get_or_create(client=client)
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        resp = self.client.post(reverse(ClientCreateView.view_name),
                                data={
                                    'first_name': 'VASYA',
                                    'gender': Gender.MALE,
                                    'date_of_birth': utils.get_date(-100),
                                    'tip': 10,
                                    'address': {
                                        'location': {
                                            'lat': 100,
                                            'lon': 100,
                                        },
                                        'city': 'kazan',
                                        'street_name': 'latstr',
                                        'building': '4',
                                        'floor': 2,
                                        'apt_number': 79,
                                        'entrance': 6,
                                        'has_intercom': True
                                    }
                                },
                                format='json')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
        # dat user
        self.user = PhoneAuthUser.objects.get(phone='777')
        self.assertIsNotNone(self.user.client)
        self.assertEqual(self.user.client.first_name, 'VASYA')
        self.assertIsNotNone(self.user.master)
        self.assertEqual(self.user.master.first_name, 'mas')
Exemple #8
0
 def test_recommendation(self):
     master = Master.objects.get(first_name='VASYA')
     schedule = master.get_schedule(timezone.now() + delta(days=1))
     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)
     services = list(master.services.all())
     order_service = services[0]
     # assume the order is almost created for 11:00 and 11:30
     resp = self.client.post(reverse(UpsaleRecommendationsView.view_name),
                             data={
                                 'date':
                                 utils.get_date(1),
                                 'time':
                                 '11:00',
                                 'order_items': [{
                                     'locked':
                                     False,
                                     'master_id':
                                     master.id,
                                     'service_ids': [order_service.id]
                                 }]
                             },
                             format='json')
     self.assertEqual(resp.status_code, status.HTTP_200_OK)
     self.assertEqual(resp.data, [{
         'master_id': master.id,
         'service_id': services[1].id
     }])
Exemple #9
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)
Exemple #10
0
    def test_create_client(self):
        token, _ = Token.objects.get_or_create(client=make_client(
            activated=False))
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        resp = self.client.post(reverse(ClientCreateView.view_name),
                                data={
                                    'first_name': 'VASYA',
                                    'gender': Gender.MALE,
                                    'date_of_birth': utils.get_date(-100),
                                    'tip': 10,
                                    'address': {
                                        'location': {
                                            'lat': 100,
                                            'lon': 100,
                                        },
                                        'city': 'kazan',
                                        'street_name': 'latstr',
                                        'building': '4',
                                        'floor': 2,
                                        'apt_number': 79,
                                        'entrance': 6,
                                        'has_intercom': True
                                    }
                                },
                                format='json')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)

        new_client_object = Client.objects.get(first_name='VASYA')
        self.assertEqual(new_client_object.first_name, 'VASYA')
        self.assertEqual(new_client_object.gender, Gender.MALE)
        self.assertEqual(new_client_object.tip, 10)
        self.assertEqual(len(new_client_object.addresses.all()), 1)
        self.assertEqual(new_client_object.home_address.city, 'kazan')
    def test_create_order__one_master_many_services_does_not_fit(self):
        master = Master.objects.get(first_name='VASYA')
        schedule = master.get_schedule(utils.get_date(1))
        TimeSlot.objects.create(time=Time.objects.create(hour=12, minute=30),
                                taken=True,
                                schedule=schedule)
        TimeSlot.objects.create(time=Time.objects.create(hour=13, minute=00),
                                taken=False,
                                schedule=schedule)
        services = master.services.all()
        # two services, 5 slots, no+1
        resp = self.client.post(
            reverse(OrderListCreateView.view_name),
            data={
                'date':
                timezone.now().strftime('%Y-%m-%d'),
                'payment_type':
                'CARD',
                'time':
                '11:00',
                'order_items': [
                    {
                        'locked': False,
                        'master_id': master.id,
                        'service_ids': [service.id for service in services]
                    },
                ]
            },
            format='json')
        self.assertEqual(resp.status_code,
                         status.HTTP_500_INTERNAL_SERVER_ERROR)

        # assert no order is created
        self.assertEqual(Order.objects.count(), 0)
Exemple #12
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')
Exemple #13
0
    def test_create_client_existing_client(self):
        token, _ = Token.objects.get_or_create(client=make_client(self.user))
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        resp = self.client.post(reverse(ClientCreateView.view_name),
                                data={
                                    'first_name': 'VASYA',
                                    'gender': Gender.MALE,
                                    'date_of_birth': utils.get_date(-100),
                                    'tip': 10,
                                    'address': {
                                        'location': {
                                            'lat': 100,
                                            'lon': 100,
                                        },
                                        'city': 'kazan',
                                        'street_name': 'latstr',
                                        'building': '4',
                                        'floor': 2,
                                        'apt_number': 79,
                                        'entrance': 6,
                                        'has_intercom': True
                                    }
                                },
                                format='json')
        self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
Exemple #14
0
 def test_add_feedback_fail_no_orders(self):
     self.order.delete()
     resp = self.client.post(
         reverse(AddFeedbackView.view_name, args=[self.master_object.id]),
         data={
             'rating': 4.0,
             'text': 'superb',
             'date': utils.get_date(1),
         }, format='json')
     self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
Exemple #15
0
    def test_add_second_feedback(self):
        feedback = Feedback.objects.create(client=self.client_object,
                                           master=self.master_object,
                                           rating=5, text='kek',
                                           date=utils.get_date(0))
        self.master_object.add_rating(feedback.rating)
        self.master_object.save()

        resp = self.client.post(
            reverse(AddFeedbackView.view_name, args=[self.master_object.id]),
            data={
                'rating': 4.0,
                'text': 'superb',
                'date': utils.get_date(1),
            }, format='json')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
        self.master_object = Master.objects.get(first_name='VASYA')
        feedback_items = list(self.master_object.feedbacks.all())
        self.assertEqual(len(feedback_items), 2)
        self.assertEqual(self.master_object.rating, 4.5)
Exemple #16
0
    def test_add_first_feedback(self):
        resp = self.client.post(
            reverse(AddFeedbackView.view_name, args=[self.master_object.id]),
            data={
                'rating': 4.0,
                'text': 'superb',
                'date': utils.get_date(1),
                'order_id': self.order.id
            }, format='json')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
        self.master_object = Master.objects.get(first_name='VASYA')
        feedback_items = list(self.master_object.feedbacks.all())
        self.assertEqual(len(feedback_items), 1)
        self.assertEqual(self.master_object.rating, 4.0)

        self.assertEqual(feedback_items[0].text, 'superb')
        self.assertEqual(feedback_items[0].rating, 4.0)
        self.assertEqual(feedback_items[0].client, self.client_object)
        self.assertEqual(feedback_items[0].master, self.master_object)
        self.assertEqual(feedback_items[0].date.strftime('%Y-%m-%d'),
                         utils.get_date(1))
    def test_create_order__one_master_one_service_cash(self):
        master = Master.objects.get(first_name='VASYA')
        service = master.services.first()
        # one service 2+1 slots
        target_date = utils.get_date(1)
        resp = self.client.post(reverse(OrderListCreateView.view_name),
                                data={
                                    'date':
                                    target_date,
                                    'payment_type':
                                    'CASH',
                                    'time':
                                    '11:00',
                                    'order_items': [
                                        {
                                            'locked': False,
                                            'master_id': master.id,
                                            'service_ids': [service.id]
                                        },
                                    ]
                                },
                                format='json')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
        master = Master.objects.get(first_name='VASYA')
        schedule = master.schedule.get(date=target_date)

        # assert timeslots are correctly set
        slots = schedule.time_slots.filter(
            time__value__in=['11:00', '11:30', '12:00'], taken=True)
        self.assertEqual(len(slots), 3)

        # assert order is created
        orders = Order.objects.all()
        self.assertTrue(len(orders), 1)
        order = orders[0]
        self.assertEqual(order.client, self.client_object)
        self.assertEqual(order.date.strftime('%Y-%m-%d'), target_date)
        self.assertEqual(order.time, datetime.time(hour=11, minute=0))
        self.assertEqual(len(order.order_items.all()), 1)
        order_item = order.order_items.all()[0]

        # assert order_items are created
        self.assertEqual(order_item.master, master)
        self.assertEqual(order_item.service, service)

        # assert future balance is correct
        self.assertEqual(
            master.balance.future,
            service.masters_share(self.client_object.tip_multiplier()))
        # assert debt is correct
        self.assertEqual(master.balance.debt, service.service_share())
Exemple #18
0
    def test_create_master_existing_account(self):
        old_client = make_client()
        token, _ = Token.objects.get_or_create(client=old_client)
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        resp = self.client.post(reverse(MasterListCreateView.view_name), data={
            'first_name': 'SUPER_MASTER',
            'gender': Gender.MALE,
            'date_of_birth': utils.get_date(-100),
            'email': '*****@*****.**',
            'services': [service.id for service in Service.objects.all()]
        }, format='json')
        self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
Exemple #19
0
    def test_create_master(self):
        resp = self.client.post(reverse(MasterListCreateView.view_name), data={
            'first_name': 'SUPER_MASTER',
            'gender': Gender.MALE,
            'date_of_birth': utils.get_date(-100),
            'email': '*****@*****.**',
            'services': ','.join(
                [str(service.id) for service in Service.objects.all()]),
            'avatar': utils.make_in_memory_image('azz')
        }, format='multipart')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)

        new_master = Master.objects.get(first_name='SUPER_MASTER')
        self.assertEqual(new_master.status, MasterStatus.ON_REVIEW)
        self.assertEqual(new_master.gender, Gender.MALE)
        self.assertEqual(new_master.email, '*****@*****.**')
        self.assertIsNotNone(new_master.balance)
        self.assertEqual(len(new_master.services.all()),
                         len(Service.objects.all()))
Exemple #20
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)
Exemple #21
0
    def test_create_client_partial(self):
        token, _ = Token.objects.get_or_create(client=make_client(
            activated=False))
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        resp = self.client.post(reverse(ClientCreateView.view_name),
                                data={
                                    'first_name': 'VASYA',
                                    'gender': Gender.MALE,
                                    'date_of_birth': utils.get_date(-100),
                                },
                                format='json')

        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)

        new_client_object = Client.objects.get(first_name='VASYA')
        self.assertEqual(new_client_object.first_name, 'VASYA')
        self.assertEqual(new_client_object.gender, Gender.MALE)
        self.assertEqual(len(new_client_object.addresses.all()), 0)
    def test_master_search_two_services(self, _calculate_eta):
        master = Master.objects.get(first_name='VASYA')
        schedule = master.get_schedule(utils.get_date(1))
        schedule.delete()
        schedule = Schedule.objects.create(master=master, date=timezone.now()
                                                               + delta(days=1))
        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)
        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)

        # assume all slots are reachable
        _calculate_eta.return_value = 10

        url = reverse(MasterSearchView.view_name)
        service_ids = ','.join(
            [str(service.id) for service in master.services.all()[0:2]])
        resp = self.client.get(
            f"{url}?services={service_ids}&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)

        # one day with 5 slots
        day_one_slots = others[0]['available_slots']
        self.assertEqual(len(day_one_slots), 1)
 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_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())))
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_create_order__composite_4hands(self):
        vasya = Master.objects.get(first_name='VASYA')
        sanya = make_master("SANYA", 12.0)

        feet = ServiceCategory.objects.get(name="Педикюр")

        for service in feet.services.all():
            sanya.services.add(service)
        sanya.save()

        target_date = utils.get_date(1)
        schedule = Schedule.objects.create(master=sanya, date=target_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)

        # two services, 2+1 for vasya, 2 for sanya
        resp = self.client.post(reverse(OrderListCreateView.view_name),
                                data={
                                    'date':
                                    target_date,
                                    'payment_type':
                                    'CARD',
                                    'time':
                                    '11:00',
                                    'order_items': [{
                                        'locked':
                                        False,
                                        'master_id':
                                        vasya.id,
                                        'service_ids':
                                        [vasya.services.first().id]
                                    }, {
                                        'locked':
                                        False,
                                        'master_id':
                                        sanya.id,
                                        'service_ids':
                                        [sanya.services.first().id]
                                    }],
                                    'special': {
                                        'type': 'composite'
                                    }
                                },
                                format='json')
        self.assertEqual(resp.status_code, status.HTTP_201_CREATED)

        vasya = Master.objects.get(first_name='VASYA')
        schedule = vasya.schedule.get(date=target_date)
        # assert timeslots are correctly set
        slots = schedule.time_slots.filter(
            time__value__in=['11:00', '11:30', '12:00'], taken=True)
        self.assertEqual(len(slots), 3)

        sanya = Master.objects.get(first_name='SANYA')
        schedule = sanya.schedule.get(date=target_date)
        # assert timeslots are correctly set
        slots = schedule.time_slots.filter(time__value__in=['11:00', '11:30'],
                                           taken=True)
        self.assertEqual(len(slots), 2)

        # assert order is created
        orders = Order.objects.all()
        self.assertTrue(len(orders), 1)

        order = orders[0]
        self.assertEqual(order.client, self.client_object)
        self.assertEqual(order.date.strftime('%Y-%m-%d'), target_date)
        self.assertEqual(order.time, datetime.time(hour=11, minute=0))
        self.assertEqual(len(order.order_items.all()), 2)
        order_item = order.order_items.all()[0]
        order_item_1 = order.order_items.all()[1]

        # assert order_items are created
        self.assertEqual(order_item.master, vasya)
        self.assertEqual(order_item.service, vasya.services.first())
        self.assertEqual(order_item_1.master, sanya)
        self.assertEqual(order_item_1.service, sanya.services.first())

        # assert future balance is correct
        self.assertEqual(
            vasya.balance.future,
            vasya.services.first().masters_share(
                self.client_object.tip_multiplier()))
        self.assertEqual(
            sanya.balance.future,
            sanya.services.first().masters_share(
                self.client_object.tip_multiplier()))