Unit tests and documentation

This commit is contained in:
zandercymatics 2025-01-06 13:39:56 -07:00
parent 9052d9ed3f
commit 188c99a169
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
4 changed files with 117 additions and 12 deletions

View file

@ -918,3 +918,36 @@ Example (only requests): `./manage.py create_federal_portfolio --branch "executi
- Parameters #1-#2: Either `--agency_name` or `--branch` must be specified. Not both.
- Parameters #2-#3, you cannot use `--both` while using these. You must specify either `--parse_requests` or `--parse_domains` seperately. While all of these parameters are optional in that you do not need to specify all of them,
you must specify at least one to run this script.
## Populate requested suborg
This script populates the "requested suborganization" fields on DomainRequest.
These fields are: requested_suborganization, suborganization_city, suborganization_state_territory.
This is done by pulling from organization_name, city, and state_territory.
The script will only parse records with a portfolio but no suborganization attached to it.
### Running on sandboxes
#### Step 1: Login to CloudFoundry
```cf login -a api.fr.cloud.gov --sso```
#### Step 2: SSH into your environment
```cf ssh getgov-{space}```
Example: `cf ssh getgov-za`
#### Step 3: Create a shell instance
```/tmp/lifecycle/shell```
#### Step 4: Upload your csv to the desired sandbox
[Follow these steps](#use-scp-to-transfer-data-to-sandboxes) to upload the federal_cio csv to a sandbox of your choice.
#### Step 5: Running the script
To create a specific portfolio:
```./manage.py populate_requested_suborg```
### Running locally
#### Step 1: Running the script
```docker-compose exec app ./manage.py populate_requested_suborg```

View file

@ -7,7 +7,7 @@ logger = logging.getLogger(__name__)
class Command(BaseCommand, PopulateScriptTemplate):
help = "Loops through each domain request object and populates the last_status_update and first_submitted_date"
help = "Loops through each domain request object and populates requested suborg info"
def handle(self, **kwargs):
"""Loops through each DomainRequest object and populates
@ -26,12 +26,3 @@ class Command(BaseCommand, PopulateScriptTemplate):
f"sub_city: {record.city}, suborg_state_territory: {record.state_territory}."
)
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKBLUE, message)
def should_skip_record(self, record: DomainRequest) -> bool:
"""Skips record update if we're missing org name, city, and state territory."""
required_fields = [
record.organization_name,
record.city,
record.state_territory
]
return not all(bool(field) for field in required_fields)

View file

@ -1032,6 +1032,8 @@ def completed_domain_request( # noqa
federal_agency=None,
federal_type=None,
action_needed_reason=None,
city=None,
state_territory=None,
portfolio=None,
organization_name=None,
sub_organization=None,
@ -1076,7 +1078,7 @@ def completed_domain_request( # noqa
organization_name=organization_name if organization_name else "Testorg",
address_line1="address 1",
address_line2="address 2",
state_territory="NY",
state_territory="NY" if not state_territory else state_territory,
zipcode="10002",
senior_official=so,
requested_domain=domain,
@ -1085,6 +1087,10 @@ def completed_domain_request( # noqa
investigator=investigator,
federal_agency=federal_agency,
)
if city:
domain_request_kwargs["city"] = city
if has_about_your_organization:
domain_request_kwargs["about_your_organization"] = "e-Government"
if has_anything_else:

View file

@ -32,7 +32,7 @@ import tablib
from unittest.mock import patch, call, MagicMock, mock_open
from epplibwrapper import commands, common
from .common import MockEppLib, less_console_noise, completed_domain_request, MockSESClient
from .common import MockEppLib, create_user, less_console_noise, completed_domain_request, MockSESClient
from api.tests.common import less_console_noise_decorator
@ -1731,3 +1731,78 @@ class TestCreateFederalPortfolio(TestCase):
self.assertEqual(existing_portfolio.organization_name, self.federal_agency.agency)
self.assertEqual(existing_portfolio.notes, "Old notes")
self.assertEqual(existing_portfolio.creator, self.user)
class TestPopulateRequestedSuborg(MockEppLib):
"""Tests for the populate_requested_suborg script"""
@less_console_noise_decorator
def setUp(self):
"""Creates test domain requests with various states"""
super().setUp()
self.user = create_user()
# Create a portfolio
self.portfolio = Portfolio.objects.create(organization_name="Test Portfolio", creator=self.user)
# Create a domain request with all required fields
self.complete_request = completed_domain_request(
name="complete.gov",
organization_name="Complete Org",
city="Washington",
state_territory="DC",
portfolio=self.portfolio,
)
# Create a request that already has a suborganization
self.suborg = Suborganization.objects.create(name="Existing Suborg", portfolio=self.portfolio)
self.existing_suborg_request = completed_domain_request(
name="existing.gov",
organization_name="Existing Org",
city="New York",
state_territory="NY",
portfolio=self.portfolio,
sub_organization=self.suborg,
)
def tearDown(self):
"""Cleans up test data"""
super().tearDown()
DomainRequest.objects.all().delete()
Suborganization.objects.all().delete()
Portfolio.objects.all().delete()
User.objects.all().delete()
@less_console_noise_decorator
def run_populate_requested_suborg(self):
"""Executes the populate_requested_suborg command"""
with patch(
"registrar.management.commands.utility.terminal_helper.TerminalHelper.query_yes_no_exit",
return_value=True,
):
call_command("populate_requested_suborg")
@less_console_noise_decorator
def test_populate_requested_suborg_complete_request(self):
"""Tests that complete requests are updated correctly"""
self.run_populate_requested_suborg()
self.complete_request.refresh_from_db()
# Verify fields were populated correctly
self.assertEqual(self.complete_request.requested_suborganization, "Complete Org")
self.assertEqual(self.complete_request.suborganization_city, "Washington")
self.assertEqual(self.complete_request.suborganization_state_territory, "DC")
@less_console_noise_decorator
def test_populate_requested_suborg_existing_suborg(self):
"""Tests that requests with existing suborgs are skipped"""
self.run_populate_requested_suborg()
self.existing_suborg_request.refresh_from_db()
# Verify the request wasn't modified
self.assertEqual(self.existing_suborg_request.sub_organization, self.suborg)
self.assertIsNone(self.existing_suborg_request.requested_suborganization)
self.assertIsNone(self.existing_suborg_request.suborganization_city)
self.assertIsNone(self.existing_suborg_request.suborganization_state_territory)