Pular para conteúdo

Test finances transaction detail view

TransactionAPIDetailTest

Bases: TestCase

Teste para a classe TransactionAPIDetail.

Esta classe contém testes para os métodos da classe TransactionAPIDetail, que lida com operações detalhadas relacionadas à uma transação específica.

Source code in finances/tests/test_finances_transaction_detail_view.py
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
class TransactionAPIDetailTest(TestCase):
    """
    Teste para a classe TransactionAPIDetail.

    Esta classe contém testes para os métodos da classe TransactionAPIDetail,
    que lida com operações detalhadas relacionadas à uma transação específica.
    """

    def setUp(self):
        """
        Configuração inicial para os testes.

        Este método é executado antes de cada teste. Ele cria uma instância
        inicial de objetos necessários para os testes.
        """

        self.factory = RequestFactory()

        self.user = User.objects.create_user(
            username='user1',
            password='password1',
            first_name='Carlos',
            last_name='Alberto',
            email='carlos@email.com'
        )

        self.account = Account.objects.create(
            owner=self.user,
            name='Conta Corrente',
            balance=1000
        )

        self.category_1 = Category.objects.create(
            name='Academia'
        )

        self.category_2 = Category.objects.create(
            name="Medicamentos"
        )

        self.transaction = Transaction.objects.create(
            amount=150,
            description='Compra de remédios na farmácia.',
            account=self.account,
            category=self.category_1
        )

        self.budget = Budget.objects.create(
            start_date='2023-08-01',
            end_date='2023-08-31',
            amount=150,
            account=self.account,
            category=self.category_2
        )

    def test_get(self):
        """
        Testa o método GET para obter a transação específica.

        Este teste verifica se o método GET retorna o status HTTP 200 OK para
        uma solicitação de listagem com detalhes de uma transação específica.
        """

        view = TransactionAPIDetail.as_view()
        request = self.factory.get(f'/api/transaction/{self.transaction.pk}/')
        force_authenticate(request, user=self.user)  # Aqui está o ponto chave
        response = view(request, pk=self.transaction.pk)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_put(self):
        """
        Testa o método PUT para atualizar os dados da transação específica.

        Este teste verifica se o método PUT retorna o status HTTP 200 OK para
        uma solicitação de atualização com os dados válidos da transação.
        """

        view = TransactionAPIDetail.as_view()
        data = {
            'amount': 180,
            'description': 'Compra de remédios na farmácia.',
            'account': self.account.pk,
            'category': self.category_1.pk
        }
        request = self.factory.put(
            f'/api/transaction/{self.transaction.pk}/',
            data=data,
            content_type='application/json'
        )
        force_authenticate(request, user=self.user)  # Aqui está o ponto chave
        response = view(request, pk=self.transaction.pk)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_delete(self):
        """
        Testa o método DELETE para exclusão da transação específica.

        Este teste verifica se o método DELETE retorna o status HTTP 204 NO
        CONTENT para uma solicitação de exclusão válida da transação. Caso haja
        uma categoria associada junto ao orçamento, o valor 'spent' do
        orçamento é decrementado do valor da transação excluída.
        """

        view = TransactionAPIDetail.as_view()

        request = self.factory.delete(
            f'/api/transaction/{self.transaction.pk}/'
        )
        request.user = self.user

        response = view(request, pk=self.transaction.pk)

        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

        with self.assertRaises(Transaction.DoesNotExist):
            Transaction.objects.get(pk=self.transaction.pk)

        category = self.transaction.category
        if category.budget_set.exists():
            budget = category.budget_set.first()
            self.assertEqual(budget.spent, 0)

    def test_delete_non_existent_transaction(self):
        """
        Teste para o método DELETE para exclusão de uma transação não
        cadastrada.

        Este teste verifica se o método DELETE retorna o status HTTP 404 NOT
        FOUND após uma solicitação de exclusão de uma transação não existente.
        """

        view = TransactionAPIDetail.as_view()

        non_existent_transaction_id = self.transaction.pk + 100

        request = self.factory.delete(
            f'/api/transaction/{non_existent_transaction_id}/'
        )
        request.user = self.user

        response = view(request, pk=non_existent_transaction_id)

        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

    def test_delete_with_budget(self):
        """
        Testa o método DELETE para exclusão de uma transação específica que
        tenha um orçamento associado.

        Este teste verifica se o método DELETE retorna o status HTTP 204 NO
        CONTENT para uma solicitação de exclusão válida, além de atualizar o
        valor dos campos do orçamento.
        """

        request = self.factory.delete(
            f'/api/transaction/{self.transaction.pk}/'
        )

        view = TransactionAPIDetail()

        self.transaction.category = self.category_1
        self.transaction.save()

        new_budget = Budget.objects.create(
            start_date='2023-08-01',
            end_date='2023-08-31',
            amount=self.transaction.amount,
            account=self.account,
            category=self.category_1,
            spent=self.transaction.amount
        )

        request.user = self.user

        response = view.delete(request, pk=self.transaction.pk)

        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

        with self.assertRaises(Transaction.DoesNotExist):
            Transaction.objects.get(pk=self.transaction.pk)

        self.category_1.refresh_from_db()
        new_budget.refresh_from_db()
        self.assertEqual(new_budget.spent, 0)

    def test_delete_without_budget(self):
        """
        Testa o método DELETE para exclusão de uma transação específica que não
        tenha um orçamento associado.

        Este teste verifica se o método DELETE retorna o status HTTP 204 NO
        CONTENT após a solicitação de exclusão válida de uma transação sem um
        orçamento associado a ela.
        """

        request = self.factory.delete(
            f'/api/transaction/{self.transaction.pk}/'
        )

        view = TransactionAPIDetail()

        self.transaction.category = None
        self.transaction.save()

        request.user = self.user

        response = view.delete(request, pk=self.transaction.pk)

        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

        with self.assertRaises(Transaction.DoesNotExist):
            Transaction.objects.get(pk=self.transaction.pk)

