from unittest.mock import MagicMock from django.contrib.sessions.middleware import SessionMiddleware from django.test import TestCase, RequestFactory from graphene.test import Client from api.schema import schema from core.factories import UserFactory from django.contrib.auth import authenticate class PasswordUpdate(TestCase): def setUp(self): get_response = MagicMock() self.user = UserFactory(username="aschi") request = RequestFactory().get("/") request.user = self.user # adding session middleware = SessionMiddleware(get_response) middleware.process_request(request) request.session.save() self.client = Client(schema=schema, context_value=request) def make_request(self, new_password, old_password="test"): mutation = """ mutation UpdatePassword($input: UpdatePasswordInput!) { updatePassword(input: $input) { success errors { field errors { code } } } } """ return self.client.execute( mutation, variables={ "input": { "passwordInput": { "oldPassword": old_password, "newPassword": new_password, } } }, ) def test_update_password(self): new_password = "Abcd123!" result = self.make_request(new_password) self.assertTrue(result.get("data").get("updatePassword").get("success")) user = authenticate(username=self.user.username, password=new_password) self.assertIsNotNone(user) def test_update_fails_with_short_password(self): new_password = "Ab!d123" result = self.make_request(new_password) self.assertFalse(result.get("data").get("updatePassword").get("success")) self.assertEqual( result.get("data").get("updatePassword").get("errors")[0], {"field": "new_password", "errors": [{"code": "min_length"}]}, ) def test_update_fails_with_no_special_character(self): new_password = "Abcd1239" result = self.make_request(new_password) self.assertFalse(result.get("data").get("updatePassword").get("success")) self.assertEqual( result.get("data").get("updatePassword").get("errors")[0], {"field": "new_password", "errors": [{"code": "invalid"}]}, ) def test_update_fails_with_no_digit(self): new_password = "Abcd!asddfg" result = self.make_request(new_password) self.assertFalse(result.get("data").get("updatePassword").get("success")) self.assertEqual( result.get("data").get("updatePassword").get("errors")[0], {"field": "new_password", "errors": [{"code": "invalid"}]}, ) def test_update_fails_with_no_lowercase_char(self): new_password = "45ABDC!AWSWS" result = self.make_request(new_password) self.assertFalse(result.get("data").get("updatePassword").get("success")) self.assertEqual( result.get("data").get("updatePassword").get("errors")[0], {"field": "new_password", "errors": [{"code": "invalid"}]}, ) def test_update_fails_with_no_uppercase_char(self): new_password = "45aswed!aswdef" result = self.make_request(new_password) self.assertFalse(result.get("data").get("updatePassword").get("success")) self.assertEqual( result.get("data").get("updatePassword").get("errors")[0], {"field": "new_password", "errors": [{"code": "invalid"}]}, ) def test_update_fails_with_wrong_old_password(self): new_password = "Abcd123!" result = self.make_request(new_password, "testttt") self.assertFalse(result.get("data").get("updatePassword").get("success")) self.assertEqual( result.get("data").get("updatePassword").get("errors")[0], {"field": "old_password", "errors": [{"code": "invalid"}]}, )