From 400a0c710e796c86bbba7e79872bd2bc59d8f06e Mon Sep 17 00:00:00 2001 From: hgh Date: Wed, 3 Sep 2025 15:44:04 +0330 Subject: [PATCH] wallet withdraw and deposit different scenario flows test --- apps/wallet/tests/application.py | 99 ++++++++++++++++++++++++++++++++ apps/wallet/views/application.py | 15 +---- 2 files changed, 102 insertions(+), 12 deletions(-) diff --git a/apps/wallet/tests/application.py b/apps/wallet/tests/application.py index 592a337..f0c5edc 100755 --- a/apps/wallet/tests/application.py +++ b/apps/wallet/tests/application.py @@ -131,6 +131,55 @@ class ApplicationApiFlowsTests(APITestCase): self.assertContains(response, 'balance') self.assertEqual(response.json()['balance'], 100) + def test_deposit_flow_insufficient_balance(self): + auth = self._create_authorization_header(self.application_access_token.token) + + # Checking wallets initials values(application balance = 300 and payee balance = zero) + response = self.client.get(reverse('wallet:application_wallet_balance_api'), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 300) + params = { + 'uuid': self.payee_uuid, + } + response = self.client.get(reverse('wallet:application_user_wallet_balance_api', kwargs=params), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 0) + + # Deposit process + data = { + 'amount': 500, + 'payee_id': self.payee_uuid, + 'payee_type': TypeChoices.USER + } + response = self.client.post(reverse('wallet:application_deposit_submit_api'), data=data, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 500) + + def test_deposit_flow_prevent_double_spending(self): + auth = self._create_authorization_header(self.application_access_token.token) + + # Checking wallets initials values(application balance = 300 and payee balance = zero) + response = self.client.get(reverse('wallet:application_wallet_balance_api'), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 300) + params = { + 'uuid': self.payee_uuid, + } + response = self.client.get(reverse('wallet:application_user_wallet_balance_api', kwargs=params), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 0) + + # Deposit process + data = { + 'amount': 200, + 'payee_id': self.payee_uuid, + 'payee_type': TypeChoices.USER + } + response = self.client.post(reverse('wallet:application_deposit_submit_api'), data=data, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 201) + + response = self.client.post(reverse('wallet:application_deposit_submit_api'), data=data, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 500) + def test_withdraw_flow_success(self): auth = self._create_authorization_header(self.payer_access_token.token) @@ -174,3 +223,53 @@ class ApplicationApiFlowsTests(APITestCase): self.assertContains(response, 'balance') self.assertEqual(response.json()['balance'], 200) + def test_withdraw_flow_insufficient_balance(self): + auth = self._create_authorization_header(self.payer_access_token.token) + + # Checking wallets initials values(application balance = 300 and payee balance = zero) + response = self.client.get(reverse('wallet:application_wallet_balance_api'), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 300) + params = { + 'uuid': self.payer_uuid, + } + response = self.client.get(reverse('wallet:application_user_wallet_balance_api', kwargs=params), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 300) + + # Deposit process + data = { + 'amount': 500, + 'payer_id': self.payer_uuid, + 'payer_type': TypeChoices.USER + } + response = self.client.post(reverse('wallet:application_withdraw_submit_api'), data=data, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 500) + + def test_withdraw_flow_prevent_double_spending(self): + auth = self._create_authorization_header(self.payer_access_token.token) + + # Checking wallets initials values(application balance = 300 and payee balance = zero) + response = self.client.get(reverse('wallet:application_wallet_balance_api'), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 300) + params = { + 'uuid': self.payer_uuid, + } + response = self.client.get(reverse('wallet:application_user_wallet_balance_api', kwargs=params), HTTP_AUTHORIZATION=auth) + self.assertContains(response, 'balance') + self.assertEqual(response.json()['balance'], 300) + + # Deposit process + data = { + 'amount': 200, + 'payer_id': self.payer_uuid, + 'payer_type': TypeChoices.USER + } + response = self.client.post(reverse('wallet:application_withdraw_submit_api'), data=data, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 201) + + response = self.client.post(reverse('wallet:application_withdraw_submit_api'), data=data, HTTP_AUTHORIZATION=auth) + self.assertEqual(response.status_code, 500) + + diff --git a/apps/wallet/views/application.py b/apps/wallet/views/application.py index 9501d84..c580fed 100755 --- a/apps/wallet/views/application.py +++ b/apps/wallet/views/application.py @@ -285,11 +285,7 @@ class CategoryDepositSubmitAPIView(generics.CreateAPIView): payee_wallet, _ = Wallet.objects.get_or_create(owner_uuid=payee_id, owner_type=payee_type, category=category) instance = serializer.save(payer_wallet=payer_wallet, application=application, payee_wallet=payee_wallet) - try: - instance.category_submit() - except Exception as e: - print(e) - APIException('Failed to submit deposit') + instance.category_submit() class CategoryDepositVerifyAPIView(generics.RetrieveAPIView): @@ -347,14 +343,9 @@ class CategoryWithdrawSubmitAPIView(generics.CreateAPIView): payer_type = serializer.validated_data.pop('payer_type') payee_wallet, _ = Wallet.objects.get_or_create(owner_uuid=application.uuid, owner_type=TypeChoices.APPLICATION, category=category) - payer_wallet, _ = Wallet.objects.get_or_create(owner_uuid=payer_id, owner_type=TypeChoices.USER, category=category) + payer_wallet, _ = Wallet.objects.get_or_create(owner_uuid=payer_id, owner_type=payer_type, category=category) instance = serializer.save(payer_wallet=payer_wallet, application=application, payee_wallet=payee_wallet) - - try: - instance.category_submit() - except Exception as e: - print(e) - APIException('Failed to submit withdraw') + instance.category_submit() class CategoryWithdrawVerifyAPIView(generics.RetrieveAPIView):