def test_convert_contribution_zip_updated_pack(get_content_path_mock, get_python_version_mock, tmp_path, mocker): """ Create a fake contribution zip file and test that it is converted to a Pack correctly. The pack already exists, checking the update flow. Args: get_content_path_mock (MagicMock): Patch of the 'get_content_path' function to return the fake repo directory used in the test get_python_version_mock (MagicMock): Patch of the 'get_python_version' function to return the "3.7" tmp_path (fixture): Temporary Path used for the unit test and cleaned up afterwards Scenario: Simulate converting a contribution zip file. Given - A contribution zip file - The zipfile contains a unified integration file When - Converting the zipfile to a valid Pack structure - The contribution is an update to an existing pack Then - Ensure integration are componentized and in valid directory structure - Ensure that readme file has not been changed. """ mocker.patch.object(GitUtil, '__init__', return_value=None) mocker.patch.object(GitUtil, 'added_files', return_value=set()) mocker.patch.object(GitUtil, 'modified_files', return_value=set()) # Create all Necessary Temporary directories # create temp directory for the repo repo_dir = tmp_path / 'content_repo' repo_dir.mkdir() get_content_path_mock.return_value = repo_dir get_python_version_mock.return_value = 3.7 # create temp target dir in which we will create all the TestSuite content items to use in the contribution zip and # that will be deleted after target_dir = repo_dir / 'target_dir' target_dir.mkdir() # create temp directory in which the contribution zip will reside contribution_zip_dir = tmp_path / 'contrib_zip' contribution_zip_dir.mkdir() # Create fake content repo and contribution zip repo = Repo(repo_dir) pack = repo.create_pack('TestPack') integration = pack.create_integration('integration0') integration.create_default_integration() contrib_zip = Contribution(target_dir, 'ContribTestPack', repo) contrib_zip.create_zip(contribution_zip_dir) # target_dir should have been deleted after creation of the zip file assert not target_dir.exists() name = 'Test Pack' contribution_path = contrib_zip.created_zip_filepath description = 'test pack description here' author = 'Octocat Smith' contrib_converter_inst = ContributionConverter( name=name, contribution=contribution_path, description=description, author=author, create_new=False, no_pipenv=True) contrib_converter_inst.convert_contribution_to_pack() converted_pack_path = repo_dir / 'Packs' / 'TestPack' assert converted_pack_path.exists() integrations_path = converted_pack_path / 'Integrations' sample_integration_path = integrations_path / 'integration0' integration_yml = sample_integration_path / 'integration0.yml' integration_py = sample_integration_path / 'integration0.py' integration_description = sample_integration_path / 'integration0_description.md' integration_image = sample_integration_path / 'integration0_image.png' integration_readme_md = sample_integration_path / 'README.md' unified_yml = integrations_path / 'integration-integration0.yml' unified_yml_in_sample = sample_integration_path / 'integration-integration0.yml' integration_files = [integration_yml, integration_py, integration_description, integration_image, integration_readme_md] for integration_file in integration_files: assert integration_file.exists() # In a new pack that part will exist. assert not unified_yml.exists() assert not unified_yml_in_sample.exists()
def test_excluded_items_contain_aliased_field(mocker, repo: Repo): """ Given - An xsoar-only incident field. - An incident field with alias of the first field. - A mapper using the xsoar-only field. When creating an ID set for marketplacev2 Then the ID set should not filter the mapper. """ host = { 'id': 'incident_host', 'name': 'Host', 'cliName': 'host', 'marketplaces': ['xsoar'], } common_types_pack = repo.create_pack('CommonTypes') common_types_pack.pack_metadata.write_json({ 'name': 'CommonTypes', 'currentVersion': '1.0.0', 'marketplaces': ['xsoar', 'marketplacev2'], }) common_types_pack.create_incident_field('Host', content=host) common_types_pack.create_incident_type('IncidentType') host_name = { 'id': 'incident_hostname', 'name': 'Host Name', 'cliName': 'hostname', 'marketplaces': ['xsoar', 'marketplacev2'], 'Aliases': [{ 'cliName': 'host', 'type': 'shortText', 'name': 'Host', }] } core_alert_fields_pack = repo.create_pack('CoreAlertFields') core_alert_fields_pack.pack_metadata.write_json({ 'name': 'CoreAlertFields', 'currentVersion': '1.0.0', 'marketplaces': ['marketplacev2'], }) core_alert_fields_pack.create_incident_field('HostName', content=host_name) mapper = { 'id': 'Mapper', 'type': 'mapping-incoming', 'mapping': { 'IncidentType': { 'dontMapEventToLabels': False, 'internalMapping': { 'Host': { 'simple': 'blabla' }, } } } } pack = repo.create_pack('MapperPack') pack.pack_metadata.write_json({ 'name': 'MapperPack', 'currentVersion': '1.0.0', 'marketplaces': ['xsoar', 'marketplacev2'], }) pack.create_mapper('Mapper', content=mapper) with ChangeCWD(repo.path): # Circle froze on 3.7 dut to high usage of processing power. # pool = Pool(processes=cpu_count() * 2) is the line that in charge of the multiprocessing initiation, # so changing `cpu_count` return value to 1 still gives you multiprocessing but with only 2 processors, # and not the maximum amount. import demisto_sdk.commands.common.update_id_set as uis mocker.patch.object(uis, 'cpu_count', return_value=1) runner = CliRunner(mix_stderr=False) result = runner.invoke(main, [ CREATE_ID_SET_CMD, '-o', 'id_set_result.json', '--marketplace', 'marketplacev2' ], catch_exceptions=False) assert result.exit_code == 0 with open(os.path.join(repo.path, 'id_set_result.json')) as file_: id_set = json.load(file_) assert len(id_set['Mappers']) == 1