Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Posting data using Django unit testing not saving to backend

I am creating a django app which i which implement most of my logic before the design aspect of the application. I created a testcase for user registration but anytime I post to the registration url, it received my posted data but never populates it to database.

class AuthTest(TestCase):
    def setUp(self):
        self.client = Client()

    def test_reg_index(self):
        response = self.client.get(reverse_lazy('register'))
        return self.assertEqual(response.status_code, 200)

    def test_registration(self):
        data = {
            'last_name': 'test_user',
            'first_name': 'test_user',
            'email': '[email protected]',
            'phone': '08035112897',
        }
        response = self.client.post(reverse_lazy('register'), data)

        self.assertEqual(response.status_code, 302)

    def test_login(self):
        # self.client.login(username='foo', password='bar')  # request.user is now user foo
        data = {
            'email': '[email protected]',
            'password': 'pass123',
        }
        response = self.client.post(reverse_lazy('login'), data)

        self.assertEqual(response.status_code, 200)
class RegisterView(FormView):
    """
    this handles users registration
    """
    form_class = RegForm
    template_name = "club/register.html"
    success_url = reverse_lazy("register")

    # def get(self, request, *args, **kwargs):
    #     return super(RegisterView, self).get(request, *args, **kwargs)

    def form_invalid(self, form):
        print(form.errors.as_data)
        return super().form_invalid(form)

    def form_valid(self, form):
        """
        Process valid registration form
        :param form:
        :return: redirects to success_url
        """
        random_password = ''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(6))
        try:
            with transaction.atomic():
                """Allow database transactions"""
                data = form.cleaned_data
                user = User.objects.create_user(
                    email=data['email'],
                    password=random_password,
                    remember_token=hashlib.sha1(str(datetime.now()).encode('utf-8')).hexdigest()
                )
                user.profile.last_name = data['last_name']
                user.profile.first_name = data['first_name']
                user.profile.phone = data['phone']
                user.save()
                send_notification.delay(user.pk, random_password)
                print('Reg success')
                messages.success(self.request, "Regular successfully registered "
                                               "please check your mail for verification",
                                 extra_tags="alert-success")
        except IntegrityError as e:
            print(e)
            messages.error(self.request, "Registration Failed: Email address already exist", extra_tags="alert-danger")
            return super(RegisterView, self).form_invalid(form)
        except Exception as e:
            print(str(e))
            messages.error(self.request, "Registration Error, contact site administrator: ", extra_tags="alert-danger")
            return super(RegisterView, self).form_invalid(form)

        return super(RegisterView, self).form_valid(form)
like image 429
Festus Fashola Avatar asked Jul 30 '26 01:07

Festus Fashola


2 Answers

The TestCase class wraps each test in a transaction, which is rolled back after the transaction (see the relevant documentation).

Even if test_registration successfully registers a user, it won't be available in test_login.

I would suggest creating a user for testing in a setUpClass method.

like image 157
Daniel Hepper Avatar answered Jul 31 '26 22:07

Daniel Hepper


In order to do this, you need to use import unittest instead of from django.test import TestCase

And in your unit test class extends TestCase with unittest.TestCase

see the example below

import unittest 
class MyTest(unittest.TestCase):
    .......
like image 40
Satish Pandey Avatar answered Jul 31 '26 23:07

Satish Pandey



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!