Example #1
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)
Example #2
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')
Example #3
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_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)
Example #5
0
 def setUp(self):
     self.user = PhoneAuthUser.objects.create(
         phone=random.randint(1000, 10000))
     self.client_object = make_client(self.user)
     token, _ = Token.objects.get_or_create(client=self.client_object)
     self.client = APIClient()
     self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
Example #6
0
 def setUp(self):
     make_everything()
     self.user = PhoneAuthUser.objects.create(phone='777')
     self.client_object = make_client(self.user)
     token, _ = Token.objects.get_or_create(client=self.client_object)
     self.client = APIClient()
     self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
Example #7
0
    def setUp(self):
        # making an auth token
        vasya = make_master("VASYA", 11.0, about='a terrible master')
        petya = make_master("PETYA", 12.0)

        hands = make_category("Маникюр")

        for service in hands.services.all():
            vasya.services.add(service)
        vasya.save()

        for service in hands.services.all():
            petya.services.add(service)
        petya.save()

        # VASYA works on 0,+1, does manicure, got three slots
        schedule = Schedule.objects.create(master=vasya, date=timezone.now())
        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)

        # PETYA works on 0th
        schedule = Schedule.objects.create(master=petya, date=timezone.now())
        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)

        self.user = PhoneAuthUser.objects.create(phone='777')
        self.client_object = make_client(self.user)
        self.master_object = vasya

        token, _ = Token.objects.get_or_create(master=self.master_object)
        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
Example #8
0
    def test_upload_not_master(self):
        client_object = make_client()

        token, _ = Token.objects.get_or_create(client=client_object)

        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        resp = self.client.patch(
            reverse(MasterAvatarUpdateView.view_name,
                    args=[self.master_object.id]),
            data={'image': utils.make_in_memory_image('avatar')})
        self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
Example #9
0
    def test_upload_not_master(self):
        client = make_client()

        token, _ = Token.objects.get_or_create(client=client)

        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        resp = self.client.post(reverse(AddPortfolioItemsView.view_name,
                                        args=[self.master_object.id]),
                                data={'images': [utils.make_in_memory_image(
                                    'avatar')]}, format='multipart')
        self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
Example #10
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}')
Example #11
0
    def test_logout_ok(self):
        token, _ = Token.objects.get_or_create(client=make_client())

        self.client = APIClient()
        self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')

        # first time ok
        response = self.client.post(reverse(LogoutView.view_name))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # second time gives unauthorized
        response = self.client.post(reverse(LogoutView.view_name))
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
Example #12
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)
Example #13
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)
Example #14
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)
Example #15
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)
Example #16
0
    def test_cant_reach(self, _calculate_eta):
        slot = TimeSlot.objects.create(
            time=Time.objects.create(hour=10, minute=30),
            taken=True, schedule=self.schedule)
        order = Order.objects.create(client=make_client(), date=timezone.now(),
                                     time=timezone.now().time())
        slot.order_item = OrderItem.objects.create(
            service=self.vasya.services.first(),
            master=self.vasya,
            order=order,
            locked=False)
        slot.save()
        TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=00),
                                taken=False, schedule=self.schedule)
        TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=30),
                                taken=False, schedule=self.schedule)
        TimeSlot.objects.create(time=Time.objects.create(hour=12, minute=00),
                                taken=False, schedule=self.schedule)
        location = Location.objects.create(lat=10, lon=120)

        _calculate_eta.return_value = 10000
        self.assertFalse(gmaps_utils.can_reach(self.schedule, location,
                                               datetime.time(hour=11,
                                                             minute=00)))
Example #17
0
    def test_gmaps_api_unavailable(self, _calculate_eta):
        slot = TimeSlot.objects.create(
            time=Time.objects.create(hour=10, minute=30),
            taken=True, schedule=self.schedule)
        order = Order.objects.create(client=make_client(), date=timezone.now(),
                                     time=timezone.now().time())
        slot.order_item = OrderItem.objects.create(
            service=self.vasya.services.first(),
            master=self.vasya,
            order=order,
            locked=False)
        slot.save()
        TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=00),
                                taken=False, schedule=self.schedule)
        TimeSlot.objects.create(time=Time.objects.create(hour=11, minute=30),
                                taken=False, schedule=self.schedule)
        TimeSlot.objects.create(time=Time.objects.create(hour=12, minute=00),
                                taken=False, schedule=self.schedule)
        location = Location.objects.create(lat=10, lon=120)

        _calculate_eta.side_effect = ApplicationError('HEY')
        with self.assertRaises(ApplicationError):
            gmaps_utils.can_reach(self.schedule, location,
                                  datetime.time(hour=11, minute=00))
Example #18
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()