mybuddy/babybuddy/tests/tests_forms.py

289 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
import datetime
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.management import call_command
from django.test import Client as HttpClient, override_settings, TestCase
from django.utils import timezone
from faker import Faker
class FormsTestCase(TestCase):
@classmethod
def setUpClass(cls):
super(FormsTestCase, cls).setUpClass()
fake = Faker()
call_command("migrate", verbosity=0)
call_command("fake", verbosity=0)
cls.c = HttpClient()
fake_user = fake.simple_profile()
cls.credentials = {
"username": fake_user["username"],
"password": fake.password(),
}
cls.user = get_user_model().objects.create_user(
is_superuser=True, **cls.credentials
)
cls.user_template = {
"username": "username",
"first_name": "User",
"last_name": "Name",
"email": "user@user.user",
"is_staff": False,
"is_read_only": False,
"password1": "d47o8dD&#hu3ulu3",
"password2": "d47o8dD&#hu3ulu3",
}
cls.settings_template = {
"first_name": "User",
"last_name": "Name",
"email": "user@user.user",
"dashboard_refresh_rate": "",
"language": "en-US",
"timezone": "UTC",
"next": "/user/settings/",
}
def test_change_password(self):
self.c.login(**self.credentials)
page = self.c.get("/user/password/")
self.assertEqual(page.status_code, 200)
params = {
"old_password": "wrong",
"new_password1": "mynewpassword",
"new_password2": "notmynewpassword",
}
page = self.c.post("/user/password/", params)
self.assertEqual(page.status_code, 200)
self.assertFormError(
page,
"form",
"old_password",
"Your old password was entered incorrectly. " "Please enter it again.",
)
params["old_password"] = self.credentials["password"]
page = self.c.post("/user/password/", params)
self.assertEqual(page.status_code, 200)
self.assertFormError(
page, "form", "new_password2", "The two password fields didnt match."
)
params["new_password2"] = "mynewpassword"
page = self.c.post("/user/password/", params)
self.assertEqual(page.status_code, 200)
def test_user_forms(self):
self.user.is_staff = True
self.user.save()
self.c.login(**self.credentials)
params = self.user_template.copy()
page = self.c.post("/users/add/", params)
self.assertEqual(page.status_code, 302)
new_user = get_user_model().objects.get(username="username")
self.assertIsInstance(new_user, get_user_model())
params["first_name"] = "Changed"
page = self.c.post("/users/{}/edit/".format(new_user.id), params)
self.assertEqual(page.status_code, 302)
new_user.refresh_from_db()
self.assertEqual(new_user.first_name, params["first_name"])
page = self.c.post("/users/{}/delete/".format(new_user.id))
self.assertEqual(page.status_code, 302)
self.assertQuerysetEqual(
get_user_model().objects.filter(username="username"), []
)
def test_add_regular_user(self):
self.user.is_staff = True
self.user.save()
self.c.login(**self.credentials)
params = self.user_template.copy()
page = self.c.post("/users/add/", params)
self.assertEqual(page.status_code, 302)
user = get_user_model().objects.get(username="username")
self.assertIsInstance(user, get_user_model())
self.assertTrue(user.is_superuser)
self.assertFalse(user.is_staff)
self.assertFalse(
user.groups.filter(
name=settings.BABY_BUDDY["READ_ONLY_GROUP_NAME"]
).exists()
)
def test_add_staff_user(self):
self.user.is_staff = True
self.user.save()
self.c.login(**self.credentials)
params = self.user_template.copy()
params["is_staff"] = True
page = self.c.post("/users/add/", params)
self.assertEqual(page.status_code, 302)
user = get_user_model().objects.get(username="username")
self.assertIsInstance(user, get_user_model())
self.assertTrue(user.is_superuser)
self.assertTrue(user.is_staff)
self.assertFalse(
user.groups.filter(
name=settings.BABY_BUDDY["READ_ONLY_GROUP_NAME"]
).exists()
)
def test_add_read_only_user(self):
self.user.is_staff = True
self.user.save()
self.c.login(**self.credentials)
params = self.user_template.copy()
params["is_read_only"] = True
page = self.c.post("/users/add/", params)
self.assertEqual(page.status_code, 302)
user = get_user_model().objects.get(username="username")
self.assertIsInstance(user, get_user_model())
self.assertFalse(user.is_superuser)
self.assertFalse(user.is_staff)
self.assertTrue(
user.groups.filter(
name=settings.BABY_BUDDY["READ_ONLY_GROUP_NAME"]
).exists()
)
def test_user_settings(self):
self.c.login(**self.credentials)
params = self.settings_template.copy()
params["first_name"] = "New First Name"
page = self.c.post("/user/settings/", params, follow=True)
self.assertEqual(page.status_code, 200)
self.assertContains(page, "New First Name")
def test_user_regenerate_api_key(self):
self.c.login(**self.credentials)
api_key_before = (
get_user_model().objects.get(pk=self.user.id).settings.api_key()
)
params = self.settings_template.copy()
params["api_key_regenerate"] = "Regenerate"
page = self.c.post("/user/settings/", params, follow=True)
self.assertEqual(page.status_code, 200)
new_api_key = get_user_model().objects.get(pk=self.user.id).settings.api_key()
self.assertNotEqual(api_key_before, new_api_key)
# API key can also be regenerated on the add-device page
api_key_before = new_api_key
params = {"api_key_regenerate": "Regenerate"}
page = self.c.post("/user/add-device/", params, follow=True)
self.assertEqual(page.status_code, 200)
new_api_key = get_user_model().objects.get(pk=self.user.id).settings.api_key()
self.assertNotEqual(api_key_before, new_api_key)
def test_invalid_post_to_add_device(self):
self.c.login(**self.credentials)
page = self.c.get("/user/add-device/")
self.assertEqual(page.status_code, 200)
page = self.c.post("/user/add-device/", params={"garbage": True}, follow=True)
self.assertEqual(page.status_code, 400)
def test_user_settings_invalid(self):
self.c.login(**self.credentials)
params = self.settings_template.copy()
params["email"] = "Not an email address"
page = self.c.post("/user/settings/", params)
self.assertEqual(page.status_code, 200)
self.assertFormError(page, "user_form", "email", "Enter a valid email address.")
def test_user_settings_language(self):
self.c.login(**self.credentials)
params = self.settings_template.copy()
params["language"] = "fr"
page = self.c.post("/user/settings/", data=params, follow=True)
self.assertContains(page, "Paramètres utilisateur")
def test_user_settings_timezone(self):
self.c.login(**self.credentials)
self.assertEqual(timezone.get_default_timezone_name(), "UTC")
params = self.settings_template.copy()
params["timezone"] = "US/Pacific"
page = self.c.post("/user/settings/", data=params, follow=True)
self.assertEqual(page.status_code, 200)
self.assertEqual(timezone.get_current_timezone_name(), params["timezone"])
def test_user_settings_dashboard_hide_empty_on(self):
self.c.login(**self.credentials)
params = self.settings_template.copy()
params["dashboard_hide_empty"] = "on"
page = self.c.post("/user/settings/", data=params, follow=True)
self.assertEqual(page.status_code, 200)
self.user.refresh_from_db()
self.assertTrue(self.user.settings.dashboard_hide_empty)
def test_user_settings_dashboard_refresh_rate(self):
self.c.login(**self.credentials)
params = self.settings_template.copy()
params["dashboard_refresh_rate"] = "0:05:00"
page = self.c.post("/user/settings/", data=params, follow=True)
self.assertEqual(page.status_code, 200)
self.user.refresh_from_db()
self.assertEqual(
self.user.settings.dashboard_refresh_rate, datetime.timedelta(seconds=300)
)
def test_user_settings_dashboard_hide_age(self):
self.c.login(**self.credentials)
params = self.settings_template.copy()
params["dashboard_hide_age"] = "1 day, 0:00:00"
page = self.c.post("/user/settings/", data=params, follow=True)
self.assertEqual(page.status_code, 200)
self.user.refresh_from_db()
self.assertEqual(
self.user.settings.dashboard_hide_age, datetime.timedelta(days=1)
)
def test_csrf_error_handling(self):
c = HttpClient(enforce_csrf_checks=True)
c.login(**self.credentials)
# Add a CSRF cookie to the client by making a request with the logout form.
c.get("/", follow=True)
# Send POST request with an invalid Origin.
headers = {"HTTP_ORIGIN": "https://www.example.com"}
data = {"csrfmiddlewaretoken": c.cookies["csrftoken"].value}
response = c.post("/logout/", data=data, follow=True, **headers)
# Assert response contains Baby Buddy's custom 403 handler text.
self.assertContains(response, "How to Fix", status_code=403)
response = c.post("/logout/", data=data, follow=True)
self.assertEqual(response.status_code, 200)