From b5ebf85bb790453157f0c9c529636d5d11abe403 Mon Sep 17 00:00:00 2001 From: angel_in_a_jar Date: Wed, 22 Jun 2022 12:06:16 +0300 Subject: [PATCH 1/7] Put order endpoint was fixed --- backend/orders/__init__.py | 0 backend/orders/serializers.py | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 backend/orders/__init__.py diff --git a/backend/orders/__init__.py b/backend/orders/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/orders/serializers.py b/backend/orders/serializers.py index 01ef300..971503d 100644 --- a/backend/orders/serializers.py +++ b/backend/orders/serializers.py @@ -1,5 +1,6 @@ from rest_framework import serializers from .models import Order +from django.db import models class OrderSerializer(serializers.Serializer): @@ -37,12 +38,14 @@ def update(self, instance, validated_data): class OrderPutSerializer(serializers.ModelSerializer): + class Meta: model = Order fields = ['status', 'possibleAngelsIds'] + extra_kwargs = {'status': {'required': False}} def update(self, instance, validated_data): instance.status = validated_data.get('status', instance.status) - instance.possibleAngelsIds = validated_data.get('possibleAngelsIds', instance.possibleAngelsIds) + instance.possibleAngelsIds = instance.possibleAngelsIds + validated_data.get('possibleAngelsIds', instance.possibleAngelsIds) instance.save() return instance From feb5c1aeac7c2074c4cdc72b553377834216a499 Mon Sep 17 00:00:00 2001 From: angel_in_a_jar Date: Sat, 25 Jun 2022 18:43:00 +0300 Subject: [PATCH 2/7] unit tests was created --- backend/InnoCart/urls.py | 2 - backend/delivery/urls.py | 2 +- backend/tests/__init__.py | 0 backend/tests/test_models.py | 250 +++++++++++++++++++++++++++++++++ backend/tests/test_views.py | 263 +++++++++++++++++++++++++++++++++++ backend/users/urls.py | 4 +- 6 files changed, 516 insertions(+), 5 deletions(-) create mode 100644 backend/tests/__init__.py create mode 100644 backend/tests/test_models.py create mode 100644 backend/tests/test_views.py diff --git a/backend/InnoCart/urls.py b/backend/InnoCart/urls.py index 78ec9f5..7778411 100644 --- a/backend/InnoCart/urls.py +++ b/backend/InnoCart/urls.py @@ -27,10 +27,8 @@ path('orders/', order_detail, name='order by id'), path('api_schema/', get_schema_view(title='API Schema', description='Guide for the REST API'), name='api_schema'), path('users/', user_detail, name='user by id'), - path('api_schema/', get_schema_view(title='API Schema', description='Guide for the REST API'), name='api_schema'), path('sign_up/', sign_up, name='sign_up'), path('sign_in/', sign_in, name='sign_in'), - path('api_schema/', get_schema_view(title='API Schema', description='Guide for the REST API'), name='api_schema'), path('delivery/', delivery_list, name='delivery'), path('delivery/', delivery_detail, name='delivery by id'), ] diff --git a/backend/delivery/urls.py b/backend/delivery/urls.py index 28e1c78..a2c693b 100644 --- a/backend/delivery/urls.py +++ b/backend/delivery/urls.py @@ -3,7 +3,7 @@ from views import delivery_list, delivery_detail urlpatterns = [ - path(r'^delivery/$', delivery_list, name='delivery list'), + path(r'^delivery/$', delivery_list, name='delivery'), path(r'^delivery/$', delivery_detail, name='delivery by id'), ] diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/tests/test_models.py b/backend/tests/test_models.py new file mode 100644 index 0000000..6b13186 --- /dev/null +++ b/backend/tests/test_models.py @@ -0,0 +1,250 @@ +from django.test import TestCase +from delivery.models import Delivery +from feedback.models import Feedback +from orders.models import Order +from users.models import User + + +class DeliveryModelTest(TestCase): + @classmethod + def setUpTestData(cls): + Delivery.objects.create(customerId=1, angelId=23, orderId=2, estimatedTime='20:00', + customerConfirmation=True, angelConfirmation=True) + + def test_customer_id_label(self): + delivery = Delivery.objects.get(id=1) + field_label = delivery._meta.get_field('customerId').verbose_name + self.assertEquals(field_label, 'customerId') + + def test_angel_id_label(self): + delivery = Delivery.objects.get(id=1) + field_label = delivery._meta.get_field('angelId').verbose_name + self.assertEquals(field_label, 'angelId') + + def test_order_id_label(self): + delivery = Delivery.objects.get(id=1) + field_label = delivery._meta.get_field('orderId').verbose_name + self.assertEquals(field_label, 'orderId') + + def test_estimated_time_label(self): + delivery = Delivery.objects.get(id=1) + field_label = delivery._meta.get_field('estimatedTime').verbose_name + self.assertEquals(field_label, 'estimatedTime') + + def test_customer_confirmation_label(self): + delivery = Delivery.objects.get(id=1) + field_label = delivery._meta.get_field('customerConfirmation').verbose_name + self.assertEquals(field_label, 'customerConfirmation') + + def test_angel_confirmation_label(self): + delivery = Delivery.objects.get(id=1) + field_label = delivery._meta.get_field('angelConfirmation').verbose_name + self.assertEquals(field_label, 'angelConfirmation') + + +class FeedbackModelTest(TestCase): + @classmethod + def setUpTestData(cls): + Feedback.objects.create(objectId=12, subjectId=23, deal='0', description='seven years bad luck') + + def test_object_id_label(self): + feedback = Feedback.objects.get(id=1) + field_label = feedback._meta.get_field('objectId').verbose_name + self.assertEquals(field_label, 'objectId') + + def test_subject_id_label(self): + feedback = Feedback.objects.get(id=1) + field_label = feedback._meta.get_field('subjectId').verbose_name + self.assertEquals(field_label, 'subjectId') + + def test_deal_label(self): + feedback = Feedback.objects.get(id=1) + field_label = feedback._meta.get_field('deal').verbose_name + self.assertEquals(field_label, 'deal') + + def test_description_label(self): + feedback = Feedback.objects.get(id=1) + field_label = feedback._meta.get_field('description').verbose_name + self.assertEquals(field_label, 'description') + + def test_description_max_length(self): + feedback = Feedback.objects.get(id=1) + max_length = feedback._meta.get_field('description').max_length + self.assertEquals(max_length, 200) + + +class OrderModelTest(TestCase): + @classmethod + def setUpTestData(cls): + Order.objects.create(customerId=12, name='Del', description='seven years bad luck', + expectedDeliveryTime='04:00', status='0', weight='100', cost='100', + fee='50', address='Inno basement', possibleAngelsIds=[123, 456], + picture='https://qwerty.com') + + def test_customer_id_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('customerId').verbose_name + self.assertEquals(field_label, 'customerId') + + def test_name_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('name').verbose_name + self.assertEquals(field_label, 'name') + + def test_description_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('description').verbose_name + self.assertEquals(field_label, 'description') + + def test_expected_delivery_time_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('expectedDeliveryTime').verbose_name + self.assertEquals(field_label, 'expectedDeliveryTime') + + def test_status_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('status').verbose_name + self.assertEquals(field_label, 'status') + + def test_weight_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('weight').verbose_name + self.assertEquals(field_label, 'weight') + + def test_cost_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('cost').verbose_name + self.assertEquals(field_label, 'cost') + + def test_fee_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('fee').verbose_name + self.assertEquals(field_label, 'fee') + + def test_address_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('address').verbose_name + self.assertEquals(field_label, 'address') + + def test_possible_angels_ids_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('possibleAngelsIds').verbose_name + self.assertEquals(field_label, 'possibleAngelsIds') + + def test_picture_label(self): + order = Order.objects.get(id=1) + field_label = order._meta.get_field('picture').verbose_name + self.assertEquals(field_label, 'picture') + + def test_name_max_length(self): + order = Order.objects.get(id=1) + max_length = order._meta.get_field('name').max_length + self.assertEquals(max_length, 100) + + def test_description_max_length(self): + order = Order.objects.get(id=1) + max_length = order._meta.get_field('description').max_length + self.assertEquals(max_length, 1000) + + def test_weight_max_digits(self): + order = Order.objects.get(id=1) + max_digits = order._meta.get_field('weight').max_digits + self.assertEquals(max_digits, 1000) + + def test_address_max_length(self): + order = Order.objects.get(id=1) + max_length = order._meta.get_field('address').max_length + self.assertEquals(max_length, 200) + + def test_weight_decimal_places(self): + order = Order.objects.get(id=1) + decimal_places = order._meta.get_field('weight').decimal_places + self.assertEquals(decimal_places, 2) + + +class UserModelTest(TestCase): + @classmethod + def setUpTestData(cls): + User.objects.create(token='qwe-rty', passwordMd5hash='qwerty12345', name='Del', + phoneNumber=8123, email='me@gmail.com', age=80, deliveryRate=1.0, + createdOrdersHistoryIds=[123], deliveredOrdersHistoryIds=[89, 90]) + + def test_token_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('token').verbose_name + self.assertEquals(field_label, 'token') + + def test_password_md5hash_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('passwordMd5hash').verbose_name + self.assertEquals(field_label, 'passwordMd5hash') + + def test_name_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('name').verbose_name + self.assertEquals(field_label, 'name') + + def test_phone_number_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('phoneNumber').verbose_name + self.assertEquals(field_label, 'phoneNumber') + + def test_email_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('email').verbose_name + self.assertEquals(field_label, 'email') + + def test_age_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('age').verbose_name + self.assertEquals(field_label, 'age') + + def test_delivery_rate_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('deliveryRate').verbose_name + self.assertEquals(field_label, 'deliveryRate') + + def test_created_orders_history_ids_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('createdOrdersHistoryIds').verbose_name + self.assertEquals(field_label, 'createdOrdersHistoryIds') + + def test_delivered_orders_history_ids_label(self): + user = User.objects.get(id=1) + field_label = user._meta.get_field('deliveredOrdersHistoryIds').verbose_name + self.assertEquals(field_label, 'deliveredOrdersHistoryIds') + + def test_token_max_length(self): + user = User.objects.get(id=1) + max_length = user._meta.get_field('token').max_length + self.assertEquals(max_length, 50) + + def test_password_md5hash_max_length(self): + user = User.objects.get(id=1) + max_length = user._meta.get_field('passwordMd5hash').max_length + self.assertEquals(max_length, 300) + + def test_name_max_length(self): + user = User.objects.get(id=1) + max_length = user._meta.get_field('name').max_length + self.assertEquals(max_length, 100) + + def test_phone_number_max_length(self): + user = User.objects.get(id=1) + max_length = user._meta.get_field('phoneNumber').max_length + self.assertEquals(max_length, 20) + + def test_email_max_length(self): + user = User.objects.get(id=1) + max_length = user._meta.get_field('email').max_length + self.assertEquals(max_length, 200) + + def test_delivery_rate_max_digits(self): + user = User.objects.get(id=1) + max_digits = user._meta.get_field('deliveryRate').max_digits + self.assertEquals(max_digits, 1000) + + def test_delivery_rate_decimal_places(self): + user = User.objects.get(id=1) + decimal_places = user._meta.get_field('deliveryRate').decimal_places + self.assertEquals(decimal_places, 1) diff --git a/backend/tests/test_views.py b/backend/tests/test_views.py new file mode 100644 index 0000000..f47cf5a --- /dev/null +++ b/backend/tests/test_views.py @@ -0,0 +1,263 @@ +from django.test import TestCase +from django.urls import reverse +from delivery.models import Delivery +from feedback.models import Feedback +from orders.models import Order +from users.models import User + + +class DeliveryViewTest(TestCase): + @classmethod + def setUpTestData(cls): + number_of_delivery = 13 + for delivery_num in range(number_of_delivery): + Delivery.objects.create(customerId=delivery_num, angelId=delivery_num + 1, orderId=delivery_num + 2, + estimatedTime='20:00', customerConfirmation=True, angelConfirmation=True) + + def test_view_url_exists_at_desired_location(self): + resp = self.client.get('/delivery/?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_accessible_by_name(self): + resp = self.client.get(reverse('delivery') + '?token=123') + self.assertEqual(resp.status_code, 200) + + def test_post_url_exists_at_desired_location(self): + resp = self.client.post('/delivery/?token=123', { + "customerId": 12, + "angelId": 123, + "orderId": 90, + "estimatedTime": "20:00", + "customerConfirmation": True, + "angelConfirmation": True + }) + self.assertEqual(resp.status_code, 201) + + def test_post_url_accessible_by_name(self): + resp = self.client.post(reverse('delivery') + '?token=123', { + "customerId": 12, + "angelId": 123, + "orderId": 90, + "estimatedTime": "20:00", + "customerConfirmation": True, + "angelConfirmation": True + }) + self.assertEqual(resp.status_code, 201) + + def test_view_url_by_order_exists_at_desired_location(self): + resp = self.client.get('/delivery/1?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_by_order_accessible_by_name(self): + resp = self.client.get(reverse('delivery by id', args=[1]) + '?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_not_found_at_desired_location(self): + resp = self.client.get('/delivery/99?token=123') + self.assertEqual(resp.status_code, 404) + + def test_view_url_not_found_by_name(self): + resp = self.client.get(reverse('delivery by id', args=[99]) + '?token=123') + self.assertEqual(resp.status_code, 404) + + +class FeedbackViewTest(TestCase): + @classmethod + def setUpTestData(cls): + number_of_feedback = 5 + for feedback_num in range(number_of_feedback): + Feedback.objects.create(objectId=feedback_num, subjectId=feedback_num + 1, + deal='0', description='seven years bad luck') + + +class OrdersViewTest(TestCase): + @classmethod + def setUpTestData(cls): + number_of_orders = 5 + for order_num in range(number_of_orders): + Order.objects.create(customerId=order_num, name='Del', description='seven years bad luck', + expectedDeliveryTime='04:00', status='0', weight='100', cost='100', + fee='50', address='Inno basement', possibleAngelsIds=[123, 456], + picture='https://qwerty.com') + + def test_view_url_exists_at_desired_location(self): + resp = self.client.get('/orders/?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_accessible_by_name(self): + resp = self.client.get(reverse('orders') + '?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_exists_at_desired_location_filter(self): + resp = self.client.get('/orders/?token=123&weightMin=100&weightMax=500') + self.assertEqual(resp.status_code, 200) + + def test_view_url_accessible_by_name_filter(self): + resp = self.client.get(reverse('orders') + '?token=123&weightMin=100&weightMax=500') + self.assertEqual(resp.status_code, 200) + + def test_view_url_exists_at_desired_location_filter2(self): + resp = self.client.get('/orders/?token=123&costMin=10&costMax=2000') + self.assertEqual(resp.status_code, 200) + + def test_view_url_accessible_by_name_filter2(self): + resp = self.client.get(reverse('orders') + '?token=123&costMin=10&costMax=2000') + self.assertEqual(resp.status_code, 200) + + def test_view_url_exists_at_desired_location_filter3(self): + resp = self.client.get('/orders/?token=123&weightMin=100&status=0') + self.assertEqual(resp.status_code, 200) + + def test_view_url_accessible_by_name_filter3(self): + resp = self.client.get(reverse('orders') + '?token=123&status=0') + self.assertEqual(resp.status_code, 200) + + def test_view_url_exists_at_desired_location_filter4(self): + resp = self.client.get('/orders/?token=123&weightMin=100&weightMax=500&costMin=10&costMax=2000&status=0') + self.assertEqual(resp.status_code, 200) + + def test_view_url_accessible_by_name_filter4(self): + resp = self.client.get(reverse('orders') + + '?token=123&weightMin=100&weightMax=500&costMin=10&costMax=2000&status=0') + self.assertEqual(resp.status_code, 200) + + def test_post_url_exists_at_desired_location(self): + resp = self.client.post('/orders/?token=123', { + "customerId": 12, + "name": "Jack", + "description": "1234", + "expectedDeliveryTime": "2022-06-20", + "status": "2", + "weight": "55.00", + "cost": 55, + "fee": 33, + "address": "e532 t", + "possibleAngelsIds": [ + 1, + 2 + ], + "picture": "http://5.53.125.241:8000/admin/orders/order/add/" + }) + self.assertEqual(resp.status_code, 201) + + def test_post_url_accessible_by_name(self): + resp = self.client.post(reverse('orders') + '?token=123', { + "customerId": 12, + "name": "Jack", + "description": "1234", + "expectedDeliveryTime": "2022-06-20", + "status": "2", + "weight": "55.00", + "cost": 55, + "fee": 33, + "address": "e532 t", + "possibleAngelsIds": [ + 1, + 2 + ], + "picture": "http://5.53.125.241:8000/admin/orders/order/add/" + }) + self.assertEqual(resp.status_code, 201) + + def test_view_url_by_id_exists_at_desired_location(self): + resp = self.client.get('/orders/1?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_by_id_accessible_by_name(self): + resp = self.client.get(reverse('order by id', args=[1]) + '?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_not_found_at_desired_location(self): + resp = self.client.get('/orders/99?token=123') + self.assertEqual(resp.status_code, 404) + + def test_view_url_not_found_by_name(self): + resp = self.client.get(reverse('order by id', args=[99]) + '?token=123') + self.assertEqual(resp.status_code, 404) + + def test_put_url_exists_at_desired_location(self): + resp = self.client.put('/orders/1?token=123', { + "status": 2, + "possibleAngelsIds": [ + 789, + 200 + ] + }, content_type='application/json') + self.assertEqual(resp.status_code, 200) + + def test_put_url_accessible_by_name(self): + resp = self.client.put(reverse('orders') + '1?token=123', { + "status": 2, + "possibleAngelsIds": [ + 789, + 200 + ] + }, content_type='application/json') + self.assertEqual(resp.status_code, 200) + + +class UserViewTest(TestCase): + @classmethod + def setUpTestData(cls): + number_of_users = 10 + for user_num in range(number_of_users): + User.objects.create(token='123', passwordMd5hash='qwerty12345', name='Del ' + str(user_num), + phoneNumber='88005553535', + email='yepper@gmail.com', age='14', deliveryRate=5.0, + createdOrdersHistoryIds=[123, 456], deliveredOrdersHistoryIds=[45]) + + def test_view_url_by_user_exists_at_desired_location(self): + resp = self.client.get('/users/1?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_by_user_accessible_by_name(self): + resp = self.client.get(reverse('user by id', args=[1]) + '?token=123') + self.assertEqual(resp.status_code, 200) + + def test_view_url_not_found_at_desired_location(self): + resp = self.client.get('/users/99?token=123') + self.assertEqual(resp.status_code, 404) + + def test_view_url_not_found_by_name(self): + resp = self.client.get(reverse('user by id', args=[99]) + '?token=123') + self.assertEqual(resp.status_code, 404) + + def test_post_url_sign_in_exists_at_desired_location(self): + resp = self.client.post('/sign_in/', { + "name": "Del 0", + "passwordMd5hash": "qwerty12345" + }) + self.assertEqual(resp.status_code, 200) + + def test_post_url_sign_in_accessible_by_name(self): + resp = self.client.post(reverse('sign_in'), { + "name": "Del 0", + "passwordMd5hash": "qwerty12345" + }) + self.assertEqual(resp.status_code, 200) + + def test_post_url_sign_up_exists_at_desired_location(self): + resp = self.client.post('/sign_up/', { + "passwordMd5hash": "qwerty12345", + "name": "Del 8000", + "phoneNumber": "88005553535", + "email": "yepper@gmail.com", + "age": "14", + "deliveryRate": 5.0, + "createdOrdersHistoryIds": [666, 777], + "deliveredOrdersHistoryIds": [1] + }) + self.assertEqual(resp.status_code, 201) + + def test_post_url_sign_up_accessible_by_name(self): + resp = self.client.post(reverse('sign_up'), { + "passwordMd5hash": "qwerty12345", + "name": "Del 8000", + "phoneNumber": "88005553535", + "email": "yepper@gmail.com", + "age": "14", + "deliveryRate": 5.0, + "createdOrdersHistoryIds": [666, 777], + "deliveredOrdersHistoryIds": [1] + }) + self.assertEqual(resp.status_code, 201) diff --git a/backend/users/urls.py b/backend/users/urls.py index a124abf..17e8c22 100644 --- a/backend/users/urls.py +++ b/backend/users/urls.py @@ -4,8 +4,8 @@ urlpatterns = [ path(r'^users/$', user_detail, name='user by id'), - path(r'^sign_up/', sign_up, name='register'), - path(r'^sign_in/', sign_in, name='register'), + path(r'^sign_up/', sign_up, name='sign up'), + path(r'^sign_in/', sign_in, name='sign in'), ] urlpatterns = format_suffix_patterns(urlpatterns) From e9bfcdc9ba64fc3318d120b2264f800dfaf50b8b Mon Sep 17 00:00:00 2001 From: angel_in_a_jar Date: Sat, 25 Jun 2022 18:49:12 +0300 Subject: [PATCH 3/7] linter moved down --- .github/workflows/linter.yml | 10 +++--- .github/workflows/linter.yml~ | 57 ----------------------------------- 2 files changed, 6 insertions(+), 61 deletions(-) delete mode 100644 .github/workflows/linter.yml~ diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 2dcd32a..bd83872 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -41,6 +41,12 @@ jobs: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 + - name: Run tests + run: cd backend && + pip install -r requirements.txt && + python manage.py test + + ################################ # Run Linter against code base # ################################ @@ -51,7 +57,3 @@ jobs: DEFAULT_BRANCH: master GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Run tests - run: cd backend && - pip install -r requirements.txt && - python manage.py test diff --git a/.github/workflows/linter.yml~ b/.github/workflows/linter.yml~ deleted file mode 100644 index 60bb57f..0000000 --- a/.github/workflows/linter.yml~ +++ /dev/null @@ -1,57 +0,0 @@ ---- -################################# -################################# -## Super Linter GitHub Actions ## -################################# -################################# -name: Lint Code Base - -# -# Documentation: -# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions -# - -############################# -# Start the job on all push # -############################# -on: - pull_request: - branches: [master, main] - -############### -# Set the Job # -############### -jobs: - build: - # Name the Job - name: Lint Code Base - # Set the agent to run on - runs-on: ubuntu-latest - - ################## - # Load all steps # - ################## - steps: - ########################## - # Checkout the code base # - ########################## - - name: Checkout Code - uses: actions/checkout@v3 - with: - # Full git history is needed to get a proper list of changed files within `super-linter` - fetch-depth: 0 - - ################################ - # Run Linter against code base # - ################################ - - name: Lint Code Base - uses: github/super-linter@v4 - env: - VALIDATE_ALL_CODEBASE: false - DEFAULT_BRANCH: master - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Run tests - run: cd backend && - python install -r requirements.txt && - python manage.py test From 972ab7a87edcb1f511699c950b0fd0e56b4497fe Mon Sep 17 00:00:00 2001 From: angel_in_a_jar Date: Wed, 29 Jun 2022 13:52:31 +0300 Subject: [PATCH 4/7] pop request delivery was created --- backend/.gitignore | 5 +++++ backend/delivery/serializers.py | 13 +++++++++++++ backend/delivery/views.py | 14 ++++++++++---- backend/orders/serializers.py | 4 +--- backend/orders/views.py | 4 ++++ backend/users/models.py | 6 ++---- backend/users/serializers.py | 18 +++++------------- backend/users/views.py | 1 - 8 files changed, 40 insertions(+), 25 deletions(-) diff --git a/backend/.gitignore b/backend/.gitignore index 681ceb5..bbfbf86 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -6,6 +6,11 @@ __pycache__ db.sqlite3 media +orders/migrations/ +feedback/migrations/ +users/migrations/ +delivery/migrations/ + # Backup files # *.bak diff --git a/backend/delivery/serializers.py b/backend/delivery/serializers.py index a08d0f6..2e1a6f3 100644 --- a/backend/delivery/serializers.py +++ b/backend/delivery/serializers.py @@ -23,3 +23,16 @@ def update(self, instance, validated_data): instance.angelConfirmation = validated_data.get('angelConfirmation', instance.angelConfirmation) instance.save() return instance + + +class DeliveryPutSerializer(serializers.ModelSerializer): + class Meta: + model = Delivery + fields = ['customerConfirmation', 'angelConfirmation'] + extra_kwargs = {'customerConfirmation': {'required': False}, 'angelConfirmation': {'required': False}} + + def update(self, instance, validated_data): + instance.customerConfirmation = validated_data.get('customerConfirmation', instance.customerConfirmation) + instance.angelConfirmation = validated_data.get('angelConfirmation', instance.angelConfirmation) + instance.save() + return instance diff --git a/backend/delivery/views.py b/backend/delivery/views.py index 6b65203..3eabb47 100644 --- a/backend/delivery/views.py +++ b/backend/delivery/views.py @@ -1,9 +1,8 @@ -from django.shortcuts import render from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response from .models import Delivery -from .serializers import DeliverySerializer +from .serializers import DeliverySerializer, DeliveryPutSerializer @api_view(['GET', 'POST']) @@ -32,17 +31,24 @@ def delivery_list(request, format=None): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) -@api_view(['GET']) +@api_view(['GET', 'PUT']) def delivery_detail(request, pk, format=None): token = request.GET.get('token') if token is None or token == '': return Response(status=status.HTTP_400_BAD_REQUEST) try: - delivery = Delivery.objects.get(pk=pk) + delivery = Delivery.objects.get(orderId=pk) except Delivery.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET': serializer = DeliverySerializer(delivery) return Response(serializer.data) + + elif request.method == 'PUT': + serializer = DeliveryPutSerializer(delivery, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/backend/orders/serializers.py b/backend/orders/serializers.py index 971503d..6d361e3 100644 --- a/backend/orders/serializers.py +++ b/backend/orders/serializers.py @@ -1,6 +1,5 @@ from rest_framework import serializers from .models import Order -from django.db import models class OrderSerializer(serializers.Serializer): @@ -38,7 +37,6 @@ def update(self, instance, validated_data): class OrderPutSerializer(serializers.ModelSerializer): - class Meta: model = Order fields = ['status', 'possibleAngelsIds'] @@ -46,6 +44,6 @@ class Meta: def update(self, instance, validated_data): instance.status = validated_data.get('status', instance.status) - instance.possibleAngelsIds = instance.possibleAngelsIds + validated_data.get('possibleAngelsIds', instance.possibleAngelsIds) + instance.possibleAngelsIds = validated_data.get('possibleAngelsIds', instance.possibleAngelsIds) instance.save() return instance diff --git a/backend/orders/views.py b/backend/orders/views.py index dc31e9c..1955042 100644 --- a/backend/orders/views.py +++ b/backend/orders/views.py @@ -3,6 +3,7 @@ from rest_framework.response import Response from .models import Order from .serializers import OrderSerializer, OrderPutSerializer +from users.models import User @api_view(['GET', 'POST']) @@ -41,6 +42,9 @@ def order_list(request, format=None): serializer = OrderSerializer(data=request.data) if serializer.is_valid(): serializer.save() + user = User.objects.all().get(pk=serializer.data['customerId']) + user.createdOrdersHistoryIds.append(serializer.data['id']) + user.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/backend/users/models.py b/backend/users/models.py index 3e95181..0d77801 100644 --- a/backend/users/models.py +++ b/backend/users/models.py @@ -1,5 +1,3 @@ -from array import array -from email.policy import default from django.db import models @@ -11,5 +9,5 @@ class User(models.Model): email = models.CharField(max_length=200, null=False, blank=False) age = models.IntegerField(null=False, blank=False) deliveryRate = models.DecimalField(decimal_places=1, max_digits=1000, null=False, blank=False, default=0) - createdOrdersHistoryIds = models.JSONField(null=True, blank=True, default=dict) - deliveredOrdersHistoryIds = models.JSONField(null=True, blank=True, default=dict) + createdOrdersHistoryIds = models.JSONField(null=True, blank=True, default=list) + deliveredOrdersHistoryIds = models.JSONField(null=True, blank=True, default=list) diff --git a/backend/users/serializers.py b/backend/users/serializers.py index b3616ba..d0af616 100644 --- a/backend/users/serializers.py +++ b/backend/users/serializers.py @@ -1,7 +1,6 @@ from rest_framework import serializers from .models import User from uuid import uuid4 -from django.db.models import Q from django.core.exceptions import ValidationError @@ -43,6 +42,7 @@ class UserLoginSerializer(serializers.ModelSerializer): # to accept either username or email id = serializers.IntegerField(read_only=True) name = serializers.CharField() + passwordMd5hash = serializers.CharField(write_only=True) token = serializers.CharField(required=False, read_only=True) def validate(self, data): @@ -54,22 +54,13 @@ def validate(self, data): user = None # if the email has been passed if '@' in name: - user = User.objects.filter( - Q(email=name) & - Q(passwordMd5hash=passwordMd5hash) - ).distinct() - if not user.exists(): - raise ValidationError("User credentials are not correct.") - user = User.objects.get(email=name) + user = User.objects.get(email=name, passwordMd5hash=passwordMd5hash) else: - user = User.objects.filter( - Q(name=name) & - Q(passwordMd5hash=passwordMd5hash) - ).distinct() - user = User.objects.get(name=name) + user = User.objects.get(phoneNumber=name, passwordMd5hash=passwordMd5hash) data['token'] = uuid4() user.token = data['token'] data['id'] = user.id + data['name'] = user.name user.save() return data @@ -79,6 +70,7 @@ class Meta: 'id', 'name', 'token', + 'passwordMd5hash', ) read_only_fields = ( diff --git a/backend/users/views.py b/backend/users/views.py index cbebc4b..2f47a13 100644 --- a/backend/users/views.py +++ b/backend/users/views.py @@ -1,4 +1,3 @@ -from django.shortcuts import render from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response From 558a3e244ec3207f4c38a578930a3474d024b2f5 Mon Sep 17 00:00:00 2001 From: angel_in_a_jar Date: Wed, 29 Jun 2022 15:22:23 +0300 Subject: [PATCH 5/7] added deliveredOrdersHistoryIds --- backend/delivery/models.py | 1 - backend/delivery/serializers.py | 2 -- backend/delivery/views.py | 4 ++++ backend/orders/models.py | 2 +- backend/orders/serializers.py | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/delivery/models.py b/backend/delivery/models.py index 696969f..67c5ca0 100644 --- a/backend/delivery/models.py +++ b/backend/delivery/models.py @@ -5,6 +5,5 @@ class Delivery(models.Model): customerId = models.IntegerField(null=False, blank=False) angelId = models.IntegerField(null=False, blank=False) orderId = models.IntegerField(null=False, blank=False) - estimatedTime = models.TimeField(null=False, blank=False) customerConfirmation = models.BooleanField(null=False, blank=False) angelConfirmation = models.BooleanField(null=False, blank=False) diff --git a/backend/delivery/serializers.py b/backend/delivery/serializers.py index 2e1a6f3..eab0c6a 100644 --- a/backend/delivery/serializers.py +++ b/backend/delivery/serializers.py @@ -7,7 +7,6 @@ class DeliverySerializer(serializers.Serializer): customerId = serializers.IntegerField() angelId = serializers.IntegerField() orderId = serializers.IntegerField() - estimatedTime = serializers.TimeField() customerConfirmation = serializers.BooleanField() angelConfirmation = serializers.BooleanField() @@ -18,7 +17,6 @@ def update(self, instance, validated_data): instance.customerId = validated_data.get('customerId', instance.customerId) instance.angelId = validated_data.get('angelId', instance.angelId) instance.orderId = validated_data.get('orderId', instance.orderId) - instance.estimatedTime = validated_data.get('estimatedTime', instance.estimatedTime) instance.customerConfirmation = validated_data.get('customerConfirmation', instance.customerConfirmation) instance.angelConfirmation = validated_data.get('angelConfirmation', instance.angelConfirmation) instance.save() diff --git a/backend/delivery/views.py b/backend/delivery/views.py index 3eabb47..084afc2 100644 --- a/backend/delivery/views.py +++ b/backend/delivery/views.py @@ -3,6 +3,7 @@ from rest_framework.response import Response from .models import Delivery from .serializers import DeliverySerializer, DeliveryPutSerializer +from users.models import User @api_view(['GET', 'POST']) @@ -27,6 +28,9 @@ def delivery_list(request, format=None): serializer = DeliverySerializer(data=request.data) if serializer.is_valid(): serializer.save() + user = User.objects.all().get(pk=serializer.data['angelId']) + user.deliveredOrdersHistoryIds.append(serializer.data['orderId']) + user.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/backend/orders/models.py b/backend/orders/models.py index 996ff7a..7ad6a67 100644 --- a/backend/orders/models.py +++ b/backend/orders/models.py @@ -10,7 +10,7 @@ class Order(models.Model): customerId = models.IntegerField(null=False, blank=False) name = models.CharField(max_length=100, null=False, blank=False) description = models.CharField(max_length=1000, null=True, blank=True, default='') - expectedDeliveryTime = models.DateField(auto_now=True, null=False, blank=False) + expectedDeliveryTime = models.TimeField(null=False, blank=False) status = models.CharField(max_length=1, choices=STATUS, null=False, blank=False) weight = models.DecimalField(decimal_places=2, max_digits=1000, null=False, blank=False) cost = models.IntegerField(null=False, blank=False) diff --git a/backend/orders/serializers.py b/backend/orders/serializers.py index 6d361e3..3765307 100644 --- a/backend/orders/serializers.py +++ b/backend/orders/serializers.py @@ -7,7 +7,7 @@ class OrderSerializer(serializers.Serializer): customerId = serializers.IntegerField() name = serializers.CharField(max_length=100) description = serializers.CharField(max_length=1000) - expectedDeliveryTime = serializers.DateField() + expectedDeliveryTime = serializers.TimeField() status = serializers.CharField(max_length=1) weight = serializers.DecimalField(decimal_places=2, max_digits=1000) cost = serializers.IntegerField() From 0ecdee20ebc7765445288ede432d9ea1cffffb74 Mon Sep 17 00:00:00 2001 From: angel_in_a_jar Date: Wed, 29 Jun 2022 15:57:07 +0300 Subject: [PATCH 6/7] tests fix --- backend/tests/test_models.py | 9 +---- backend/tests/test_views.py | 78 ++++++++++++++++++++++++++---------- 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/backend/tests/test_models.py b/backend/tests/test_models.py index 6b13186..f4d989f 100644 --- a/backend/tests/test_models.py +++ b/backend/tests/test_models.py @@ -8,7 +8,7 @@ class DeliveryModelTest(TestCase): @classmethod def setUpTestData(cls): - Delivery.objects.create(customerId=1, angelId=23, orderId=2, estimatedTime='20:00', + Delivery.objects.create(customerId=1, angelId=23, orderId=2, customerConfirmation=True, angelConfirmation=True) def test_customer_id_label(self): @@ -26,11 +26,6 @@ def test_order_id_label(self): field_label = delivery._meta.get_field('orderId').verbose_name self.assertEquals(field_label, 'orderId') - def test_estimated_time_label(self): - delivery = Delivery.objects.get(id=1) - field_label = delivery._meta.get_field('estimatedTime').verbose_name - self.assertEquals(field_label, 'estimatedTime') - def test_customer_confirmation_label(self): delivery = Delivery.objects.get(id=1) field_label = delivery._meta.get_field('customerConfirmation').verbose_name @@ -77,7 +72,7 @@ class OrderModelTest(TestCase): @classmethod def setUpTestData(cls): Order.objects.create(customerId=12, name='Del', description='seven years bad luck', - expectedDeliveryTime='04:00', status='0', weight='100', cost='100', + expectedDeliveryTime='04:00:00', status='0', weight='100', cost='100', fee='50', address='Inno basement', possibleAngelsIds=[123, 456], picture='https://qwerty.com') diff --git a/backend/tests/test_views.py b/backend/tests/test_views.py index f47cf5a..4710a99 100644 --- a/backend/tests/test_views.py +++ b/backend/tests/test_views.py @@ -9,10 +9,14 @@ class DeliveryViewTest(TestCase): @classmethod def setUpTestData(cls): - number_of_delivery = 13 + User.objects.create(token='123', passwordMd5hash='qwerty12345', name='Del', + phoneNumber='88005553535', + email='yepper@gmail.com', age='14', deliveryRate=5.0, + createdOrdersHistoryIds=[123, 456], deliveredOrdersHistoryIds=[45]) + number_of_delivery = 2 for delivery_num in range(number_of_delivery): - Delivery.objects.create(customerId=delivery_num, angelId=delivery_num + 1, orderId=delivery_num + 2, - estimatedTime='20:00', customerConfirmation=True, angelConfirmation=True) + Delivery.objects.create(customerId=delivery_num, angelId=1, orderId=delivery_num + 2, + customerConfirmation=True, angelConfirmation=True) def test_view_url_exists_at_desired_location(self): resp = self.client.get('/delivery/?token=123') @@ -24,10 +28,9 @@ def test_view_url_accessible_by_name(self): def test_post_url_exists_at_desired_location(self): resp = self.client.post('/delivery/?token=123', { - "customerId": 12, - "angelId": 123, + "customerId": 1, + "angelId": 1, "orderId": 90, - "estimatedTime": "20:00", "customerConfirmation": True, "angelConfirmation": True }) @@ -35,21 +38,20 @@ def test_post_url_exists_at_desired_location(self): def test_post_url_accessible_by_name(self): resp = self.client.post(reverse('delivery') + '?token=123', { - "customerId": 12, - "angelId": 123, + "customerId": 1, + "angelId": 1, "orderId": 90, - "estimatedTime": "20:00", "customerConfirmation": True, "angelConfirmation": True }) self.assertEqual(resp.status_code, 201) def test_view_url_by_order_exists_at_desired_location(self): - resp = self.client.get('/delivery/1?token=123') + resp = self.client.get('/delivery/3?token=123') self.assertEqual(resp.status_code, 200) def test_view_url_by_order_accessible_by_name(self): - resp = self.client.get(reverse('delivery by id', args=[1]) + '?token=123') + resp = self.client.get(reverse('delivery by id', args=[3]) + '?token=123') self.assertEqual(resp.status_code, 200) def test_view_url_not_found_at_desired_location(self): @@ -60,6 +62,20 @@ def test_view_url_not_found_by_name(self): resp = self.client.get(reverse('delivery by id', args=[99]) + '?token=123') self.assertEqual(resp.status_code, 404) + def test_put_url_exists_at_desired_location(self): + resp = self.client.put('/delivery/3?token=123', { + "customerConfirmation": "true", + "angelConfirmation": "true" + }, content_type='application/json') + self.assertEqual(resp.status_code, 200) + + def test_put_url_accessible_by_name(self): + resp = self.client.put(reverse('delivery') + '3?token=123', { + "customerConfirmation": "true", + "angelConfirmation": "true" + }, content_type='application/json') + self.assertEqual(resp.status_code, 200) + class FeedbackViewTest(TestCase): @classmethod @@ -74,9 +90,13 @@ class OrdersViewTest(TestCase): @classmethod def setUpTestData(cls): number_of_orders = 5 + User.objects.create(token='123', passwordMd5hash='qwerty12345', name='Del', + phoneNumber='88005553535', + email='yepper@gmail.com', age='14', deliveryRate=5.0, + createdOrdersHistoryIds=[123, 456], deliveredOrdersHistoryIds=[45]) for order_num in range(number_of_orders): Order.objects.create(customerId=order_num, name='Del', description='seven years bad luck', - expectedDeliveryTime='04:00', status='0', weight='100', cost='100', + expectedDeliveryTime='04:00:00', status='0', weight='100', cost='100', fee='50', address='Inno basement', possibleAngelsIds=[123, 456], picture='https://qwerty.com') @@ -123,10 +143,10 @@ def test_view_url_accessible_by_name_filter4(self): def test_post_url_exists_at_desired_location(self): resp = self.client.post('/orders/?token=123', { - "customerId": 12, + "customerId": 1, "name": "Jack", "description": "1234", - "expectedDeliveryTime": "2022-06-20", + "expectedDeliveryTime": "04:00:00", "status": "2", "weight": "55.00", "cost": 55, @@ -142,10 +162,10 @@ def test_post_url_exists_at_desired_location(self): def test_post_url_accessible_by_name(self): resp = self.client.post(reverse('orders') + '?token=123', { - "customerId": 12, + "customerId": 1, "name": "Jack", "description": "1234", - "expectedDeliveryTime": "2022-06-20", + "expectedDeliveryTime": "04:00:00", "status": "2", "weight": "55.00", "cost": 55, @@ -202,8 +222,8 @@ def setUpTestData(cls): number_of_users = 10 for user_num in range(number_of_users): User.objects.create(token='123', passwordMd5hash='qwerty12345', name='Del ' + str(user_num), - phoneNumber='88005553535', - email='yepper@gmail.com', age='14', deliveryRate=5.0, + phoneNumber='88005553535 ' + str(user_num), + email='yepper@gmail.com ' + str(user_num), age='14', deliveryRate=5.0, createdOrdersHistoryIds=[123, 456], deliveredOrdersHistoryIds=[45]) def test_view_url_by_user_exists_at_desired_location(self): @@ -222,16 +242,30 @@ def test_view_url_not_found_by_name(self): resp = self.client.get(reverse('user by id', args=[99]) + '?token=123') self.assertEqual(resp.status_code, 404) - def test_post_url_sign_in_exists_at_desired_location(self): + def test_post_url_sign_in_exists_at_desired_location_number(self): + resp = self.client.post('/sign_in/', { + "name": "88005553535 0", + "passwordMd5hash": "qwerty12345" + }) + self.assertEqual(resp.status_code, 200) + + def test_post_url_sign_in_accessible_by_name_number(self): + resp = self.client.post(reverse('sign_in'), { + "name": "88005553535 0", + "passwordMd5hash": "qwerty12345" + }) + self.assertEqual(resp.status_code, 200) + + def test_post_url_sign_in_exists_at_desired_location_email(self): resp = self.client.post('/sign_in/', { - "name": "Del 0", + "name": "yepper@gmail.com 0", "passwordMd5hash": "qwerty12345" }) self.assertEqual(resp.status_code, 200) - def test_post_url_sign_in_accessible_by_name(self): + def test_post_url_sign_in_accessible_by_name_email(self): resp = self.client.post(reverse('sign_in'), { - "name": "Del 0", + "name": "yepper@gmail.com 0", "passwordMd5hash": "qwerty12345" }) self.assertEqual(resp.status_code, 200) From c514af3c982543a215af1bb1d9acab24b755797c Mon Sep 17 00:00:00 2001 From: angel_in_a_jar Date: Sun, 3 Jul 2022 12:26:26 +0300 Subject: [PATCH 7/7] fixed expectedDeliveryTime --- backend/orders/models.py | 2 +- backend/orders/serializers.py | 2 +- backend/tests/test_models.py | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/orders/models.py b/backend/orders/models.py index 7ad6a67..88c1006 100644 --- a/backend/orders/models.py +++ b/backend/orders/models.py @@ -10,7 +10,7 @@ class Order(models.Model): customerId = models.IntegerField(null=False, blank=False) name = models.CharField(max_length=100, null=False, blank=False) description = models.CharField(max_length=1000, null=True, blank=True, default='') - expectedDeliveryTime = models.TimeField(null=False, blank=False) + expectedDeliveryTime = models.CharField(max_length=50, null=False, blank=False) status = models.CharField(max_length=1, choices=STATUS, null=False, blank=False) weight = models.DecimalField(decimal_places=2, max_digits=1000, null=False, blank=False) cost = models.IntegerField(null=False, blank=False) diff --git a/backend/orders/serializers.py b/backend/orders/serializers.py index 3765307..d728518 100644 --- a/backend/orders/serializers.py +++ b/backend/orders/serializers.py @@ -7,7 +7,7 @@ class OrderSerializer(serializers.Serializer): customerId = serializers.IntegerField() name = serializers.CharField(max_length=100) description = serializers.CharField(max_length=1000) - expectedDeliveryTime = serializers.TimeField() + expectedDeliveryTime = serializers.CharField(max_length=50) status = serializers.CharField(max_length=1) weight = serializers.DecimalField(decimal_places=2, max_digits=1000) cost = serializers.IntegerField() diff --git a/backend/tests/test_models.py b/backend/tests/test_models.py index f4d989f..35771be 100644 --- a/backend/tests/test_models.py +++ b/backend/tests/test_models.py @@ -136,6 +136,11 @@ def test_name_max_length(self): max_length = order._meta.get_field('name').max_length self.assertEquals(max_length, 100) + def test_time_max_length(self): + order = Order.objects.get(id=1) + max_length = order._meta.get_field('expectedDeliveryTime').max_length + self.assertEquals(max_length, 50) + def test_description_max_length(self): order = Order.objects.get(id=1) max_length = order._meta.get_field('description').max_length