mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-24 03:30:50 +02:00
merged main
This commit is contained in:
commit
38db00bd79
16 changed files with 1285 additions and 294 deletions
|
@ -1,6 +1,8 @@
|
|||
from datetime import date
|
||||
from django.test import TestCase, RequestFactory, Client
|
||||
from django.contrib.admin.sites import AdminSite
|
||||
from contextlib import ExitStack
|
||||
from django_webtest import WebTest # type: ignore
|
||||
from django.contrib import messages
|
||||
from django.urls import reverse
|
||||
from registrar.admin import (
|
||||
|
@ -35,7 +37,7 @@ from .common import (
|
|||
)
|
||||
from django.contrib.sessions.backends.db import SessionStore
|
||||
from django.contrib.auth import get_user_model
|
||||
from unittest.mock import patch
|
||||
from unittest.mock import ANY, call, patch
|
||||
from unittest import skip
|
||||
|
||||
from django.conf import settings
|
||||
|
@ -45,7 +47,11 @@ import logging
|
|||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TestDomainAdmin(MockEppLib):
|
||||
class TestDomainAdmin(MockEppLib, WebTest):
|
||||
# csrf checks do not work with WebTest.
|
||||
# We disable them here. TODO for another ticket.
|
||||
csrf_checks = False
|
||||
|
||||
def setUp(self):
|
||||
self.site = AdminSite()
|
||||
self.admin = DomainAdmin(model=Domain, admin_site=self.site)
|
||||
|
@ -53,8 +59,177 @@ class TestDomainAdmin(MockEppLib):
|
|||
self.superuser = create_superuser()
|
||||
self.staffuser = create_user()
|
||||
self.factory = RequestFactory()
|
||||
self.app.set_user(self.superuser.username)
|
||||
self.client.force_login(self.superuser)
|
||||
super().setUp()
|
||||
|
||||
@skip("TODO for another ticket. This test case is grabbing old db data.")
|
||||
@patch("registrar.admin.DomainAdmin._get_current_date", return_value=date(2024, 1, 1))
|
||||
def test_extend_expiration_date_button(self, mock_date_today):
|
||||
"""
|
||||
Tests if extend_expiration_date button extends correctly
|
||||
"""
|
||||
|
||||
# Create a ready domain with a preset expiration date
|
||||
domain, _ = Domain.objects.get_or_create(name="fake.gov", state=Domain.State.READY)
|
||||
|
||||
response = self.app.get(reverse("admin:registrar_domain_change", args=[domain.pk]))
|
||||
|
||||
# Make sure the ex date is what we expect it to be
|
||||
domain_ex_date = Domain.objects.get(id=domain.id).expiration_date
|
||||
self.assertEqual(domain_ex_date, date(2023, 5, 25))
|
||||
|
||||
# Make sure that the page is loading as expected
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, domain.name)
|
||||
self.assertContains(response, "Extend expiration date")
|
||||
|
||||
# Grab the form to submit
|
||||
form = response.forms["domain_form"]
|
||||
|
||||
with patch("django.contrib.messages.add_message") as mock_add_message:
|
||||
# Submit the form
|
||||
response = form.submit("_extend_expiration_date")
|
||||
|
||||
# Follow the response
|
||||
response = response.follow()
|
||||
|
||||
# refresh_from_db() does not work for objects with protected=True.
|
||||
# https://github.com/viewflow/django-fsm/issues/89
|
||||
new_domain = Domain.objects.get(id=domain.id)
|
||||
|
||||
# Check that the current expiration date is what we expect
|
||||
self.assertEqual(new_domain.expiration_date, date(2025, 5, 25))
|
||||
|
||||
# Assert that everything on the page looks correct
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, domain.name)
|
||||
self.assertContains(response, "Extend expiration date")
|
||||
|
||||
# Ensure the message we recieve is in line with what we expect
|
||||
expected_message = "Successfully extended the expiration date."
|
||||
expected_call = call(
|
||||
# The WGSI request doesn't need to be tested
|
||||
ANY,
|
||||
messages.INFO,
|
||||
expected_message,
|
||||
extra_tags="",
|
||||
fail_silently=False,
|
||||
)
|
||||
mock_add_message.assert_has_calls([expected_call], 1)
|
||||
|
||||
@patch("registrar.admin.DomainAdmin._get_current_date", return_value=date(2024, 1, 1))
|
||||
def test_extend_expiration_date_button_epp(self, mock_date_today):
|
||||
"""
|
||||
Tests if extend_expiration_date button sends the right epp command
|
||||
"""
|
||||
|
||||
# Create a ready domain with a preset expiration date
|
||||
domain, _ = Domain.objects.get_or_create(name="fake.gov", state=Domain.State.READY)
|
||||
|
||||
response = self.app.get(reverse("admin:registrar_domain_change", args=[domain.pk]))
|
||||
|
||||
# Make sure that the page is loading as expected
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, domain.name)
|
||||
self.assertContains(response, "Extend expiration date")
|
||||
|
||||
# Grab the form to submit
|
||||
form = response.forms["domain_form"]
|
||||
|
||||
with patch("django.contrib.messages.add_message") as mock_add_message:
|
||||
with patch("registrar.models.Domain.renew_domain") as renew_mock:
|
||||
# Submit the form
|
||||
response = form.submit("_extend_expiration_date")
|
||||
|
||||
# Follow the response
|
||||
response = response.follow()
|
||||
|
||||
# This value is based off of the current year - the expiration date.
|
||||
# We "freeze" time to 2024, so 2024 - 2023 will always result in an
|
||||
# "extension" of 2, as that will be one year of extension from that date.
|
||||
extension_length = 2
|
||||
|
||||
# Assert that it is calling the function with the right extension length.
|
||||
# We only need to test the value that EPP sends, as we can assume the other
|
||||
# test cases cover the "renew" function.
|
||||
renew_mock.assert_has_calls([call(length=extension_length)], any_order=False)
|
||||
|
||||
# We should not make duplicate calls
|
||||
self.assertEqual(renew_mock.call_count, 1)
|
||||
|
||||
# Assert that everything on the page looks correct
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, domain.name)
|
||||
self.assertContains(response, "Extend expiration date")
|
||||
|
||||
# Ensure the message we recieve is in line with what we expect
|
||||
expected_message = "Successfully extended the expiration date."
|
||||
expected_call = call(
|
||||
# The WGSI request doesn't need to be tested
|
||||
ANY,
|
||||
messages.INFO,
|
||||
expected_message,
|
||||
extra_tags="",
|
||||
fail_silently=False,
|
||||
)
|
||||
mock_add_message.assert_has_calls([expected_call], 1)
|
||||
|
||||
@patch("registrar.admin.DomainAdmin._get_current_date", return_value=date(2023, 1, 1))
|
||||
def test_extend_expiration_date_button_date_matches_epp(self, mock_date_today):
|
||||
"""
|
||||
Tests if extend_expiration_date button sends the right epp command
|
||||
when the current year matches the expiration date
|
||||
"""
|
||||
|
||||
# Create a ready domain with a preset expiration date
|
||||
domain, _ = Domain.objects.get_or_create(name="fake.gov", state=Domain.State.READY)
|
||||
|
||||
response = self.app.get(reverse("admin:registrar_domain_change", args=[domain.pk]))
|
||||
|
||||
# Make sure that the page is loading as expected
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, domain.name)
|
||||
self.assertContains(response, "Extend expiration date")
|
||||
|
||||
# Grab the form to submit
|
||||
form = response.forms["domain_form"]
|
||||
|
||||
with patch("django.contrib.messages.add_message") as mock_add_message:
|
||||
with patch("registrar.models.Domain.renew_domain") as renew_mock:
|
||||
# Submit the form
|
||||
response = form.submit("_extend_expiration_date")
|
||||
|
||||
# Follow the response
|
||||
response = response.follow()
|
||||
|
||||
extension_length = 1
|
||||
|
||||
# Assert that it is calling the function with the right extension length.
|
||||
# We only need to test the value that EPP sends, as we can assume the other
|
||||
# test cases cover the "renew" function.
|
||||
renew_mock.assert_has_calls([call(length=extension_length)], any_order=False)
|
||||
|
||||
# We should not make duplicate calls
|
||||
self.assertEqual(renew_mock.call_count, 1)
|
||||
|
||||
# Assert that everything on the page looks correct
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, domain.name)
|
||||
self.assertContains(response, "Extend expiration date")
|
||||
|
||||
# Ensure the message we recieve is in line with what we expect
|
||||
expected_message = "Successfully extended the expiration date."
|
||||
expected_call = call(
|
||||
# The WGSI request doesn't need to be tested
|
||||
ANY,
|
||||
messages.INFO,
|
||||
expected_message,
|
||||
extra_tags="",
|
||||
fail_silently=False,
|
||||
)
|
||||
mock_add_message.assert_has_calls([expected_call], 1)
|
||||
|
||||
def test_short_org_name_in_domains_list(self):
|
||||
"""
|
||||
Make sure the short name is displaying in admin on the list page
|
||||
|
@ -966,8 +1141,17 @@ class TestDomainApplicationAdmin(MockEppLib):
|
|||
investigator_field = DomainApplication._meta.get_field("investigator")
|
||||
|
||||
# We should only be displaying staff users, in alphabetical order
|
||||
expected_dropdown = list(User.objects.filter(is_staff=True))
|
||||
current_dropdown = list(self.admin.formfield_for_foreignkey(investigator_field, request).queryset)
|
||||
sorted_fields = ["first_name", "last_name", "email"]
|
||||
expected_dropdown = list(User.objects.filter(is_staff=True).order_by(*sorted_fields))
|
||||
|
||||
# Grab the current dropdown. We do an API call to autocomplete to get this info.
|
||||
application_queryset = self.admin.formfield_for_foreignkey(investigator_field, request).queryset
|
||||
user_request = self.factory.post(
|
||||
"/admin/autocomplete/?app_label=registrar&model_name=domainapplication&field_name=investigator"
|
||||
)
|
||||
user_admin = MyUserAdmin(User, self.site)
|
||||
user_queryset = user_admin.get_search_results(user_request, application_queryset, None)[0]
|
||||
current_dropdown = list(user_queryset)
|
||||
|
||||
self.assertEqual(expected_dropdown, current_dropdown)
|
||||
|
||||
|
@ -1002,7 +1186,13 @@ class TestDomainApplicationAdmin(MockEppLib):
|
|||
self.client.login(username="staffuser", password=p)
|
||||
request = RequestFactory().get("/")
|
||||
|
||||
expected_list = list(User.objects.filter(is_staff=True).order_by("first_name", "last_name", "email"))
|
||||
# These names have metadata embedded in them. :investigator implicitly tests if
|
||||
# these are actually from the attribute "investigator".
|
||||
expected_list = [
|
||||
"AGuy AGuy last_name:investigator",
|
||||
"FinalGuy FinalGuy last_name:investigator",
|
||||
"SomeGuy first_name:investigator SomeGuy last_name:investigator",
|
||||
]
|
||||
|
||||
# Get the actual sorted list of investigators from the lookups method
|
||||
actual_list = [item for _, item in self.admin.InvestigatorFilter.lookups(self, request, self.admin)]
|
||||
|
@ -1434,12 +1624,47 @@ class AuditedAdminTest(TestCase):
|
|||
|
||||
return ordered_list
|
||||
|
||||
def test_alphabetically_sorted_domain_application_investigator(self):
|
||||
"""Tests if the investigator field is alphabetically sorted by mimicking
|
||||
the call event flow"""
|
||||
# Creates multiple domain applications - review status does not matter
|
||||
applications = multiple_unalphabetical_domain_objects("application")
|
||||
|
||||
# Create a mock request
|
||||
application_request = self.factory.post(
|
||||
"/admin/registrar/domainapplication/{}/change/".format(applications[0].pk)
|
||||
)
|
||||
|
||||
# Get the formfield data from the application page
|
||||
application_admin = AuditedAdmin(DomainApplication, self.site)
|
||||
field = DomainApplication.investigator.field
|
||||
application_queryset = application_admin.formfield_for_foreignkey(field, application_request).queryset
|
||||
|
||||
request = self.factory.post(
|
||||
"/admin/autocomplete/?app_label=registrar&model_name=domainapplication&field_name=investigator"
|
||||
)
|
||||
|
||||
sorted_fields = ["first_name", "last_name", "email"]
|
||||
desired_sort_order = list(User.objects.filter(is_staff=True).order_by(*sorted_fields))
|
||||
|
||||
# Grab the data returned from get search results
|
||||
admin = MyUserAdmin(User, self.site)
|
||||
search_queryset = admin.get_search_results(request, application_queryset, None)[0]
|
||||
current_sort_order = list(search_queryset)
|
||||
|
||||
self.assertEqual(
|
||||
desired_sort_order,
|
||||
current_sort_order,
|
||||
"Investigator is not ordered alphabetically",
|
||||
)
|
||||
|
||||
# This test case should be refactored in general, as it is too overly specific and engineered
|
||||
def test_alphabetically_sorted_fk_fields_domain_application(self):
|
||||
with less_console_noise():
|
||||
tested_fields = [
|
||||
DomainApplication.authorizing_official.field,
|
||||
DomainApplication.submitter.field,
|
||||
DomainApplication.investigator.field,
|
||||
# DomainApplication.investigator.field,
|
||||
DomainApplication.creator.field,
|
||||
DomainApplication.requested_domain.field,
|
||||
]
|
||||
|
@ -1457,142 +1682,141 @@ class AuditedAdminTest(TestCase):
|
|||
# but both fields are of a fixed length.
|
||||
# For test case purposes, this should be performant.
|
||||
for field in tested_fields:
|
||||
isNamefield: bool = field == DomainApplication.requested_domain.field
|
||||
if isNamefield:
|
||||
sorted_fields = ["name"]
|
||||
else:
|
||||
sorted_fields = ["first_name", "last_name"]
|
||||
# We want both of these to be lists, as it is richer test wise.
|
||||
|
||||
desired_order = self.order_by_desired_field_helper(model_admin, request, field.name, *sorted_fields)
|
||||
current_sort_order = list(model_admin.formfield_for_foreignkey(field, request).queryset)
|
||||
|
||||
# Conforms to the same object structure as desired_order
|
||||
current_sort_order_coerced_type = []
|
||||
|
||||
# This is necessary as .queryset and get_queryset
|
||||
# return lists of different types/structures.
|
||||
# We need to parse this data and coerce them into the same type.
|
||||
for contact in current_sort_order:
|
||||
if not isNamefield:
|
||||
first = contact.first_name
|
||||
last = contact.last_name
|
||||
with self.subTest(field=field):
|
||||
isNamefield: bool = field == DomainApplication.requested_domain.field
|
||||
if isNamefield:
|
||||
sorted_fields = ["name"]
|
||||
else:
|
||||
first = contact.name
|
||||
last = None
|
||||
sorted_fields = ["first_name", "last_name"]
|
||||
# We want both of these to be lists, as it is richer test wise.
|
||||
|
||||
name_tuple = self.coerced_fk_field_helper(first, last, field.name, ":")
|
||||
if name_tuple is not None:
|
||||
current_sort_order_coerced_type.append(name_tuple)
|
||||
desired_order = self.order_by_desired_field_helper(model_admin, request, field.name, *sorted_fields)
|
||||
current_sort_order = list(model_admin.formfield_for_foreignkey(field, request).queryset)
|
||||
|
||||
self.assertEqual(
|
||||
desired_order,
|
||||
current_sort_order_coerced_type,
|
||||
"{} is not ordered alphabetically".format(field.name),
|
||||
)
|
||||
# Conforms to the same object structure as desired_order
|
||||
current_sort_order_coerced_type = []
|
||||
|
||||
# This is necessary as .queryset and get_queryset
|
||||
# return lists of different types/structures.
|
||||
# We need to parse this data and coerce them into the same type.
|
||||
for contact in current_sort_order:
|
||||
if not isNamefield:
|
||||
first = contact.first_name
|
||||
last = contact.last_name
|
||||
else:
|
||||
first = contact.name
|
||||
last = None
|
||||
|
||||
name_tuple = self.coerced_fk_field_helper(first, last, field.name, ":")
|
||||
if name_tuple is not None:
|
||||
current_sort_order_coerced_type.append(name_tuple)
|
||||
|
||||
self.assertEqual(
|
||||
desired_order,
|
||||
current_sort_order_coerced_type,
|
||||
"{} is not ordered alphabetically".format(field.name),
|
||||
)
|
||||
|
||||
def test_alphabetically_sorted_fk_fields_domain_information(self):
|
||||
with less_console_noise():
|
||||
tested_fields = [
|
||||
DomainInformation.authorizing_official.field,
|
||||
DomainInformation.submitter.field,
|
||||
# DomainInformation.creator.field,
|
||||
(DomainInformation.domain.field, ["name"]),
|
||||
(DomainInformation.domain_application.field, ["requested_domain__name"]),
|
||||
]
|
||||
# Creates multiple domain applications - review status does not matter
|
||||
applications = multiple_unalphabetical_domain_objects("information")
|
||||
tested_fields = [
|
||||
DomainInformation.authorizing_official.field,
|
||||
DomainInformation.submitter.field,
|
||||
# DomainInformation.creator.field,
|
||||
(DomainInformation.domain.field, ["name"]),
|
||||
(DomainInformation.domain_application.field, ["requested_domain__name"]),
|
||||
]
|
||||
# Creates multiple domain applications - review status does not matter
|
||||
applications = multiple_unalphabetical_domain_objects("information")
|
||||
|
||||
# Create a mock request
|
||||
request = self.factory.post("/admin/registrar/domaininformation/{}/change/".format(applications[0].pk))
|
||||
# Create a mock request
|
||||
request = self.factory.post("/admin/registrar/domaininformation/{}/change/".format(applications[0].pk))
|
||||
|
||||
model_admin = AuditedAdmin(DomainInformation, self.site)
|
||||
model_admin = AuditedAdmin(DomainInformation, self.site)
|
||||
|
||||
sorted_fields = []
|
||||
# Typically we wouldn't want two nested for fields,
|
||||
# but both fields are of a fixed length.
|
||||
# For test case purposes, this should be performant.
|
||||
for field in tested_fields:
|
||||
isOtherOrderfield: bool = isinstance(field, tuple)
|
||||
field_obj = None
|
||||
if isOtherOrderfield:
|
||||
sorted_fields = field[1]
|
||||
field_obj = field[0]
|
||||
else:
|
||||
sorted_fields = ["first_name", "last_name"]
|
||||
field_obj = field
|
||||
# We want both of these to be lists, as it is richer test wise.
|
||||
desired_order = self.order_by_desired_field_helper(model_admin, request, field_obj.name, *sorted_fields)
|
||||
current_sort_order = list(model_admin.formfield_for_foreignkey(field_obj, request).queryset)
|
||||
sorted_fields = []
|
||||
# Typically we wouldn't want two nested for fields,
|
||||
# but both fields are of a fixed length.
|
||||
# For test case purposes, this should be performant.
|
||||
for field in tested_fields:
|
||||
isOtherOrderfield: bool = isinstance(field, tuple)
|
||||
field_obj = None
|
||||
if isOtherOrderfield:
|
||||
sorted_fields = field[1]
|
||||
field_obj = field[0]
|
||||
else:
|
||||
sorted_fields = ["first_name", "last_name"]
|
||||
field_obj = field
|
||||
# We want both of these to be lists, as it is richer test wise.
|
||||
desired_order = self.order_by_desired_field_helper(model_admin, request, field_obj.name, *sorted_fields)
|
||||
current_sort_order = list(model_admin.formfield_for_foreignkey(field_obj, request).queryset)
|
||||
|
||||
# Conforms to the same object structure as desired_order
|
||||
current_sort_order_coerced_type = []
|
||||
# Conforms to the same object structure as desired_order
|
||||
current_sort_order_coerced_type = []
|
||||
|
||||
# This is necessary as .queryset and get_queryset
|
||||
# return lists of different types/structures.
|
||||
# We need to parse this data and coerce them into the same type.
|
||||
for obj in current_sort_order:
|
||||
last = None
|
||||
if not isOtherOrderfield:
|
||||
first = obj.first_name
|
||||
last = obj.last_name
|
||||
elif field_obj == DomainInformation.domain.field:
|
||||
first = obj.name
|
||||
elif field_obj == DomainInformation.domain_application.field:
|
||||
first = obj.requested_domain.name
|
||||
# This is necessary as .queryset and get_queryset
|
||||
# return lists of different types/structures.
|
||||
# We need to parse this data and coerce them into the same type.
|
||||
for obj in current_sort_order:
|
||||
last = None
|
||||
if not isOtherOrderfield:
|
||||
first = obj.first_name
|
||||
last = obj.last_name
|
||||
elif field_obj == DomainInformation.domain.field:
|
||||
first = obj.name
|
||||
elif field_obj == DomainInformation.domain_application.field:
|
||||
first = obj.requested_domain.name
|
||||
|
||||
name_tuple = self.coerced_fk_field_helper(first, last, field_obj.name, ":")
|
||||
if name_tuple is not None:
|
||||
current_sort_order_coerced_type.append(name_tuple)
|
||||
name_tuple = self.coerced_fk_field_helper(first, last, field_obj.name, ":")
|
||||
if name_tuple is not None:
|
||||
current_sort_order_coerced_type.append(name_tuple)
|
||||
|
||||
self.assertEqual(
|
||||
desired_order,
|
||||
current_sort_order_coerced_type,
|
||||
"{} is not ordered alphabetically".format(field_obj.name),
|
||||
)
|
||||
self.assertEqual(
|
||||
desired_order,
|
||||
current_sort_order_coerced_type,
|
||||
"{} is not ordered alphabetically".format(field_obj.name),
|
||||
)
|
||||
|
||||
def test_alphabetically_sorted_fk_fields_domain_invitation(self):
|
||||
with less_console_noise():
|
||||
tested_fields = [DomainInvitation.domain.field]
|
||||
tested_fields = [DomainInvitation.domain.field]
|
||||
|
||||
# Creates multiple domain applications - review status does not matter
|
||||
applications = multiple_unalphabetical_domain_objects("invitation")
|
||||
# Creates multiple domain applications - review status does not matter
|
||||
applications = multiple_unalphabetical_domain_objects("invitation")
|
||||
|
||||
# Create a mock request
|
||||
request = self.factory.post("/admin/registrar/domaininvitation/{}/change/".format(applications[0].pk))
|
||||
# Create a mock request
|
||||
request = self.factory.post("/admin/registrar/domaininvitation/{}/change/".format(applications[0].pk))
|
||||
|
||||
model_admin = AuditedAdmin(DomainInvitation, self.site)
|
||||
model_admin = AuditedAdmin(DomainInvitation, self.site)
|
||||
|
||||
sorted_fields = []
|
||||
# Typically we wouldn't want two nested for fields,
|
||||
# but both fields are of a fixed length.
|
||||
# For test case purposes, this should be performant.
|
||||
for field in tested_fields:
|
||||
sorted_fields = ["name"]
|
||||
# We want both of these to be lists, as it is richer test wise.
|
||||
sorted_fields = []
|
||||
# Typically we wouldn't want two nested for fields,
|
||||
# but both fields are of a fixed length.
|
||||
# For test case purposes, this should be performant.
|
||||
for field in tested_fields:
|
||||
sorted_fields = ["name"]
|
||||
# We want both of these to be lists, as it is richer test wise.
|
||||
|
||||
desired_order = self.order_by_desired_field_helper(model_admin, request, field.name, *sorted_fields)
|
||||
current_sort_order = list(model_admin.formfield_for_foreignkey(field, request).queryset)
|
||||
desired_order = self.order_by_desired_field_helper(model_admin, request, field.name, *sorted_fields)
|
||||
current_sort_order = list(model_admin.formfield_for_foreignkey(field, request).queryset)
|
||||
|
||||
# Conforms to the same object structure as desired_order
|
||||
current_sort_order_coerced_type = []
|
||||
# Conforms to the same object structure as desired_order
|
||||
current_sort_order_coerced_type = []
|
||||
|
||||
# This is necessary as .queryset and get_queryset
|
||||
# return lists of different types/structures.
|
||||
# We need to parse this data and coerce them into the same type.
|
||||
for contact in current_sort_order:
|
||||
first = contact.name
|
||||
last = None
|
||||
# This is necessary as .queryset and get_queryset
|
||||
# return lists of different types/structures.
|
||||
# We need to parse this data and coerce them into the same type.
|
||||
for contact in current_sort_order:
|
||||
first = contact.name
|
||||
last = None
|
||||
|
||||
name_tuple = self.coerced_fk_field_helper(first, last, field.name, ":")
|
||||
if name_tuple is not None:
|
||||
current_sort_order_coerced_type.append(name_tuple)
|
||||
name_tuple = self.coerced_fk_field_helper(first, last, field.name, ":")
|
||||
if name_tuple is not None:
|
||||
current_sort_order_coerced_type.append(name_tuple)
|
||||
|
||||
self.assertEqual(
|
||||
desired_order,
|
||||
current_sort_order_coerced_type,
|
||||
"{} is not ordered alphabetically".format(field.name),
|
||||
)
|
||||
self.assertEqual(
|
||||
desired_order,
|
||||
current_sort_order_coerced_type,
|
||||
"{} is not ordered alphabetically".format(field.name),
|
||||
)
|
||||
|
||||
def coerced_fk_field_helper(self, first_name, last_name, field_name, queryset_shorthand):
|
||||
"""Handles edge cases for test cases"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue