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,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'composition_decorator'
|
|
4
|
+
require_relative 'bundle_entry_decorator'
|
|
5
|
+
|
|
6
|
+
# A decorator for FHIR::Bundle to add convenience methods
|
|
7
|
+
class BundleDecorator < FHIR::Bundle
|
|
8
|
+
def initialize(data)
|
|
9
|
+
if data.is_a?(Hash)
|
|
10
|
+
super
|
|
11
|
+
else
|
|
12
|
+
super(data.respond_to?(:source_hash) ? data.source_hash : data.to_hash)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def composition_resource
|
|
17
|
+
return nil if composition_entry.nil?
|
|
18
|
+
|
|
19
|
+
CompositionDecorator.new(composition_entry.resource)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def composition_entry
|
|
23
|
+
entry.find { |entr| entr.resource.resourceType == 'Composition' }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def resources_by_references(entry_references)
|
|
27
|
+
entry_references.filter_map { |ref| resource_by_reference(ref) }.uniq
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def resource_by_reference(entry_reference)
|
|
31
|
+
entry = resolve_entry_reference(entry_reference)
|
|
32
|
+
entry&.resource
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def resolve_entry_reference_as_reference(entry_reference)
|
|
38
|
+
base_url = BundleEntryDecorator.new(composition_entry).full_url_base
|
|
39
|
+
return resolve_by_base_url(entry_reference, base_url) if base_url
|
|
40
|
+
|
|
41
|
+
resolve_by_suffix_match(entry_reference)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def resolve_by_base_url(entry_reference, base_url)
|
|
45
|
+
entry.find do |entr|
|
|
46
|
+
next unless entr.fullUrl&.start_with?('http')
|
|
47
|
+
|
|
48
|
+
entr.fullUrl == base_url + entry_reference
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def resolve_by_suffix_match(entry_reference)
|
|
53
|
+
# Composition fullUrl is a URN so no base URL is derivable. Fall back to
|
|
54
|
+
# suffix match: a relative {Type}/{id} reference can resolve to an absolute
|
|
55
|
+
# fullUrl that ends with /{Type}/{id} (FHIR bundle reference rules).
|
|
56
|
+
# Only resolve when exactly one entry matches — multiple matches are
|
|
57
|
+
# ambiguous (entries from different servers share the same type/id).
|
|
58
|
+
matches = entry.select { |entr| entr.fullUrl&.end_with?("/#{entry_reference}") }
|
|
59
|
+
matches.length == 1 ? matches.first : nil
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def resolve_entry_reference_by_exact_url(entry_reference)
|
|
63
|
+
canonical = strip_history_suffix(entry_reference)
|
|
64
|
+
entry.find { |entr| entr.fullUrl == canonical }
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def resolve_entry_reference(entry_reference)
|
|
68
|
+
is_urn = entry_reference.start_with?('urn:')
|
|
69
|
+
is_url = entry_reference.start_with?('http')
|
|
70
|
+
is_reference = !is_urn && !is_url && entry_reference.split('/').length == 2
|
|
71
|
+
|
|
72
|
+
return resolve_entry_reference_by_exact_url(entry_reference) if is_urn || is_url
|
|
73
|
+
return resolve_entry_reference_as_reference(entry_reference) if is_reference
|
|
74
|
+
|
|
75
|
+
nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def strip_history_suffix(url)
|
|
79
|
+
url&.sub(%r{/_history/[^/]+$}, '')
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Decorator for FHIR::Bundle::Entry
|
|
4
|
+
class BundleEntryDecorator < FHIR::Bundle::Entry
|
|
5
|
+
def initialize(data)
|
|
6
|
+
if data.is_a?(Hash)
|
|
7
|
+
super
|
|
8
|
+
else
|
|
9
|
+
super(data.respond_to?(:source_hash) ? data.source_hash : data.to_hash)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def full_url_base
|
|
14
|
+
return nil if fullUrl.nil?
|
|
15
|
+
return nil unless fullUrl.start_with?('http') || fullUrl.start_with?('https')
|
|
16
|
+
|
|
17
|
+
fullUrl.split("#{resource.resourceType}/#{resource.id}").first
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'basic_validate_bundle_test'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# The Bundle resource is valid against the AU PS Bundle profile
|
|
7
|
+
class BundleIsValidClass < BasicValidateBundleTest
|
|
8
|
+
id :bundle_is_valid_class_test
|
|
9
|
+
input :bundle_resource,
|
|
10
|
+
optional: true,
|
|
11
|
+
description: 'If you want to check existing Bundle resource',
|
|
12
|
+
type: 'textarea'
|
|
13
|
+
|
|
14
|
+
def skip_test?
|
|
15
|
+
bundle_resource.blank?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def read_and_save_data
|
|
19
|
+
resource = FHIR.from_contents(bundle_resource)
|
|
20
|
+
scratch[:bundle_ips_resource] = resource
|
|
21
|
+
save_bundle_entities_to_scratch(scratch_bundle)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
run do
|
|
25
|
+
skip_if skip_test?, 'No Bundle resource provided'
|
|
26
|
+
read_and_save_data
|
|
27
|
+
omit_if omit_au_ps_validation?, OMIT_AU_PS_MESSAGE
|
|
28
|
+
validate_au_ps_bundle
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Decorator for FHIR::CapabilityStatement
|
|
4
|
+
class CapabilityStatementDecorator < FHIR::CapabilityStatement
|
|
5
|
+
def all_profiles
|
|
6
|
+
profiles + supported_profiles
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def profiles
|
|
10
|
+
rest.map do |rest_item|
|
|
11
|
+
rest_item.resource.map(&:profile)
|
|
12
|
+
end.flatten.compact.uniq
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def supported_profiles
|
|
16
|
+
rest.map do |rest_item|
|
|
17
|
+
rest_item.resource.map(&:supportedProfile)
|
|
18
|
+
end.flatten.compact.uniq
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'section_decorator'
|
|
4
|
+
|
|
5
|
+
# Decorator for FHIR::Composition to add convenience methods
|
|
6
|
+
class CompositionDecorator < FHIR::Composition
|
|
7
|
+
def initialize(data)
|
|
8
|
+
if data.is_a?(Hash)
|
|
9
|
+
super
|
|
10
|
+
else
|
|
11
|
+
super(data.respond_to?(:source_hash) ? data.source_hash : data.to_hash)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def section_codes
|
|
16
|
+
section.map { |sect| section_first_code(sect) }.compact
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def entry_references_by_codes(codes)
|
|
20
|
+
sections = sections_by_codes(codes).compact
|
|
21
|
+
sections.map(&:entry_references).flatten
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def sections_by_codes(codes)
|
|
25
|
+
codes.map { |code| section_by_code(code) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def section_by_code(code)
|
|
29
|
+
section_data = section.find { |sect| section_first_code(sect) == code }
|
|
30
|
+
return nil if section_data.nil?
|
|
31
|
+
|
|
32
|
+
SectionDecorator.new(section_data.to_hash)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def event_by_code(code)
|
|
36
|
+
return nil if event.nil?
|
|
37
|
+
|
|
38
|
+
event.find { |elem| event_element_code(elem) == code }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def event_element_code(event_elem)
|
|
44
|
+
cc = event_elem.code&.first
|
|
45
|
+
return nil if cc.nil?
|
|
46
|
+
|
|
47
|
+
cc.coding&.first&.code
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def section_first_code(section)
|
|
51
|
+
cc = section.code
|
|
52
|
+
return nil if cc.nil?
|
|
53
|
+
|
|
54
|
+
cc.coding&.first&.code
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Bundle-level booleans and per-path statistics lines for CompositionUtils.
|
|
4
|
+
module CompositionUtilsBooleanAndStats
|
|
5
|
+
def boolean_to_existent_string(boolean_value, optional: false)
|
|
6
|
+
missing_icon = optional ? '⚠️' : '❌'
|
|
7
|
+
boolean_value ? '✅ Populated' : "#{missing_icon} Missing"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def all_entries_have_full_url_info?
|
|
11
|
+
entry_full_url_count = resolve_path_with_dar(scratch_bundle, 'entry.fullUrl').length
|
|
12
|
+
entries_count = resolve_path_with_dar(scratch_bundle, 'entry').length
|
|
13
|
+
|
|
14
|
+
entry_full_url_count == entries_count
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def timestamp_info?
|
|
18
|
+
resolve_path_with_dar(scratch_bundle, 'timestamp').first.present?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def type_info?
|
|
22
|
+
resolve_path_with_dar(scratch_bundle, 'type').first.present?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def identifier_info?
|
|
26
|
+
resolve_path_with_dar(scratch_bundle, 'identifier').first.present?
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'bundle_decorator'
|
|
4
|
+
require_relative 'composition_utils/boolean_and_stats'
|
|
5
|
+
|
|
6
|
+
# Utilities for FHIR Composition resources
|
|
7
|
+
module CompositionUtils
|
|
8
|
+
include CompositionUtilsBooleanAndStats
|
|
9
|
+
|
|
10
|
+
def scratch_bundle
|
|
11
|
+
scratch[:bundle_ips_resource]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def check_bundle_exists_in_scratch
|
|
15
|
+
skip_if scratch_bundle.blank?, 'No Bundle resource provided'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def group_section_output(section_info_array)
|
|
19
|
+
section_entities = {}
|
|
20
|
+
section_info_array.each do |section_info|
|
|
21
|
+
if section_entities.keys.include?(section_info)
|
|
22
|
+
section_entities[section_info] += 1
|
|
23
|
+
else
|
|
24
|
+
section_entities[section_info] = 1
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
section_entities.keys.map { |section_entity| "#{section_entity} x#{section_entities[section_entity]}" }
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module AUPSTestKit
|
|
4
|
+
# Custodian Must Support identifier slices (Organization).
|
|
5
|
+
module BasicTestCustodianIdentifierSlices
|
|
6
|
+
def validate_custodian_ms_identifier_slices(resource, slices, resource_type_str, profile_str)
|
|
7
|
+
return unless resource.present? && slices.present?
|
|
8
|
+
|
|
9
|
+
custodian_header = custodian_identifier_slices_header(resource_type_str, profile_str)
|
|
10
|
+
slice_results = custodian_identifier_slice_results(identifiers_from_resource(resource) || [], slices)
|
|
11
|
+
custodian_post_identifier_slices_message(custodian_header, slice_results)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def custodian_identifier_slices_header(resource_type_str, profile_str)
|
|
17
|
+
"**Referenced custodian**: #{resource_type_str}#{" — #{profile_str}" if profile_str.present?}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def custodian_identifier_slice_results(identifiers, slices)
|
|
21
|
+
slices.map do |slice|
|
|
22
|
+
ident = find_identifier_by_system(identifiers, slice[:system])
|
|
23
|
+
{ slice: slice, identifier: ident }
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def custodian_post_identifier_slices_message(custodian_header, slice_results)
|
|
28
|
+
lines = slice_results.map { |result| custodian_identifier_slice_line(result) }
|
|
29
|
+
message_type = slice_results.all? { |r| r[:identifier].present? } ? 'info' : 'warning'
|
|
30
|
+
add_message(message_type, custodian_identifier_slices_full_message(custodian_header, lines))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def custodian_identifier_slice_line(result)
|
|
34
|
+
if result[:identifier].present?
|
|
35
|
+
type_str = identifier_type_display(result[:identifier])
|
|
36
|
+
"✅ Populated: **#{result[:slice][:name]}** — system: #{result[:slice][:system]}#{type_str}"
|
|
37
|
+
else
|
|
38
|
+
"⚠️ Missing: **#{result[:slice][:name]}**"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def custodian_identifier_slices_full_message(custodian_header, lines)
|
|
43
|
+
heading = '## List of Must Support identifier slices populated or missing (type and system when populated)'
|
|
44
|
+
['Must support identifier slices correctly populated', custodian_header, heading, lines.join("\n\n")].join("\n\n")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'basic_test_custodian_resource'
|
|
4
|
+
require_relative 'basic_test_custodian_identifier_slices'
|
|
5
|
+
require_relative 'basic_test_custodian_tests'
|
|
6
|
+
|
|
7
|
+
module AUPSTestKit
|
|
8
|
+
# Composes Composition.custodian Must Support helpers for BasicTest.
|
|
9
|
+
module BasicTestCustodianModule
|
|
10
|
+
include BasicTestCustodianResource
|
|
11
|
+
include BasicTestCustodianIdentifierSlices
|
|
12
|
+
include BasicTestCustodianTests
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../bundle_decorator'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# Resolves Composition.custodian reference from the scratch bundle.
|
|
7
|
+
module BasicTestCustodianResource
|
|
8
|
+
def custodian_resource
|
|
9
|
+
return nil unless scratch_bundle.present?
|
|
10
|
+
|
|
11
|
+
bundle_resource = BundleDecorator.new(scratch_bundle)
|
|
12
|
+
composition_resource = bundle_resource.composition_resource
|
|
13
|
+
return nil unless composition_resource.present?
|
|
14
|
+
|
|
15
|
+
custodian_ref = first_composition_custodian_reference(composition_resource)
|
|
16
|
+
return nil unless custodian_ref.present?
|
|
17
|
+
|
|
18
|
+
ref_str = custodian_ref.respond_to?(:reference) ? custodian_ref.reference : custodian_ref['reference']
|
|
19
|
+
return nil if ref_str.blank?
|
|
20
|
+
|
|
21
|
+
bundle_entity_resource_from_scratch(ref_str)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def first_composition_custodian_reference(composition_resource)
|
|
27
|
+
return nil unless composition_resource.respond_to?(:custodian) && composition_resource.custodian.present?
|
|
28
|
+
|
|
29
|
+
composition_resource.custodian
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../basic_test_contants_module'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# Inferno tests for Composition.custodian Must Support.
|
|
7
|
+
module BasicTestCustodianTests
|
|
8
|
+
include BasicTestConstants
|
|
9
|
+
|
|
10
|
+
def test_composition_custodian_ms_identifier_slices
|
|
11
|
+
check_bundle_exists_in_scratch
|
|
12
|
+
resource = custodian_resource
|
|
13
|
+
skip_if resource.blank?, 'Custodian is not populated'
|
|
14
|
+
|
|
15
|
+
rtype_str, profile_str = author_resource_type_and_profiles(resource)
|
|
16
|
+
validate_custodian_ms_identifier_slices(resource, ORGANIZATION_MS_IDENTIFIER_SLICES, rtype_str, profile_str)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'bundle_is_valid_class'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# The Bundle resource is valid against the IPS Bundle profile
|
|
7
|
+
class IpsBundleIsValidClass < BundleIsValidClass
|
|
8
|
+
id :ips_bundle_is_valid_class_base
|
|
9
|
+
|
|
10
|
+
run do
|
|
11
|
+
omit_if omit_ips_validation?, OMIT_IPS_MESSAGE
|
|
12
|
+
validate_ips_bundle
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'retrieve_bundle_test_class'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# Retrieve a bundle and validate against the IPS Bundle profile
|
|
7
|
+
class IpsRetrieveBundleTestClass < RetrieveBundleTestClass
|
|
8
|
+
id :ips_retrieve_bundle_test_class_base
|
|
9
|
+
|
|
10
|
+
run do
|
|
11
|
+
skip_if skip_test?, 'There is no FHIR server URL, Bundle ID or Bundle URL provided'
|
|
12
|
+
read_and_save_data
|
|
13
|
+
omit_if omit_ips_validation?, OMIT_IPS_MESSAGE
|
|
14
|
+
validate_ips_bundle
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'summary_valid_bundle_class'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# Bundle from $summary validated against the IPS Bundle profile
|
|
7
|
+
class IpsSummaryValidBundleClass < SummaryValidBundleClass
|
|
8
|
+
id :ips_summary_valid_bundle_class_base
|
|
9
|
+
|
|
10
|
+
run do
|
|
11
|
+
omit_if omit_ips_validation?, OMIT_IPS_MESSAGE
|
|
12
|
+
validate_ips_bundle
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'yaml'
|
|
4
|
+
|
|
5
|
+
module AUPSTestKit
|
|
6
|
+
# Manages metadata from the ballot YAML file.
|
|
7
|
+
class MetadataManager
|
|
8
|
+
def initialize(metadata_yaml_path)
|
|
9
|
+
@metadata_yaml_path = metadata_yaml_path
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def metadata
|
|
13
|
+
@metadata ||= YAML.safe_load_file(@metadata_yaml_path, permitted_classes: [Symbol], aliases: true)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def sections_metadata_by_codes(codes)
|
|
17
|
+
composition_sections_metadata.filter { |section| codes.include?(section[:code]) }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def group_metadata_by_resource_type(resource_type)
|
|
21
|
+
group_metadata = groups_metadata.find { |group| group[:resource] == resource_type }
|
|
22
|
+
return nil if group_metadata.nil?
|
|
23
|
+
|
|
24
|
+
group_metadata
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def group_metadata_by_profile_url(profile_url)
|
|
28
|
+
group_metadata = groups_metadata.find { |group| group[:profile_url] == profile_url }
|
|
29
|
+
return nil if group_metadata.nil?
|
|
30
|
+
|
|
31
|
+
group_metadata
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def composition_sections_metadata
|
|
35
|
+
metadata[:composition_sections]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def subject_metadata
|
|
39
|
+
metadata[:subject]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def author_metadata
|
|
43
|
+
metadata[:author]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def custodian_metadata
|
|
47
|
+
metadata[:custodian]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def attester_metadata
|
|
51
|
+
metadata[:attester]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def groups_metadata
|
|
55
|
+
metadata[:groups]
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'net/http'
|
|
4
|
+
require 'uri'
|
|
5
|
+
|
|
6
|
+
require_relative 'basic_validate_bundle_test'
|
|
7
|
+
|
|
8
|
+
module AUPSTestKit
|
|
9
|
+
# A base class for all tests that retrieve a Bundle resource
|
|
10
|
+
class RetrieveBundleTestClass < BasicValidateBundleTest
|
|
11
|
+
id :retrieve_bundle_test_class
|
|
12
|
+
input_order :bundle_url, :url, :bundle_id, :credentials, :header_name, :header_value
|
|
13
|
+
|
|
14
|
+
input :bundle_id,
|
|
15
|
+
optional: true,
|
|
16
|
+
description: 'To request Bundle/{bundle_id}'
|
|
17
|
+
|
|
18
|
+
input :bundle_url,
|
|
19
|
+
optional: true,
|
|
20
|
+
description: 'To retrieve document Bundle using HTTP GET request'
|
|
21
|
+
|
|
22
|
+
input :url,
|
|
23
|
+
title: 'FHIR Server Base Url',
|
|
24
|
+
optional: true
|
|
25
|
+
|
|
26
|
+
input :credentials,
|
|
27
|
+
title: 'OAuth Credentials',
|
|
28
|
+
type: :oauth_credentials,
|
|
29
|
+
optional: true
|
|
30
|
+
|
|
31
|
+
input :header_name,
|
|
32
|
+
title: 'Header name',
|
|
33
|
+
optional: true
|
|
34
|
+
|
|
35
|
+
input :header_value,
|
|
36
|
+
title: 'Header value',
|
|
37
|
+
optional: true
|
|
38
|
+
|
|
39
|
+
fhir_client do
|
|
40
|
+
url :url
|
|
41
|
+
oauth_credentials :credentials
|
|
42
|
+
headers(header_name.present? && header_value.present? ? { header_name => header_value } : {})
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def get_bundle_resource_from_fhir_server(bundle_id)
|
|
46
|
+
fhir_read(:bundle, bundle_id)
|
|
47
|
+
assert_response_status(200)
|
|
48
|
+
assert_resource_type(:bundle)
|
|
49
|
+
scratch[:bundle_ips_resource] = resource
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def get_bundle_resource_from_url(bundle_url)
|
|
53
|
+
uri = URI(bundle_url)
|
|
54
|
+
response = Net::HTTP.get_response(uri)
|
|
55
|
+
assert response.code == '200', "Bundle resource not found at #{bundle_url}"
|
|
56
|
+
bundle_resource = FHIR.from_contents(response.body)
|
|
57
|
+
assert bundle_resource.resourceType == 'Bundle', 'Resource have different type than Bundle'
|
|
58
|
+
scratch[:bundle_ips_resource] = bundle_resource
|
|
59
|
+
save_bundle_entities_to_scratch(scratch_bundle)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def skip_test?
|
|
63
|
+
!((url.present? && bundle_id.present?) || bundle_url.present?)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def read_and_save_data
|
|
67
|
+
if url.present? && bundle_id.present?
|
|
68
|
+
get_bundle_resource_from_fhir_server(bundle_id) if url.present? && bundle_id.present?
|
|
69
|
+
elsif bundle_url.present?
|
|
70
|
+
get_bundle_resource_from_url(bundle_url)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
run do
|
|
75
|
+
skip_if skip_test?, 'There is no FHIR server URL, Bundle ID or Bundle URL provided'
|
|
76
|
+
read_and_save_data
|
|
77
|
+
omit_if omit_au_ps_validation?, OMIT_AU_PS_MESSAGE
|
|
78
|
+
validate_au_ps_bundle
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'digest'
|
|
4
|
+
|
|
5
|
+
# A class to represent a rich message for the better and informative output
|
|
6
|
+
class RichMessage
|
|
7
|
+
attr_reader :message, :type, :resource_type, :profile
|
|
8
|
+
|
|
9
|
+
def initialize(resource, message, profile, _idx, _ref)
|
|
10
|
+
message_body = cleanup_message_body(message[:message], resource.resourceType, resource.id)
|
|
11
|
+
@resource_type = resource.resourceType
|
|
12
|
+
@message = message_body
|
|
13
|
+
@type = message[:type]
|
|
14
|
+
@profile = profile
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def cleanup_message_body(message, resource_type, resource_id)
|
|
20
|
+
string_to_replace = resource_id.present? ? "#{resource_type}/#{resource_id}: " : "#{resource_type}: "
|
|
21
|
+
message.sub(string_to_replace, '')
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# A class to represent a rich validation message for the better and informative output
|
|
4
|
+
class RichValidationMessage
|
|
5
|
+
def initialize(rich_messages)
|
|
6
|
+
@rich_messages = rich_messages
|
|
7
|
+
@title = calculate_title(rich_messages.first)
|
|
8
|
+
@indexes = uniq_attribute_values(rich_messages, :idx)
|
|
9
|
+
@entry_references = uniq_attribute_values(rich_messages, :ref)
|
|
10
|
+
@resource_ids = uniq_attribute_values(rich_messages, :resource_id)
|
|
11
|
+
@message = rich_messages.first.message
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_s
|
|
15
|
+
[
|
|
16
|
+
[nil, @title],
|
|
17
|
+
['Indexes', @indexes.join(', ')],
|
|
18
|
+
['Entry References', @entry_references.join(', ')],
|
|
19
|
+
['Resource IDs', @resource_ids.join(', ')],
|
|
20
|
+
[nil, @message]
|
|
21
|
+
].map { |part| msg_line(title: part[0], value: part[1]) }.compact.join("\n\n")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def uniq_attribute_values(messages_array, attribute)
|
|
27
|
+
messages_array.map { |message| message.send(attribute) }.uniq.sort
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def msg_line(title: nil, value: nil)
|
|
31
|
+
return nil if title.blank? && value.blank?
|
|
32
|
+
return nil if value.blank?
|
|
33
|
+
|
|
34
|
+
title.present? ? "**#{title}**: #{value}" : value
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def calculate_title(message)
|
|
38
|
+
profile = message.profile
|
|
39
|
+
resource_type = message.resource_type
|
|
40
|
+
profile.present? ? "### #{resource_type} (#{profile})" : "### #{resource_type}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Decorator for FHIR::Composition::Section
|
|
4
|
+
class SectionDecorator < FHIR::Composition::Section
|
|
5
|
+
def get_entry_index_by_reference(reference)
|
|
6
|
+
entry&.index { |entr| entr.reference == reference }
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def entry_references
|
|
10
|
+
entry&.map(&:reference) || []
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def empty_reason_str
|
|
14
|
+
er_coding = emptyReason&.coding&.first
|
|
15
|
+
return unless er_coding.present?
|
|
16
|
+
|
|
17
|
+
"#{er_coding.display} (#{er_coding.code})"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def code_display_str
|
|
21
|
+
"#{code.coding.first.display || title} (#{code.coding.first.code})"
|
|
22
|
+
end
|
|
23
|
+
end
|