au_ps_inferno 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +201 -0
- data/lib/au_ps_inferno/generator/constants.rb +61 -0
- data/lib/au_ps_inferno/generator/generator.rb +76 -0
- data/lib/au_ps_inferno/generator/generator_group_based_metadata_module.rb +113 -0
- data/lib/au_ps_inferno/generator/ig_resources_extractor.rb +149 -0
- data/lib/au_ps_inferno/generator/metadata_manager.rb +608 -0
- data/lib/au_ps_inferno/generator/naming.rb +52 -0
- data/lib/au_ps_inferno/generator/sections_validation_group_generator.rb +182 -0
- data/lib/au_ps_inferno/generator/test_file_generator.rb +77 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_bundle_instance.rb +56 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_bundle_must_support_conformance/suite_au_ps_bundle_instance_au_ps_bundle_must_support_conformance_bundle_must_support_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_bundle_must_support_conformance.rb +16 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_attester/suite_au_ps_bundle_instance_au_ps_composition_attester_attester_party_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_attester/suite_au_ps_bundle_instance_au_ps_composition_attester_attester_party_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_attester/suite_au_ps_bundle_instance_au_ps_composition_attester_attester_party_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_attester.rb +26 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_author/suite_au_ps_bundle_instance_au_ps_composition_author_author_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_author/suite_au_ps_bundle_instance_au_ps_composition_author_author_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_author/suite_au_ps_bundle_instance_au_ps_composition_author_author_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_author/suite_au_ps_bundle_instance_au_ps_composition_author_author_resource_type_is_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_author.rb +28 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_custodian/suite_au_ps_bundle_instance_au_ps_composition_custodian_custodian_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_custodian/suite_au_ps_bundle_instance_au_ps_composition_custodian_custodian_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_custodian/suite_au_ps_bundle_instance_au_ps_composition_custodian_custodian_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_custodian.rb +26 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_mandatory_sections/composition_mandatory_sections_mandatory_sections_entry_profiles.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_mandatory_sections/suite_au_ps_bundle_instance_au_ps_composition_mandatory_sections_sections_shall_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_mandatory_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_mandatory_ms_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_ms_subelements_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_optional_ms_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_optional_ms_slices.rb +22 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_must_support_conformance.rb +28 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_optional_sections/suite_au_ps_bundle_instance_au_ps_composition_optional_sections_optional_sections_entry_profiles.rb +22 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_optional_sections/suite_au_ps_bundle_instance_au_ps_composition_optional_sections_sections_may_populated.rb +24 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_optional_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_recommended_sections/composition_recommended_sections_recommended_sections_entry_profiles.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_recommended_sections/suite_au_ps_bundle_instance_au_ps_composition_recommended_sections_sections_should_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_recommended_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_subject/suite_au_ps_bundle_instance_au_ps_composition_subject_subject_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_subject/suite_au_ps_bundle_instance_au_ps_composition_subject_subject_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_subject/suite_au_ps_bundle_instance_au_ps_composition_subject_subject_ms_subelements_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_subject/suite_au_ps_bundle_instance_au_ps_composition_subject_subject_resource_type_is_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_subject.rb +28 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_undefined_sections/suite_au_ps_bundle_instance_au_ps_composition_undefined_sections_sections_may_undefined.rb +24 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_undefined_sections.rb +18 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/bundle_validation/suite_au_ps_bundle_instance_bundle_validation_bundle_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/bundle_validation/suite_au_ps_bundle_instance_bundle_validation_bundle_valid_ips.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_bundle_instance/bundle_validation.rb +20 -0
- data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_cs_is_valid_test.rb +21 -0
- data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_cs_supports_au_ps_profiles.rb +40 -0
- data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_cs_supports_ips_recommended_ops.rb +19 -0
- data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_retrieve_cs_group.rb +47 -0
- data/lib/au_ps_inferno/suite/au_ps_v100.rb +39 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_bundle_must_support_conformance/bundle_must_support_conformance_bundle_must_support_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_bundle_must_support_conformance.rb +16 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_attester/composition_attester_attester_party_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_attester/composition_attester_attester_party_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_attester/composition_attester_attester_party_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_attester.rb +26 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_author/composition_author_author_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_author/composition_author_author_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_author/composition_author_author_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_author/composition_author_author_resource_type_is_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_author.rb +28 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_custodian/composition_custodian_custodian_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_custodian/composition_custodian_custodian_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_custodian/composition_custodian_custodian_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_custodian.rb +26 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_mandatory_sections/composition_mandatory_sections_mandatory_sections_entry_profiles.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_mandatory_sections/composition_mandatory_sections_sections_shall_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_mandatory_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_mandatory_ms_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_ms_subelements_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_optional_ms_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_optional_ms_slices.rb +22 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_must_support_conformance.rb +28 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_optional_sections/composition_optional_sections_optional_sections_entry_profiles.rb +22 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_optional_sections/composition_optional_sections_sections_may_populated.rb +24 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_optional_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_recommended_sections/composition_recommended_sections_recommended_sections_entry_profiles.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_recommended_sections/composition_recommended_sections_sections_should_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_recommended_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_subject/composition_subject_subject_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_subject/composition_subject_subject_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_subject/composition_subject_subject_ms_subelements_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_subject/composition_subject_subject_resource_type_is_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_subject.rb +28 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_undefined_sections/composition_undefined_sections_sections_may_undefined.rb +24 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_undefined_sections.rb +18 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/bundle_validation/suite_generate_au_ps_using_ips_summary_validation_tests_bundle_validation_bundle_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/bundle_validation/suite_generate_au_ps_using_ips_summary_validation_tests_bundle_validation_bundle_valid_ips.rb +21 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/bundle_validation.rb +20 -0
- data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/generate_au_ps_using_ips_summary_validation_tests.rb +56 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_bundle_must_support_conformance/bundle_must_support_conformance_bundle_must_support_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_bundle_must_support_conformance.rb +16 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_attester/composition_attester_attester_party_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_attester/composition_attester_attester_party_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_attester/composition_attester_attester_party_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_attester.rb +26 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_author/composition_author_author_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_author/composition_author_author_resource_type_is_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_author/suite_retrieve_au_ps_bundle_validation_tests_au_ps_composition_author_author_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_author/suite_retrieve_au_ps_bundle_validation_tests_au_ps_composition_author_author_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_author.rb +28 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_custodian/composition_custodian_custodian_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_custodian/composition_custodian_custodian_ms_subelements.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_custodian/suite_retrieve_au_ps_bundle_validation_tests_au_ps_composition_custodian_custodian_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_custodian.rb +26 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_mandatory_sections/composition_mandatory_sections_mandatory_sections_entry_profiles.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_mandatory_sections/composition_mandatory_sections_sections_shall_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_mandatory_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_mandatory_ms_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_ms_subelements_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_optional_ms_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_must_support_conformance/composition_must_support_conformance_composition_optional_ms_slices.rb +22 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_must_support_conformance.rb +28 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_optional_sections/composition_optional_sections_optional_sections_entry_profiles.rb +22 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_optional_sections/composition_optional_sections_sections_may_populated.rb +24 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_optional_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_recommended_sections/composition_recommended_sections_recommended_sections_entry_profiles.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_recommended_sections/composition_recommended_sections_sections_should_populated.rb +22 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_recommended_sections.rb +20 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_subject/composition_subject_subject_ms_identifier_slices.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_subject/composition_subject_subject_ms_subelements_populated.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_subject/composition_subject_subject_resource_type_is_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_subject/suite_retrieve_au_ps_bundle_validation_tests_au_ps_composition_subject_subject_ms_elements.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_subject.rb +28 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_undefined_sections/composition_undefined_sections_sections_may_undefined.rb +24 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_undefined_sections.rb +18 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/bundle_validation/suite_retrieve_au_ps_bundle_validation_tests_bundle_validation_bundle_valid.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/bundle_validation/suite_retrieve_au_ps_bundle_validation_tests_bundle_validation_bundle_valid_ips.rb +21 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/bundle_validation.rb +20 -0
- data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/retrieve_au_ps_bundle_validation_tests.rb +56 -0
- data/lib/au_ps_inferno/utils/attester/basic_test_attester_identifier_slices.rb +74 -0
- data/lib/au_ps_inferno/utils/attester/basic_test_attester_message_helpers.rb +16 -0
- data/lib/au_ps_inferno/utils/attester/basic_test_attester_module.rb +14 -0
- data/lib/au_ps_inferno/utils/attester/basic_test_attester_resource.rb +54 -0
- data/lib/au_ps_inferno/utils/author/basic_test_author_module.rb +12 -0
- data/lib/au_ps_inferno/utils/author/basic_test_author_resource.rb +32 -0
- data/lib/au_ps_inferno/utils/author/basic_test_author_tests.rb +24 -0
- data/lib/au_ps_inferno/utils/basic_test/bundle_module.rb +87 -0
- data/lib/au_ps_inferno/utils/basic_test/capability_operations_module.rb +37 -0
- data/lib/au_ps_inferno/utils/basic_test/composition_elements_and_slices_module.rb +98 -0
- data/lib/au_ps_inferno/utils/basic_test/composition_section_check_resources_ms_elements_module.rb +197 -0
- data/lib/au_ps_inferno/utils/basic_test/composition_section_read_issues_helpers_module.rb +66 -0
- data/lib/au_ps_inferno/utils/basic_test/composition_section_read_module.rb +127 -0
- data/lib/au_ps_inferno/utils/basic_test/composition_subelements_module.rb +84 -0
- data/lib/au_ps_inferno/utils/basic_test/ms_elements_populated_helpers_module.rb +38 -0
- data/lib/au_ps_inferno/utils/basic_test/ms_elements_populated_module.rb +71 -0
- data/lib/au_ps_inferno/utils/basic_test/ms_identifier_slices_module.rb +61 -0
- data/lib/au_ps_inferno/utils/basic_test/ms_sub_elements_populated_module.rb +128 -0
- data/lib/au_ps_inferno/utils/basic_test/paths_module.rb +26 -0
- data/lib/au_ps_inferno/utils/basic_test/resolve_path_debug_module.rb +45 -0
- data/lib/au_ps_inferno/utils/basic_test/resolve_resource_type_module.rb +52 -0
- data/lib/au_ps_inferno/utils/basic_test/resource_helpers_module.rb +129 -0
- data/lib/au_ps_inferno/utils/basic_test/scratch_bundle_entries_module.rb +30 -0
- data/lib/au_ps_inferno/utils/basic_test/section_bundle_validation_module.rb +70 -0
- data/lib/au_ps_inferno/utils/basic_test_class.rb +56 -0
- data/lib/au_ps_inferno/utils/basic_test_contants_module.rb +32 -0
- data/lib/au_ps_inferno/utils/basic_test_with_url.rb +8 -0
- data/lib/au_ps_inferno/utils/basic_validate_bundle_test.rb +43 -0
- data/lib/au_ps_inferno/utils/bundle_decorator.rb +81 -0
- data/lib/au_ps_inferno/utils/bundle_entry_decorator.rb +19 -0
- data/lib/au_ps_inferno/utils/bundle_is_valid_class.rb +31 -0
- data/lib/au_ps_inferno/utils/capability_statement_decorator.rb +20 -0
- data/lib/au_ps_inferno/utils/composition_decorator.rb +56 -0
- data/lib/au_ps_inferno/utils/composition_utils/boolean_and_stats.rb +28 -0
- data/lib/au_ps_inferno/utils/composition_utils.rb +29 -0
- data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_identifier_slices.rb +47 -0
- data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_module.rb +14 -0
- data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_resource.rb +32 -0
- data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_tests.rb +19 -0
- data/lib/au_ps_inferno/utils/inferno_suite_generator_compat.rb +7 -0
- data/lib/au_ps_inferno/utils/ips_bundle_is_valid_class.rb +15 -0
- data/lib/au_ps_inferno/utils/ips_retrieve_bundle_test_class.rb +17 -0
- data/lib/au_ps_inferno/utils/ips_summary_valid_bundle_class.rb +15 -0
- data/lib/au_ps_inferno/utils/metadata_manager.rb +58 -0
- data/lib/au_ps_inferno/utils/retrieve_bundle_test_class.rb +81 -0
- data/lib/au_ps_inferno/utils/rich_message_class.rb +23 -0
- data/lib/au_ps_inferno/utils/rich_validation_message.rb +42 -0
- data/lib/au_ps_inferno/utils/section_decorator.rb +23 -0
- data/lib/au_ps_inferno/utils/section_names_mapping.rb +31 -0
- data/lib/au_ps_inferno/utils/section_test_class.rb +18 -0
- data/lib/au_ps_inferno/utils/section_test_module.rb +16 -0
- data/lib/au_ps_inferno/utils/structure_definition_decorator.rb +28 -0
- data/lib/au_ps_inferno/utils/subject/basic_test_subject_module.rb +12 -0
- data/lib/au_ps_inferno/utils/subject/basic_test_subject_patient_ms_other_tests.rb +15 -0
- data/lib/au_ps_inferno/utils/subject/basic_test_subject_resource.rb +21 -0
- data/lib/au_ps_inferno/utils/summary_valid_bundle_class.rb +84 -0
- data/lib/au_ps_inferno/utils/validator_helpers.rb +92 -0
- data/lib/au_ps_inferno/version.rb +6 -0
- data/lib/au_ps_inferno.rb +3 -0
- metadata +310 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'ms_elements_populated_helpers_module'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# Must Support elements populated or missing message.
|
|
7
|
+
module BasicTestMsSubElementsPopulatedModule
|
|
8
|
+
include BasicTestMsElementsPopulatedHelpersModule
|
|
9
|
+
|
|
10
|
+
def ms_sub_elements_populated_message(container_type)
|
|
11
|
+
guard_populated_resource(container_type)
|
|
12
|
+
|
|
13
|
+
resource = get_resource_by_container_type(container_type)
|
|
14
|
+
|
|
15
|
+
author_and_device_resource?(container_type, resource)
|
|
16
|
+
|
|
17
|
+
return unless (metadata = get_metadata_by_resource_type(resource.resourceType)).present?
|
|
18
|
+
|
|
19
|
+
_, new_grouped_sub_elements, ms_checker, results =
|
|
20
|
+
sub_elements_filtered_grouped_and_check_context(resource, metadata)
|
|
21
|
+
omit_if new_grouped_sub_elements.blank?, 'No complex element with Must Support sub-elements is defined'
|
|
22
|
+
|
|
23
|
+
show_ms_elements_messages(new_grouped_sub_elements, ms_checker, resource, results)
|
|
24
|
+
assert assert_result(results, new_grouped_sub_elements),
|
|
25
|
+
'When any mandatory Must Support sub-element is missing. See the list in messages tab.'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def ms_checker(metadata)
|
|
31
|
+
@ms_checker ||= InfernoSuiteGenerator::MSChecker.new(metadata)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def get_metadata_by_resource_type(resource_type)
|
|
35
|
+
raw_metadata = metadata_manager.group_metadata_by_resource_type(resource_type)
|
|
36
|
+
return nil unless raw_metadata.present?
|
|
37
|
+
|
|
38
|
+
InfernoSuiteGenerator::Generator::GroupMetadata.new(raw_metadata)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def sub_elements_filtered_grouped_and_check_context(resource, metadata)
|
|
42
|
+
checker = ms_checker(metadata)
|
|
43
|
+
results = checker.elements_present_statuses([resource], all_present: false)
|
|
44
|
+
filtered_results = results.filter { |result| sub_element?(result[:path]) }
|
|
45
|
+
grouped = filtered_results.group_by { |result| result[:path].split('.').first }
|
|
46
|
+
|
|
47
|
+
[filtered_results, grouped, checker, results]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def show_ms_elements_messages(new_grouped_sub_elements, ms_checker, resource, results)
|
|
51
|
+
new_grouped_sub_elements.each do |parent_path, sub_elements|
|
|
52
|
+
sub_element_message(ms_checker, sub_elements, resource, parent_path, results)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def assert_result(results, grouped_sub_elements)
|
|
57
|
+
grouped_sub_elements.all? do |parent_path, sub_elements|
|
|
58
|
+
!sub_element_assertion_failure?(results, parent_path, sub_elements)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def mandatory_ms_sub_elements(sub_elements)
|
|
63
|
+
sub_elements.filter { |res| res[:mandatory] == true }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def sub_element_assertion_failure?(results, parent_path, sub_elements)
|
|
67
|
+
mandatory_sub_elements = mandatory_ms_sub_elements(sub_elements)
|
|
68
|
+
return false if mandatory_sub_elements.empty?
|
|
69
|
+
|
|
70
|
+
mandatory_sub_elements_present = mandatory_sub_elements.all? { |res| res[:present] == true }
|
|
71
|
+
|
|
72
|
+
parent_element = results.find { |res| res[:path] == parent_path }
|
|
73
|
+
return false if parent_element.nil?
|
|
74
|
+
|
|
75
|
+
parent_present = parent_element[:present] == true
|
|
76
|
+
|
|
77
|
+
!mandatory_sub_elements_present && parent_present
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def sub_element_message(ms_checker, sub_elements, resource, parent_path, results)
|
|
81
|
+
message_level = build_message_level(ms_checker, sub_elements, results)
|
|
82
|
+
message = build_sub_element_message_content(ms_checker, sub_elements, resource, parent_path, results)
|
|
83
|
+
add_message(message_level, message)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def build_message_level(ms_checker, sub_elements, results)
|
|
87
|
+
return 'warning' if parent_element_is_not_populated?(sub_elements, results)
|
|
88
|
+
|
|
89
|
+
ms_checker.calculate_elements_status_message_level(sub_elements)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def build_sub_element_message_content(ms_checker, sub_elements, resource, parent_path, results)
|
|
93
|
+
[
|
|
94
|
+
'Must Support sub-elements correctly populated',
|
|
95
|
+
"**Referenced subject**: #{resource.resourceType}",
|
|
96
|
+
"## Complex element **#{parent_path}** — Must Support sub-elements populated or missing",
|
|
97
|
+
sub_element_statuses_texts(ms_checker, sub_elements, results, parent_path)
|
|
98
|
+
].join("\n\n")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def sub_element_statuses_texts(ms_checker, sub_elements, results, parent_path)
|
|
102
|
+
if parent_element_is_not_populated?(sub_elements, results)
|
|
103
|
+
return parent_element_is_not_populated_text(parent_path,
|
|
104
|
+
sub_elements)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
ms_checker.element_statuses_texts(sub_elements).map do |text|
|
|
108
|
+
text.gsub('|- ', '')
|
|
109
|
+
end.join("\n\n")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def parent_element_is_not_populated?(sub_elements, results)
|
|
113
|
+
parent_path = sub_elements[0][:path].split('.').first
|
|
114
|
+
results.any? { |result| result[:path] == parent_path && result[:present] == false }
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def parent_element_is_not_populated_text(parent_path, sub_elements)
|
|
118
|
+
"**Complex element #{parent_path}** is not populated. " \
|
|
119
|
+
"Must Support sub-elements that would be validated: #{sub_elements.map do |element|
|
|
120
|
+
element[:path]
|
|
121
|
+
end.join(', ')}."
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def sub_element?(path)
|
|
125
|
+
path.include?('.')
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
# FHIR path population checks and formatted lists of populated elements.
|
|
5
|
+
module BasicTestPathsModule
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
def populated_paths_info(resource, elements_array, mandatory_array: [])
|
|
9
|
+
title = '## List of populated elements'
|
|
10
|
+
result = elements_array.map do |element|
|
|
11
|
+
mandatory = mandatory_array.include?(element)
|
|
12
|
+
element_str = "**#{element}**"
|
|
13
|
+
element_str += ' (M)' if mandatory
|
|
14
|
+
"#{boolean_to_existent_string(resolve_path_with_dar(resource, element).first.present?,
|
|
15
|
+
optional: !mandatory)}: #{element_str}"
|
|
16
|
+
end
|
|
17
|
+
[title, result.join("\n\n")].join("\n\n")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def all_paths_are_populated?(resource, elements_array)
|
|
21
|
+
elements_array.map do |element|
|
|
22
|
+
resolve_path_with_dar(resource, element).first.present?
|
|
23
|
+
end.all?
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
# Wraps Inferno's FHIRResourceNavigation#resolve_path to check simple elements for DAR extension presence.
|
|
5
|
+
# Ex: birthDate DAR extension is _birthDate.extension.where(url='http://hl7.org/fhir/StructureDefinition/data-absent-reason').valueCode
|
|
6
|
+
module BasicTestResolvePathDebugModule
|
|
7
|
+
def resolve_path_with_dar(resource, path)
|
|
8
|
+
result = eval_expression(resource, path)
|
|
9
|
+
return result if result.length.positive?
|
|
10
|
+
|
|
11
|
+
check_for_dar(resource, path)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def eval_expression(resource, path)
|
|
17
|
+
result = resolve_path(resource, path)
|
|
18
|
+
return_values(result)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def return_values(result)
|
|
22
|
+
result.length.positive? ? result : []
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def check_for_dar(resource, path)
|
|
26
|
+
dar_path = modify_path_to_check_for_dar(path)
|
|
27
|
+
return nil if dar_path.nil?
|
|
28
|
+
|
|
29
|
+
eval_expression(resource, dar_path)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def modify_path_to_check_for_dar(path)
|
|
33
|
+
# Last path segment as primitive -> _segment.extension (FHIR JSON shadow path for extensions).
|
|
34
|
+
# Single segment: birthDate -> _birthDate.extension
|
|
35
|
+
# Nested: name.family -> name._family.extension
|
|
36
|
+
segments = path.split('.')
|
|
37
|
+
return nil if segments.empty?
|
|
38
|
+
|
|
39
|
+
last_part = segments.last
|
|
40
|
+
prefix = segments.length > 1 ? segments[0..-2].join('.') : ''
|
|
41
|
+
suffix = "#{last_part}.extension"
|
|
42
|
+
prefix.empty? ? suffix : "#{prefix}.#{suffix}"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
# Resolves the resource type from a resource. This module is used in tests for subject, author, custodian, attester.
|
|
5
|
+
module BasicTestResolveResourceTypeModule
|
|
6
|
+
def test_resource_type_is_valid?(container_type)
|
|
7
|
+
result = raw_resource_type_is_valid(container_type)
|
|
8
|
+
valid = result[:valid?]
|
|
9
|
+
result_msg = result[:msg]
|
|
10
|
+
|
|
11
|
+
build_message(valid, result_msg)
|
|
12
|
+
assert valid, result_msg
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def raw_resource_type_is_valid(container_type)
|
|
16
|
+
resource = get_resource_by_container_type(container_type)
|
|
17
|
+
return { valid?: false, msg: not_resolved_message(container_type) } if resource.blank?
|
|
18
|
+
|
|
19
|
+
resolved_type = resource_type(resource)
|
|
20
|
+
|
|
21
|
+
unless allowed_resource_types(container_type).include?(resolved_type)
|
|
22
|
+
return { valid?: false, msg: invalid_resource_type_message(container_type, resolved_type) }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
{ valid?: true, msg: valid_resource_type_message(container_type, resolved_type) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def allowed_resource_types(container_type)
|
|
31
|
+
container_metadata = get_target_metadata_by_container_type(container_type)
|
|
32
|
+
container_metadata.map { |item| item[:resource_type] }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def build_message(valid, result_msg)
|
|
36
|
+
msg_level = calculate_message_level(failed: !valid, warning: false, info: valid)
|
|
37
|
+
add_message(msg_level, result_msg)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def not_resolved_message(container_type)
|
|
41
|
+
"#{container_type.capitalize} reference does not resolve"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def invalid_resource_type_message(container_type, resource_type)
|
|
45
|
+
"#{container_type.capitalize} reference resolves to a resource with invalid resource type: #{resource_type}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def valid_resource_type_message(container_type, resource_type)
|
|
49
|
+
"#{container_type.capitalize} reference resolves to a resource with valid resource type: #{resource_type}"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'yaml'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# Cross-cutting helpers: metadata, resource typing, profiles, identifiers, coding.
|
|
7
|
+
module BasicTestResourceHelpersModule
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
def calculate_message_level(failed: false, warning: false, info: false)
|
|
11
|
+
return 'error' if failed
|
|
12
|
+
return 'warning' if warning
|
|
13
|
+
return 'info' if info
|
|
14
|
+
|
|
15
|
+
'info'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def resource_type(resource)
|
|
19
|
+
return nil unless resource.present?
|
|
20
|
+
|
|
21
|
+
resource.respond_to?(:resourceType) ? resource.resourceType : resource['resourceType']
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def author_resource_type_and_profiles(resource)
|
|
25
|
+
return ['', ''] unless resource.present?
|
|
26
|
+
|
|
27
|
+
resource_type_str = resource.respond_to?(:resourceType) ? resource.resourceType : resource['resourceType']
|
|
28
|
+
profiles = resource_profiles(resource)
|
|
29
|
+
profile_str = profiles.is_a?(Array) ? profiles.join(', ') : profiles.to_s
|
|
30
|
+
[resource_type_str.to_s, profile_str.to_s]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def resource_profiles(resource)
|
|
34
|
+
return [] unless resource.present?
|
|
35
|
+
|
|
36
|
+
if resource.respond_to?(:meta) && resource.meta&.profile.present?
|
|
37
|
+
resource.meta.profile
|
|
38
|
+
elsif resource.is_a?(Hash)
|
|
39
|
+
resource.dig('meta', 'profile') || []
|
|
40
|
+
else
|
|
41
|
+
[]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def ms_elements_populated_message(resource, list_lines)
|
|
46
|
+
ref = prepare_resource_type_and_profile_str(resource, 'author')
|
|
47
|
+
"#{ms_elements_populated_title}#{ref}#{populated_elements_list(list_lines)}"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def ms_elements_populated_title
|
|
51
|
+
'Must Support elements correctly populated'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def prepare_resource_type_and_profile_str(resource, human_readable_name)
|
|
55
|
+
resource_type_str = resource.respond_to?(:resourceType) ? resource.resourceType : resource['resourceType']
|
|
56
|
+
profiles = resource_profiles(resource)
|
|
57
|
+
profile_str = profiles.is_a?(Array) && profiles.length.positive? ? profiles.join(', ') : nil
|
|
58
|
+
|
|
59
|
+
result = [resource_type_str, profile_str].compact.join(' — ')
|
|
60
|
+
|
|
61
|
+
"\n\n**Referenced #{human_readable_name}**: #{result}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def populated_elements_list(list_lines)
|
|
65
|
+
return '' if list_lines.blank?
|
|
66
|
+
|
|
67
|
+
"\n\n## List of Must Support elements (complex) populated or missing\n\n#{list_lines.join("\n\n")}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def identifiers_from_resource(resource)
|
|
71
|
+
return nil unless resource.present?
|
|
72
|
+
|
|
73
|
+
if resource.respond_to?(:identifier)
|
|
74
|
+
resource.identifier
|
|
75
|
+
elsif resource.is_a?(Hash)
|
|
76
|
+
resource['identifier']
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def identifier_system(ident)
|
|
81
|
+
return nil unless ident.present?
|
|
82
|
+
|
|
83
|
+
ident.respond_to?(:system) ? ident.system : ident['system']
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def find_identifier_by_system(identifiers, system_url)
|
|
87
|
+
return nil if identifiers.blank? || system_url.blank?
|
|
88
|
+
|
|
89
|
+
identifiers.find { |ident| identifier_system(ident).to_s.strip == system_url.to_s.strip }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def identifier_type_display(ident)
|
|
93
|
+
return '' unless ident.present?
|
|
94
|
+
|
|
95
|
+
type_val = ident.respond_to?(:type) ? ident.type : ident['type']
|
|
96
|
+
return '' if type_val.blank?
|
|
97
|
+
|
|
98
|
+
coding_suffix_from_type_value(type_val)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def coding_suffix_from_type_value(type_val)
|
|
102
|
+
return coding_display_suffix(type_val.coding.first) if type_val.respond_to?(:coding) && type_val.coding.present?
|
|
103
|
+
return coding_display_suffix_hash(type_val['coding'].first) if type_val.is_a?(Hash) && type_val['coding'].present?
|
|
104
|
+
|
|
105
|
+
''
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def coding_display_suffix(coding)
|
|
109
|
+
display = coding.respond_to?(:display) ? coding.display : coding['display']
|
|
110
|
+
code = coding.respond_to?(:code) ? coding.code : coding['code']
|
|
111
|
+
", type: #{display.presence || code.presence || '—'}"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def coding_display_suffix_hash(coding)
|
|
115
|
+
", type: #{coding['display'].presence || coding['code'].presence || '—'}"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def guard_populated_resource(container_type)
|
|
119
|
+
resource_is_poluated = raw_resource_type_is_valid(container_type)
|
|
120
|
+
skip_if !resource_is_poluated[:valid?], resource_is_poluated[:msg]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def author_and_device_resource?(container_type, resource)
|
|
124
|
+
# TODO: This function should be more generic in the future.
|
|
125
|
+
is_author_and_device = container_type == 'author' && resource_type(resource) == 'Device'
|
|
126
|
+
omit_if is_author_and_device, 'Test is ommited because the author reference resolves to a Device resource'
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
# Saving and retrieving bundle entities from scratch.
|
|
5
|
+
module BasicTestScratchBundleEntriesModule
|
|
6
|
+
def save_bundle_entities_to_scratch(bundle)
|
|
7
|
+
scratch[:bundle_entities] = bundle.entry.map do |entry|
|
|
8
|
+
{
|
|
9
|
+
full_url: entry.fullUrl,
|
|
10
|
+
resource_type: entry.resource.resourceType,
|
|
11
|
+
resource: entry.resource
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def bundle_entities_from_scratch
|
|
17
|
+
scratch[:bundle_entities] || []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def bundle_entity_from_scratch(full_url)
|
|
21
|
+
bundle_entities_from_scratch.find { |entity| entity[:full_url] == full_url }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def bundle_entity_resource_from_scratch(full_url)
|
|
25
|
+
return nil if bundle_entity_from_scratch(full_url).nil?
|
|
26
|
+
|
|
27
|
+
bundle_entity_from_scratch(full_url)[:resource]
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
# Per-section bundle row validation (optional, mandatory, and mixed strictness).
|
|
5
|
+
module BasicTestSectionBundleValidationModule
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
def validate_populated_undefined_sections_in_bundle(sections_code_to_filter, elements_array)
|
|
9
|
+
skip_if scratch_bundle.blank?, 'No Bundle resource provided'
|
|
10
|
+
|
|
11
|
+
bundle_resource = BundleDecorator.new(scratch_bundle)
|
|
12
|
+
sections_to_validate = bundle_resource.composition_resource.section_codes.filter do |section_code|
|
|
13
|
+
!sections_code_to_filter.include?(section_code)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
skip_if sections_to_validate.blank?, 'No sections to validate'
|
|
17
|
+
validate_populated_sections_in_bundle(sections_to_validate, elements_array, optional: true)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def validate_populated_sections_in_bundle(section_codes_array, elements_array, optional: false)
|
|
21
|
+
skip_if scratch_bundle.blank?, 'No Bundle resource provided'
|
|
22
|
+
skip_if section_codes_array.blank?, 'No sections to validate'
|
|
23
|
+
|
|
24
|
+
composition = BundleDecorator.new(scratch_bundle).composition_resource
|
|
25
|
+
all_errors = section_codes_array.filter_map do |section_code|
|
|
26
|
+
section_bundle_row_failure?(composition, section_code, elements_array, optional: optional)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
assert all_errors.empty?,
|
|
30
|
+
'Some of the sections are not populated. See the list of populated sections in messages tab.'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def section_bundle_row_failure?(composition, section_code, elements_array, optional:)
|
|
34
|
+
section = composition.section_by_code(section_code)
|
|
35
|
+
return section_bundle_blank_outcome?(section_code, optional) if section.blank?
|
|
36
|
+
|
|
37
|
+
section_bundle_ms_population_outcome?(section, elements_array)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def section_bundle_blank_outcome?(section_code, optional)
|
|
41
|
+
add_message(optional ? 'warning' : 'error', "#{get_section_name(section_code)} is missing")
|
|
42
|
+
optional ? false : true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def section_bundle_ms_population_outcome?(section, elements_array)
|
|
46
|
+
body = section_ms_elements_message(section, elements_array)
|
|
47
|
+
return section_bundle_all_ms_ok?(body) if all_paths_are_populated?(section, elements_array)
|
|
48
|
+
|
|
49
|
+
add_message('error', section_ms_missing_mandatory_message(body))
|
|
50
|
+
true
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def section_bundle_all_ms_ok?(body)
|
|
54
|
+
add_message('info', "Section correctly populated\n\n#{body}")
|
|
55
|
+
false
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def section_ms_missing_mandatory_message(body)
|
|
59
|
+
"For section with any mandatory Must Support element in section missing (i.e. title, code, text)\n\n#{body}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def section_ms_elements_message(section, elements_array)
|
|
63
|
+
title = "### #{section.code_display_str}"
|
|
64
|
+
elements_list = elements_array.map do |element|
|
|
65
|
+
"**#{element}**: #{boolean_to_existent_string(resolve_path_with_dar(section, element).first.present?)}"
|
|
66
|
+
end.join("\n\n")
|
|
67
|
+
[title, 'List of Must Support elements populated or missing:', elements_list].join("\n\n")
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'bundle_decorator'
|
|
4
|
+
require_relative 'composition_utils'
|
|
5
|
+
require_relative 'validator_helpers'
|
|
6
|
+
require_relative 'section_test_module'
|
|
7
|
+
require_relative 'section_names_mapping'
|
|
8
|
+
require_relative 'basic_test_contants_module'
|
|
9
|
+
require_relative 'attester/basic_test_attester_module'
|
|
10
|
+
require_relative 'subject/basic_test_subject_module'
|
|
11
|
+
require_relative 'author/basic_test_author_module'
|
|
12
|
+
require_relative 'custodian/basic_test_custodian_module'
|
|
13
|
+
require_relative 'basic_test/bundle_module'
|
|
14
|
+
require_relative 'basic_test/capability_operations_module'
|
|
15
|
+
require_relative 'basic_test/composition_section_read_module'
|
|
16
|
+
require_relative 'basic_test/paths_module'
|
|
17
|
+
require_relative 'basic_test/resource_helpers_module'
|
|
18
|
+
require_relative 'basic_test/composition_subelements_module'
|
|
19
|
+
require_relative 'basic_test/ms_identifier_slices_module'
|
|
20
|
+
require_relative 'basic_test/composition_elements_and_slices_module'
|
|
21
|
+
require_relative 'basic_test/section_bundle_validation_module'
|
|
22
|
+
require_relative 'basic_test/resolve_path_debug_module'
|
|
23
|
+
require_relative 'basic_test/scratch_bundle_entries_module'
|
|
24
|
+
require_relative 'basic_test/ms_elements_populated_module'
|
|
25
|
+
require_relative 'basic_test/ms_sub_elements_populated_module'
|
|
26
|
+
require_relative 'basic_test/resolve_resource_type_module'
|
|
27
|
+
|
|
28
|
+
module AUPSTestKit
|
|
29
|
+
# A base class for all tests to decrease code duplication.
|
|
30
|
+
# Shared behavior is composed from BasicTest* modules under utils/basic_test/.
|
|
31
|
+
class BasicTest < Inferno::Test
|
|
32
|
+
include CompositionUtils
|
|
33
|
+
include ValidatorHelpers
|
|
34
|
+
include SectionTestModule
|
|
35
|
+
include SectionNamesMapping
|
|
36
|
+
include BasicTestConstants
|
|
37
|
+
include BasicTestSubjectModule
|
|
38
|
+
include BasicTestAuthorModule
|
|
39
|
+
include BasicTestCustodianModule
|
|
40
|
+
include BasicTestAttesterModule
|
|
41
|
+
include BasicTestBundleModule
|
|
42
|
+
include BasicTestCapabilityOperationsModule
|
|
43
|
+
include BasicTestCompositionSectionReadModule
|
|
44
|
+
include BasicTestPathsModule
|
|
45
|
+
include BasicTestResourceHelpersModule
|
|
46
|
+
include BasicTestCompositionSubelementsModule
|
|
47
|
+
include BasicTestMsIdentifierSlicesModule
|
|
48
|
+
include BasicTestCompositionElementsAndSlicesModule
|
|
49
|
+
include BasicTestSectionBundleValidationModule
|
|
50
|
+
include BasicTestResolvePathDebugModule
|
|
51
|
+
include BasicTestScratchBundleEntriesModule
|
|
52
|
+
include BasicTestMsElementsPopulatedModule
|
|
53
|
+
include BasicTestMsSubElementsPopulatedModule
|
|
54
|
+
include BasicTestResolveResourceTypeModule
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
module BasicTestConstants
|
|
5
|
+
# AU PS Patient Must Support identifier slices (optional). System URLs for IHI, DVA, Medicare.
|
|
6
|
+
PATIENT_MS_IDENTIFIER_SLICES = [
|
|
7
|
+
{ name: 'IHI', system: 'http://ns.electronichealth.net.au/id/hi/ihi/1.0' },
|
|
8
|
+
{ name: 'DVA', system: 'http://ns.electronichealth.net.au/id/dva' },
|
|
9
|
+
{ name: 'MEDICARE', system: 'http://ns.electronichealth.net.au/id/medicare-number' }
|
|
10
|
+
].freeze
|
|
11
|
+
ORGANIZATION_MS_IDENTIFIER_SLICES = [
|
|
12
|
+
{ name: 'ABN', system: 'http://hl7.org.au/id/abn' },
|
|
13
|
+
{ name: 'HPIO', system: 'http://ns.electronichealth.net.au/id/hi/hpio/1.0' }
|
|
14
|
+
].freeze
|
|
15
|
+
PRACTITIONER_ROLE_MS_IDENTIFIER_SLICES = [
|
|
16
|
+
{ name: 'MEDICARE PROVIDER', system: 'http://ns.electronichealth.net.au/id/medicare-provider-number' }
|
|
17
|
+
].freeze
|
|
18
|
+
PRACTITIONER_MS_IDENTIFIER_SLICES = [
|
|
19
|
+
{ name: 'HPII', system: 'http://ns.electronichealth.net.au/id/hi/hpii/1.0' }
|
|
20
|
+
].freeze
|
|
21
|
+
|
|
22
|
+
# Author resource type -> Must Support identifier slices (empty for Device, RelatedPerson).
|
|
23
|
+
AUTHOR_MS_IDENTIFIER_SLICES_BY_TYPE = {
|
|
24
|
+
'Practitioner' => PRACTITIONER_MS_IDENTIFIER_SLICES,
|
|
25
|
+
'PractitionerRole' => PRACTITIONER_ROLE_MS_IDENTIFIER_SLICES,
|
|
26
|
+
'Patient' => PATIENT_MS_IDENTIFIER_SLICES,
|
|
27
|
+
'Organization' => ORGANIZATION_MS_IDENTIFIER_SLICES,
|
|
28
|
+
'RelatedPerson' => [],
|
|
29
|
+
'Device' => []
|
|
30
|
+
}.freeze
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
# Basic test for validating a Bundle resource against the AU PS Bundle or IPS Bundle profile
|
|
5
|
+
class BasicValidateBundleTest < BasicTest
|
|
6
|
+
OMIT_AU_PS_MESSAGE = 'Validation against AU PS Bundle is disabled'
|
|
7
|
+
OMIT_IPS_MESSAGE = 'Validation against IPS Bundle is disabled'
|
|
8
|
+
|
|
9
|
+
id :basic_validate_bundle_test
|
|
10
|
+
|
|
11
|
+
input :validate_against,
|
|
12
|
+
title: 'Validate Against',
|
|
13
|
+
optional: true,
|
|
14
|
+
type: 'checkbox',
|
|
15
|
+
default: %w[au_ps_bundle],
|
|
16
|
+
options: {
|
|
17
|
+
list_options: [
|
|
18
|
+
{
|
|
19
|
+
label: 'AU PS Bundle Validation',
|
|
20
|
+
value: 'au_ps_bundle'
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: 'IPS Bundle Validation',
|
|
24
|
+
value: 'ips_bundle'
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
def omit_au_ps_validation?
|
|
30
|
+
omit_test_wrapper?('au_ps_bundle')
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def omit_ips_validation?
|
|
34
|
+
omit_test_wrapper?('ips_bundle')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def omit_test_wrapper?(include_str)
|
|
40
|
+
validate_against.blank? || !validate_against.include?(include_str)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|