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.
Files changed (195) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/au_ps_inferno/generator/constants.rb +61 -0
  4. data/lib/au_ps_inferno/generator/generator.rb +76 -0
  5. data/lib/au_ps_inferno/generator/generator_group_based_metadata_module.rb +113 -0
  6. data/lib/au_ps_inferno/generator/ig_resources_extractor.rb +149 -0
  7. data/lib/au_ps_inferno/generator/metadata_manager.rb +608 -0
  8. data/lib/au_ps_inferno/generator/naming.rb +52 -0
  9. data/lib/au_ps_inferno/generator/sections_validation_group_generator.rb +182 -0
  10. data/lib/au_ps_inferno/generator/test_file_generator.rb +77 -0
  11. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_bundle_instance.rb +56 -0
  12. 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
  13. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_bundle_must_support_conformance.rb +16 -0
  14. 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
  15. 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
  16. 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
  17. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_attester.rb +26 -0
  18. 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
  19. 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
  20. 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
  21. 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
  22. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_author.rb +28 -0
  23. 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
  24. 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
  25. 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
  26. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_custodian.rb +26 -0
  27. 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
  28. 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
  29. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_mandatory_sections.rb +20 -0
  30. 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
  31. 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
  32. 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
  33. 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
  34. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_must_support_conformance.rb +28 -0
  35. 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
  36. 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
  37. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_optional_sections.rb +20 -0
  38. 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
  39. 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
  40. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_recommended_sections.rb +20 -0
  41. 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
  42. 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
  43. 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
  44. 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
  45. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_subject.rb +28 -0
  46. 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
  47. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/au_ps_composition_undefined_sections.rb +18 -0
  48. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/bundle_validation/suite_au_ps_bundle_instance_bundle_validation_bundle_valid.rb +21 -0
  49. 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
  50. data/lib/au_ps_inferno/suite/au_ps_bundle_instance/bundle_validation.rb +20 -0
  51. data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_cs_is_valid_test.rb +21 -0
  52. data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_cs_supports_au_ps_profiles.rb +40 -0
  53. data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_cs_supports_ips_recommended_ops.rb +19 -0
  54. data/lib/au_ps_inferno/suite/au_ps_retrieve_cs_group/au_ps_retrieve_cs_group.rb +47 -0
  55. data/lib/au_ps_inferno/suite/au_ps_v100.rb +39 -0
  56. 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
  57. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_bundle_must_support_conformance.rb +16 -0
  58. 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
  59. 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
  60. 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
  61. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_attester.rb +26 -0
  62. 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
  63. 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
  64. 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
  65. 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
  66. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_author.rb +28 -0
  67. 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
  68. 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
  69. 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
  70. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_custodian.rb +26 -0
  71. 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
  72. 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
  73. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_mandatory_sections.rb +20 -0
  74. 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
  75. 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
  76. 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
  77. 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
  78. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_must_support_conformance.rb +28 -0
  79. 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
  80. 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
  81. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_optional_sections.rb +20 -0
  82. 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
  83. 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
  84. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_recommended_sections.rb +20 -0
  85. 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
  86. 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
  87. 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
  88. 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
  89. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_subject.rb +28 -0
  90. 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
  91. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/au_ps_composition_undefined_sections.rb +18 -0
  92. 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
  93. 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
  94. data/lib/au_ps_inferno/suite/generate_au_ps_using_ips_summary_validation_tests/bundle_validation.rb +20 -0
  95. 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
  96. 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
  97. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_bundle_must_support_conformance.rb +16 -0
  98. 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
  99. 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
  100. 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
  101. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_attester.rb +26 -0
  102. 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
  103. 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
  104. 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
  105. 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
  106. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_author.rb +28 -0
  107. 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
  108. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_custodian/composition_custodian_custodian_ms_subelements.rb +21 -0
  109. 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
  110. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_custodian.rb +26 -0
  111. 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
  112. 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
  113. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_mandatory_sections.rb +20 -0
  114. 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
  115. 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
  116. 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
  117. 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
  118. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_must_support_conformance.rb +28 -0
  119. 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
  120. 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
  121. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_optional_sections.rb +20 -0
  122. 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
  123. 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
  124. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_recommended_sections.rb +20 -0
  125. 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
  126. 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
  127. 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
  128. 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
  129. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_subject.rb +28 -0
  130. 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
  131. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/au_ps_composition_undefined_sections.rb +18 -0
  132. 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
  133. 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
  134. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/bundle_validation.rb +20 -0
  135. data/lib/au_ps_inferno/suite/retrieve_au_ps_bundle_validation_tests/retrieve_au_ps_bundle_validation_tests.rb +56 -0
  136. data/lib/au_ps_inferno/utils/attester/basic_test_attester_identifier_slices.rb +74 -0
  137. data/lib/au_ps_inferno/utils/attester/basic_test_attester_message_helpers.rb +16 -0
  138. data/lib/au_ps_inferno/utils/attester/basic_test_attester_module.rb +14 -0
  139. data/lib/au_ps_inferno/utils/attester/basic_test_attester_resource.rb +54 -0
  140. data/lib/au_ps_inferno/utils/author/basic_test_author_module.rb +12 -0
  141. data/lib/au_ps_inferno/utils/author/basic_test_author_resource.rb +32 -0
  142. data/lib/au_ps_inferno/utils/author/basic_test_author_tests.rb +24 -0
  143. data/lib/au_ps_inferno/utils/basic_test/bundle_module.rb +87 -0
  144. data/lib/au_ps_inferno/utils/basic_test/capability_operations_module.rb +37 -0
  145. data/lib/au_ps_inferno/utils/basic_test/composition_elements_and_slices_module.rb +98 -0
  146. data/lib/au_ps_inferno/utils/basic_test/composition_section_check_resources_ms_elements_module.rb +197 -0
  147. data/lib/au_ps_inferno/utils/basic_test/composition_section_read_issues_helpers_module.rb +66 -0
  148. data/lib/au_ps_inferno/utils/basic_test/composition_section_read_module.rb +127 -0
  149. data/lib/au_ps_inferno/utils/basic_test/composition_subelements_module.rb +84 -0
  150. data/lib/au_ps_inferno/utils/basic_test/ms_elements_populated_helpers_module.rb +38 -0
  151. data/lib/au_ps_inferno/utils/basic_test/ms_elements_populated_module.rb +71 -0
  152. data/lib/au_ps_inferno/utils/basic_test/ms_identifier_slices_module.rb +61 -0
  153. data/lib/au_ps_inferno/utils/basic_test/ms_sub_elements_populated_module.rb +128 -0
  154. data/lib/au_ps_inferno/utils/basic_test/paths_module.rb +26 -0
  155. data/lib/au_ps_inferno/utils/basic_test/resolve_path_debug_module.rb +45 -0
  156. data/lib/au_ps_inferno/utils/basic_test/resolve_resource_type_module.rb +52 -0
  157. data/lib/au_ps_inferno/utils/basic_test/resource_helpers_module.rb +129 -0
  158. data/lib/au_ps_inferno/utils/basic_test/scratch_bundle_entries_module.rb +30 -0
  159. data/lib/au_ps_inferno/utils/basic_test/section_bundle_validation_module.rb +70 -0
  160. data/lib/au_ps_inferno/utils/basic_test_class.rb +56 -0
  161. data/lib/au_ps_inferno/utils/basic_test_contants_module.rb +32 -0
  162. data/lib/au_ps_inferno/utils/basic_test_with_url.rb +8 -0
  163. data/lib/au_ps_inferno/utils/basic_validate_bundle_test.rb +43 -0
  164. data/lib/au_ps_inferno/utils/bundle_decorator.rb +81 -0
  165. data/lib/au_ps_inferno/utils/bundle_entry_decorator.rb +19 -0
  166. data/lib/au_ps_inferno/utils/bundle_is_valid_class.rb +31 -0
  167. data/lib/au_ps_inferno/utils/capability_statement_decorator.rb +20 -0
  168. data/lib/au_ps_inferno/utils/composition_decorator.rb +56 -0
  169. data/lib/au_ps_inferno/utils/composition_utils/boolean_and_stats.rb +28 -0
  170. data/lib/au_ps_inferno/utils/composition_utils.rb +29 -0
  171. data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_identifier_slices.rb +47 -0
  172. data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_module.rb +14 -0
  173. data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_resource.rb +32 -0
  174. data/lib/au_ps_inferno/utils/custodian/basic_test_custodian_tests.rb +19 -0
  175. data/lib/au_ps_inferno/utils/inferno_suite_generator_compat.rb +7 -0
  176. data/lib/au_ps_inferno/utils/ips_bundle_is_valid_class.rb +15 -0
  177. data/lib/au_ps_inferno/utils/ips_retrieve_bundle_test_class.rb +17 -0
  178. data/lib/au_ps_inferno/utils/ips_summary_valid_bundle_class.rb +15 -0
  179. data/lib/au_ps_inferno/utils/metadata_manager.rb +58 -0
  180. data/lib/au_ps_inferno/utils/retrieve_bundle_test_class.rb +81 -0
  181. data/lib/au_ps_inferno/utils/rich_message_class.rb +23 -0
  182. data/lib/au_ps_inferno/utils/rich_validation_message.rb +42 -0
  183. data/lib/au_ps_inferno/utils/section_decorator.rb +23 -0
  184. data/lib/au_ps_inferno/utils/section_names_mapping.rb +31 -0
  185. data/lib/au_ps_inferno/utils/section_test_class.rb +18 -0
  186. data/lib/au_ps_inferno/utils/section_test_module.rb +16 -0
  187. data/lib/au_ps_inferno/utils/structure_definition_decorator.rb +28 -0
  188. data/lib/au_ps_inferno/utils/subject/basic_test_subject_module.rb +12 -0
  189. data/lib/au_ps_inferno/utils/subject/basic_test_subject_patient_ms_other_tests.rb +15 -0
  190. data/lib/au_ps_inferno/utils/subject/basic_test_subject_resource.rb +21 -0
  191. data/lib/au_ps_inferno/utils/summary_valid_bundle_class.rb +84 -0
  192. data/lib/au_ps_inferno/utils/validator_helpers.rb +92 -0
  193. data/lib/au_ps_inferno/version.rb +6 -0
  194. data/lib/au_ps_inferno.rb +3 -0
  195. 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,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Compatibility shim for pinned inferno_suite_generator versions
4
+ # that still reference FHIR::R4::* classes.
5
+ FHIR.const_set(:R4, FHIR) if defined?(FHIR) && !FHIR.const_defined?(:R4)
6
+
7
+ require 'inferno_suite_generator'
@@ -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