Solidify json unit tests

This commit is contained in:
Rachid Mrad 2024-05-30 15:20:10 -04:00
parent db985cb3d7
commit f8c14ea36a
No known key found for this signature in database
6 changed files with 107 additions and 20 deletions

View file

@ -291,13 +291,13 @@ We use the [CSS Block Element Modifier (BEM)](https://getbem.com/naming/) naming
### Upgrading USWDS and other JavaScript packages
Version numbers can be manually controlled in `package.json`. Edit that, if desired.
Now run `docker-compose run node npm update`.
Then run `docker-compose up` to recompile and recopy the assets.
Examine the results in the running application (remember to empty your cache!) and commit `package.json` and `package-lock.json` if all is well.
1. Version numbers can be manually controlled in `package.json`. Edit that, if desired.
2. Now run `docker-compose run node npm update`.
3. Then run `docker-compose up` to recompile and recopy the assets, or run `docker-compose updateUswds` if your docker is already up.
4. Make note of the dotgov changes in uswds-edited.js.
5. Copy over the newly compiled code from uswds.js into uswds-edited.js.
6. Put back the dotgov changes you made note of into uswds-edited.js.
7. Examine the results in the running application (remember to empty your cache!) and commit `package.json` and `package-lock.json` if all is well.
## Finite State Machines

View file

@ -952,6 +952,7 @@ document.addEventListener('DOMContentLoaded', function() {
data.domains.forEach(domain => {
const expirationDate = domain.expiration_date ? new Date(domain.expiration_date) : null;
const expirationDateSortValue = expirationDate ? expirationDate.getTime() : '';
const actionUrl = domain.action_url;
const row = document.createElement('tr');
row.innerHTML = `
@ -975,7 +976,7 @@ document.addEventListener('DOMContentLoaded', function() {
</svg>
</td>
<td>
<a href="/domain/${domain.id}">
<a href="${actionUrl}">
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img" width="24">
<use xlink:href="/public/img/sprite.svg#${domain.state === 'deleted' || domain.state === 'on hold' ? 'visibility' : 'settings'}"></use>
</svg>
@ -1132,8 +1133,8 @@ document.addEventListener('DOMContentLoaded', function() {
data.domain_requests.forEach(request => {
const domainName = request.requested_domain ? request.requested_domain : `New domain request <span class="text-base font-body-xs">(${new Date(request.created_at).toLocaleString()} UTC)</span>`;
const submissionDate = request.submission_date ? new Date(request.submission_date).toLocaleDateString() : `<span class="text-base">Not submitted</span>`;
const actionUrl = (request.status === 'Started' || request.status === 'Withdrawn') ? `/domain-request/${request.id}/edit` : `/domain-request/${request.id}`;
const actionLabel = (request.status === 'Started' || request.status === 'Withdrawn') ? 'Edit' : 'Manage';
const actionUrl = request.action_url;
const actionLabel = request.action_label;
const deleteButton = request.is_deletable ? `
<a
role="button"

View file

@ -2,6 +2,7 @@ from registrar.models import UserDomainRole, Domain
from django.urls import reverse
from .test_views import TestWithUser
from django_webtest import WebTest # type: ignore
from django.utils.dateparse import parse_date
class GetDomainsJsonTest(TestWithUser, WebTest):
@ -19,6 +20,11 @@ class GetDomainsJsonTest(TestWithUser, WebTest):
UserDomainRole.objects.create(user=self.user, domain=self.domain2)
UserDomainRole.objects.create(user=self.user, domain=self.domain3)
def tearDown(self):
super().tearDown()
UserDomainRole.objects.all().delete()
UserDomainRole.objects.all().delete()
def test_get_domains_json_unauthenticated(self):
"""for an unauthenticated user, test that the user is redirected for auth"""
self.app.reset()
@ -38,12 +44,37 @@ class GetDomainsJsonTest(TestWithUser, WebTest):
self.assertFalse(data["has_previous"])
self.assertEqual(data["num_pages"], 1)
# Check domains
# Check the number of domains
self.assertEqual(len(data["domains"]), 3)
# Expected domains
expected_domains = [self.domain1, self.domain2, self.domain3]
# Extract fields from response
domain_ids = [domain["id"] for domain in data["domains"]]
self.assertIn(self.domain1.id, domain_ids)
self.assertIn(self.domain2.id, domain_ids)
self.assertIn(self.domain3.id, domain_ids)
names = [domain["name"] for domain in data["domains"]]
expiration_dates = [domain["expiration_date"] for domain in data["domains"]]
states = [domain["state"] for domain in data["domains"]]
state_displays = [domain["state_display"] for domain in data["domains"]]
get_state_help_texts = [domain["get_state_help_text"] for domain in data["domains"]]
action_urls = [domain["action_url"] for domain in data["domains"]]
# Check fields for each domain
for i, expected_domain in enumerate(expected_domains):
self.assertEqual(expected_domain.id, domain_ids[i])
self.assertEqual(expected_domain.name, names[i])
self.assertEqual(expected_domain.expiration_date, expiration_dates[i])
self.assertEqual(expected_domain.state, states[i])
# Parsing the expiration date from string to date
parsed_expiration_date = parse_date(expiration_dates[i])
expected_domain.expiration_date = parsed_expiration_date
# Check state_display and get_state_help_text
self.assertEqual(expected_domain.state_display(), state_displays[i])
self.assertEqual(expected_domain.get_state_help_text(), get_state_help_texts[i])
self.assertEqual(f'/domain/{expected_domain.id}', action_urls[i])
def test_pagination(self):
"""Test that pagination is correct in the response"""

View file

@ -2,6 +2,8 @@ from registrar.models import DomainRequest
from django.urls import reverse
from .test_views import TestWithUser
from django_webtest import WebTest # type: ignore
from datetime import datetime
from django.utils.dateparse import parse_datetime
class DomainRequestViewTest(TestWithUser, WebTest):
@ -88,6 +90,13 @@ class DomainRequestViewTest(TestWithUser, WebTest):
status=DomainRequest.DomainRequestStatus.REJECTED,
created_at="2024-11-01",
),
DomainRequest.objects.create(
creator=self.user,
requested_domain=None,
submission_date="2024-11-02",
status=DomainRequest.DomainRequestStatus.WITHDRAWN,
created_at="2024-11-02",
),
DomainRequest.objects.create(
creator=self.user,
requested_domain=None,
@ -97,8 +106,12 @@ class DomainRequestViewTest(TestWithUser, WebTest):
),
]
def tearDown(self):
super().tearDown()
DomainRequest.objects.all().delete()
def test_get_domain_requests_json_authenticated(self):
"""test that domain requests are returned properly for an authenticated user"""
"""Test that domain requests are returned properly for an authenticated user."""
response = self.app.get(reverse("get_domain_requests_json"))
self.assertEqual(response.status_code, 200)
data = response.json
@ -109,10 +122,33 @@ class DomainRequestViewTest(TestWithUser, WebTest):
self.assertFalse(data["has_previous"])
self.assertEqual(data["num_pages"], 2)
# Check domain requests
# Check the number of domain requests
self.assertEqual(len(data["domain_requests"]), 10)
for domain_request in data["domain_requests"]:
self.assertNotEqual(domain_request["status"], "Approved")
# Extract fields from response
requested_domains = [request["requested_domain"] for request in data["domain_requests"]]
submission_dates = [request["submission_date"] for request in data["domain_requests"]]
statuses = [request["status"] for request in data["domain_requests"]]
created_ats = [request["created_at"] for request in data["domain_requests"]]
ids = [request["id"] for request in data["domain_requests"]]
is_deletables = [request["is_deletable"] for request in data["domain_requests"]]
# Check fields for each domain request
for i in range(10):
self.assertNotEqual(data["domain_requests"][i]["status"], "Approved")
self.assertEqual(self.domain_requests[i].requested_domain.name if self.domain_requests[i].requested_domain else None, requested_domains[i])
self.assertEqual(self.domain_requests[i].submission_date, submission_dates[i])
self.assertEqual(self.domain_requests[i].get_status_display(), statuses[i])
self.assertEqual(parse_datetime(self.domain_requests[i].created_at.isoformat()), parse_datetime(created_ats[i]))
self.assertEqual(self.domain_requests[i].id, ids[i])
# Check is_deletable
is_deletable_expected = self.domain_requests[i].status in [
DomainRequest.DomainRequestStatus.STARTED,
DomainRequest.DomainRequestStatus.WITHDRAWN
]
self.assertEqual(is_deletable_expected, is_deletables[i])
def test_pagination(self):
"""Test that pagination works properly. There are 11 total non-approved requests and

View file

@ -1,6 +1,8 @@
from django.http import JsonResponse
from django.core.paginator import Paginator
from registrar.models import DomainRequest
from django.utils.dateformat import format
from django.utils.dateparse import parse_datetime
def get_domain_requests_json(request):
@ -28,10 +30,26 @@ def get_domain_requests_json(request):
"requested_domain": domain_request.requested_domain.name if domain_request.requested_domain else None,
"submission_date": domain_request.submission_date,
"status": domain_request.get_status_display(),
"created_at": domain_request.created_at,
"created_at": format(domain_request.created_at, 'c'), # Serialize to ISO 8601
"id": domain_request.id,
"is_deletable": domain_request.status
in [DomainRequest.DomainRequestStatus.STARTED, DomainRequest.DomainRequestStatus.WITHDRAWN],
"action_url": (
f"/domain-request/{domain_request.id}/edit"
if domain_request.status in [
DomainRequest.DomainRequestStatus.STARTED,
DomainRequest.DomainRequestStatus.WITHDRAWN
]
else f"/domain-request/{domain_request.id}"
),
"action_label": (
"Edit"
if domain_request.status in [
DomainRequest.DomainRequestStatus.STARTED,
DomainRequest.DomainRequestStatus.WITHDRAWN
]
else "Manage"
),
}
for domain_request in page_obj
]

View file

@ -41,6 +41,7 @@ def get_domains_json(request):
"state": domain.state,
"state_display": domain.state_display(),
"get_state_help_text": domain.get_state_help_text(),
"action_url": f"/domain/{domain.id}",
}
for domain in page_obj.object_list
]