Skip to content

Commit f388c39

Browse files
authored
administrative penalty integration tests (#555)
* administrative penalty integration tests * test case fixes * fix for linking closed cased files
1 parent 420c655 commit f388c39

File tree

2 files changed

+97
-67
lines changed

2 files changed

+97
-67
lines changed

compliance-api/src/compliance_api/services/case_file.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,6 @@ def link(cls, case_file_id, link):
324324
if not link_to_case_file:
325325
raise ResourceNotFoundError(f"CaseFile with {link_case_file_id} not found")
326326
_link_case_file_checks(case_file, case_file_id)
327-
_link_case_file_checks(link_to_case_file, link_case_file_id)
328327
source_link = CaseFileLinkModel.get_links_by_source_and_target(
329328
source_id=case_file_id, target_id=link_case_file_id
330329
)
@@ -917,7 +916,9 @@ def _build_enforcement_query(inspection_ids: list):
917916
OrderModel,
918917
and_(
919918
OrderModel.inspection_id == InspectionModel.id,
920-
OrderModel.order_status != OrderStatusEnum.OPEN,
919+
OrderModel.order_status.notin_(
920+
[OrderStatusEnum.OPEN, OrderStatusEnum.CLOSED]
921+
),
921922
OrderModel.is_active.is_(True),
922923
OrderModel.is_deleted.is_(False),
923924
),

compliance-api/tests/integration/api/test_administrative_penalty.py

Lines changed: 94 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -350,30 +350,30 @@ def test_update_administrative_penalty_with_invalid_inspection_id(
350350
assert result.status_code == HTTPStatus.NOT_FOUND
351351

352352

353-
# def test_update_administrative_penalty_with_decision_but_no_penalty_amount(
354-
# client,
355-
# auth_header_super_user,
356-
# created_administrative_penalty,
357-
# created_administrative_penalty_inspection_requirement,
358-
# ):
359-
# """Test updating administrative penalty with decision but no penalty amount."""
360-
# url = urljoin(API_BASE_URL, f"{created_administrative_penalty.id}")
361-
# update_data = {
362-
# "inspection_id": created_administrative_penalty.inspection_id,
363-
# "decision": DecisionEnum.AP_ISSUED.name,
364-
# "inspection_requirement_ids": [
365-
# created_administrative_penalty_inspection_requirement.id
366-
# ],
367-
# # No penalty_amount provided
368-
# }
369-
370-
# headers = {**auth_header_super_user, "Content-Type": "application/json"}
371-
# result = client.patch(
372-
# url,
373-
# data=json.dumps(update_data),
374-
# headers=headers,
375-
# )
376-
# assert result.status_code == HTTPStatus.UNPROCESSABLE_ENTITY
353+
def test_update_administrative_penalty_with_decision_but_no_penalty_amount(
354+
client,
355+
auth_header_super_user,
356+
created_administrative_penalty,
357+
created_administrative_penalty_inspection_requirement,
358+
):
359+
"""Test updating administrative penalty with decision but no penalty amount."""
360+
url = urljoin(API_BASE_URL, f"{created_administrative_penalty.id}")
361+
update_data = {
362+
"inspection_id": created_administrative_penalty.inspection_id,
363+
"decision": DecisionEnum.AP_ISSUED.name,
364+
"inspection_requirement_ids": [
365+
created_administrative_penalty_inspection_requirement.id
366+
],
367+
# No penalty_amount provided
368+
}
369+
370+
headers = {**auth_header_super_user, "Content-Type": "application/json"}
371+
result = client.patch(
372+
url,
373+
data=json.dumps(update_data),
374+
headers=headers,
375+
)
376+
assert result.status_code == HTTPStatus.BAD_REQUEST
377377

378378

379379
def test_delete_administrative_penalty(
@@ -408,47 +408,76 @@ def test_delete_administrative_penalty_without_inspection_id(
408408
assert result.status_code == HTTPStatus.BAD_REQUEST
409409

410410

411-
# def test_link_administrative_penalty_success(
412-
# client,
413-
# auth_header_super_user,
414-
# created_administrative_penalty,
415-
# created_inspection,
416-
# session,
417-
# mocker,
418-
# ):
419-
# """Test successfully linking an administrative penalty to inspection requirements."""
420-
# # Create a new requirement that's not already linked to the administrative penalty
421-
# from compliance_api.services.inspection_requirement import InspectionRequirementService
422-
# from tests.utilities.factory_scenario.inspection_requirement_scenario import InspectionRequirementScenario
423-
424-
# # Mock auth for requirement creation
425-
# contains_role = mocker.patch("compliance_api.auth.jwt.contains_role")
426-
# contains_role.return_value = True
427-
428-
# # Create a new requirement with administrative penalty enforcement action
429-
# requirement_data = copy.copy(InspectionRequirementScenario.default_value.value)
430-
# requirement_data["enforcement_action_ids"] = [
431-
# 6
432-
# ] # Administrative Penalty Recommendation
433-
# new_requirement = InspectionRequirementService.create(
434-
# created_inspection.id, requirement_data
435-
# )
436-
437-
# url = urljoin(API_BASE_URL, "links")
438-
# link_data = {
439-
# "administrative_penalty_id": created_administrative_penalty.id,
440-
# "inspection_id": created_inspection.id,
441-
# "inspection_requirement_ids": [new_requirement.id],
442-
# }
443-
444-
# result = client.post(
445-
# url,
446-
# data=json.dumps(link_data),
447-
# headers=auth_header_super_user,
448-
# )
449-
# print(result.json)
450-
# assert result.status_code == HTTPStatus.CREATED
451-
# assert result.json["id"] == created_administrative_penalty.id
411+
def test_link_administrative_penalty_success(
412+
client,
413+
auth_header_super_user,
414+
created_inspection,
415+
session,
416+
mocker,
417+
):
418+
"""Test successfully linking an administrative penalty to inspection requirements."""
419+
from compliance_api.services.administrative_penalty import AdministrativePenaltyService
420+
from compliance_api.services.inspection import InspectionService
421+
from compliance_api.services.inspection_requirement import InspectionRequirementService
422+
from tests.utilities.factory_scenario.administrative_penalty_scenario import AdministrativePenaltyScenario
423+
from tests.utilities.factory_scenario.inspection_requirement_scenario import InspectionRequirementScenario
424+
from tests.utilities.factory_scenario.inspection_scenario import InspectionScenario
425+
426+
# Mock auth for all operations
427+
contains_role = mocker.patch("compliance_api.auth.jwt.contains_role")
428+
contains_role.return_value = True
429+
access_check_fn = mocker.patch(
430+
"compliance_api.services.service_utils.ServiceUtils.access_check_update_for_inspection"
431+
)
432+
access_check_fn.return_value = True
433+
inspection_status_check = mocker.patch(
434+
"compliance_api.services.service_utils.ServiceUtils.inspection_status_check"
435+
)
436+
inspection_status_check.return_value = True
437+
438+
# Create first inspection and requirement for the administrative penalty
439+
ap_inspection_data = copy.copy(InspectionScenario.default_value.value)
440+
ap_inspection_data["case_file_id"] = created_inspection.case_file_id
441+
ap_inspection = InspectionService.create(ap_inspection_data)
442+
443+
ap_requirement_data = copy.copy(InspectionRequirementScenario.default_value.value)
444+
ap_requirement_data["enforcement_action_ids"] = [6] # Administrative Penalty Recommendation
445+
ap_requirement = InspectionRequirementService.create(
446+
ap_inspection.id, ap_requirement_data
447+
)
448+
449+
# Create administrative penalty with the first requirement
450+
ap_data = copy.copy(AdministrativePenaltyScenario.default_value.value)
451+
ap_data["inspection_id"] = ap_inspection.id
452+
ap_data["inspection_requirement_ids"] = [ap_requirement.id]
453+
administrative_penalty = AdministrativePenaltyService.create_administrative_penalty(ap_data)
454+
455+
# Create second inspection and requirement for linking
456+
link_inspection_data = copy.copy(InspectionScenario.default_value.value)
457+
link_inspection_data["case_file_id"] = created_inspection.case_file_id
458+
link_inspection = InspectionService.create(link_inspection_data)
459+
460+
link_requirement_data = copy.copy(InspectionRequirementScenario.default_value.value)
461+
link_requirement_data["enforcement_action_ids"] = [6] # Administrative Penalty Recommendation
462+
link_requirement = InspectionRequirementService.create(
463+
link_inspection.id, link_requirement_data
464+
)
465+
466+
# Now test the linking
467+
url = urljoin(API_BASE_URL, "links")
468+
link_data = {
469+
"administrative_penalty_id": administrative_penalty.id,
470+
"inspection_id": link_inspection.id,
471+
"inspection_requirement_ids": [link_requirement.id],
472+
}
473+
474+
result = client.post(
475+
url,
476+
data=json.dumps(link_data),
477+
headers=auth_header_super_user,
478+
)
479+
assert result.status_code == HTTPStatus.CREATED
480+
assert result.json["id"] == administrative_penalty.id
452481

453482

454483
def test_link_administrative_penalty_with_invalid_ap_id(

0 commit comments

Comments
 (0)