-1

I should test login functionality for this Django project, but it seems it can't login properly. This is the login method on views.py

def login_request(request):
if request.method == "POST":
    form = AuthenticationForm(request, data=request.POST)
    if form.is_valid():
        username = form.cleaned_data.get('username')
        password = form.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        request.session['username'] = username  # Session test
        if user is not None:
            login(request, user)
            messages.info(request, "You are now logged in as {username}.")
            # Redirect da login alla dashboard dell'utente
            return redirect("dashboard")

        else:
            messages.error("Invalis User")
            #return render(request=request, template_name="dashboard.html", context={})
    else:
        messages.error(request, "Invalid username or password.")
form = AuthenticationForm()
return render(request=request, template_name="login.html", context={"login_form": form})

After login, it redirects to the dashboard which shows boards linked to the user, with this code

def dashboard(request):
usern = request.session.get('username')
userlog = User.objects.get(username=usern)
boards = BoardMember.objects.all().filter(user=userlog)
return render(request, "dashboard.html", {'board': boards,
                                           'user': userlog})

Everything works fine, but when I test it in TestCase the error is "User matching query does not exist", test code is:

class ViewsTestCase(TestCase):
def setUp(self):
    User.objects.create(username="Paolo", password="Paolo")
    self.client = Client()

def test_getLogin(self):
    response = self.client.get("/")
    self.assertEqual(response.status_code, 200)

def test_login(self):
    username = "Paolo"
    password = "Paolo"
    response = self.client.post("/dashboard/",
                                {
                                    'username': username,
                                    'password': password
                                })

    self.assertEqual(response.status_code, 200)
    user = User.objects.get(username="Paolo")
    session = self.client.session
    """self.assertEqual(session['username'], username)
    self.assertEqual(session['user_id'], user.id)
    self.assertEqual(session['logged'], True)"""

Complete traceback:

Traceback (most recent call last):
File "/tests.py", line 52, in test_login
response = self.client.post("/dashboard/",
File "venv/lib/python3.8/site-     packages/django/test/client.py", line 543, in post
response = super().post(path, data=data, content_type=content_type, secure=secure, **extra)
File "/venv/lib/python3.8/site-packages/django/test/client.py", line 356, in post
return self.generic('POST', path, post_data, content_type,
File "/venv/lib/python3.8/site-packages/django/test/client.py", line 422, in generic
return self.request(**r)
File "/venv/lib/python3.8/site-packages/django/test/client.py", line 503, in request
raise exc_value
File “/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File “/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/views.py", line 56, in dashboard
userlog = User.objects.get(username=usern)
File "/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File “/venv/lib/python3.8/site-packages/django/db/models/query.py", line 406, in get
raise self.model.DoesNotExist(
ISW_ScrumBoard.models.User.DoesNotExist: User matching query does not exist.

2 Answers2

0

You can do this, to test the django login

from django.test import Client, TestCase

class TestsUser(TestCase):
    def __init__(self):
        self.e = Client()
    
    def test_login(self):
        self.e.login(username="Username", password="your_password")
  • ***`Client().login()`*** supposed to use when you want to test some view which required a *"logged-in session (or a logged-in user)"*. – JPG Dec 28 '20 at 17:24
  • I'm not testing the view (In this part of code), however this didn't work, maybe I did not explain myself well – Matteo Reccia Dec 29 '20 at 15:58
0

Are you looking for this function?

login(request, user, backend=None)

from Django docs:

How to log a user in¶

If you have an authenticated user you want to attach to the current session - this is done with a login() function.

login(request, user, backend=None)

MSC
  • 61
  • 1
  • 2