|
1 |
| -from django.test import TestCase |
2 |
| -from unittest.mock import patch |
3 |
| -from rest_framework.test import APIClient |
| 1 | +from rest_framework.test import APITestCase, APIClient |
4 | 2 | from rest_framework import status
|
| 3 | +from unittest.mock import patch |
| 4 | +from authentication.models import User |
| 5 | +from user_expense_type.models import UserExpenseType |
| 6 | +from bankcard.models import BankCard |
5 | 7 | from authentication.services.cognito_service import CognitoService
|
6 |
| -from rest_framework.response import Response |
7 |
| -from .views import ExpenseViewSet, ExpenseGroupedByTypeAndCategoryViewSet |
8 | 8 |
|
9 | 9 |
|
10 |
| -class ExpenseViewSetTestCase(TestCase): |
| 10 | +class ExpenseViewSetTestCase(APITestCase): |
11 | 11 | def setUp(self):
|
12 | 12 | self.client = APIClient()
|
13 |
| - self.view = ExpenseViewSet() |
14 |
| - self.expense = { |
15 |
| - "user_expense_type": 1, |
| 13 | + self.user = User.objects.create_user( |
| 14 | + username="test@email.com", |
| 15 | + email="test@email.com", |
| 16 | + password="TestPassword1", |
| 17 | + first_name="Test User", |
| 18 | + user_id="389704ef-1e4f-4000-a801-bf887a1c88f2", |
| 19 | + ) |
| 20 | + self.user_expense_type = UserExpenseType.objects.create( |
| 21 | + username="389704ef-1e4f-4000-a801-bf887a1c88f2", set_by_user=False, name="Personal" |
| 22 | + ) |
| 23 | + self.bankcard = BankCard.objects.create( |
| 24 | + user_id=self.user, account_number=123456, bank_name="Test Bank", card_type="debit" |
| 25 | + ) |
| 26 | + self.expense_data = { |
| 27 | + "user_expense_type": self.user_expense_type.id, |
16 | 28 | "category": 1,
|
17 |
| - "bankcard_id": 1, |
| 29 | + "bankcard_id": self.bankcard.id, |
18 | 30 | "amount": 100,
|
| 31 | + "description": "Test description", |
| 32 | + "username": "389704ef-1e4f-4000-a801-bf887a1c88f2", |
19 | 33 | }
|
20 | 34 |
|
21 |
| - @patch.object(ExpenseViewSet, "create") |
22 |
| - @patch.object(CognitoService, "login_user") |
23 |
| - def test_create(self, mock_login_user, mock_create): |
24 |
| - mock_login_user.return_value = { |
25 |
| - "AuthenticationResult": {"AccessToken": "mock_access_token", "IdToken": "mock_id_token"} |
26 |
| - } |
27 |
| - mock_create.return_value = Response(status=status.HTTP_201_CREATED, data=self.expense) |
28 |
| - |
29 |
| - request = self.client.post("/expenses/", self.expense) |
30 |
| - request.headers["Authorization"] = "Bearer mock_access_token" |
| 35 | + @patch("authentication.decorators.get_user_id_from_token") |
| 36 | + @patch("expenses.views.categorize_expense_description") |
| 37 | + @patch("expenses.views.get_user_id_from_token") |
| 38 | + def test_create(self, mock_get_user_id, mock_categorize, mock_auth_get_user_id): |
| 39 | + mock_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
| 40 | + mock_categorize.return_value = self.expense_data, None |
| 41 | + mock_auth_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
31 | 42 |
|
32 |
| - response = self.client.post("/expenses/", self.expense) |
| 43 | + response = self.client.post("/expenses/", self.expense_data) |
33 | 44 |
|
34 | 45 | self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
35 | 46 | self.assertEqual(response.data["amount"], 100)
|
36 | 47 |
|
37 |
| - @patch.object(ExpenseViewSet, "list") |
38 |
| - @patch.object(CognitoService, "login_user") |
39 |
| - def test_list(self, mock_login_user, mock_list): |
40 |
| - mock_login_user.return_value = { |
41 |
| - "AuthenticationResult": {"AccessToken": "mock_access_token", "IdToken": "mock_id_token"} |
42 |
| - } |
43 |
| - mock_list.return_value = Response(status=status.HTTP_200_OK, data=self.expense) |
44 |
| - |
45 |
| - request = self.client.get("/expenses/") |
46 |
| - request.headers["Authorization"] = "Bearer mock_access_token" |
| 48 | + @patch("authentication.decorators.get_user_id_from_token") |
| 49 | + @patch("expenses.views.categorize_expense_description") |
| 50 | + @patch("expenses.views.get_user_id_from_token") |
| 51 | + def test_list(self, mock_get_user_id, mock_categorize, mock_auth_get_user_id): |
| 52 | + mock_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
| 53 | + mock_categorize.return_value = self.expense_data, None |
| 54 | + mock_auth_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
47 | 55 |
|
| 56 | + response = self.client.post("/expenses/", self.expense_data) |
| 57 | + response = self.client.post("/expenses/", self.expense_data) |
48 | 58 | response = self.client.get("/expenses/")
|
49 | 59 |
|
50 | 60 | self.assertEqual(response.status_code, status.HTTP_200_OK)
|
51 |
| - self.assertEqual(response.data["amount"], 100) |
| 61 | + self.assertEqual(len(response.data), 2) |
52 | 62 |
|
53 |
| - @patch.object(ExpenseViewSet, "retrieve") |
54 |
| - @patch.object(CognitoService, "login_user") |
55 |
| - def test_retrieve(self, mock_login_user, mock_retrieve): |
56 |
| - mock_login_user.return_value = { |
57 |
| - "AuthenticationResult": {"AccessToken": "mock_access_token", "IdToken": "mock_id_token"} |
58 |
| - } |
59 |
| - mock_retrieve.return_value = Response(status=status.HTTP_200_OK, data=self.expense) |
60 |
| - |
61 |
| - request = self.client.get("/expenses/1/") |
62 |
| - request.headers["Authorization"] = "Bearer mock_access_token" |
| 63 | + @patch("authentication.decorators.get_user_id_from_token") |
| 64 | + @patch("expenses.views.categorize_expense_description") |
| 65 | + @patch("expenses.views.get_user_id_from_token") |
| 66 | + def test_retrieve(self, mock_get_user_id, mock_categorize, mock_auth_get_user_id): |
| 67 | + mock_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
| 68 | + mock_categorize.return_value = self.expense_data, None |
| 69 | + mock_auth_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
63 | 70 |
|
64 |
| - response = self.client.get("/expenses/1/") |
| 71 | + response = self.client.post("/expenses/", self.expense_data) |
| 72 | + response = self.client.get(f"/expenses/{response.data['id']}/") |
65 | 73 |
|
66 | 74 | self.assertEqual(response.status_code, status.HTTP_200_OK)
|
67 | 75 | self.assertEqual(response.data["amount"], 100)
|
68 | 76 |
|
69 |
| - @patch.object(ExpenseViewSet, "destroy") |
70 |
| - @patch.object(CognitoService, "login_user") |
71 |
| - def test_destroy(self, mock_login_user, mock_destroy): |
72 |
| - mock_login_user.return_value = { |
73 |
| - "AuthenticationResult": {"AccessToken": "mock_access_token", "IdToken": "mock_id_token"} |
74 |
| - } |
75 |
| - mock_destroy.return_value = Response(status=status.HTTP_204_NO_CONTENT) |
76 |
| - |
77 |
| - request = self.client.delete("/expenses/1/") |
78 |
| - request.headers["Authorization"] = "Bearer mock_access_token" |
79 |
| - |
80 |
| - response = self.client.delete("/expenses/1/") |
81 |
| - |
82 |
| - self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) |
| 77 | + @patch("authentication.decorators.get_user_id_from_token") |
| 78 | + @patch("expenses.views.categorize_expense_description") |
| 79 | + @patch("expenses.views.get_user_id_from_token") |
| 80 | + def test_update(self, mock_get_user_id, mock_categorize, mock_auth_get_user_id): |
| 81 | + mock_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
| 82 | + mock_categorize.return_value = self.expense_data, None |
| 83 | + mock_auth_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
83 | 84 |
|
84 |
| - @patch.object(ExpenseViewSet, "partial_update") |
85 |
| - @patch.object(CognitoService, "login_user") |
86 |
| - def test_partial_update(self, mock_login_user, mock_partial_update): |
87 |
| - mock_login_user.return_value = { |
88 |
| - "AuthenticationResult": {"AccessToken": "mock_access_token", "IdToken": "mock_id_token"} |
89 |
| - } |
90 |
| - new_expense = { |
91 |
| - "expense_type": 1, |
92 |
| - "category": 1, |
93 |
| - "bankcard_id": 1, |
94 |
| - "amount": 200, |
95 |
| - } |
96 |
| - mock_partial_update.return_value = Response(status=status.HTTP_200_OK, data=new_expense) |
97 |
| - |
98 |
| - request = self.client.put("/expenses/1/", {"amount": 200}) |
99 |
| - request.headers["Authorization"] = "Bearer mock_access_token" |
100 |
| - |
101 |
| - response = self.client.put("/expenses/1/", {"amount": 200}) |
| 85 | + response = self.client.post("/expenses/", self.expense_data) |
| 86 | + response = self.client.put(f"/expenses/{response.data['id']}/", {"amount": 200}) |
102 | 87 |
|
103 | 88 | self.assertEqual(response.status_code, status.HTTP_200_OK)
|
104 | 89 | self.assertEqual(response.data["amount"], 200)
|
105 | 90 |
|
| 91 | + @patch("authentication.decorators.get_user_id_from_token") |
| 92 | + @patch("expenses.views.categorize_expense_description") |
| 93 | + @patch("expenses.views.get_user_id_from_token") |
| 94 | + def test_delete(self, mock_get_user_id, mock_categorize, mock_auth_get_user_id): |
| 95 | + mock_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
| 96 | + mock_categorize.return_value = self.expense_data, None |
| 97 | + mock_auth_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
106 | 98 |
|
107 |
| -class ExpenseGroupedByTypeAndCategoryViewSetTestCase(TestCase): |
108 |
| - def setUp(self): |
109 |
| - self.client = APIClient() |
110 |
| - self.view = ExpenseGroupedByTypeAndCategoryViewSet() |
111 |
| - self.expense = { |
112 |
| - "expense_type": 1, |
113 |
| - "category": 1, |
114 |
| - "bankcard_id": 1, |
115 |
| - "amount": 100, |
116 |
| - } |
117 |
| - self.expenses_grouped = {"Personal": {"Comida": 100}} |
| 99 | + response = self.client.post("/expenses/", self.expense_data) |
| 100 | + response = self.client.delete(f"/expenses/{response.data['id']}/") |
118 | 101 |
|
119 |
| - @patch.object(ExpenseGroupedByTypeAndCategoryViewSet, "list") |
120 |
| - @patch.object(CognitoService, "login_user") |
121 |
| - def test_list(self, mock_login_user, mock_list): |
122 |
| - mock_login_user.return_value = { |
123 |
| - "AuthenticationResult": {"AccessToken": "mock_access_token", "IdToken": "mock_id_token"} |
124 |
| - } |
125 |
| - mock_list.return_value = Response(status=status.HTTP_200_OK, data=self.expenses_grouped) |
| 102 | + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) |
126 | 103 |
|
127 |
| - request = self.client.get("/expenses/grouped/") |
128 |
| - request.headers["Authorization"] = "Bearer mock_access_token" |
| 104 | + @patch("authentication.decorators.get_user_id_from_token") |
| 105 | + @patch("expenses.views.categorize_expense_description") |
| 106 | + @patch("expenses.views.get_user_id_from_token") |
| 107 | + def test_grouped(self, mock_get_user_id, mock_categorize, mock_auth_get_user_id): |
| 108 | + mock_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
| 109 | + mock_categorize.return_value = self.expense_data, None |
| 110 | + mock_auth_get_user_id.return_value = "389704ef-1e4f-4000-a801-bf887a1c88f2" |
129 | 111 |
|
| 112 | + response = self.client.post("/expenses/", self.expense_data) |
| 113 | + response = self.client.post("/expenses/", self.expense_data) |
130 | 114 | response = self.client.get("/expenses/grouped/")
|
131 | 115 |
|
132 | 116 | self.assertEqual(response.status_code, status.HTTP_200_OK)
|
133 |
| - self.assertIn("Personal", response.data) |
134 |
| - self.assertIn("Comida", response.data["Personal"]) |
135 |
| - self.assertEqual(response.data["Personal"]["Comida"], 100) |
| 117 | + self.assertEqual(len(response.data), 1) |
| 118 | + self.assertEqual(response.data["Personal"]["Comida"], 200) |
0 commit comments