@@ -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
379379def 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
454483def test_link_administrative_penalty_with_invalid_ap_id (
0 commit comments