setUp()

Configuração inicial para os testes.

Este método é executado antes de cada teste. Ele cria uma instância inicial de objetos necessários para os testes.

Source code in finances/tests/test_finances_transaction_detail_view.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
def setUp(self):
    """
    Configuração inicial para os testes.

    Este método é executado antes de cada teste. Ele cria uma instância
    inicial de objetos necessários para os testes.
    """

    self.factory = RequestFactory()

    self.user = User.objects.create_user(
        username='user1',
        password='password1',
        first_name='Carlos',
        last_name='Alberto',
        email='carlos@email.com'
    )

    self.account = Account.objects.create(
        owner=self.user,
        name='Conta Corrente',
        balance=1000
    )

    self.category_1 = Category.objects.create(
        name='Academia'
    )

    self.category_2 = Category.objects.create(
        name="Medicamentos"
    )

    self.transaction = Transaction.objects.create(
        amount=150,
        description='Compra de remédios na farmácia.',
        account=self.account,
        category=self.category_1
    )

    self.budget = Budget.objects.create(
        start_date='2023-08-01',
        end_date='2023-08-31',
        amount=150,
        account=self.account,
        category=self.category_2
    )

test_delete()

Testa o método DELETE para exclusão da transação específica.

Este teste verifica se o método DELETE retorna o status HTTP 204 NO CONTENT para uma solicitação de exclusão válida da transação. Caso haja uma categoria associada junto ao orçamento, o valor 'spent' do orçamento é decrementado do valor da transação excluída.

Source code in finances/tests/test_finances_transaction_detail_view.py
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
def test_delete(self):
    """
    Testa o método DELETE para exclusão da transação específica.

    Este teste verifica se o método DELETE retorna o status HTTP 204 NO
    CONTENT para uma solicitação de exclusão válida da transação. Caso haja
    uma categoria associada junto ao orçamento, o valor 'spent' do
    orçamento é decrementado do valor da transação excluída.
    """

    view = TransactionAPIDetail.as_view()

    request = self.factory.delete(
        f'/api/transaction/{self.transaction.pk}/'
    )
    request.user = self.user

    response = view(request, pk=self.transaction.pk)

    self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

    with self.assertRaises(Transaction.DoesNotExist):
        Transaction.objects.get(pk=self.transaction.pk)

    category = self.transaction.category
    if category.budget_set.exists():
        budget = category.budget_set.first()
        self.assertEqual(budget.spent, 0)

test_delete_non_existent_transaction()

Teste para o método DELETE para exclusão de uma transação não cadastrada.

Este teste verifica se o método DELETE retorna o status HTTP 404 NOT FOUND após uma solicitação de exclusão de uma transação não existente.

Source code in finances/tests/test_finances_transaction_detail_view.py
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
def test_delete_non_existent_transaction(self):
    """
    Teste para o método DELETE para exclusão de uma transação não
    cadastrada.

    Este teste verifica se o método DELETE retorna o status HTTP 404 NOT
    FOUND após uma solicitação de exclusão de uma transação não existente.
    """

    view = TransactionAPIDetail.as_view()

    non_existent_transaction_id = self.transaction.pk + 100

    request = self.factory.delete(
        f'/api/transaction/{non_existent_transaction_id}/'
    )
    request.user = self.user

    response = view(request, pk=non_existent_transaction_id)

    self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

