def test_get_control_and_group_info_from_catalog(tmp_trestle_dir: pathlib.Path) -> None: """Test get all groups from the catalog.""" test_utils.setup_for_multi_profile(tmp_trestle_dir, False, True) prof_a_path = ModelUtils.path_for_top_level_model( tmp_trestle_dir, 'test_profile_a', prof.Profile, FileContentType.JSON ) catalog = ProfileResolver.get_resolved_profile_catalog(tmp_trestle_dir, prof_a_path) cat_interface = CatalogInterface(catalog) all_groups_top = cat_interface.get_all_controls_from_catalog(recurse=False) assert len(list(all_groups_top)) == 6 all_groups_rec = cat_interface.get_all_controls_from_catalog(recurse=True) assert len(list(all_groups_rec)) == 7 all_group_ids = cat_interface.get_group_ids() assert len(all_group_ids) == 1 statement_label, part = cat_interface.get_statement_label_if_exists('ac-1', 'ac-1_smt.c.2') assert statement_label == '2.' assert part.id == 'ac-1_smt.c.2' cat_path = cat_interface._get_control_path('ac-2') assert cat_path[0] == 'ac' assert len(cat_path) == 1
def test_profile_resolver(tmp_trestle_dir: pathlib.Path) -> None: """Test the resolver.""" test_utils.setup_for_multi_profile(tmp_trestle_dir, False, True) prof_a_path = ModelUtils.path_for_top_level_model( tmp_trestle_dir, 'test_profile_a', prof.Profile, FileContentType.JSON ) cat = ProfileResolver.get_resolved_profile_catalog(tmp_trestle_dir, prof_a_path) interface = CatalogInterface(cat) # added part ac-1_expevid from prof a list1 = find_string_in_all_controls_prose(interface, 'Detailed evidence logs') # modify param ac-3.3_prm_2 in prof b list2 = find_string_in_all_controls_prose(interface, 'full and complete compliance') assert len(list1) == 1 assert len(list2) == 1 assert interface.get_count_of_controls_in_catalog(False) == 6 assert interface.get_count_of_controls_in_catalog(True) == 7 assert len(cat.controls) == 4 assert interface.get_dependent_control_ids('ac-3') == ['ac-3.3'] control = interface.get_control('a-1') assert control.parts[0].parts[0].id == 'a-1_deep' assert control.parts[0].parts[0].prose == 'Extra added part in subpart'
def test_get_control_param_dict(tmp_trestle_dir: pathlib.Path) -> None: """Test getting the param dict of a control.""" test_utils.setup_for_multi_profile(tmp_trestle_dir, False, True) prof_a_path = ModelUtils.path_for_top_level_model(tmp_trestle_dir, 'test_profile_a', prof.Profile, FileContentType.JSON) catalog = ProfileResolver.get_resolved_profile_catalog( tmp_trestle_dir, prof_a_path) catalog_interface = CatalogInterface(catalog) control = catalog_interface.get_control('ac-1') param_dict = ControlIOReader.get_control_param_dict(control, False) # confirm profile value is used assert ControlIOReader.param_values_as_str( param_dict['ac-1_prm_1']) == 'all alert personnel' # confirm original param label is used since no value was assigned assert ControlIOReader.param_to_str(param_dict['ac-1_prm_7'], ParameterRep.VALUE_OR_LABEL_OR_CHOICES ) == 'organization-defined events' param = control.params[0] param.values = None param.select = common.ParameterSelection( how_many=common.HowMany.one_or_more, choice=['choice 1', 'choice 2']) param_dict = ControlIOReader.get_control_param_dict(control, False) assert ControlIOReader.param_to_str( param_dict['ac-1_prm_1'], ParameterRep.VALUE_OR_LABEL_OR_CHOICES) == 'choice 1, choice 2'
def test_add_props_before_after_ok(tmp_trestle_dir: pathlib.Path) -> None: """ Test for property addition behavior with before or after. Properties added with before or after will default to starting or ending. """ test_utils.setup_for_multi_profile(tmp_trestle_dir, False, True) prof_g_path = ModelUtils.path_for_top_level_model( tmp_trestle_dir, 'test_profile_g', prof.Profile, FileContentType.JSON ) _ = ProfileResolver.get_resolved_profile_catalog(tmp_trestle_dir, prof_g_path)
def test_parameter_resolution(tmp_trestle_dir: pathlib.Path) -> None: """Test whether expected order of operations is preserved for parameter substution.""" test_utils.setup_for_multi_profile(tmp_trestle_dir, False, True) prof_e_path = ModelUtils.path_for_top_level_model( tmp_trestle_dir, 'test_profile_e', prof.Profile, FileContentType.JSON ) profile_e_parameter_string = '## Override value ##' profile_a_value = 'all alert personnel' # based on 800-53 rev 5 cat = ProfileResolver.get_resolved_profile_catalog(tmp_trestle_dir, prof_e_path) interface = CatalogInterface(cat) control = interface.get_control('ac-1') locations = interface.find_string_in_control(control, profile_e_parameter_string) locations_a = interface.find_string_in_control(control, profile_a_value) assert len(locations) == 1 assert len(locations_a) == 0 assert len(control.params[1].constraints) == 1
def test_add_props(tmp_trestle_dir: pathlib.Path) -> None: """Test all types of property additions.""" test_utils.setup_for_multi_profile(tmp_trestle_dir, False, True) prof_f_path = ModelUtils.path_for_top_level_model( tmp_trestle_dir, 'test_profile_f', prof.Profile, FileContentType.JSON ) cat = ProfileResolver.get_resolved_profile_catalog(tmp_trestle_dir, prof_f_path) interface = CatalogInterface(cat) ac_3 = interface.get_control('ac-3') assert len(ac_3.props) == 6 assert ac_3.props[-1].value == 'four' for part in ac_3.parts: if part.id == 'ac-3_stmt': assert len(part.props) == 4 ac_5 = interface.get_control('ac-5') for part in ac_5.parts: if part.id == 'ac-5_stmt': for sub_part in part.parts: if sub_part.id == 'ac-5_smt.a': assert len(sub_part.props) == 4
def test_get_profile_param_dict(tmp_trestle_dir: pathlib.Path) -> None: """Test get profile param dict for control.""" test_utils.setup_for_multi_profile(tmp_trestle_dir, False, True) profile, profile_path = ModelUtils.load_top_level_model( tmp_trestle_dir, 'test_profile_a', prof.Profile, FileContentType.JSON) profile_resolver = ProfileResolver() catalog = profile_resolver.get_resolved_profile_catalog( tmp_trestle_dir, profile_path) catalog_interface = CatalogInterface(catalog) control = catalog_interface.get_control('ac-1') full_param_dict = CatalogInterface._get_full_profile_param_dict(profile) control_param_dict = CatalogInterface._get_profile_param_dict( control, full_param_dict, False) assert ControlIOReader.param_to_str( control_param_dict['ac-1_prm_1'], ParameterRep.VALUE_OR_LABEL_OR_CHOICES) == 'all alert personnel' assert ControlIOReader.param_to_str( control_param_dict['ac-1_prm_6'], ParameterRep.VALUE_OR_LABEL_OR_CHOICES) == 'monthly' # param 7 has no value so its label will be used assert ControlIOReader.param_to_str(control_param_dict['ac-1_prm_7'], ParameterRep.VALUE_OR_LABEL_OR_CHOICES ) == 'organization-defined events'