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,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ms_elements_populated_helpers_module'
4
+
5
+ module AUPSTestKit
6
+ # Must Support elements populated or missing message.
7
+ module BasicTestMsSubElementsPopulatedModule
8
+ include BasicTestMsElementsPopulatedHelpersModule
9
+
10
+ def ms_sub_elements_populated_message(container_type)
11
+ guard_populated_resource(container_type)
12
+
13
+ resource = get_resource_by_container_type(container_type)
14
+
15
+ author_and_device_resource?(container_type, resource)
16
+
17
+ return unless (metadata = get_metadata_by_resource_type(resource.resourceType)).present?
18
+
19
+ _, new_grouped_sub_elements, ms_checker, results =
20
+ sub_elements_filtered_grouped_and_check_context(resource, metadata)
21
+ omit_if new_grouped_sub_elements.blank?, 'No complex element with Must Support sub-elements is defined'
22
+
23
+ show_ms_elements_messages(new_grouped_sub_elements, ms_checker, resource, results)
24
+ assert assert_result(results, new_grouped_sub_elements),
25
+ 'When any mandatory Must Support sub-element is missing. See the list in messages tab.'
26
+ end
27
+
28
+ private
29
+
30
+ def ms_checker(metadata)
31
+ @ms_checker ||= InfernoSuiteGenerator::MSChecker.new(metadata)
32
+ end
33
+
34
+ def get_metadata_by_resource_type(resource_type)
35
+ raw_metadata = metadata_manager.group_metadata_by_resource_type(resource_type)
36
+ return nil unless raw_metadata.present?
37
+
38
+ InfernoSuiteGenerator::Generator::GroupMetadata.new(raw_metadata)
39
+ end
40
+
41
+ def sub_elements_filtered_grouped_and_check_context(resource, metadata)
42
+ checker = ms_checker(metadata)
43
+ results = checker.elements_present_statuses([resource], all_present: false)
44
+ filtered_results = results.filter { |result| sub_element?(result[:path]) }
45
+ grouped = filtered_results.group_by { |result| result[:path].split('.').first }
46
+
47
+ [filtered_results, grouped, checker, results]
48
+ end
49
+
50
+ def show_ms_elements_messages(new_grouped_sub_elements, ms_checker, resource, results)
51
+ new_grouped_sub_elements.each do |parent_path, sub_elements|
52
+ sub_element_message(ms_checker, sub_elements, resource, parent_path, results)
53
+ end
54
+ end
55
+
56
+ def assert_result(results, grouped_sub_elements)
57
+ grouped_sub_elements.all? do |parent_path, sub_elements|
58
+ !sub_element_assertion_failure?(results, parent_path, sub_elements)
59
+ end
60
+ end
61
+
62
+ def mandatory_ms_sub_elements(sub_elements)
63
+ sub_elements.filter { |res| res[:mandatory] == true }
64
+ end
65
+
66
+ def sub_element_assertion_failure?(results, parent_path, sub_elements)
67
+ mandatory_sub_elements = mandatory_ms_sub_elements(sub_elements)
68
+ return false if mandatory_sub_elements.empty?
69
+
70
+ mandatory_sub_elements_present = mandatory_sub_elements.all? { |res| res[:present] == true }
71
+
72
+ parent_element = results.find { |res| res[:path] == parent_path }
73
+ return false if parent_element.nil?
74
+
75
+ parent_present = parent_element[:present] == true
76
+
77
+ !mandatory_sub_elements_present && parent_present
78
+ end
79
+
80
+ def sub_element_message(ms_checker, sub_elements, resource, parent_path, results)
81
+ message_level = build_message_level(ms_checker, sub_elements, results)
82
+ message = build_sub_element_message_content(ms_checker, sub_elements, resource, parent_path, results)
83
+ add_message(message_level, message)
84
+ end
85
+
86
+ def build_message_level(ms_checker, sub_elements, results)
87
+ return 'warning' if parent_element_is_not_populated?(sub_elements, results)
88
+
89
+ ms_checker.calculate_elements_status_message_level(sub_elements)
90
+ end
91
+
92
+ def build_sub_element_message_content(ms_checker, sub_elements, resource, parent_path, results)
93
+ [
94
+ 'Must Support sub-elements correctly populated',
95
+ "**Referenced subject**: #{resource.resourceType}",
96
+ "## Complex element **#{parent_path}** — Must Support sub-elements populated or missing",
97
+ sub_element_statuses_texts(ms_checker, sub_elements, results, parent_path)
98
+ ].join("\n\n")
99
+ end
100
+
101
+ def sub_element_statuses_texts(ms_checker, sub_elements, results, parent_path)
102
+ if parent_element_is_not_populated?(sub_elements, results)
103
+ return parent_element_is_not_populated_text(parent_path,
104
+ sub_elements)
105
+ end
106
+
107
+ ms_checker.element_statuses_texts(sub_elements).map do |text|
108
+ text.gsub('|- ', '')
109
+ end.join("\n\n")
110
+ end
111
+
112
+ def parent_element_is_not_populated?(sub_elements, results)
113
+ parent_path = sub_elements[0][:path].split('.').first
114
+ results.any? { |result| result[:path] == parent_path && result[:present] == false }
115
+ end
116
+
117
+ def parent_element_is_not_populated_text(parent_path, sub_elements)
118
+ "**Complex element #{parent_path}** is not populated. " \
119
+ "Must Support sub-elements that would be validated: #{sub_elements.map do |element|
120
+ element[:path]
121
+ end.join(', ')}."
122
+ end
123
+
124
+ def sub_element?(path)
125
+ path.include?('.')
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ # FHIR path population checks and formatted lists of populated elements.
5
+ module BasicTestPathsModule
6
+ private
7
+
8
+ def populated_paths_info(resource, elements_array, mandatory_array: [])
9
+ title = '## List of populated elements'
10
+ result = elements_array.map do |element|
11
+ mandatory = mandatory_array.include?(element)
12
+ element_str = "**#{element}**"
13
+ element_str += ' (M)' if mandatory
14
+ "#{boolean_to_existent_string(resolve_path_with_dar(resource, element).first.present?,
15
+ optional: !mandatory)}: #{element_str}"
16
+ end
17
+ [title, result.join("\n\n")].join("\n\n")
18
+ end
19
+
20
+ def all_paths_are_populated?(resource, elements_array)
21
+ elements_array.map do |element|
22
+ resolve_path_with_dar(resource, element).first.present?
23
+ end.all?
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ # Wraps Inferno's FHIRResourceNavigation#resolve_path to check simple elements for DAR extension presence.
5
+ # Ex: birthDate DAR extension is _birthDate.extension.where(url='http://hl7.org/fhir/StructureDefinition/data-absent-reason').valueCode
6
+ module BasicTestResolvePathDebugModule
7
+ def resolve_path_with_dar(resource, path)
8
+ result = eval_expression(resource, path)
9
+ return result if result.length.positive?
10
+
11
+ check_for_dar(resource, path)
12
+ end
13
+
14
+ private
15
+
16
+ def eval_expression(resource, path)
17
+ result = resolve_path(resource, path)
18
+ return_values(result)
19
+ end
20
+
21
+ def return_values(result)
22
+ result.length.positive? ? result : []
23
+ end
24
+
25
+ def check_for_dar(resource, path)
26
+ dar_path = modify_path_to_check_for_dar(path)
27
+ return nil if dar_path.nil?
28
+
29
+ eval_expression(resource, dar_path)
30
+ end
31
+
32
+ def modify_path_to_check_for_dar(path)
33
+ # Last path segment as primitive -> _segment.extension (FHIR JSON shadow path for extensions).
34
+ # Single segment: birthDate -> _birthDate.extension
35
+ # Nested: name.family -> name._family.extension
36
+ segments = path.split('.')
37
+ return nil if segments.empty?
38
+
39
+ last_part = segments.last
40
+ prefix = segments.length > 1 ? segments[0..-2].join('.') : ''
41
+ suffix = "#{last_part}.extension"
42
+ prefix.empty? ? suffix : "#{prefix}.#{suffix}"
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ # Resolves the resource type from a resource. This module is used in tests for subject, author, custodian, attester.
5
+ module BasicTestResolveResourceTypeModule
6
+ def test_resource_type_is_valid?(container_type)
7
+ result = raw_resource_type_is_valid(container_type)
8
+ valid = result[:valid?]
9
+ result_msg = result[:msg]
10
+
11
+ build_message(valid, result_msg)
12
+ assert valid, result_msg
13
+ end
14
+
15
+ def raw_resource_type_is_valid(container_type)
16
+ resource = get_resource_by_container_type(container_type)
17
+ return { valid?: false, msg: not_resolved_message(container_type) } if resource.blank?
18
+
19
+ resolved_type = resource_type(resource)
20
+
21
+ unless allowed_resource_types(container_type).include?(resolved_type)
22
+ return { valid?: false, msg: invalid_resource_type_message(container_type, resolved_type) }
23
+ end
24
+
25
+ { valid?: true, msg: valid_resource_type_message(container_type, resolved_type) }
26
+ end
27
+
28
+ private
29
+
30
+ def allowed_resource_types(container_type)
31
+ container_metadata = get_target_metadata_by_container_type(container_type)
32
+ container_metadata.map { |item| item[:resource_type] }
33
+ end
34
+
35
+ def build_message(valid, result_msg)
36
+ msg_level = calculate_message_level(failed: !valid, warning: false, info: valid)
37
+ add_message(msg_level, result_msg)
38
+ end
39
+
40
+ def not_resolved_message(container_type)
41
+ "#{container_type.capitalize} reference does not resolve"
42
+ end
43
+
44
+ def invalid_resource_type_message(container_type, resource_type)
45
+ "#{container_type.capitalize} reference resolves to a resource with invalid resource type: #{resource_type}"
46
+ end
47
+
48
+ def valid_resource_type_message(container_type, resource_type)
49
+ "#{container_type.capitalize} reference resolves to a resource with valid resource type: #{resource_type}"
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module AUPSTestKit
6
+ # Cross-cutting helpers: metadata, resource typing, profiles, identifiers, coding.
7
+ module BasicTestResourceHelpersModule
8
+ private
9
+
10
+ def calculate_message_level(failed: false, warning: false, info: false)
11
+ return 'error' if failed
12
+ return 'warning' if warning
13
+ return 'info' if info
14
+
15
+ 'info'
16
+ end
17
+
18
+ def resource_type(resource)
19
+ return nil unless resource.present?
20
+
21
+ resource.respond_to?(:resourceType) ? resource.resourceType : resource['resourceType']
22
+ end
23
+
24
+ def author_resource_type_and_profiles(resource)
25
+ return ['', ''] unless resource.present?
26
+
27
+ resource_type_str = resource.respond_to?(:resourceType) ? resource.resourceType : resource['resourceType']
28
+ profiles = resource_profiles(resource)
29
+ profile_str = profiles.is_a?(Array) ? profiles.join(', ') : profiles.to_s
30
+ [resource_type_str.to_s, profile_str.to_s]
31
+ end
32
+
33
+ def resource_profiles(resource)
34
+ return [] unless resource.present?
35
+
36
+ if resource.respond_to?(:meta) && resource.meta&.profile.present?
37
+ resource.meta.profile
38
+ elsif resource.is_a?(Hash)
39
+ resource.dig('meta', 'profile') || []
40
+ else
41
+ []
42
+ end
43
+ end
44
+
45
+ def ms_elements_populated_message(resource, list_lines)
46
+ ref = prepare_resource_type_and_profile_str(resource, 'author')
47
+ "#{ms_elements_populated_title}#{ref}#{populated_elements_list(list_lines)}"
48
+ end
49
+
50
+ def ms_elements_populated_title
51
+ 'Must Support elements correctly populated'
52
+ end
53
+
54
+ def prepare_resource_type_and_profile_str(resource, human_readable_name)
55
+ resource_type_str = resource.respond_to?(:resourceType) ? resource.resourceType : resource['resourceType']
56
+ profiles = resource_profiles(resource)
57
+ profile_str = profiles.is_a?(Array) && profiles.length.positive? ? profiles.join(', ') : nil
58
+
59
+ result = [resource_type_str, profile_str].compact.join(' — ')
60
+
61
+ "\n\n**Referenced #{human_readable_name}**: #{result}"
62
+ end
63
+
64
+ def populated_elements_list(list_lines)
65
+ return '' if list_lines.blank?
66
+
67
+ "\n\n## List of Must Support elements (complex) populated or missing\n\n#{list_lines.join("\n\n")}"
68
+ end
69
+
70
+ def identifiers_from_resource(resource)
71
+ return nil unless resource.present?
72
+
73
+ if resource.respond_to?(:identifier)
74
+ resource.identifier
75
+ elsif resource.is_a?(Hash)
76
+ resource['identifier']
77
+ end
78
+ end
79
+
80
+ def identifier_system(ident)
81
+ return nil unless ident.present?
82
+
83
+ ident.respond_to?(:system) ? ident.system : ident['system']
84
+ end
85
+
86
+ def find_identifier_by_system(identifiers, system_url)
87
+ return nil if identifiers.blank? || system_url.blank?
88
+
89
+ identifiers.find { |ident| identifier_system(ident).to_s.strip == system_url.to_s.strip }
90
+ end
91
+
92
+ def identifier_type_display(ident)
93
+ return '' unless ident.present?
94
+
95
+ type_val = ident.respond_to?(:type) ? ident.type : ident['type']
96
+ return '' if type_val.blank?
97
+
98
+ coding_suffix_from_type_value(type_val)
99
+ end
100
+
101
+ def coding_suffix_from_type_value(type_val)
102
+ return coding_display_suffix(type_val.coding.first) if type_val.respond_to?(:coding) && type_val.coding.present?
103
+ return coding_display_suffix_hash(type_val['coding'].first) if type_val.is_a?(Hash) && type_val['coding'].present?
104
+
105
+ ''
106
+ end
107
+
108
+ def coding_display_suffix(coding)
109
+ display = coding.respond_to?(:display) ? coding.display : coding['display']
110
+ code = coding.respond_to?(:code) ? coding.code : coding['code']
111
+ ", type: #{display.presence || code.presence || '—'}"
112
+ end
113
+
114
+ def coding_display_suffix_hash(coding)
115
+ ", type: #{coding['display'].presence || coding['code'].presence || '—'}"
116
+ end
117
+
118
+ def guard_populated_resource(container_type)
119
+ resource_is_poluated = raw_resource_type_is_valid(container_type)
120
+ skip_if !resource_is_poluated[:valid?], resource_is_poluated[:msg]
121
+ end
122
+
123
+ def author_and_device_resource?(container_type, resource)
124
+ # TODO: This function should be more generic in the future.
125
+ is_author_and_device = container_type == 'author' && resource_type(resource) == 'Device'
126
+ omit_if is_author_and_device, 'Test is ommited because the author reference resolves to a Device resource'
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ # Saving and retrieving bundle entities from scratch.
5
+ module BasicTestScratchBundleEntriesModule
6
+ def save_bundle_entities_to_scratch(bundle)
7
+ scratch[:bundle_entities] = bundle.entry.map do |entry|
8
+ {
9
+ full_url: entry.fullUrl,
10
+ resource_type: entry.resource.resourceType,
11
+ resource: entry.resource
12
+ }
13
+ end
14
+ end
15
+
16
+ def bundle_entities_from_scratch
17
+ scratch[:bundle_entities] || []
18
+ end
19
+
20
+ def bundle_entity_from_scratch(full_url)
21
+ bundle_entities_from_scratch.find { |entity| entity[:full_url] == full_url }
22
+ end
23
+
24
+ def bundle_entity_resource_from_scratch(full_url)
25
+ return nil if bundle_entity_from_scratch(full_url).nil?
26
+
27
+ bundle_entity_from_scratch(full_url)[:resource]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ # Per-section bundle row validation (optional, mandatory, and mixed strictness).
5
+ module BasicTestSectionBundleValidationModule
6
+ private
7
+
8
+ def validate_populated_undefined_sections_in_bundle(sections_code_to_filter, elements_array)
9
+ skip_if scratch_bundle.blank?, 'No Bundle resource provided'
10
+
11
+ bundle_resource = BundleDecorator.new(scratch_bundle)
12
+ sections_to_validate = bundle_resource.composition_resource.section_codes.filter do |section_code|
13
+ !sections_code_to_filter.include?(section_code)
14
+ end
15
+
16
+ skip_if sections_to_validate.blank?, 'No sections to validate'
17
+ validate_populated_sections_in_bundle(sections_to_validate, elements_array, optional: true)
18
+ end
19
+
20
+ def validate_populated_sections_in_bundle(section_codes_array, elements_array, optional: false)
21
+ skip_if scratch_bundle.blank?, 'No Bundle resource provided'
22
+ skip_if section_codes_array.blank?, 'No sections to validate'
23
+
24
+ composition = BundleDecorator.new(scratch_bundle).composition_resource
25
+ all_errors = section_codes_array.filter_map do |section_code|
26
+ section_bundle_row_failure?(composition, section_code, elements_array, optional: optional)
27
+ end
28
+
29
+ assert all_errors.empty?,
30
+ 'Some of the sections are not populated. See the list of populated sections in messages tab.'
31
+ end
32
+
33
+ def section_bundle_row_failure?(composition, section_code, elements_array, optional:)
34
+ section = composition.section_by_code(section_code)
35
+ return section_bundle_blank_outcome?(section_code, optional) if section.blank?
36
+
37
+ section_bundle_ms_population_outcome?(section, elements_array)
38
+ end
39
+
40
+ def section_bundle_blank_outcome?(section_code, optional)
41
+ add_message(optional ? 'warning' : 'error', "#{get_section_name(section_code)} is missing")
42
+ optional ? false : true
43
+ end
44
+
45
+ def section_bundle_ms_population_outcome?(section, elements_array)
46
+ body = section_ms_elements_message(section, elements_array)
47
+ return section_bundle_all_ms_ok?(body) if all_paths_are_populated?(section, elements_array)
48
+
49
+ add_message('error', section_ms_missing_mandatory_message(body))
50
+ true
51
+ end
52
+
53
+ def section_bundle_all_ms_ok?(body)
54
+ add_message('info', "Section correctly populated\n\n#{body}")
55
+ false
56
+ end
57
+
58
+ def section_ms_missing_mandatory_message(body)
59
+ "For section with any mandatory Must Support element in section missing (i.e. title, code, text)\n\n#{body}"
60
+ end
61
+
62
+ def section_ms_elements_message(section, elements_array)
63
+ title = "### #{section.code_display_str}"
64
+ elements_list = elements_array.map do |element|
65
+ "**#{element}**: #{boolean_to_existent_string(resolve_path_with_dar(section, element).first.present?)}"
66
+ end.join("\n\n")
67
+ [title, 'List of Must Support elements populated or missing:', elements_list].join("\n\n")
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'bundle_decorator'
4
+ require_relative 'composition_utils'
5
+ require_relative 'validator_helpers'
6
+ require_relative 'section_test_module'
7
+ require_relative 'section_names_mapping'
8
+ require_relative 'basic_test_contants_module'
9
+ require_relative 'attester/basic_test_attester_module'
10
+ require_relative 'subject/basic_test_subject_module'
11
+ require_relative 'author/basic_test_author_module'
12
+ require_relative 'custodian/basic_test_custodian_module'
13
+ require_relative 'basic_test/bundle_module'
14
+ require_relative 'basic_test/capability_operations_module'
15
+ require_relative 'basic_test/composition_section_read_module'
16
+ require_relative 'basic_test/paths_module'
17
+ require_relative 'basic_test/resource_helpers_module'
18
+ require_relative 'basic_test/composition_subelements_module'
19
+ require_relative 'basic_test/ms_identifier_slices_module'
20
+ require_relative 'basic_test/composition_elements_and_slices_module'
21
+ require_relative 'basic_test/section_bundle_validation_module'
22
+ require_relative 'basic_test/resolve_path_debug_module'
23
+ require_relative 'basic_test/scratch_bundle_entries_module'
24
+ require_relative 'basic_test/ms_elements_populated_module'
25
+ require_relative 'basic_test/ms_sub_elements_populated_module'
26
+ require_relative 'basic_test/resolve_resource_type_module'
27
+
28
+ module AUPSTestKit
29
+ # A base class for all tests to decrease code duplication.
30
+ # Shared behavior is composed from BasicTest* modules under utils/basic_test/.
31
+ class BasicTest < Inferno::Test
32
+ include CompositionUtils
33
+ include ValidatorHelpers
34
+ include SectionTestModule
35
+ include SectionNamesMapping
36
+ include BasicTestConstants
37
+ include BasicTestSubjectModule
38
+ include BasicTestAuthorModule
39
+ include BasicTestCustodianModule
40
+ include BasicTestAttesterModule
41
+ include BasicTestBundleModule
42
+ include BasicTestCapabilityOperationsModule
43
+ include BasicTestCompositionSectionReadModule
44
+ include BasicTestPathsModule
45
+ include BasicTestResourceHelpersModule
46
+ include BasicTestCompositionSubelementsModule
47
+ include BasicTestMsIdentifierSlicesModule
48
+ include BasicTestCompositionElementsAndSlicesModule
49
+ include BasicTestSectionBundleValidationModule
50
+ include BasicTestResolvePathDebugModule
51
+ include BasicTestScratchBundleEntriesModule
52
+ include BasicTestMsElementsPopulatedModule
53
+ include BasicTestMsSubElementsPopulatedModule
54
+ include BasicTestResolveResourceTypeModule
55
+ end
56
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ module BasicTestConstants
5
+ # AU PS Patient Must Support identifier slices (optional). System URLs for IHI, DVA, Medicare.
6
+ PATIENT_MS_IDENTIFIER_SLICES = [
7
+ { name: 'IHI', system: 'http://ns.electronichealth.net.au/id/hi/ihi/1.0' },
8
+ { name: 'DVA', system: 'http://ns.electronichealth.net.au/id/dva' },
9
+ { name: 'MEDICARE', system: 'http://ns.electronichealth.net.au/id/medicare-number' }
10
+ ].freeze
11
+ ORGANIZATION_MS_IDENTIFIER_SLICES = [
12
+ { name: 'ABN', system: 'http://hl7.org.au/id/abn' },
13
+ { name: 'HPIO', system: 'http://ns.electronichealth.net.au/id/hi/hpio/1.0' }
14
+ ].freeze
15
+ PRACTITIONER_ROLE_MS_IDENTIFIER_SLICES = [
16
+ { name: 'MEDICARE PROVIDER', system: 'http://ns.electronichealth.net.au/id/medicare-provider-number' }
17
+ ].freeze
18
+ PRACTITIONER_MS_IDENTIFIER_SLICES = [
19
+ { name: 'HPII', system: 'http://ns.electronichealth.net.au/id/hi/hpii/1.0' }
20
+ ].freeze
21
+
22
+ # Author resource type -> Must Support identifier slices (empty for Device, RelatedPerson).
23
+ AUTHOR_MS_IDENTIFIER_SLICES_BY_TYPE = {
24
+ 'Practitioner' => PRACTITIONER_MS_IDENTIFIER_SLICES,
25
+ 'PractitionerRole' => PRACTITIONER_ROLE_MS_IDENTIFIER_SLICES,
26
+ 'Patient' => PATIENT_MS_IDENTIFIER_SLICES,
27
+ 'Organization' => ORGANIZATION_MS_IDENTIFIER_SLICES,
28
+ 'RelatedPerson' => [],
29
+ 'Device' => []
30
+ }.freeze
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ # A base class for all tests with FHIR server URL to decrease code duplication
5
+ class BasicTestWithURL < BasicTest
6
+ id :basic_test_with_url
7
+ end
8
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AUPSTestKit
4
+ # Basic test for validating a Bundle resource against the AU PS Bundle or IPS Bundle profile
5
+ class BasicValidateBundleTest < BasicTest
6
+ OMIT_AU_PS_MESSAGE = 'Validation against AU PS Bundle is disabled'
7
+ OMIT_IPS_MESSAGE = 'Validation against IPS Bundle is disabled'
8
+
9
+ id :basic_validate_bundle_test
10
+
11
+ input :validate_against,
12
+ title: 'Validate Against',
13
+ optional: true,
14
+ type: 'checkbox',
15
+ default: %w[au_ps_bundle],
16
+ options: {
17
+ list_options: [
18
+ {
19
+ label: 'AU PS Bundle Validation',
20
+ value: 'au_ps_bundle'
21
+ },
22
+ {
23
+ label: 'IPS Bundle Validation',
24
+ value: 'ips_bundle'
25
+ }
26
+ ]
27
+ }
28
+
29
+ def omit_au_ps_validation?
30
+ omit_test_wrapper?('au_ps_bundle')
31
+ end
32
+
33
+ def omit_ips_validation?
34
+ omit_test_wrapper?('ips_bundle')
35
+ end
36
+
37
+ private
38
+
39
+ def omit_test_wrapper?(include_str)
40
+ validate_against.blank? || !validate_against.include?(include_str)
41
+ end
42
+ end
43
+ end