test_delete_with_budget()

Testa o método DELETE para exclusão de uma transação específica que tenha um orçamento associado.

Este teste verifica se o método DELETE retorna o status HTTP 204 NO CONTENT para uma solicitação de exclusão válida, além de atualizar o valor dos campos do orçamento.

Source code in finances/tests/test_finances_transaction_detail_view.py
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
def test_delete_with_budget(self):
    """
    Testa o método DELETE para exclusão de uma transação específica que
    tenha um orçamento associado.

    Este teste verifica se o método DELETE retorna o status HTTP 204 NO
    CONTENT para uma solicitação de exclusão válida, além de atualizar o
    valor dos campos do orçamento.
    """

    request = self.factory.delete(
        f'/api/transaction/{self.transaction.pk}/'
    )

    view = TransactionAPIDetail()

    self.transaction.category = self.category_1
    self.transaction.save()

    new_budget = Budget.objects.create(
        start_date='2023-08-01',
        end_date='2023-08-31',
        amount=self.transaction.amount,
        account=self.account,
        category=self.category_1,
        spent=self.transaction.amount
    )

    request.user = self.user

    response = view.delete(request, pk=self.transaction.pk)

    self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

    with self.assertRaises(Transaction.DoesNotExist):
        Transaction.objects.get(pk=self.transaction.pk)

    self.category_1.refresh_from_db()
    new_budget.refresh_from_db()
    self.assertEqual(new_budget.spent, 0)

test_delete_without_budget()

Testa o método DELETE para exclusão de uma transação específica que não tenha um orçamento associado.

Este teste verifica se o método DELETE retorna o status HTTP 204 NO CONTENT após a solicitação de exclusão válida de uma transação sem um orçamento associado a ela.

Source code in finances/tests/test_finances_transaction_detail_view.py
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
def test_delete_without_budget(self):
    """
    Testa o método DELETE para exclusão de uma transação específica que não
    tenha um orçamento associado.

    Este teste verifica se o método DELETE retorna o status HTTP 204 NO
    CONTENT após a solicitação de exclusão válida de uma transação sem um
    orçamento associado a ela.
    """

    request = self.factory.delete(
        f'/api/transaction/{self.transaction.pk}/'
    )

    view = TransactionAPIDetail()

    self.transaction.category = None
    self.transaction.save()

    request.user = self.user

    response = view.delete(request, pk=self.transaction.pk)

    self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)

    with self.assertRaises(Transaction.DoesNotExist):
        Transaction.objects.get(pk=self.transaction.pk)

test_get()

Testa o método GET para obter a transação específica.

Este teste verifica se o método GET retorna o status HTTP 200 OK para uma solicitação de listagem com detalhes de uma transação específica.

Source code in finances/tests/test_finances_transaction_detail_view.py
64
65
66
67
68
69
70
71
72
73
74
75
76
def test_get(self):
    """
    Testa o método GET para obter a transação específica.

    Este teste verifica se o método GET retorna o status HTTP 200 OK para
    uma solicitação de listagem com detalhes de uma transação específica.
    """

    view = TransactionAPIDetail.as_view()
    request = self.factory.get(f'/api/transaction/{self.transaction.pk}/')
    force_authenticate(request, user=self.user)  # Aqui está o ponto chave
    response = view(request, pk=self.transaction.pk)
    self.assertEqual(response.status_code, status.HTTP_200_OK)

test_put()

Testa o método PUT para atualizar os dados da transação específica.

Este teste verifica se o método PUT retorna o status HTTP 200 OK para uma solicitação de atualização com os dados válidos da transação.

Source code in finances/tests/test_finances_transaction_detail_view.py
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
def test_put(self):
    """
    Testa o método PUT para atualizar os dados da transação específica.

    Este teste verifica se o método PUT retorna o status HTTP 200 OK para
    uma solicitação de atualização com os dados válidos da transação.
    """

    view = TransactionAPIDetail.as_view()
    data = {
        'amount': 180,
        'description': 'Compra de remédios na farmácia.',
        'account': self.account.pk,
        'category': self.category_1.pk
    }
    request = self.factory.put(
        f'/api/transaction/{self.transaction.pk}/',
        data=data,
        content_type='application/json'
    )
    force_authenticate(request, user=self.user)  # Aqui está o ponto chave
    response = view(request, pk=self.transaction.pk)
    self.assertEqual(response.status_code, status.HTTP_200_OK)