From 17eb55710800049ddc10ca1555aedfd3acbce935 Mon Sep 17 00:00:00 2001 From: cx-happy-yang <30431255+cx-happy-yang@users.noreply.github.com> Date: Tue, 8 Sep 2026 13:45:57 +0800 Subject: [PATCH] Replace print() calls with logging across SDK, examples, tests, and docs All print() calls converted to logger.info/logger.error/logger.warning using logging.getLogger(__name__) per module, following the SDK's existing logging conventions. stderr prints become logger.error; skip/warning messages become logger.warning. Co-Authored-By: Claude Code --- CheckmarxPythonSDK/CxODataApiSDK/Utilities.py | 22 ++- .../CxOne/KeycloakAPI/ClientsApi.py | 4 +- CheckmarxPythonSDK/CxOne/repoManagerAPI.py | 2 +- CheckmarxPythonSDK/CxOne/reportAPI.py | 16 ++- CheckmarxPythonSDK/CxOne/scansAPI.py | 8 +- CheckmarxPythonSDK/CxOne/uploadsAPI.py | 4 +- .../CxPortalSoapApiSDK/CxAuditWebService.py | 4 +- .../CxPortalSoapApiSDK/CxPortalWebService.py | 6 +- CheckmarxPythonSDK/CxReporting/api.py | 6 +- CheckmarxPythonSDK/CxRestAPISDK/ScansAPI.py | 6 +- CheckmarxPythonSDK/api_client.py | 8 +- CheckmarxPythonSDK/rate_limiter.py | 6 +- docs/cross_reference_endpoints.py | 66 ++++----- docs/swagger_yaml/CxSAST/fetch_swagger.py | 4 +- docs/update_swagger_yaml.py | 18 +-- examples/CxOne/async_demo.py | 12 +- examples/CxOne/cxone_direct_configuration.py | 10 +- ...sable_exploitable_path_for_all_projects.py | 56 ++++---- examples/CxOne/export_sast_state_by_query.py | 14 +- examples/CxOne/get_audit_events.py | 42 +++--- examples/CxOne/get_project_sast_exclusions.py | 32 +++-- examples/CxOne/triage_workflow.py | 108 ++++++++------- ...rigger_scm_project_scans_on_main_branch.py | 37 +++-- examples/CxOne/update_project_preset.py | 38 ++--- examples/CxSAST/access_control_demo.py | 16 +-- examples/CxSAST/compare_presets.py | 18 +-- examples/CxSAST/dump_all_path_ids.py | 16 ++- ..._report_without_not_exploitable_results.py | 12 +- ...all_scan_results_and_output_to_csv_file.py | 8 +- examples/CxSAST/get_all_teams.py | 10 +- examples/CxSAST/osa_scan_demo.py | 8 +- examples/CxSAST/scan_from_git.py | 40 +++--- examples/CxSAST/scan_from_local_zip.py | 42 +++--- examples/CxSCA/cxsca_scan.py | 34 +++-- .../test_client_registration_policy_api.py | 8 +- .../test_client_role_mappings_api.py | 54 ++++---- .../KeycloakAPI/test_client_roles_api.py | 88 ++++++------ .../KeycloakAPI/test_client_scopes_api.py | 48 +++---- tests/CxOne/KeycloakAPI/test_clients_api.py | 50 +++---- tests/CxOne/KeycloakAPI/test_component_api.py | 44 +++--- tests/CxOne/KeycloakAPI/test_groups_api.py | 96 +++++++------ .../test_identity_providers_api.py | 30 ++-- tests/CxOne/KeycloakAPI/test_key_api.py | 8 +- .../CxOne/KeycloakAPI/test_role_mapper_api.py | 62 +++++---- tests/CxOne/KeycloakAPI/test_roles_api.py | 28 ++-- .../CxOne/KeycloakAPI/test_roles_by_id_api.py | 130 +++++++----------- .../KeycloakAPI/test_scope_mappings_api.py | 26 ++-- tests/CxOne/KeycloakAPI/test_users_api.py | 40 +++--- tests/CxOne/test_access_control_api.py | 48 +++---- tests/CxOne/test_access_management_api.py | 12 +- tests/CxOne/test_ai_assets_api.py | 12 +- tests/CxOne/test_apisec_api.py | 32 +++-- .../CxOne/test_byor_results_handler_v2_api.py | 14 +- tests/CxOne/test_data_retention_api.py | 4 +- tests/CxOne/test_fusion_dispatcher_api.py | 6 +- tests/CxOne/test_fusion_results_api.py | 4 +- .../CxOne/test_global_inventory_reader_api.py | 22 +-- .../CxOne/test_kics_results_predicates_api.py | 8 +- tests/CxOne/test_logs_api.py | 24 ++-- tests/CxOne/test_micro_engines_api.py | 6 +- tests/CxOne/test_misc_endpoints.py | 10 +- .../CxOne/test_organizational_domains_api.py | 4 +- tests/CxOne/test_projects_api.py | 62 +++++---- tests/CxOne/test_repo_manager_api.py | 18 +-- tests/CxOne/test_repo_store_service_api.py | 4 +- tests/CxOne/test_repository_insights_api.py | 6 +- tests/CxOne/test_results_overview_api.py | 4 +- tests/CxOne/test_risk_management_api.py | 4 +- tests/CxOne/test_sast_queries_audit_api.py | 8 +- tests/CxOne/test_sast_results_api.py | 10 +- .../CxOne/test_sast_results_predicates_api.py | 10 +- .../test_sast_scan_metadata_service_api.py | 6 +- tests/CxOne/test_scans_api.py | 8 +- tests/CxOne/test_static_correlator_api.py | 4 +- tests/CxOne/test_token_expiry_integration.py | 4 +- tests/CxOne/test_uploads_api.py | 4 +- tests/CxOne/test_webhook_api.py | 6 +- .../CxReporting/test_cxreporting_api.py | 6 +- tests/CxSAST/CxRestAPI/test_projects_api.py | 8 +- .../CxRestAPI/test_sast_results_pagination.py | 50 +++---- tests/CxSCA/test_sca_api.py | 8 +- tests/test_sample.py | 4 +- 82 files changed, 978 insertions(+), 907 deletions(-) diff --git a/CheckmarxPythonSDK/CxODataApiSDK/Utilities.py b/CheckmarxPythonSDK/CxODataApiSDK/Utilities.py index 3d12a2fd..7cd7fa98 100644 --- a/CheckmarxPythonSDK/CxODataApiSDK/Utilities.py +++ b/CheckmarxPythonSDK/CxODataApiSDK/Utilities.py @@ -1,6 +1,8 @@ import csv from itertools import groupby from copy import deepcopy +import logging +logger = logging.getLogger(__name__) from .ProjectsODataAPI import ( get_all_projects_id_name, @@ -105,8 +107,8 @@ def get_all_results_with_count_for_each_project_json_format( {"ScanId": scan_id, "ResultsWithQuery": results_with_query} ) except ValueError as e: - print(e) - print("Fail to fetch data for scan id: {id} ".format(id=scan_id)) + logger.info(e) + logger.error("Fail to fetch data for scan id: {id} ".format(id=scan_id)) project.update({"Scans": results_list}) @@ -167,11 +169,9 @@ def get_result(project, filter_false_positive=False, threshold=0): last_scan_id = get_last_scan_id_of_a_project(project_id=project_id) if not last_scan_id: - print( - "Project name: {name}, id : {id} has no scans".format( + logger.info("Project name: {name}, id : {id} has no scans".format( name=project_name, id=project_id - ) - ) + )) return None last_full_scan_id = get_last_full_scan_id_of_a_project(project_id=project_id) @@ -181,8 +181,8 @@ def get_result(project, filter_false_positive=False, threshold=0): scan_id=last_scan_id ) except ValueError as e: - print("Fail to get scan result for scan id: {id}".format(id=last_scan_id)) - print("Exception: {error} ".format(error=e)) + logger.error("Fail to get scan result for scan id: {id}".format(id=last_scan_id)) + logger.error("Exception: {error} ".format(error=e)) return None if last_scan_id != last_full_scan_id: @@ -193,10 +193,8 @@ def get_result(project, filter_false_positive=False, threshold=0): ) ) except Exception as e: - print( - "Fail to get scan result for scan id: {id}".format(id=last_full_scan_id) - ) - print("Exception: {error} ".format(error=e)) + logger.error("Fail to get scan result for scan id: {id}".format(id=last_full_scan_id)) + logger.error("Exception: {error} ".format(error=e)) return None result_list = merge_results_by_similarity_id(result_list, last_full_scan_result) diff --git a/CheckmarxPythonSDK/CxOne/KeycloakAPI/ClientsApi.py b/CheckmarxPythonSDK/CxOne/KeycloakAPI/ClientsApi.py index 05df45c1..b752f673 100644 --- a/CheckmarxPythonSDK/CxOne/KeycloakAPI/ClientsApi.py +++ b/CheckmarxPythonSDK/CxOne/KeycloakAPI/ClientsApi.py @@ -86,8 +86,8 @@ def post_clients( Relative path: /{realm}/clients """ url = f"{self.base_url}/{realm}/clients" - print(f"Post request to {url}") - print(f"Request body: {client_representation.to_dict()}") + logger.info(f"Post request to {url}") + logger.info(f"Request body: {client_representation.to_dict()}") response = self.api_client.call_api("POST", url, json=client_representation.to_dict()) return response.status_code == 201 diff --git a/CheckmarxPythonSDK/CxOne/repoManagerAPI.py b/CheckmarxPythonSDK/CxOne/repoManagerAPI.py index 274cb747..cf495b37 100644 --- a/CheckmarxPythonSDK/CxOne/repoManagerAPI.py +++ b/CheckmarxPythonSDK/CxOne/repoManagerAPI.py @@ -236,7 +236,7 @@ def get_all_repo_orgs_for_a_scm_type( url=url, params=params, ) - print(response.json()) + logger.info(response.json()) return RepoOrgs(orgs=[RepoOrg(**item) for item in response.json().get("orgs")]) def create_installation_of_scm_on_org( diff --git a/CheckmarxPythonSDK/CxOne/reportAPI.py b/CheckmarxPythonSDK/CxOne/reportAPI.py index fe2808ca..a158729e 100644 --- a/CheckmarxPythonSDK/CxOne/reportAPI.py +++ b/CheckmarxPythonSDK/CxOne/reportAPI.py @@ -2,6 +2,8 @@ from CheckmarxPythonSDK.api_client import ApiClient from CheckmarxPythonSDK.CxOne.config import construct_configuration from typing import List +import logging +logger = logging.getLogger(__name__) class ReportAPI(object): @@ -74,10 +76,10 @@ def create_scan_report_v2( ) status = response.json().get("status") if status == "completed": - print("Report has been generated successfully!") + logger.info("Report has been generated successfully!") break else: - print("Generating report, please wait...") + logger.info("Generating report, please wait...") time.sleep(2) return report_id @@ -123,10 +125,10 @@ def create_scan_report( ) status = response.json().get("status") if status == "completed": - print("Report has been generated successfully!") + logger.info("Report has been generated successfully!") break else: - print("Generating report, please wait...") + logger.info("Generating report, please wait...") time.sleep(2) return report_id @@ -233,13 +235,13 @@ def get_sca_scan_report(self, export_id: str) -> dict: response = self.api_client.call_api( method="GET", url=download_url ) - print("Report has been generated successfully!") + logger.info("Report has been generated successfully!") break if status == "Failed": - print(f"Error: {response.content}") + logger.error(f"Error: {response.content}") break else: - print("Generating report, please wait...") + logger.info("Generating report, please wait...") time.sleep(2) return response.json() diff --git a/CheckmarxPythonSDK/CxOne/scansAPI.py b/CheckmarxPythonSDK/CxOne/scansAPI.py index cc6070a0..91457ff9 100644 --- a/CheckmarxPythonSDK/CxOne/scansAPI.py +++ b/CheckmarxPythonSDK/CxOne/scansAPI.py @@ -5,6 +5,8 @@ from httpx import Response from deprecated import deprecated from CheckmarxPythonSDK.utilities.compat import NO_CONTENT, OK, CREATED +import logging +logger = logging.getLogger(__name__) from .dto import ( ScanInput, @@ -481,10 +483,8 @@ def scan_by_repo_url( {"type": engine, "value": engine_configs[engine]} ) else: - print( - f"Warning: Engine '{engine}' is not supported " - f"and will be ignored." - ) + logger.warning(f"Warning: Engine '{engine}' is not supported " + f"and will be ignored.") return self.api_client.call_api( method="POST", url=self.base_url, json=scan_data ) diff --git a/CheckmarxPythonSDK/CxOne/uploadsAPI.py b/CheckmarxPythonSDK/CxOne/uploadsAPI.py index c13ab8fb..47c42680 100644 --- a/CheckmarxPythonSDK/CxOne/uploadsAPI.py +++ b/CheckmarxPythonSDK/CxOne/uploadsAPI.py @@ -5,6 +5,8 @@ from CheckmarxPythonSDK.utilities.compat import OK, NO_CONTENT from typing import List from os.path import exists +import logging +logger = logging.getLogger(__name__) class UploadsAPI(object): @@ -46,7 +48,7 @@ def upload_zip_content_for_scanning( is_successful (bool) """ if not zip_file_path or not exists(zip_file_path): - print("zip file path: {} does not exist".format(zip_file_path)) + logger.info("zip file path: {} does not exist".format(zip_file_path)) file_name = os.path.basename(zip_file_path) response = self.api_client.call_api( method="PUT", diff --git a/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxAuditWebService.py b/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxAuditWebService.py index 3aec879a..ed431469 100644 --- a/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxAuditWebService.py +++ b/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxAuditWebService.py @@ -1,6 +1,8 @@ from os.path import exists from CheckmarxPythonSDK.configuration import Configuration from CheckmarxPythonSDK.CxPortalSoapApiSDK.config import construct_configuration +import logging +logger = logging.getLogger(__name__) from .sudsClient import SudsClient @@ -438,7 +440,7 @@ def keep_alive(self) -> dict: def import_queries(self, imported_file_path: str) -> dict: if not exists(imported_file_path): - print("Error, the imported file {} not exist".format(imported_file_path)) + logger.error("Error, the imported file {} not exist".format(imported_file_path)) return None with open(imported_file_path, "rb") as xml_file: imported_file = xml_file.read() diff --git a/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxPortalWebService.py b/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxPortalWebService.py index dd751515..2aa222aa 100644 --- a/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxPortalWebService.py +++ b/CheckmarxPythonSDK/CxPortalSoapApiSDK/CxPortalWebService.py @@ -9,6 +9,8 @@ from typing import List, Union from CheckmarxPythonSDK.configuration import Configuration from CheckmarxPythonSDK.CxPortalSoapApiSDK.config import construct_configuration +import logging +logger = logging.getLogger(__name__) from .sudsClient import SudsClient @@ -1152,7 +1154,7 @@ def import_preset(self, imported_file_path: str) -> Union[dict, None]: """ if not exists(imported_file_path): - print("Error, the imported file {} not exist".format(imported_file_path)) + logger.error("Error, the imported file {} not exist".format(imported_file_path)) return with open(imported_file_path, "rb") as xml_file: @@ -1177,7 +1179,7 @@ def import_queries(self, imported_file_path: str) -> Union[dict, None]: """ if not exists(imported_file_path): - print("Error, the imported file {} not exist".format(imported_file_path)) + logger.error("Error, the imported file {} not exist".format(imported_file_path)) return with open(imported_file_path, "rb") as xml_file: diff --git a/CheckmarxPythonSDK/CxReporting/api.py b/CheckmarxPythonSDK/CxReporting/api.py index bd737f0a..6c3de357 100644 --- a/CheckmarxPythonSDK/CxReporting/api.py +++ b/CheckmarxPythonSDK/CxReporting/api.py @@ -4,6 +4,8 @@ import json from CheckmarxPythonSDK.utilities.compat import OK, CREATED from typing import Union +import logging +logger = logging.getLogger(__name__) from .dto import ( CreateReportDTO, ) @@ -97,12 +99,12 @@ def get_report(self, report_request: CreateReportDTO) -> Union[bytes, None]: ) while report_status.upper() != "FINISHED": if "FAIL" in report_status.upper(): - print("Report generation failed!") + logger.error("Report generation failed!") return None report_status = self.retrieve_the_status_of_a_specific_report( report_id=report_id ) - print("report status: {}".format(report_status)) + logger.info("report status: {}".format(report_status)) time.sleep(2) return self.retrieve_the_file_of_a_specific_report(report_id=report_id) diff --git a/CheckmarxPythonSDK/CxRestAPISDK/ScansAPI.py b/CheckmarxPythonSDK/CxRestAPISDK/ScansAPI.py index 976f2969..a09ebd32 100644 --- a/CheckmarxPythonSDK/CxRestAPISDK/ScansAPI.py +++ b/CheckmarxPythonSDK/CxRestAPISDK/ScansAPI.py @@ -6,6 +6,8 @@ from os.path import normpath, exists, abspath from CheckmarxPythonSDK.utilities.compat import OK, CREATED, NO_CONTENT, ACCEPTED +import logging +logger = logging.getLogger(__name__) from .sast.projects.dto import CxLink, CxProject, CxPreset from .sast.engines.dto import CxEngineServer, CxEngineConfiguration from .sast.scans.dto import ( @@ -1020,9 +1022,7 @@ def create_new_scan_with_settings( url = f"{self.base_url}/cxrestapi/sast/scanWithSettings" file_name = os.path.basename(zipped_source_file_path) if not exists(normpath(abspath(zipped_source_file_path))): - print( - "zipped_source_file_path not exist: {}".format(zipped_source_file_path) - ) + logger.info("zipped_source_file_path not exist: {}".format(zipped_source_file_path)) return None fields = { "projectId": str(project_id), diff --git a/CheckmarxPythonSDK/api_client.py b/CheckmarxPythonSDK/api_client.py index 3dac7545..e144c3c8 100644 --- a/CheckmarxPythonSDK/api_client.py +++ b/CheckmarxPythonSDK/api_client.py @@ -5,6 +5,8 @@ import time import typing from typing import Callable, Union +import logging +logger = logging.getLogger(__name__) from .configuration import Configuration from .rate_limiter import RateLimiter from .__version__ import __version__ @@ -166,9 +168,7 @@ def wrapper(self, *args, **kwargs): base_wait * (2**retries), max_wait ) - print( - f"Rate limited (429), waiting {backoff_time:.2f} seconds before retrying..." - ) + logger.info(f"Rate limited (429), waiting {backoff_time:.2f} seconds before retrying...") time.sleep(backoff_time) retries += 1 continue @@ -178,7 +178,7 @@ def wrapper(self, *args, **kwargs): return response except Exception as e: - print(f"error: {e}") + logger.error(f"error: {e}") raise if last_exception: diff --git a/CheckmarxPythonSDK/rate_limiter.py b/CheckmarxPythonSDK/rate_limiter.py index fa7a9900..169bc615 100644 --- a/CheckmarxPythonSDK/rate_limiter.py +++ b/CheckmarxPythonSDK/rate_limiter.py @@ -1,5 +1,7 @@ import time import threading +import logging +logger = logging.getLogger(__name__) class TokenBucket: @@ -51,9 +53,7 @@ def consume(self, tokens: int = 1, block: bool = True) -> bool: # Calculate wait time inside the lock, then sleep outside it tokens_needed = tokens - self.tokens wait_time = tokens_needed / self.refill_rate - print( - f"Rate limiting: waiting {wait_time:.2f} seconds for {tokens_needed} tokens..." - ) + logger.info(f"Rate limiting: waiting {wait_time:.2f} seconds for {tokens_needed} tokens...") # Sleep outside the lock so other threads are not blocked time.sleep(wait_time) diff --git a/docs/cross_reference_endpoints.py b/docs/cross_reference_endpoints.py index c2c9d274..9bf9dcc8 100644 --- a/docs/cross_reference_endpoints.py +++ b/docs/cross_reference_endpoints.py @@ -13,6 +13,8 @@ import sys import yaml from typing import Dict, List, Set, Tuple, Optional +import logging +logger = logging.getLogger(__name__) SDK_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) CXONE_DIR = os.path.join(SDK_DIR, "CheckmarxPythonSDK", "CxOne") @@ -216,14 +218,14 @@ def simplify(endpoint: str) -> str: def main(): - print("=" * 70) - print("CxOne API Endpoint Cross-Reference: Python SDK vs Swagger YAML") - print("=" * 70) + logger.info("=" * 70) + logger.info("CxOne API Endpoint Cross-Reference: Python SDK vs Swagger YAML") + logger.info("=" * 70) py_endpoints = scan_python_api_files() yaml_endpoints = {k: v for k, v in scan_yaml_files().items() if k not in SKIP_YAML} - print("\nParsed {} Python API files, {} YAML spec files.".format( + logger.info("\nParsed {} Python API files, {} YAML spec files.".format( len(py_endpoints), len(yaml_endpoints))) py_set: Set[str] = set() @@ -244,9 +246,9 @@ def main(): # ========================================================================= # Section 1: Deprecated (Python only, not in YAML) # ========================================================================= - print("\n" + "=" * 70) - print("1. DEPRECATED — in Python SDK but NOT in any YAML") - print("=" * 70) + logger.info("\n" + "=" * 70) + logger.warning("1. DEPRECATED — in Python SDK but NOT in any YAML") + logger.info("=" * 70) deprecated: List[Tuple[str, str]] = [] for fname in sorted(py_raw.keys()): @@ -258,19 +260,19 @@ def main(): current = "" for fname, ep in sorted(deprecated, key=lambda x: (x[0], x[1])): if fname != current: - print("\n {}".format(fname)) + logger.info("\n {}".format(fname)) current = fname - print(" {}".format(ep)) - print("\n Total deprecated: {}".format(len(deprecated))) + logger.info(" {}".format(ep)) + logger.warning("\n Total deprecated: {}".format(len(deprecated))) else: - print(" (none)") + logger.info(" (none)") # ========================================================================= # Section 2: Missing (YAML only, not in Python) # ========================================================================= - print("\n" + "=" * 70) - print("2. MISSING — in YAML but NOT in Python SDK (need to add)") - print("=" * 70) + logger.info("\n" + "=" * 70) + logger.info("2. MISSING — in YAML but NOT in Python SDK (need to add)") + logger.info("=" * 70) missing: List[Tuple[str, str]] = [] for fname in sorted(yaml_raw.keys()): @@ -282,12 +284,12 @@ def main(): current = "" for fname, ep in sorted(missing, key=lambda x: (x[0], x[1])): if fname != current: - print("\n {}".format(fname)) + logger.info("\n {}".format(fname)) current = fname - print(" {}".format(ep)) - print("\n Total missing: {}".format(len(missing))) + logger.info(" {}".format(ep)) + logger.info("\n Total missing: {}".format(len(missing))) else: - print(" (none)") + logger.info(" (none)") # ========================================================================= # Section 3: Summary @@ -296,21 +298,21 @@ def main(): total_py = sum(len(v) for v in py_raw.values()) total_yaml = sum(len(v) for v in yaml_raw.values()) - print("\n" + "=" * 70) - print("3. SUMMARY") - print("=" * 70) - print(" Python endpoints: {}".format(total_py)) - print(" YAML endpoints: {}".format(total_yaml)) - print(" Matched: {}".format(matched)) - print(" Deprecated (py-only): {}".format(len(deprecated))) - print(" Missing (yaml-only): {}".format(len(missing))) + logger.info("\n" + "=" * 70) + logger.info("3. SUMMARY") + logger.info("=" * 70) + logger.info(" Python endpoints: {}".format(total_py)) + logger.info(" YAML endpoints: {}".format(total_yaml)) + logger.info(" Matched: {}".format(matched)) + logger.warning(" Deprecated (py-only): {}".format(len(deprecated))) + logger.info(" Missing (yaml-only): {}".format(len(missing))) # ========================================================================= # Section 4: Entirely new YAML services # ========================================================================= - print("\n" + "=" * 70) - print("4. ENTIRELY NEW YAML SERVICES (no Python API file)") - print("=" * 70) + logger.info("\n" + "=" * 70) + logger.info("4. ENTIRELY NEW YAML SERVICES (no Python API file)") + logger.info("=" * 70) yaml_prefixes: Dict[str, str] = {} for fname in sorted(os.listdir(YAML_DIR)): @@ -340,10 +342,10 @@ def main(): if unmatched: for fname, prefix in unmatched: ep_count = len(yaml_raw.get(fname, [])) - print(" {} (prefix: {}, {} endpoints)".format(fname, prefix, ep_count)) - print(" Total new services: {}".format(len(unmatched))) + logger.info(" {} (prefix: {}, {} endpoints)".format(fname, prefix, ep_count)) + logger.info(" Total new services: {}".format(len(unmatched))) else: - print(" (none)") + logger.info(" (none)") if __name__ == "__main__": diff --git a/docs/swagger_yaml/CxSAST/fetch_swagger.py b/docs/swagger_yaml/CxSAST/fetch_swagger.py index b4e4110e..b7b07be2 100644 --- a/docs/swagger_yaml/CxSAST/fetch_swagger.py +++ b/docs/swagger_yaml/CxSAST/fetch_swagger.py @@ -2,6 +2,8 @@ import urllib.request import ssl from pathlib import Path +import logging +logger = logging.getLogger(__name__) url = "https://desktop-rmvpboc/cxrestapi/help/swagger/docs/latest" output_path = Path(__file__).parent / "swagger.json" @@ -15,4 +17,4 @@ with open(output_path, "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False) -print(f"Saved {len(data)} top-level keys to {output_path}") +logger.info(f"Saved {len(data)} top-level keys to {output_path}") diff --git a/docs/update_swagger_yaml.py b/docs/update_swagger_yaml.py index 06edb7a8..8b402b3c 100644 --- a/docs/update_swagger_yaml.py +++ b/docs/update_swagger_yaml.py @@ -13,6 +13,8 @@ from typing import List, Optional from urllib.request import Request, urlopen from urllib.error import URLError +import logging +logger = logging.getLogger(__name__) BASE_URL = "https://sng.ast.checkmarx.net/spec/v1" OUTPUT_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -70,15 +72,15 @@ def file_md5(path: str) -> Optional[str]: def main() -> None: - print("Fetching file list from {}?...".format(BASE_URL)) + logger.info("Fetching file list from {}?...".format(BASE_URL)) try: html = fetch_page(BASE_URL + "?") except URLError as e: - print("ERROR: could not fetch index page: {}".format(e), file=sys.stderr) + logger.error("ERROR: could not fetch index page: {}".format(e)) sys.exit(1) links = extract_yaml_links(html) - print("Found {} unique .yaml/.YAML links.".format(len(links))) + logger.info("Found {} unique .yaml/.YAML links.".format(len(links))) updated = 0 added = 0 @@ -100,23 +102,23 @@ def main() -> None: old_hash = file_md5(filepath) new_hash = hashlib.md5(content).hexdigest() if old_hash == new_hash: - print(" {:50s} unchanged".format(name)) + logger.info(" {:50s} unchanged".format(name)) skipped += 1 continue - print(" {:50s} updated".format(name)) + logger.info(" {:50s} updated".format(name)) updated += 1 else: - print(" {:50s} new file".format(name)) + logger.info(" {:50s} new file".format(name)) added += 1 with open(filepath, "wb") as f: f.write(content) except URLError as e: - print(" {:50s} ERROR: {}".format(name, e), file=sys.stderr) + logger.error(" {:50s} ERROR: {}".format(name, e)) errors += 1 - print("\nDone. updated: {} added: {} skipped: {} errors: {}".format( + logger.error("\nDone. updated: {} added: {} skipped: {} errors: {}".format( updated, added, skipped, errors)) diff --git a/examples/CxOne/async_demo.py b/examples/CxOne/async_demo.py index f80e11b5..efe26d12 100644 --- a/examples/CxOne/async_demo.py +++ b/examples/CxOne/async_demo.py @@ -4,6 +4,8 @@ from CheckmarxPythonSDK.async_api_client import AsyncApiClient from CheckmarxPythonSDK.CxOne.projectsAPI import ProjectsAPI from CheckmarxPythonSDK.CxOne.config import construct_configuration +import logging +logger = logging.getLogger(__name__) class RequestData: @@ -43,7 +45,7 @@ def __init__( params=api_data.request_data.param, json=api_data.request_data.json, ) -print(response.json()) +logger.info(response.json()) # response to ProjectsCollection @@ -57,14 +59,12 @@ async def main(): params=api_data.request_data.param, json=api_data.request_data.json, ) as response: - print(f"Status: {response.status}") - print(f"Content type: {response.headers['content-type']}") + logger.info(f"Status: {response.status}") + logger.info(f"Content type: {response.headers['content-type']}") # Use await to get the JSON data asynchronously data = await response.json() - print( - f"Location: {data['iss_position']['latitude']}, {data['iss_position']['longitude']}" - ) + logger.info(f"Location: {data['iss_position']['latitude']}, {data['iss_position']['longitude']}") # response to ProjectsCollection diff --git a/examples/CxOne/cxone_direct_configuration.py b/examples/CxOne/cxone_direct_configuration.py index 8b328192..8e1a9e6b 100644 --- a/examples/CxOne/cxone_direct_configuration.py +++ b/examples/CxOne/cxone_direct_configuration.py @@ -7,6 +7,8 @@ from CheckmarxPythonSDK.api_client import ApiClient from CheckmarxPythonSDK.CxOne.projectsAPI import ProjectsAPI from CheckmarxPythonSDK.CxOne.scansAPI import ScansAPI +import logging +logger = logging.getLogger(__name__) def make_api_client( @@ -45,7 +47,7 @@ def example_refresh_token(): scans_api = ScansAPI(api_client=api_client) projects = projects_api.get_all_projects() - print(f"Found {len(projects)} projects") + logger.info(f"Found {len(projects)} projects") # --- Example 2: client_credentials grant type --- @@ -59,7 +61,7 @@ def example_client_credentials(): projects_api = ProjectsAPI(api_client=api_client) projects = projects_api.get_all_projects() - print(f"Found {len(projects)} projects") + logger.info(f"Found {len(projects)} projects") # --- Example 3: two tenants simultaneously --- @@ -78,8 +80,8 @@ def example_multi_tenant(): projects_a = ProjectsAPI(api_client=client_a).get_all_projects() projects_b = ProjectsAPI(api_client=client_b).get_all_projects() - print(f"Tenant A: {len(projects_a)} projects") - print(f"Tenant B: {len(projects_b)} projects") + logger.info(f"Tenant A: {len(projects_a)} projects") + logger.info(f"Tenant B: {len(projects_b)} projects") if __name__ == "__main__": diff --git a/examples/CxOne/disable_exploitable_path_for_all_projects.py b/examples/CxOne/disable_exploitable_path_for_all_projects.py index c6f36b9b..5aad2e54 100644 --- a/examples/CxOne/disable_exploitable_path_for_all_projects.py +++ b/examples/CxOne/disable_exploitable_path_for_all_projects.py @@ -80,6 +80,8 @@ from CheckmarxPythonSDK.CxOne.projectsAPI import ProjectsAPI from CheckmarxPythonSDK.CxOne.scanConfigurationAPI import ScanConfigurationAPI from CheckmarxPythonSDK.CxOne.dto.ScanParameter import ScanParameter +import logging +logger = logging.getLogger(__name__) EXPLOITABLE_PATH_KEY = "scan.config.sca.ExploitablePath" CACHE_FILE = Path(__file__).resolve().parent / "disabled_exploitable_path_cache.json" @@ -88,7 +90,7 @@ def load_dotenv(): env_path = Path(__file__).resolve().parents[2] / ".env" if not env_path.exists(): - print(f"Warning: {env_path} not found, using environment variables.") + logger.warning(f"Warning: {env_path} not found, using environment variables.") return with open(env_path) as f: for line in f: @@ -141,13 +143,11 @@ def load_cache(tenant_name: str) -> dict: try: data = json.loads(CACHE_FILE.read_text()) except (json.JSONDecodeError, OSError) as exc: - print(f"Warning: could not read {CACHE_FILE} ({exc}), ignoring cache.") + logger.warning(f"Warning: could not read {CACHE_FILE} ({exc}), ignoring cache.") return {} if data.get("tenant") != tenant_name: - print( - f"Warning: {CACHE_FILE} belongs to tenant " - f"{data.get('tenant')!r}, not {tenant_name!r} — ignoring cache." - ) + logger.warning(f"Warning: {CACHE_FILE} belongs to tenant " + f"{data.get('tenant')!r}, not {tenant_name!r} — ignoring cache.") return {} return data.get("projects", {}) @@ -256,23 +256,21 @@ def main(): tenant_value = get_tenant_exploitable_path_value(scan_config_api) tenant_enabled = tenant_value is None or tenant_value.lower() != "false" if tenant_enabled: - print( - f"Note: tenant-level default is " + logger.info(f"Note: tenant-level default is " f"{tenant_value if tenant_value is not None else '(unset, defaults to true)'}" f" — this is intentional (it's what activates Exploitable Path " f"analysis tenant-wide) and is not changed by this script. Any " f"new project created after this run will inherit it enabled " - f"until this script is re-run against it.\n" - ) + f"until this script is re-run against it.\n") all_projects = projects_api.get_all_projects() - print(f"Found {len(all_projects)} projects.") + logger.info(f"Found {len(all_projects)} projects.") known_project_ids = {project.id for project in all_projects} def flush_cache(): if cache_dirty: save_cache(tenant_name, cache, known_project_ids) - print(f"(cache: {len(cache)} project(s) recorded in {CACHE_FILE.name})") + logger.info(f"(cache: {len(cache)} project(s) recorded in {CACHE_FILE.name})") def check_project(project): current_value = get_exploitable_path_value(scan_config_api, project.id) @@ -305,26 +303,24 @@ def check_project(project): else: to_update.append((project, current_value)) - print( - f"Already disabled: {already_disabled + already_disabled_cached} " - f"({already_disabled_cached} skipped via cache, no API call)" - ) - print(f"To be disabled: {len(to_update)}") + logger.warning(f"Already disabled: {already_disabled + already_disabled_cached} " + f"({already_disabled_cached} skipped via cache, no API call)") + logger.info(f"To be disabled: {len(to_update)}") for project, current_value in to_update: shown = current_value if current_value is not None else "(inherited/unset)" - print(f" - {project.name} ({project.id}): current value = {shown}") + logger.info(f" - {project.name} ({project.id}): current value = {shown}") if read_errors: - print(f"Could not read current value for {len(read_errors)} project(s):") + logger.error(f"Could not read current value for {len(read_errors)} project(s):") for name, exc in read_errors: - print(f" - {name}: {exc}") + logger.info(f" - {name}: {exc}") if not to_update: - print("\nNothing to do.") + logger.info("\nNothing to do.") flush_cache() return if not args.apply: - print("\nDry run only, no changes made. Re-run with --apply to make changes.") + logger.info("\nDry run only, no changes made. Re-run with --apply to make changes.") flush_cache() return @@ -335,14 +331,12 @@ def check_project(project): f"project(s). Continue? [y/N] " ) except EOFError: - print( - "\nNo terminal available to confirm (stdin is not " - "interactive) — pass --yes to run unattended. Aborted." - ) + logger.error("\nNo terminal available to confirm (stdin is not " + "interactive) — pass --yes to run unattended. Aborted.") flush_cache() return if answer.strip().lower() != "y": - print("Aborted.") + logger.error("Aborted.") flush_cache() return @@ -367,7 +361,7 @@ def apply_project(project): status = f"FAILED ({exc})" else: status = "OK" if is_successful else "FAILED (write succeeded but read-back still shows enabled)" - print(f" [{completed}/{len(to_update)}] {project.name} ... {status}") + logger.info(f" [{completed}/{len(to_update)}] {project.name} ... {status}") if is_successful: succeeded += 1 cache[project.id] = project.name @@ -375,11 +369,11 @@ def apply_project(project): else: failed.append(project.name) - print(f"\nDisabled 'Exploitable Path' for {succeeded}/{len(to_update)} projects.") + logger.info(f"\nDisabled 'Exploitable Path' for {succeeded}/{len(to_update)} projects.") if failed: - print("Failed projects (see messages above for why):") + logger.error("Failed projects (see messages above for why):") for name in failed: - print(f" - {name}") + logger.info(f" - {name}") flush_cache() diff --git a/examples/CxOne/export_sast_state_by_query.py b/examples/CxOne/export_sast_state_by_query.py index 7f8968cb..978501bc 100644 --- a/examples/CxOne/export_sast_state_by_query.py +++ b/examples/CxOne/export_sast_state_by_query.py @@ -22,6 +22,8 @@ from CheckmarxPythonSDK.api_client import ApiClient from CheckmarxPythonSDK.CxOne.projectsAPI import ProjectsAPI from CheckmarxPythonSDK.CxOne.sastResultsAPI import SastResultsAPI +import logging +logger = logging.getLogger(__name__) OUTPUT_CSV = Path(__file__).resolve().parent / "sast_state_by_query_v6.csv" STATES = ["TO_VERIFY", "CONFIRMED", "URGENT", @@ -31,7 +33,7 @@ def load_dotenv(): env_path = Path(__file__).resolve().parents[2] / ".env" if not env_path.exists(): - print(f"Warning: {env_path} not found, using environment variables.") + logger.warning(f"Warning: {env_path} not found, using environment variables.") return with open(env_path) as f: for line in f: @@ -100,7 +102,7 @@ def main(): sast_api = SastResultsAPI(api_client=api_client) all_projects = projects_api.get_all_projects() - print(f"Found {len(all_projects)} projects.") + logger.info(f"Found {len(all_projects)} projects.") project_lookup = {p.id: p for p in all_projects} project_ids = [p.id for p in all_projects] @@ -126,7 +128,7 @@ def main(): recent_scans[pid] = scan else: skipped_old += 1 - print(f"Projects with a last scan on main branch: {len(last_scans)}" + logger.warning(f"Projects with a last scan on main branch: {len(last_scans)}" f" ({len(recent_scans)} within 2 days, {skipped_old} older)") headers = [ @@ -147,7 +149,7 @@ def main(): name = project.name scan_id = scan.id - print(f" [{i}/{total}] {name} ...", end=" ", flush=True) + logger.info(f" [{i}/{total}] {name} ...") results = fetch_all_sast_results(sast_api, scan_id) # count by (query_name, state); capture query-level attributes @@ -167,7 +169,7 @@ def main(): lang = r.language_name or "" query_language[query] = lang - print(f"{len(results)} results, {len(state_counters)} queries") + logger.info(f"{len(results)} results, {len(state_counters)} queries") for query in sorted(state_counters): s = state_counters[query] @@ -183,7 +185,7 @@ def main(): "proposed_not_exploitable": s.get("PROPOSED_NOT_EXPLOITABLE", 0), }) - print(f"\nWrote to {OUTPUT_CSV}") + logger.info(f"\nWrote to {OUTPUT_CSV}") if __name__ == "__main__": diff --git a/examples/CxOne/get_audit_events.py b/examples/CxOne/get_audit_events.py index e568b249..78dcd113 100644 --- a/examples/CxOne/get_audit_events.py +++ b/examples/CxOne/get_audit_events.py @@ -12,6 +12,8 @@ import sys from datetime import datetime, timezone from urllib.request import urlopen, Request +import logging +logger = logging.getLogger(__name__) # --- Configuration --- SERVER_URL = "https://deu.ast.checkmarx.net" @@ -55,7 +57,7 @@ def api_request(method: str, path: str, body: dict = None, access_token: str = N def get_access_token() -> str: """Exchange API key for an access token.""" - print("Obtaining access token from IAM...") + logger.info("Obtaining access token from IAM...") path = "/auth/realms/{}/protocol/openid-connect/token".format( "*" ) @@ -79,7 +81,7 @@ def get_access_token() -> str: token_data = json.loads(resp.read().decode("utf-8")) return token_data.get("access_token", "") except Exception as e: - print("Token exchange failed ({}), trying direct API key...".format(e)) + logger.error("Token exchange failed ({}), trying direct API key...".format(e)) # Fallback: use the API key directly as bearer token return API_KEY @@ -101,7 +103,7 @@ def fetch_audit_events(access_token: str, start_date: str, end_date: str) -> lis all_events.extend(events) total = result.get("totalFilteredCount", 0) - print(" Page {}: fetched {} events (total filtered: {})".format( + logger.info(" Page {}: fetched {} events (total filtered: {})".format( page, len(events), total )) @@ -114,37 +116,37 @@ def fetch_audit_events(access_token: str, start_date: str, end_date: str) -> lis def main(): - print("=" * 80) - print("DEU Tenant Audit Events — April & May 2026") - print("=" * 80) - print("Tenant: *") - print("Server: {}".format(SERVER_URL)) + logger.info("=" * 80) + logger.info("DEU Tenant Audit Events — April & May 2026") + logger.info("=" * 80) + logger.info("Tenant: *") + logger.info("Server: {}".format(SERVER_URL)) access_token = get_access_token() if not access_token: - print("ERROR: Could not obtain access token", file=sys.stderr) + logger.error("ERROR: Could not obtain access token") sys.exit(1) - print("Access token obtained.") + logger.info("Access token obtained.") for month_name, (start, end) in MONTHS.items(): - print() - print("-" * 80) - print("Fetching {} 2026 ({} to {})...".format(month_name.title(), start, end)) + logger.info("") + logger.info("-" * 80) + logger.info("Fetching {} 2026 ({} to {})...".format(month_name.title(), start, end)) try: all_events = fetch_audit_events(access_token, start, end) except Exception as e: - print("ERROR fetching {}: {}".format(month_name, e)) + logger.error("ERROR fetching {}: {}".format(month_name, e)) continue - print("Total events fetched: {}".format(len(all_events))) + logger.info("Total events fetched: {}".format(len(all_events))) # Filter for target resources filtered = [ e for e in all_events if e.get("auditResource", "").lower() in TARGET_RESOURCES ] - print("Filtered events (Scans/Apps/Projects/Config): {}".format(len(filtered))) + logger.info("Filtered events (Scans/Apps/Projects/Config): {}".format(len(filtered))) # Save json_path = os.path.join(OUTPUT_DIR, "deu_audit_events_{}.json".format(month_name)) @@ -155,13 +157,13 @@ def main(): "events": filtered}, f, indent=2, default=str) - print("Saved: {} ({:,.0f} KB)".format( + logger.info("Saved: {} ({:,.0f} KB)".format( json_path, os.path.getsize(json_path) / 1024 )) - print() - print("=" * 80) - print("Done. Files saved to: {}".format(OUTPUT_DIR)) + logger.info("") + logger.info("=" * 80) + logger.info("Done. Files saved to: {}".format(OUTPUT_DIR)) if __name__ == "__main__": diff --git a/examples/CxOne/get_project_sast_exclusions.py b/examples/CxOne/get_project_sast_exclusions.py index 41e934c8..71376d13 100644 --- a/examples/CxOne/get_project_sast_exclusions.py +++ b/examples/CxOne/get_project_sast_exclusions.py @@ -22,6 +22,8 @@ from CheckmarxPythonSDK.CxOne.projectsAPI import ProjectsAPI from CheckmarxPythonSDK.CxOne.scanConfigurationAPI import ScanConfigurationAPI from CheckmarxPythonSDK.CxOne.dto.ScanParameter import ScanParameter +import logging +logger = logging.getLogger(__name__) RECOMMENDED_EXCLUSIONS_KEY = "scan.config.sast.recommendedExclusions" @@ -30,7 +32,7 @@ def load_dotenv(): """Load .env file from the project root.""" env_path = Path(__file__).resolve().parents[2] / ".env" if not env_path.exists(): - print(f"Warning: {env_path} not found, using environment variables.") + logger.warning(f"Warning: {env_path} not found, using environment variables.") return with open(env_path) as f: for line in f: @@ -94,26 +96,26 @@ def main(): scan_config_api = ScanConfigurationAPI(api_client=api_client) projects = projects_api.get_all_projects() - print(f"Found {len(projects)} projects.\n") + logger.info(f"Found {len(projects)} projects.\n") # Step 1: Check all projects - print("=" * 60) - print("Step 1: Check all projects") - print("=" * 60) + logger.info("=" * 60) + logger.info("Step 1: Check all projects") + logger.info("=" * 60) needs_update = [] for project in projects: param = get_exclusion_param(scan_config_api, project.id) value = param.value if param else "N/A" value_display = value if value != "" else "(empty)" - print(f" {project.name}: {value_display}") + logger.info(f" {project.name}: {value_display}") if is_false_or_empty(param): needs_update.append(project) # Step 2: Update projects that are false/empty if needs_update: - print(f"\n{'=' * 60}") - print(f"Step 2: Set to true for {len(needs_update)} project(s)") - print(f"{'=' * 60}") + logger.info(f"\n{'=' * 60}") + logger.info(f"Step 2: Set to true for {len(needs_update)} project(s)") + logger.info(f"{'=' * 60}") for project in needs_update: update_param = ScanParameter( key=RECOMMENDED_EXCLUSIONS_KEY, @@ -126,19 +128,19 @@ def main(): scan_parameters=[update_param], ) status = "OK" if success else "FAILED" - print(f" {project.name}: {status}") + logger.info(f" {project.name}: {status}") else: - print("\nNo projects need updating.") + logger.info("\nNo projects need updating.") # Step 3: Verify all projects again - print(f"\n{'=' * 60}") - print("Step 3: Verify all projects") - print(f"{'=' * 60}") + logger.info(f"\n{'=' * 60}") + logger.info("Step 3: Verify all projects") + logger.info(f"{'=' * 60}") for project in projects: param = get_exclusion_param(scan_config_api, project.id) value = param.value if param else "N/A" value_display = value if value != "" else "(empty)" - print(f" {project.name}: {value_display}") + logger.info(f" {project.name}: {value_display}") if __name__ == "__main__": diff --git a/examples/CxOne/triage_workflow.py b/examples/CxOne/triage_workflow.py index 0ffe4510..b8ec4fc2 100644 --- a/examples/CxOne/triage_workflow.py +++ b/examples/CxOne/triage_workflow.py @@ -34,6 +34,8 @@ from CheckmarxPythonSDK.CxOne.sastQueriesAPI import SastQueriesAPI from CheckmarxPythonSDK.CxOne.sastResultsPredicatesAPI import SastResultsPredicatesAPI from CheckmarxPythonSDK.CxOne.repoStoreServiceAPI import RepoStoreServiceAPI +import logging +logger = logging.getLogger(__name__) SKIP_USER = "cxservice_happy.yang@checkmarx.com" @@ -41,7 +43,7 @@ def load_dotenv(): env_path = Path(__file__).resolve().parents[2] / ".env" if not env_path.exists(): - print(f"Warning: {env_path} not found, using environment variables.") + logger.warning(f"Warning: {env_path} not found, using environment variables.") return with open(env_path) as f: for line in f: @@ -145,12 +147,12 @@ def show_source_code(repostore_api, scan_id, file_path, line_num): lines = code.split("\n") start = max(0, (line_num or 1) - 10) end = min(len(lines), (line_num or 1) + 10) - print(f" --- Lines {start + 1}-{end} ---") + logger.info(f" --- Lines {start + 1}-{end} ---") for i in range(start, end): marker = " >>>" if i == (line_num or 1) - 1 else " " - print(f" {i + 1:4d}{marker} {lines[i]}") + logger.info(f" {i + 1:4d}{marker} {lines[i]}") except Exception as e: - print(f" Error reading source: {e}") + logger.error(f" Error reading source: {e}") def was_triaged_by_cxservice(response): @@ -171,31 +173,31 @@ def process_finding(idx, total, finding, project, scan_id, """Run steps 4-9 for a single SAST finding.""" similarity_id = str(finding.similarity_id) header = f"Finding {idx}/{total} | {finding.query_name} | {finding.severity} | {finding.language_name}" - print(f"\n{'=' * 70}") - print(f"{'=' * 70}") - print(f" {header}") - print(f"{'=' * 70}") - print(f" Similarity ID: {similarity_id}") - print(f" State / Status: {finding.state} / {finding.status}") + logger.info(f"\n{'=' * 70}") + logger.info(f"{'=' * 70}") + logger.info(f" {header}") + logger.info(f"{'=' * 70}") + logger.info(f" Similarity ID: {similarity_id}") + logger.info(f" State / Status: {finding.state} / {finding.status}") if finding.nodes: for node in finding.nodes[:4]: - print(f" Node: {node.name} ({node.node_type}) file={node.file_name} line={node.line}") + logger.info(f" Node: {node.name} ({node.node_type}) file={node.file_name} line={node.line}") # Step 4: Query description - print(f"\n --- Step 4: Query description ---") + logger.info(f"\n --- Step 4: Query description ---") try: query_desc = queries_api.get_sast_query_description( ids=[finding.query_id_str], scan_id=scan_id, ) if query_desc: qd = query_desc[0] - print(f" Description: {(qd.description or '')[:400]}") - print(f" Remediation: {(qd.remediation or '')[:400]}") + logger.info(f" Description: {(qd.description or '')[:400]}") + logger.info(f" Remediation: {(qd.remediation or '')[:400]}") except Exception as e: - print(f" Error: {e}") + logger.error(f" Error: {e}") # Step 5: Check predicates — skip if already triaged by cxservice - print(f"\n --- Step 5: Check predicates ---") + logger.info(f"\n --- Step 5: Check predicates ---") try: predicates = predicates_api.get_all_predicates_for_similarity_id( similarity_id=similarity_id, @@ -204,39 +206,39 @@ def process_finding(idx, total, finding, project, scan_id, scan_id=scan_id, ) except Exception as e: - print(f" Error fetching predicates: {e}") + logger.error(f" Error fetching predicates: {e}") return False if was_triaged_by_cxservice(predicates): - print(f" SKIP: already triaged by {SKIP_USER}") + logger.warning(f" SKIP: already triaged by {SKIP_USER}") return False for proj in (predicates.predicate_history_per_project or []): for p in (proj.predicates or []): - print(f" Pred: {p.state}/{p.severity} by {p.created_by} at {p.created_at}") + logger.info(f" Pred: {p.state}/{p.severity} by {p.created_by} at {p.created_at}") # Step 6: Source file - print(f"\n --- Step 6: Source file ---") + logger.info(f"\n --- Step 6: Source file ---") source_file, source_line = get_source_file_info(finding.nodes) if source_file: - print(f" File: {source_file} (line {source_line})") + logger.info(f" File: {source_file} (line {source_line})") show_source_code(repostore_api, scan_id, source_file, source_line) else: - print(" No source file found.") + logger.info(" No source file found.") # Step 7: Decision - print(f"\n --- Step 7: Decision ---") - print(f" 1 - CONFIRMED 2 - NOT_EXPLOITABLE 3 - Skip") + logger.info(f"\n --- Step 7: Decision ---") + logger.warning(f" 1 - CONFIRMED 2 - NOT_EXPLOITABLE 3 - Skip") choice = input(" > ").strip() if choice not in ("1", "2"): - print(" Skipped.") + logger.warning(" Skipped.") return False new_state = "CONFIRMED" if choice == "1" else "NOT_EXPLOITABLE" comment = input(f" Comment ({new_state}): ").strip() # Step 8: Apply triage - print(f"\n --- Step 8: Apply triage -> {new_state} ---") + logger.info(f"\n --- Step 8: Apply triage -> {new_state} ---") payload = [{ "similarityId": similarity_id, "projectId": project["id"], @@ -249,13 +251,13 @@ def process_finding(idx, total, finding, project, scan_id, success = predicates_api.predicate_severity_and_state_by_similarity_id_and_project_id( data=payload, ) - print(f" Applied: {'OK' if success else 'FAILED'}") + logger.error(f" Applied: {'OK' if success else 'FAILED'}") except Exception as e: - print(f" Error: {e}") + logger.error(f" Error: {e}") return False # Step 9: Verify - print(f"\n --- Step 9: Verify ---") + logger.info(f"\n --- Step 9: Verify ---") try: latest = predicates_api.get_latest_predicates_for_similarity_id( similarity_id=similarity_id, @@ -264,15 +266,15 @@ def process_finding(idx, total, finding, project, scan_id, ) for proj in (latest.predicate_history_per_project or []): for p in (proj.predicates or []): - print(f" Latest: {p.state}/{p.severity} by {p.created_by}") + logger.info(f" Latest: {p.state}/{p.severity} by {p.created_by}") except Exception as e: - print(f" Error: {e}") + logger.error(f" Error: {e}") return True def main(): if len(sys.argv) < 2: - print("Usage: python triage_workflow.py ") + logger.info("Usage: python triage_workflow.py ") sys.exit(1) project_name = sys.argv[1] @@ -287,28 +289,28 @@ def main(): repostore_api = RepoStoreServiceAPI(api_client=api_client) # -------- Step 1: Find project & get last scan -------- - print("=" * 70) - print(f"Step 1: Project '{project_name}'") - print("=" * 70) + logger.info("=" * 70) + logger.info(f"Step 1: Project '{project_name}'") + logger.info("=" * 70) project = find_project_by_name(projects_api, project_name) if not project: - print(f" Project '{project_name}' not found.") + logger.info(f" Project '{project_name}' not found.") sys.exit(1) - print(f" Project ID : {project['id']}") - print(f" Main branch: {project['mainBranch']}") + logger.info(f" Project ID : {project['id']}") + logger.info(f" Main branch: {project['mainBranch']}") scan = get_last_main_branch_scan(projects_api, project["id"]) if not scan: - print(" No scan found on main branch.") + logger.info(" No scan found on main branch.") sys.exit(1) scan_id = scan["id"] - print(f" Scan ID : {scan_id}") - print(f" Status : {scan['status']}") + logger.info(f" Scan ID : {scan_id}") + logger.info(f" Status : {scan['status']}") # -------- Step 2: SAST summary -------- - print(f"\n{'=' * 70}") - print(f"Step 2: SAST summary (by LANGUAGE)") - print(f"{'=' * 70}") + logger.info(f"\n{'=' * 70}") + logger.info(f"Step 2: SAST summary (by LANGUAGE)") + logger.info(f"{'=' * 70}") summary = summary_api.get_sast_aggregate_results( scan_id=scan_id, group_by_field=["LANGUAGE"], @@ -318,18 +320,18 @@ def main(): for item in summary["scannerSummary"]: lang = item.get("languageName") or item.get("label", "?") sev = item.get("severityCounters", {}) or item.get("severity", {}) - print(f" {lang}: {sev}") + logger.info(f" {lang}: {sev}") else: - print(f" Raw: {summary}") + logger.info(f" Raw: {summary}") # -------- Step 3: Iterate all SAST results -------- all_results = fetch_all_results(results_api, scan_id) total = len(all_results) - print(f"\n{'=' * 70}") - print(f"Step 3: {total} SAST results to triage") - print(f"{'=' * 70}") + logger.info(f"\n{'=' * 70}") + logger.info(f"Step 3: {total} SAST results to triage") + logger.info(f"{'=' * 70}") if not all_results: - print(" No results found.") + logger.info(" No results found.") return triaged = 0 @@ -345,9 +347,9 @@ def main(): else: skipped += 1 - print(f"\n{'=' * 70}") - print(f"Done: {total} findings, {triaged} triaged, {skipped} skipped") - print(f"{'=' * 70}") + logger.info(f"\n{'=' * 70}") + logger.warning(f"Done: {total} findings, {triaged} triaged, {skipped} skipped") + logger.info(f"{'=' * 70}") if __name__ == "__main__": diff --git a/examples/CxOne/trigger_scm_project_scans_on_main_branch.py b/examples/CxOne/trigger_scm_project_scans_on_main_branch.py index 3f011009..a9955d5e 100644 --- a/examples/CxOne/trigger_scm_project_scans_on_main_branch.py +++ b/examples/CxOne/trigger_scm_project_scans_on_main_branch.py @@ -23,13 +23,15 @@ from CheckmarxPythonSDK.api_client import ApiClient from CheckmarxPythonSDK.CxOne.projectsAPI import ProjectsAPI from CheckmarxPythonSDK.CxOne.repoManagerAPI import RepoManagerAPI +import logging +logger = logging.getLogger(__name__) def load_dotenv(): """Load .env file from the project root.""" env_path = Path(__file__).resolve().parents[2] / ".env" if not env_path.exists(): - print(f"Warning: {env_path} not found, using environment variables.") + logger.warning(f"Warning: {env_path} not found, using environment variables.") return with open(env_path) as f: for line in f: @@ -94,7 +96,7 @@ def main(): repo_manager_api = RepoManagerAPI(api_client=api_client) project_list = projects_api.get_all_projects() - print(f"Found {len(project_list)} projects.\n") + logger.info(f"Found {len(project_list)} projects.\n") skipped = [] scanned = [] @@ -135,12 +137,9 @@ def main(): repo_identity = scm_repo_id if scm_repo_id else repo_url.rstrip("/").split("/")[-1] - print( - f" {project.name}: " + logger.info(f" {project.name}: " f"origin={origin}, org={organization}, " - f"repo_id={repo_id}, branch={main_branch}", - end="" - ) + f"repo_id={repo_id}, branch={main_branch}") try: result = repo_manager_api.scm_managed_project_scan( @@ -153,29 +152,29 @@ def main(): default_branch=main_branch, ) if result.status_code in (200, 201, 202): - print(" -> OK") + logger.info(" -> OK") scanned.append((project.name, "OK")) else: - print(f" -> FAILED (status={result.status_code})") + logger.error(f" -> FAILED (status={result.status_code})") failed.append((project.name, f"status={result.status_code}")) except Exception as e: - print(f" -> FAILED: {e}") + logger.error(f" -> FAILED: {e}") failed.append((project.name, str(e))) - print(f"\n{'=' * 60}") - print(f"Summary: {len(project_list)} total") - print(f" Scanned: {len(scanned)}") - print(f" Skipped: {len(skipped)}") - print(f" Failed: {len(failed)}") + logger.info(f"\n{'=' * 60}") + logger.info(f"Summary: {len(project_list)} total") + logger.info(f" Scanned: {len(scanned)}") + logger.warning(f" Skipped: {len(skipped)}") + logger.error(f" Failed: {len(failed)}") if skipped: - print(f"\nSkipped:") + logger.warning(f"\nSkipped:") for name, reason in skipped: - print(f" {name}: {reason}") + logger.info(f" {name}: {reason}") if failed: - print(f"\nFailed:") + logger.error(f"\nFailed:") for name, error in failed: - print(f" {name}: {error}") + logger.error(f" {name}: {error}") if __name__ == "__main__": diff --git a/examples/CxOne/update_project_preset.py b/examples/CxOne/update_project_preset.py index e191950b..16deaca3 100644 --- a/examples/CxOne/update_project_preset.py +++ b/examples/CxOne/update_project_preset.py @@ -26,6 +26,8 @@ from CheckmarxPythonSDK.CxOne.projectsAPI import ProjectsAPI from CheckmarxPythonSDK.CxOne.scanConfigurationAPI import ScanConfigurationAPI from CheckmarxPythonSDK.CxOne.dto.ScanParameter import ScanParameter +import logging +logger = logging.getLogger(__name__) PRESET_KEY = "scan.config.sast.presetName" CSV_FILE = Path(__file__).resolve().parent / "project_to_be_update_preset.csv" @@ -36,7 +38,7 @@ def load_dotenv(): """Load .env file from the project root.""" env_path = Path(__file__).resolve().parents[2] / ".env" if not env_path.exists(): - print(f"Warning: {env_path} not found, using environment variables.") + logger.warning(f"Warning: {env_path} not found, using environment variables.") return with open(env_path) as f: for line in f: @@ -81,7 +83,7 @@ def build_configuration() -> Configuration: def load_target_project_names(): """Read project names from the CSV file.""" if not CSV_FILE.exists(): - print(f"Error: {CSV_FILE} not found.") + logger.error(f"Error: {CSV_FILE} not found.") return [] with open(CSV_FILE, newline="") as f: reader = csv.DictReader(f) @@ -98,9 +100,9 @@ def get_preset_param(api: ScanConfigurationAPI, project_id: str): def main(): target_names = load_target_project_names() if not target_names: - print("No project names found in CSV file.") + logger.info("No project names found in CSV file.") return - print(f"Loaded {len(target_names)} project name(s) from {CSV_FILE.name}.\n") + logger.info(f"Loaded {len(target_names)} project name(s) from {CSV_FILE.name}.\n") configuration = build_configuration() api_client = ApiClient(configuration=configuration) @@ -111,24 +113,24 @@ def main(): all_projects = projects_api.get_all_projects() projects = [p for p in all_projects if p.name in target_names] if not projects: - print(f"No target projects found among {len(all_projects)} total projects.") + logger.info(f"No target projects found among {len(all_projects)} total projects.") return - print(f"Found {len(projects)} target project(s) out of {len(all_projects)} total.\n") + logger.info(f"Found {len(projects)} target project(s) out of {len(all_projects)} total.\n") # Step 1: Get current preset for target projects - print("=" * 60) - print("Step 1: Get current project preset") - print("=" * 60) + logger.info("=" * 60) + logger.info("Step 1: Get current project preset") + logger.info("=" * 60) for project in projects: param = get_preset_param(scan_config_api, project.id) value = param.value if param else "N/A" value_display = value if value != "" else "(empty)" - print(f" {project.name}: {value_display}") + logger.info(f" {project.name}: {value_display}") # Step 2: Update preset for target projects - print(f"\n{'=' * 60}") - print("Step 2: Update project preset") - print(f"{'=' * 60}") + logger.info(f"\n{'=' * 60}") + logger.info("Step 2: Update project preset") + logger.info(f"{'=' * 60}") for project in projects: update_param = ScanParameter( key=PRESET_KEY, @@ -141,17 +143,17 @@ def main(): scan_parameters=[update_param], ) status = "OK" if success else "FAILED" - print(f" {project.name}: {status}") + logger.info(f" {project.name}: {status}") # Step 3: Verify preset for target projects - print(f"\n{'=' * 60}") - print("Step 3: Verify project preset") - print(f"{'=' * 60}") + logger.info(f"\n{'=' * 60}") + logger.info("Step 3: Verify project preset") + logger.info(f"{'=' * 60}") for project in projects: param = get_preset_param(scan_config_api, project.id) value = param.value if param else "N/A" value_display = value if value != "" else "(empty)" - print(f" {project.name}: {value_display}") + logger.info(f" {project.name}: {value_display}") if __name__ == "__main__": diff --git a/examples/CxSAST/access_control_demo.py b/examples/CxSAST/access_control_demo.py index 4b3a71ed..aecc4135 100644 --- a/examples/CxSAST/access_control_demo.py +++ b/examples/CxSAST/access_control_demo.py @@ -32,6 +32,8 @@ import csv from CheckmarxPythonSDK.CxRestAPISDK import AccessControlAPI +import logging +logger = logging.getLogger(__name__) def get_users_from_csv_file(file_path): @@ -67,26 +69,22 @@ def add_users_from_csv_file(users): row_number = index + 2 username = user.get("Username") if username in all_user_name: - print( - "Row No.{}, Username: {} already taken, will ignore this line".format( + logger.info("Row No.{}, Username: {} already taken, will ignore this line".format( row_number, username - ) - ) + )) continue email = user.get("Email") if email in all_user_email: - print( - "Row No.{}, Email: {} already taken, will ignore this line".format( + logger.info("Row No.{}, Email: {} already taken, will ignore this line".format( row_number, email - ) - ) + )) continue try: locale_id = all_locale_code.index(user.get("LocaleCode")) + 1 except ValueError: - print("Wrong Locale Code in row No.{}, will use en-US".format(row_number)) + logger.info("Wrong Locale Code in row No.{}, will use en-US".format(row_number)) locale_id = 1 role_ids = [] diff --git a/examples/CxSAST/compare_presets.py b/examples/CxSAST/compare_presets.py index 1e50d483..f3c40d23 100644 --- a/examples/CxSAST/compare_presets.py +++ b/examples/CxSAST/compare_presets.py @@ -8,6 +8,8 @@ import sys from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI from CheckmarxPythonSDK.CxPortalSoapApiSDK import get_query_collection +import logging +logger = logging.getLogger(__name__) projects_api = ProjectsAPI() @@ -28,7 +30,7 @@ def compare_preset_details(preset_a, preset_b, query_map): queries.append(query_map[query_id]) for q in sorted(queries): - print(q) + logger.info(q) def compare_presets(preset_a_name, preset_b_name): @@ -45,11 +47,11 @@ def compare_presets(preset_a_name, preset_b_name): for preset in all_presets: if preset.name.lower() == preset_a_name.lower(): if preset_a: - print(f'Warning: multiple presets match "{preset_a_name}"') + logger.warning(f'Warning: multiple presets match "{preset_a_name}"') preset_a = projects_api.get_preset_details_by_preset_id(preset.id) elif preset.name.lower() == preset_b_name.lower(): if preset_b: - print(f'Warning: multiple presets match "{preset_b_name}"') + logger.warning(f'Warning: multiple presets match "{preset_b_name}"') preset_b = projects_api.get_preset_details_by_preset_id(preset.id) if not preset_a: @@ -69,19 +71,19 @@ def compare_presets(preset_a_name, preset_b_name): for q in queries: query_map[q["QueryId"]] = f'{qg["PackageFullName"]}:{q["Name"]}' - print(f"Queries in {preset_a.name} but not in {preset_b.name}:") + logger.info(f"Queries in {preset_a.name} but not in {preset_b.name}:") compare_preset_details(preset_a, preset_b, query_map) - print() + logger.info("") - print(f"Queries in {preset_b.name} but not in {preset_a.name}:") + logger.info(f"Queries in {preset_b.name} but not in {preset_a.name}:") compare_preset_details(preset_b, preset_a, query_map) if __name__ == "__main__": if len(sys.argv) < 3: - print(f"usage: py {sys.argv[0]} ", file=sys.stderr) + logger.error(f"usage: py {sys.argv[0]} ") sys.exit(1) preset_a = sys.argv[1] @@ -90,5 +92,5 @@ def compare_presets(preset_a_name, preset_b_name): try: compare_presets(preset_a, preset_b) except Exception as e: - print(f"Error: {e}", file=sys.stderr) + logger.error(f"Error: {e}") sys.exit(2) diff --git a/examples/CxSAST/dump_all_path_ids.py b/examples/CxSAST/dump_all_path_ids.py index b66e74a9..c59187cd 100644 --- a/examples/CxSAST/dump_all_path_ids.py +++ b/examples/CxSAST/dump_all_path_ids.py @@ -24,6 +24,8 @@ os.environ[key.strip()] = value.strip().strip("\"'") from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI, ScansAPI +import logging +logger = logging.getLogger(__name__) def main(): @@ -41,21 +43,21 @@ def main(): only_full_scans=True, ) if not scan_id: - print("No qualifying scan found.") + logger.info("No qualifying scan found.") return results = scan_api.get_all_scan_results(scan_id=scan_id, limit=20) path_ids = [r.path_id for r in results] unique = len(set(path_ids)) - print(f"Scan ID: {scan_id}") - print(f"Total fetched: {len(results)}") - print(f"Unique: {unique}") - print(f"Duplicates: {len(results) - unique}") + logger.info(f"Scan ID: {scan_id}") + logger.info(f"Total fetched: {len(results)}") + logger.info(f"Unique: {unique}") + logger.info(f"Duplicates: {len(results) - unique}") - print(f"\n--- All {len(path_ids)} path_ids ---") + logger.info(f"\n--- All {len(path_ids)} path_ids ---") for pid in path_ids: - print(pid) + logger.info(pid) if __name__ == "__main__": diff --git a/examples/CxSAST/generate_report_without_not_exploitable_results.py b/examples/CxSAST/generate_report_without_not_exploitable_results.py index dbbc4a81..e35ac2f5 100644 --- a/examples/CxSAST/generate_report_without_not_exploitable_results.py +++ b/examples/CxSAST/generate_report_without_not_exploitable_results.py @@ -6,6 +6,8 @@ from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI, ScansAPI from CheckmarxPythonSDK.CxPortalSoapApiSDK import create_scan_report +import logging +logger = logging.getLogger(__name__) def get_last_scan_id_of_a_project(team_full_name, project_name): @@ -50,7 +52,7 @@ def get_result_state_id_list(result_state_list): result_state_id = all_result_state_list.index(result_state) result_state_id_list.append(result_state_id) except ValueError: - print("result state: {} Not found".format(result_state)) + logger.info("result state: {} Not found".format(result_state)) return result_state_id_list @@ -73,15 +75,13 @@ def generate_report( scan_api = ScansAPI() if not exists(normpath(reports_folder)): - print("The folder to store the Checkmarx scan reports does not exist") + logger.info("The folder to store the Checkmarx scan reports does not exist") return if not scan_id: - print( - "No scan found for this project, team full name: {}, project name: {}".format( + logger.info("No scan found for this project, team full name: {}, project name: {}".format( team, project - ) - ) + )) return # register scan report diff --git a/examples/CxSAST/get_all_scan_results_and_output_to_csv_file.py b/examples/CxSAST/get_all_scan_results_and_output_to_csv_file.py index a4e1faf6..b48bce8d 100644 --- a/examples/CxSAST/get_all_scan_results_and_output_to_csv_file.py +++ b/examples/CxSAST/get_all_scan_results_and_output_to_csv_file.py @@ -1,6 +1,8 @@ """ Generate a CSV report with all scan results in Checkmarx system """ +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxODataApiSDK import ( dump_last_scan_results_of_each_project_into_csv_file, @@ -9,14 +11,14 @@ if __name__ == "__main__": dump_last_scan_results_of_each_project_into_csv_file(file_path="all_results.csv") - print("finish getting all_results") + logger.info("finish getting all_results") dump_last_scan_results_statistics_of_each_project_into_csv_file( file_path="results_with_count_more_than_20.csv", threshold=20 ) - print("finish getting results_with_count_more_than_20") + logger.info("finish getting results_with_count_more_than_20") dump_last_scan_results_statistics_of_each_project_into_csv_file( file_path="false_positive_results.csv" ) - print("finish getting false_positive_results") + logger.info("finish getting false_positive_results") diff --git a/examples/CxSAST/get_all_teams.py b/examples/CxSAST/get_all_teams.py index d991fb67..c4fa3ab0 100644 --- a/examples/CxSAST/get_all_teams.py +++ b/examples/CxSAST/get_all_teams.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxRestAPISDK import TeamAPI, config +import logging +logger = logging.getLogger(__name__) class ConfigOverride: @@ -33,11 +35,11 @@ def __exit__(self, exc_type, exc_value, traceback): teamAPI = TeamAPI() for c in configs.values(): - print(f'Retrieving data from {c["base_url"]}') + logger.info(f'Retrieving data from {c["base_url"]}') with ConfigOverride(c): teams = teamAPI.get_all_teams() - print(f"Found {len(teams)} teams") + logger.info(f"Found {len(teams)} teams") if len(teams) == 0: - print("Trying again...") + logger.info("Trying again...") teams = teamAPI.get_all_teams - print(f"Found {len(teams)} teams") + logger.info(f"Found {len(teams)} teams") diff --git a/examples/CxSAST/osa_scan_demo.py b/examples/CxSAST/osa_scan_demo.py index 1f054863..0b9c71fe 100644 --- a/examples/CxSAST/osa_scan_demo.py +++ b/examples/CxSAST/osa_scan_demo.py @@ -9,12 +9,14 @@ from CheckmarxPythonSDK.CxRestAPISDK import TeamAPI from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI from CheckmarxPythonSDK.CxRestAPISDK import OsaAPI +import logging +logger = logging.getLogger(__name__) directory = dirname(__file__) # the absolute path of the file config.ini zip_file_path = normpath(join(directory, "JavaVulnerableLab-master.zip")) if not exists(zip_file_path): - print("JavaVulnerableLab-master.zip not found under current directory.") + logger.info("JavaVulnerableLab-master.zip not found under current directory.") def osa_scan(): @@ -51,7 +53,7 @@ def osa_scan(): if osa_scan_state == "Succeeded": break elif osa_scan_state == "Failed": - print("OSA scan failed") + logger.error("OSA scan failed") return else: time.sleep(1) @@ -59,7 +61,7 @@ def osa_scan(): # 6. get summary report summary_report = osa_api.get_osa_scan_summary_report(scan_id=scan_id) - print(summary_report) + logger.info(summary_report) if __name__ == "__main__": diff --git a/examples/CxSAST/scan_from_git.py b/examples/CxSAST/scan_from_git.py index 2221c097..e04c0567 100644 --- a/examples/CxSAST/scan_from_git.py +++ b/examples/CxSAST/scan_from_git.py @@ -22,6 +22,8 @@ from CheckmarxPythonSDK.CxRestAPISDK import TeamAPI from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI from CheckmarxPythonSDK.CxRestAPISDK import ScansAPI +import logging +logger = logging.getLogger(__name__) def scan_from_git( @@ -48,17 +50,17 @@ def scan_from_git( param_str += "git_repo_url: {}, \n".format(git_repo_url) param_str += "branch: {}, \n".format(branch) param_str += "report_folder: {}".format(report_folder) - print(param_str) + logger.info(param_str) projects_api = ProjectsAPI() team_api = TeamAPI() scan_api = ScansAPI() # 2. get team id - print("2. get team id") + logger.info("2. get team id") team_id = team_api.get_team_id_by_team_full_name(team_full_name) if not team_id: - print("team: {} not exist".format(team_full_name)) + logger.info("team: {} not exist".format(team_full_name)) return project_id = projects_api.get_project_id_by_project_name_and_team_full_name( @@ -66,30 +68,30 @@ def scan_from_git( ) # 3. create project with default configuration, will get project id - print("3. create project with default configuration, will get project id") + logger.info("3. create project with default configuration, will get project id") if not project_id: project = projects_api.create_project_with_default_configuration( project_name=project_name, team_id=team_id ) project_id = project.id - print("project_id: {}".format(project_id)) + logger.info("project_id: {}".format(project_id)) # 4. set remote source setting to git - print("4. set remote source setting to git") + logger.info("4. set remote source setting to git") projects_api.set_remote_source_setting_to_git( project_id=project_id, url=git_repo_url, branch=branch ) # 6. set data retention settings by project id - print("6. set data retention settings by project id") + logger.info("6. set data retention settings by project id") projects_api.set_data_retention_settings_by_project_id( project_id=project_id, scans_to_keep=3 ) # 7. define SAST scan settings - print("7. define SAST scan settings") + logger.info("7. define SAST scan settings") preset_id = projects_api.get_preset_id_by_name(preset_name="All") - print("preset id: {}".format(preset_id)) + logger.info("preset id: {}".format(preset_id)) scan_api.define_sast_scan_settings(project_id=project_id, preset_id=preset_id) projects_api.set_project_exclude_settings_by_project_id( @@ -97,17 +99,17 @@ def scan_from_git( ) # 8. create new scan, will get a scan id - print("8. create new scan, will get a scan id") + logger.info("8. create new scan, will get a scan id") scan = scan_api.create_new_scan(project_id=project_id) scan_id = scan.id - print("scan_id : {}".format(scan_id)) + logger.info("scan_id : {}".format(scan_id)) # 9. get scan details by scan id - print("9. get scan details by scan id") + logger.info("9. get scan details by scan id") while True: scan_detail = scan_api.get_sast_scan_details_by_scan_id(scan_id=scan_id) scan_status = scan_detail.status.name - print("scan_status: {}".format(scan_status)) + logger.info("scan_status: {}".format(scan_status)) if scan_status == "Finished": break elif scan_status == "Failed": @@ -115,24 +117,24 @@ def scan_from_git( time.sleep(10) # 11[optional]. get statistics results by scan id - print("11[optional]. get statistics results by scan id") + logger.info("11[optional]. get statistics results by scan id") statistics = scan_api.get_statistics_results_by_scan_id(scan_id=scan_id) if statistics: - print(statistics) + logger.info(statistics) # 12. register scan report - print("12. register scan report") + logger.info("12. register scan report") report = scan_api.register_scan_report(scan_id=scan_id, report_type=report_type) report_id = report.report_id - print("report_id : {}".format(report_id)) + logger.info("report_id : {}".format(report_id)) # 13. get report status by id - print("13. get report status by id") + logger.info("13. get report status by id") while not scan_api.is_report_generation_finished(report_id): time.sleep(10) # 14. get report by id - print("14. get report by id") + logger.info("14. get report by id") report_content = scan_api.get_report_by_id(report_id) time_stamp = datetime.now().strftime("_%Y_%m_%d_%H_%M_%S") diff --git a/examples/CxSAST/scan_from_local_zip.py b/examples/CxSAST/scan_from_local_zip.py index 02e541e1..cd8e8c28 100644 --- a/examples/CxSAST/scan_from_local_zip.py +++ b/examples/CxSAST/scan_from_local_zip.py @@ -24,6 +24,8 @@ from CheckmarxPythonSDK.CxRestAPISDK import TeamAPI from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI from CheckmarxPythonSDK.CxRestAPISDK import ScansAPI +import logging +logger = logging.getLogger(__name__) def scan_from_local( @@ -46,24 +48,24 @@ def scan_from_local( report_folder = dirname(__file__) if not exists(zip_file_path): - print("zip file not found. \n abort scan.") + logger.error("zip file not found. \n abort scan.") return param_str = "team_full_name: {}, \n".format(team_full_name) param_str += "project_name: {}, \n".format(project_name) param_str += "report_type: {}, \n".format(report_type) param_str += "zip_file_path: {}, \n".format(zip_file_path) param_str += "report_folder: {}".format(report_folder) - print(param_str) + logger.info(param_str) team_api = TeamAPI() projects_api = ProjectsAPI() scan_api = ScansAPI() # 2. get team id - print("2. get team id") + logger.info("2. get team id") team_id = team_api.get_team_id_by_team_full_name(team_full_name) if not team_id: - print("team: {} not exist".format(team_full_name)) + logger.info("team: {} not exist".format(team_full_name)) return project_id = projects_api.get_project_id_by_project_name_and_team_full_name( @@ -71,28 +73,28 @@ def scan_from_local( ) # 3. create project with default configuration, will get project id - print("3. create project with default configuration, will get project id") + logger.info("3. create project with default configuration, will get project id") if not project_id: project = projects_api.create_project_with_default_configuration( project_name=project_name, team_id=team_id ) project_id = project.id - print("project_id: {}".format(project_id)) + logger.info("project_id: {}".format(project_id)) # 4. upload source code zip file - print("4. upload source code zip file") + logger.info("4. upload source code zip file") projects_api.upload_source_code_zip_file(project_id, str(zip_file_path)) # 6. set data retention settings by project id - print("6. set data retention settings by project id") + logger.info("6. set data retention settings by project id") projects_api.set_data_retention_settings_by_project_id( project_id=project_id, scans_to_keep=3 ) # 7. define SAST scan settings - print("7. define SAST scan settings") + logger.info("7. define SAST scan settings") preset_id = projects_api.get_preset_id_by_name(preset_name="All") - print("preset id: {}".format(preset_id)) + logger.info("preset id: {}".format(preset_id)) scan_api.define_sast_scan_settings(project_id=project_id, preset_id=preset_id) projects_api.set_project_exclude_settings_by_project_id( @@ -100,17 +102,17 @@ def scan_from_local( ) # 8. create new scan, will get a scan id - print("8. create new scan, will get a scan id") + logger.info("8. create new scan, will get a scan id") scan = scan_api.create_new_scan(project_id=project_id) scan_id = scan.id - print("scan_id : {}".format(scan_id)) + logger.info("scan_id : {}".format(scan_id)) # 9. get scan details by scan id - print("9. get scan details by scan id") + logger.info("9. get scan details by scan id") while True: scan_detail = scan_api.get_sast_scan_details_by_scan_id(scan_id=scan_id) scan_status = scan_detail.status.name - print("scan_status: {}".format(scan_status)) + logger.info("scan_status: {}".format(scan_status)) if scan_status == "Finished": break elif scan_status == "Failed": @@ -118,24 +120,24 @@ def scan_from_local( time.sleep(10) # 11[optional]. get statistics results by scan id - print("11[optional]. get statistics results by scan id") + logger.info("11[optional]. get statistics results by scan id") statistics = scan_api.get_statistics_results_by_scan_id(scan_id=scan_id) if statistics: - print(statistics) + logger.info(statistics) # 12. register scan report - print("12. register scan report") + logger.info("12. register scan report") report = scan_api.register_scan_report(scan_id=scan_id, report_type=report_type) report_id = report.report_id - print("report_id : {}".format(report_id)) + logger.info("report_id : {}".format(report_id)) # 13. get report status by id - print("13. get report status by id") + logger.info("13. get report status by id") while not scan_api.is_report_generation_finished(report_id): time.sleep(10) # 14. get report by id - print("14. get report by id") + logger.info("14. get report by id") report_content = scan_api.get_report_by_id(report_id) time_stamp = datetime.now().strftime("_%Y_%m_%d_%H_%M_%S") diff --git a/examples/CxSCA/cxsca_scan.py b/examples/CxSCA/cxsca_scan.py index 557a700d..c32f053b 100644 --- a/examples/CxSCA/cxsca_scan.py +++ b/examples/CxSCA/cxsca_scan.py @@ -7,6 +7,8 @@ import time from datetime import datetime from os.path import exists +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxScaApiSDK import ( check_if_project_already_exists, @@ -33,56 +35,52 @@ def get_project_id(project_name): def sca_scan(project_name, zip_file_path): if not exists(zip_file_path): - print("zip_file_path:{} not exists. \n abort scan.".format(zip_file_path)) + logger.error("zip_file_path:{} not exists. \n abort scan.".format(zip_file_path)) return project_id = get_project_id(project_name) - print("project_id: {}".format(project_id)) + logger.info("project_id: {}".format(project_id)) upload_link = generate_upload_link_for_scanning(project_id=project_id) is_successful = upload_zip_content_for_scanning(upload_link, zip_file_path) if not is_successful: - print( - "Fail to upload file with upload link: {} \n abort scan.".format( + logger.error("Fail to upload file with upload link: {} \n abort scan.".format( upload_link - ) - ) + )) return scan_id = scan_previously_uploaded_zip( project_id=project_id, uploaded_file_url=upload_link ) - print("scan_id: {}".format(scan_id)) + logger.info("scan_id: {}".format(scan_id)) while True: response = get_scan_status(scan_id=scan_id) scan_status = response.get("name") if scan_status == "Scanning": - print("scanning ...") + logger.info("scanning ...") time.sleep(60) continue elif scan_status == "Done": - print("scan finished successfully!") + logger.info("scan finished successfully!") break elif scan_status == "Failed": - print( - "scan_status:{}, message:{}".format( + logger.info("scan_status:{}, message:{}".format( scan_status, response.get("message") - ) - ) + )) return risk_report_summary = get_risk_report_summary(project_id=project_id) - print("risk_report_summary:{}".format(risk_report_summary)) + logger.info("risk_report_summary:{}".format(risk_report_summary)) packages = get_packages_of_a_scan(scan_id=scan_id) - print("get packages of a scan") + logger.info("get packages of a scan") vulnerabilities = get_vulnerabilities_of_a_scan(scan_id=scan_id) - print("get vulnerabilities of a scan") + logger.info("get vulnerabilities of a scan") licenses = get_licenses_of_a_scan(scan_id=scan_id) - print("get licenses of a scan") + logger.info("get licenses of a scan") time_stamp = datetime.now().strftime("_%Y_%m_%d_%H_%M_%S") - print("create sca json report") + logger.info("create sca json report") with open("sca_report" + time_stamp + ".json", "w") as out_file: out_file.write( json.dumps( diff --git a/tests/CxOne/KeycloakAPI/test_client_registration_policy_api.py b/tests/CxOne/KeycloakAPI/test_client_registration_policy_api.py index fba507b9..adb39b44 100644 --- a/tests/CxOne/KeycloakAPI/test_client_registration_policy_api.py +++ b/tests/CxOne/KeycloakAPI/test_client_registration_policy_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.ClientRegistrationPolicyApi import ( ClientRegistrationPolicyApi, ) @@ -17,10 +19,10 @@ def test_get_providers(self): try: providers = self.client_registration_policy_api.get_providers(self.realm) assert isinstance(providers, list) - print(f"Got {len(providers)} client registration policy providers") + logger.info(f"Got {len(providers)} client registration policy providers") for provider in providers: - print(f" - {provider.id}") + logger.info(f" - {provider.id}") except Exception as e: - print(f"Error in test_get_providers: {e}") + logger.error(f"Error in test_get_providers: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True diff --git a/tests/CxOne/KeycloakAPI/test_client_role_mappings_api.py b/tests/CxOne/KeycloakAPI/test_client_role_mappings_api.py index 19145755..883d82b4 100644 --- a/tests/CxOne/KeycloakAPI/test_client_role_mappings_api.py +++ b/tests/CxOne/KeycloakAPI/test_client_role_mappings_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.ClientRoleMappingsApi import ( ClientRoleMappingsApi, ) @@ -22,11 +24,11 @@ def test_get_group_role_mappings_client(self): self.realm, self.test_group_id, self.test_client_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} group role mappings for client") + logger.info(f"Got {len(roles)} group role mappings for client") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_group_role_mappings_client: {e}") + logger.error(f"Error in test_get_group_role_mappings_client: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -50,7 +52,7 @@ def test_delete_group_role_mappings_client(self): assert deleted is True except Exception as e: - print(f"Error in test_delete_group_role_mappings_client: {e}") + logger.error(f"Error in test_delete_group_role_mappings_client: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -63,11 +65,11 @@ def test_get_group_role_mappings_client_available(self): ) ) assert isinstance(available_roles, list) - print(f"Got {len(available_roles)} available group role mappings") + logger.info(f"Got {len(available_roles)} available group role mappings") for role in available_roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_group_role_mappings_client_available: {e}") + logger.error(f"Error in test_get_group_role_mappings_client_available: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -80,11 +82,11 @@ def test_get_group_role_mappings_client_composite(self): ) ) assert isinstance(composite_roles, list) - print(f"Got {len(composite_roles)} composite group role mappings") + logger.info(f"Got {len(composite_roles)} composite group role mappings") for role in composite_roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_group_role_mappings_client_composite: {e}") + logger.error(f"Error in test_get_group_role_mappings_client_composite: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -95,11 +97,11 @@ def test_get_user_role_mappings_client(self): self.realm, self.test_user_id, self.test_client_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} user role mappings for client") + logger.info(f"Got {len(roles)} user role mappings for client") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_user_role_mappings_client: {e}") + logger.error(f"Error in test_get_user_role_mappings_client: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -110,18 +112,18 @@ def test_post_user_role_mappings_client(self): added = self.client_role_mappings_api.post_user_role_mappings_client( self.realm, self.test_user_id, self.test_client_id, role_representations=[role_representation] ) - print(f"Added user role mapping: {added}") + logger.info(f"Added user role mapping: {added}") assert added is True roles = self.client_role_mappings_api.get_user_role_mappings_client( self.realm, self.test_user_id, self.test_client_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} user role mappings for client") + logger.info(f"Got {len(roles)} user role mappings for client") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") assert role_representation.name in [role.name for role in roles] except Exception as e: - print(f"Error in test_post_user_role_mappings_client: {e}") + logger.error(f"Error in test_post_user_role_mappings_client: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -132,15 +134,15 @@ def test_delete_user_role_mappings_client(self): deleted = self.client_role_mappings_api.delete_user_role_mappings_client( self.realm, self.test_user_id, self.test_client_id, role_representations=[role_representation] ) - print(f"Deleted user role mapping: {deleted}") + logger.info(f"Deleted user role mapping: {deleted}") assert deleted is True roles = self.client_role_mappings_api.get_user_role_mappings_client( self.realm, self.test_user_id, self.test_client_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} user role mappings for client") + logger.info(f"Got {len(roles)} user role mappings for client") except Exception as e: - print(f"Error in test_delete_user_role_mappings_client: {e}") + logger.error(f"Error in test_delete_user_role_mappings_client: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -153,11 +155,11 @@ def test_get_user_role_mappings_client_available(self): ) ) assert isinstance(available_roles, list) - print(f"Got {len(available_roles)} available user role mappings") + logger.info(f"Got {len(available_roles)} available user role mappings") for role in available_roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_user_role_mappings_client_available: {e}") + logger.error(f"Error in test_get_user_role_mappings_client_available: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -170,10 +172,10 @@ def test_get_user_role_mappings_client_composite(self): ) ) assert isinstance(composite_roles, list) - print(f"Got {len(composite_roles)} composite user role mappings") + logger.info(f"Got {len(composite_roles)} composite user role mappings") for role in composite_roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_user_role_mappings_client_composite: {e}") + logger.error(f"Error in test_get_user_role_mappings_client_composite: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True diff --git a/tests/CxOne/KeycloakAPI/test_client_roles_api.py b/tests/CxOne/KeycloakAPI/test_client_roles_api.py index aaced999..fb0a46dd 100644 --- a/tests/CxOne/KeycloakAPI/test_client_roles_api.py +++ b/tests/CxOne/KeycloakAPI/test_client_roles_api.py @@ -1,5 +1,7 @@ import pytest from CheckmarxPythonSDK.CxOne.KeycloakAPI.ClientRolesApi import ClientRolesApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.RoleRepresentation import ( RoleRepresentation, ) @@ -31,11 +33,11 @@ def test_get_client_roles(self): self.realm, self.test_client_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} client roles") + logger.info(f"Got {len(roles)} client roles") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_client_roles: {e}") + logger.error(f"Error in test_get_client_roles: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -46,9 +48,9 @@ def test_post_client_roles(self): created = self.client_roles_api.post_client_roles( self.realm, self.test_client_id, role_representation ) - print(f"Created client role: {created}") + logger.info(f"Created client role: {created}") except Exception as e: - print(f"Error in test_post_client_roles: {e}") + logger.error(f"Error in test_post_client_roles: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -59,9 +61,9 @@ def test_get_client_role(self): self.realm, self.test_client_id, self.test_role_name ) assert role is not None - print(f"Got client role: {role.name}") + logger.info(f"Got client role: {role.name}") except Exception as e: - print(f"Error in test_get_client_role: {e}") + logger.error(f"Error in test_get_client_role: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -75,9 +77,9 @@ def test_put_client_role(self): self.test_role_name, role_representation, ) - print(f"Updated client role: {updated}") + logger.info(f"Updated client role: {updated}") except Exception as e: - print(f"Error in test_put_client_role: {e}") + logger.error(f"Error in test_put_client_role: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -87,9 +89,9 @@ def test_delete_client_role(self): deleted = self.client_roles_api.delete_client_role( self.realm, self.test_client_id, self.test_role_name ) - print(f"Deleted client role: {deleted}") + logger.info(f"Deleted client role: {deleted}") except Exception as e: - print(f"Error in test_delete_client_role: {e}") + logger.error(f"Error in test_delete_client_role: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -100,11 +102,11 @@ def test_get_client_role_composites(self): self.realm, self.test_client_id, self.test_role_name ) assert isinstance(composites, list) - print(f"Got {len(composites)} client role composites") + logger.info(f"Got {len(composites)} client role composites") for composite in composites: - print(f" - {composite.name}") + logger.info(f" - {composite.name}") except Exception as e: - print(f"Error in test_get_client_role_composites: {e}") + logger.error(f"Error in test_get_client_role_composites: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -118,9 +120,9 @@ def test_post_client_role_composites(self): self.test_role_name, role_representation, ) - print(f"Added client role composite: {added}") + logger.info(f"Added client role composite: {added}") except Exception as e: - print(f"Error in test_post_client_role_composites: {e}") + logger.error(f"Error in test_post_client_role_composites: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -130,9 +132,9 @@ def test_delete_client_role_composites(self): removed = self.client_roles_api.delete_client_role_composites( self.realm, self.test_client_id, self.test_role_name ) - print(f"Removed client role composites: {removed}") + logger.info(f"Removed client role composites: {removed}") except Exception as e: - print(f"Error in test_delete_client_role_composites: {e}") + logger.error(f"Error in test_delete_client_role_composites: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -146,11 +148,11 @@ def test_get_client_role_composites_client(self): self.test_client_uuid, ) assert isinstance(composites, list) - print(f"Got {len(composites)} client role composites for client") + logger.info(f"Got {len(composites)} client role composites for client") for composite in composites: - print(f" - {composite.name}") + logger.info(f" - {composite.name}") except Exception as e: - print(f"Error in test_get_client_role_composites_client: {e}") + logger.error(f"Error in test_get_client_role_composites_client: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -161,11 +163,11 @@ def test_get_client_role_composites_realm(self): self.realm, self.test_client_id, self.test_role_name ) assert isinstance(composites, list) - print(f"Got {len(composites)} client role composites for realm") + logger.info(f"Got {len(composites)} client role composites for realm") for composite in composites: - print(f" - {composite.name}") + logger.info(f" - {composite.name}") except Exception as e: - print(f"Error in test_get_client_role_composites_realm: {e}") + logger.error(f"Error in test_get_client_role_composites_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -176,11 +178,11 @@ def test_get_client_role_groups(self): self.realm, self.test_client_id, self.test_role_name ) assert isinstance(groups, list) - print(f"Got {len(groups)} client role groups") + logger.info(f"Got {len(groups)} client role groups") for group in groups: - print(f" - {group.name}") + logger.info(f" - {group.name}") except Exception as e: - print(f"Error in test_get_client_role_groups: {e}") + logger.error(f"Error in test_get_client_role_groups: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -191,9 +193,9 @@ def test_get_client_role_management_permissions(self): self.realm, self.test_client_id, self.test_role_name ) assert permissions is not None - print(f"Got client role management permissions: {permissions.to_dict()}") + logger.info(f"Got client role management permissions: {permissions.to_dict()}") except Exception as e: - print(f"Error in test_get_client_role_management_permissions: {e}") + logger.error(f"Error in test_get_client_role_management_permissions: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -204,11 +206,11 @@ def test_get_client_role_users(self): self.realm, self.test_client_id, self.test_role_name ) assert isinstance(users, list) - print(f"Got {len(users)} client role users") + logger.info(f"Got {len(users)} client role users") for user in users: - print(f" - {user.username}") + logger.info(f" - {user.username}") except Exception as e: - print(f"Error in test_get_client_role_users: {e}") + logger.error(f"Error in test_get_client_role_users: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -217,11 +219,11 @@ def test_get_roles_by_realm(self): try: roles = self.client_roles_api.get_roles_by_realm(self.realm) assert isinstance(roles, list) - print(f"Got {len(roles)} realm roles") + logger.info(f"Got {len(roles)} realm roles") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_roles_by_realm: {e}") + logger.error(f"Error in test_get_roles_by_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -232,9 +234,9 @@ def test_post_roles_by_realm(self): created = self.client_roles_api.post_roles_by_realm( self.realm, role_representation ) - print(f"Created realm role: {created}") + logger.info(f"Created realm role: {created}") except Exception as e: - print(f"Error in test_post_roles_by_realm: {e}") + logger.error(f"Error in test_post_roles_by_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -245,9 +247,9 @@ def test_get_role_by_realm_by_role_name(self): self.realm, self.test_role_name ) assert role is not None - print(f"Got realm role by name: {role.name}") + logger.info(f"Got realm role by name: {role.name}") except Exception as e: - print(f"Error in test_get_role_by_realm_by_role_name: {e}") + logger.error(f"Error in test_get_role_by_realm_by_role_name: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -258,9 +260,9 @@ def test_put_role_by_realm_by_role_name(self): updated = self.client_roles_api.put_role_by_realm_by_role_name( self.realm, self.test_role_name, role_representation ) - print(f"Updated realm role: {updated}") + logger.info(f"Updated realm role: {updated}") except Exception as e: - print(f"Error in test_put_role_by_realm_by_role_name: {e}") + logger.error(f"Error in test_put_role_by_realm_by_role_name: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -270,8 +272,8 @@ def test_delete_role_by_realm_by_role_name(self): deleted = self.client_roles_api.delete_role_by_realm_by_role_name( self.realm, self.test_role_name ) - print(f"Deleted realm role: {deleted}") + logger.info(f"Deleted realm role: {deleted}") except Exception as e: - print(f"Error in test_delete_role_by_realm_by_role_name: {e}") + logger.error(f"Error in test_delete_role_by_realm_by_role_name: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True diff --git a/tests/CxOne/KeycloakAPI/test_client_scopes_api.py b/tests/CxOne/KeycloakAPI/test_client_scopes_api.py index c2ecf910..48412eb1 100644 --- a/tests/CxOne/KeycloakAPI/test_client_scopes_api.py +++ b/tests/CxOne/KeycloakAPI/test_client_scopes_api.py @@ -1,5 +1,7 @@ import pytest from CheckmarxPythonSDK.CxOne.KeycloakAPI.ClientScopesApi import ClientScopesApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.ClientScopeRepresentation import ( ClientScopeRepresentation, ) @@ -18,11 +20,11 @@ def test_get_client_scopes(self): try: client_scopes = self.client_scopes_api.get_client_scopes(self.realm) assert isinstance(client_scopes, list) - print(f"Got {len(client_scopes)} client scopes") + logger.info(f"Got {len(client_scopes)} client scopes") for client_scope in client_scopes: - print(f" - {client_scope.name} (ID: {client_scope.id})") + logger.info(f" - {client_scope.name} (ID: {client_scope.id})") except Exception as e: - print(f"Error in test_get_client_scopes: {e}") + logger.error(f"Error in test_get_client_scopes: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -35,9 +37,9 @@ def test_post_client_scopes(self): created = self.client_scopes_api.post_client_scopes( self.realm, client_scope_representation ) - print(f"Created client scope: {created}") + logger.info(f"Created client scope: {created}") except Exception as e: - print(f"Error in test_post_client_scopes: {e}") + logger.error(f"Error in test_post_client_scopes: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -48,9 +50,9 @@ def test_get_client_scope(self): self.realm, self.test_client_scope_id ) assert client_scope is not None - print(f"Got client scope: {client_scope.name} (ID: {client_scope.id})") + logger.info(f"Got client scope: {client_scope.name} (ID: {client_scope.id})") except Exception as e: - print(f"Error in test_get_client_scope: {e}") + logger.error(f"Error in test_get_client_scope: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -63,9 +65,9 @@ def test_put_client_scope(self): updated = self.client_scopes_api.put_client_scope( self.realm, self.test_client_scope_id, client_scope_representation ) - print(f"Updated client scope: {updated}") + logger.info(f"Updated client scope: {updated}") except Exception as e: - print(f"Error in test_put_client_scope: {e}") + logger.error(f"Error in test_put_client_scope: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -75,9 +77,9 @@ def test_delete_client_scope(self): deleted = self.client_scopes_api.delete_client_scope( self.realm, self.test_client_scope_id ) - print(f"Deleted client scope: {deleted}") + logger.info(f"Deleted client scope: {deleted}") except Exception as e: - print(f"Error in test_delete_client_scope: {e}") + logger.error(f"Error in test_delete_client_scope: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -86,11 +88,11 @@ def test_get_client_templates(self): try: client_templates = self.client_scopes_api.get_client_templates(self.realm) assert isinstance(client_templates, list) - print(f"Got {len(client_templates)} client templates") + logger.info(f"Got {len(client_templates)} client templates") for client_template in client_templates: - print(f" - {client_template.name} (ID: {client_template.id})") + logger.info(f" - {client_template.name} (ID: {client_template.id})") except Exception as e: - print(f"Error in test_get_client_templates: {e}") + logger.error(f"Error in test_get_client_templates: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -103,9 +105,9 @@ def test_post_client_templates(self): created = self.client_scopes_api.post_client_templates( self.realm, client_scope_representation ) - print(f"Created client template: {created}") + logger.info(f"Created client template: {created}") except Exception as e: - print(f"Error in test_post_client_templates: {e}") + logger.error(f"Error in test_post_client_templates: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -116,11 +118,9 @@ def test_get_client_template(self): self.realm, self.test_client_template_id ) assert client_template is not None - print( - f"Got client template: {client_template.name} (ID: {client_template.id})" - ) + logger.info(f"Got client template: {client_template.name} (ID: {client_template.id})") except Exception as e: - print(f"Error in test_get_client_template: {e}") + logger.error(f"Error in test_get_client_template: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -133,9 +133,9 @@ def test_put_client_template(self): updated = self.client_scopes_api.put_client_template( self.realm, self.test_client_template_id, client_scope_representation ) - print(f"Updated client template: {updated}") + logger.info(f"Updated client template: {updated}") except Exception as e: - print(f"Error in test_put_client_template: {e}") + logger.error(f"Error in test_put_client_template: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -145,8 +145,8 @@ def test_delete_client_template(self): deleted = self.client_scopes_api.delete_client_template( self.realm, self.test_client_template_id ) - print(f"Deleted client template: {deleted}") + logger.info(f"Deleted client template: {deleted}") except Exception as e: - print(f"Error in test_delete_client_template: {e}") + logger.error(f"Error in test_delete_client_template: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True diff --git a/tests/CxOne/KeycloakAPI/test_clients_api.py b/tests/CxOne/KeycloakAPI/test_clients_api.py index 2e97a2cf..65bf81e1 100644 --- a/tests/CxOne/KeycloakAPI/test_clients_api.py +++ b/tests/CxOne/KeycloakAPI/test_clients_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.KeycloakAPI import ClientsApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.ClientRepresentation import ( ClientRepresentation, ) @@ -13,11 +15,11 @@ def test_get_clients(self): try: clients = self.clients_api.get_clients(realm=self.realm) for client in clients: - print(client) + logger.info(client) assert isinstance(clients, list) - print(f"Got {len(clients)} clients") + logger.info(f"Got {len(clients)} clients") except Exception as e: - print(f"Error in test_get_clients: {e}") + logger.error(f"Error in test_get_clients: {e}") assert True def test_client_crud(self): @@ -40,7 +42,7 @@ def test_client_crud(self): create_successful = self.clients_api.post_clients( realm=self.realm, client_representation=client_representation ) - print(f"Create client {test_client_id} successful: {create_successful}") + logger.info(f"Create client {test_client_id} successful: {create_successful}") client_id = None created_clients = self.clients_api.get_clients( @@ -54,20 +56,20 @@ def test_client_crud(self): assert created_client is not None created_client.name = "test_client_2026_02_24_updated" - print(f"Update client {created_client.client_id} to {created_client.name}") + logger.info(f"Update client {created_client.client_id} to {created_client.name}") update_successful = self.clients_api.put_client( realm=self.realm, id=client_id, client_representation=created_client, ) - print(f"Update client successful: {update_successful}") + logger.info(f"Update client successful: {update_successful}") delete_successful = self.clients_api.delete_client_by_realm_by_id( realm=self.realm, id=client_id ) - print(f"Delete client successful: {delete_successful}") + logger.info(f"Delete client successful: {delete_successful}") except Exception as e: - print(f"Error in test_client_crud: {e}") + logger.error(f"Error in test_client_crud: {e}") assert True def test_client_secret_operations(self): @@ -75,19 +77,19 @@ def test_client_secret_operations(self): clients = self.clients_api.get_clients(realm=self.realm) if clients: test_client = clients[0] - print(f"Testing with client: {test_client.client_id}") + logger.info(f"Testing with client: {test_client.client_id}") secret = self.clients_api.get_client_secret( realm=self.realm, id=test_client.id ) - print(f"Got client secret: {secret is not None}") + logger.info(f"Got client secret: {secret is not None}") new_secret = self.clients_api.post_client_secret( realm=self.realm, id=test_client.id ) - print(f"Generated new secret: {new_secret is not None}") + logger.info(f"Generated new secret: {new_secret is not None}") except Exception as e: - print(f"Error in test_client_secret_operations: {e}") + logger.error(f"Error in test_client_secret_operations: {e}") assert True def test_client_scopes(self): @@ -95,19 +97,19 @@ def test_client_scopes(self): clients = self.clients_api.get_clients(realm=self.realm) if clients: test_client = clients[0] - print(f"Testing with client: {test_client.client_id}") + logger.info(f"Testing with client: {test_client.client_id}") default_scopes = self.clients_api.get_default_client_scopes( realm=self.realm, id=test_client.id ) - print(f"Got {len(default_scopes)} default scopes") + logger.info(f"Got {len(default_scopes)} default scopes") optional_scopes = self.clients_api.get_optional_client_scopes( realm=self.realm, id=test_client.id ) - print(f"Got {len(optional_scopes)} optional scopes") + logger.info(f"Got {len(optional_scopes)} optional scopes") except Exception as e: - print(f"Error in test_client_scopes: {e}") + logger.error(f"Error in test_client_scopes: {e}") assert True def test_client_sessions(self): @@ -115,19 +117,19 @@ def test_client_sessions(self): clients = self.clients_api.get_clients(realm=self.realm) if clients: test_client = clients[0] - print(f"Testing with client: {test_client.client_id}") + logger.info(f"Testing with client: {test_client.client_id}") session_count = self.clients_api.get_session_count( realm=self.realm, id=test_client.id ) - print(f"Session count: {session_count}") + logger.info(f"Session count: {session_count}") offline_session_count = self.clients_api.get_offline_session_count( realm=self.realm, id=test_client.id ) - print(f"Offline session count: {offline_session_count}") + logger.info(f"Offline session count: {offline_session_count}") except Exception as e: - print(f"Error in test_client_sessions: {e}") + logger.error(f"Error in test_client_sessions: {e}") assert True def test_other_client_methods(self): @@ -135,17 +137,17 @@ def test_other_client_methods(self): clients = self.clients_api.get_clients(realm=self.realm) if clients: test_client = clients[0] - print(f"Testing with client: {test_client.client_id}") + logger.info(f"Testing with client: {test_client.client_id}") permissions = self.clients_api.get_client_management_permissions( realm=self.realm, id=test_client.id ) - print(f"Got management permissions: {permissions is not None}") + logger.info(f"Got management permissions: {permissions is not None}") service_account_user = self.clients_api.get_service_account_user( realm=self.realm, id=test_client.id ) - print(f"Got service account user: {service_account_user is not None}") + logger.info(f"Got service account user: {service_account_user is not None}") except Exception as e: - print(f"Error in test_other_client_methods: {e}") + logger.error(f"Error in test_other_client_methods: {e}") assert True diff --git a/tests/CxOne/KeycloakAPI/test_component_api.py b/tests/CxOne/KeycloakAPI/test_component_api.py index 22e41bef..73680847 100644 --- a/tests/CxOne/KeycloakAPI/test_component_api.py +++ b/tests/CxOne/KeycloakAPI/test_component_api.py @@ -1,5 +1,7 @@ import pytest from CheckmarxPythonSDK.CxOne.KeycloakAPI.ComponentApi import ComponentApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.ComponentRepresentation import ( ComponentRepresentation, ) @@ -21,11 +23,11 @@ def test_get_components(self): try: components = self.component_api.get_components(self.realm) assert isinstance(components, list) - print(f"Got {len(components)} components") + logger.info(f"Got {len(components)} components") for component in components: - print(f" - {component.name} (ID: {component.id})") + logger.info(f" - {component.name} (ID: {component.id})") except Exception as e: - print(f"Error in test_get_components: {e}") + logger.error(f"Error in test_get_components: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -36,11 +38,11 @@ def test_get_components_with_parameters(self): self.realm, name=self.test_component_name, type=self.test_component_type ) assert isinstance(components, list) - print(f"Got {len(components)} components with filters") + logger.info(f"Got {len(components)} components with filters") for component in components: - print(f" - {component.name} (ID: {component.id})") + logger.info(f" - {component.name} (ID: {component.id})") except Exception as e: - print(f"Error in test_get_components_with_parameters: {e}") + logger.error(f"Error in test_get_components_with_parameters: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -53,9 +55,9 @@ def test_post_components(self): created = self.component_api.post_components( self.realm, component_representation ) - print(f"Created component: {created}") + logger.info(f"Created component: {created}") except Exception as e: - print(f"Error in test_post_components: {e}") + logger.error(f"Error in test_post_components: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -66,9 +68,9 @@ def test_get_component(self): self.realm, self.test_component_id ) assert component is not None - print(f"Got component: {component.name} (ID: {component.id})") + logger.info(f"Got component: {component.name} (ID: {component.id})") except Exception as e: - print(f"Error in test_get_component: {e}") + logger.error(f"Error in test_get_component: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -81,9 +83,9 @@ def test_put_component(self): updated = self.component_api.put_component( self.realm, self.test_component_id, component_representation ) - print(f"Updated component: {updated}") + logger.info(f"Updated component: {updated}") except Exception as e: - print(f"Error in test_put_component: {e}") + logger.error(f"Error in test_put_component: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -93,9 +95,9 @@ def test_delete_component(self): deleted = self.component_api.delete_component( self.realm, self.test_component_id ) - print(f"Deleted component: {deleted}") + logger.info(f"Deleted component: {deleted}") except Exception as e: - print(f"Error in test_delete_component: {e}") + logger.error(f"Error in test_delete_component: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -106,11 +108,11 @@ def test_get_sub_component_types(self): self.realm, self.test_component_id ) assert isinstance(sub_component_types, list) - print(f"Got {len(sub_component_types)} sub-component types") + logger.info(f"Got {len(sub_component_types)} sub-component types") for component_type in sub_component_types: - print(f" - {component_type.id}") + logger.info(f" - {component_type.id}") except Exception as e: - print(f"Error in test_get_sub_component_types: {e}") + logger.error(f"Error in test_get_sub_component_types: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -121,12 +123,10 @@ def test_get_sub_component_types_with_type(self): self.realm, self.test_component_id, type=self.test_component_type ) assert isinstance(sub_component_types, list) - print( - f"Got {len(sub_component_types)} sub-component types with type filter" - ) + logger.info(f"Got {len(sub_component_types)} sub-component types with type filter") for component_type in sub_component_types: - print(f" - {component_type.id}") + logger.info(f" - {component_type.id}") except Exception as e: - print(f"Error in test_get_sub_component_types_with_type: {e}") + logger.error(f"Error in test_get_sub_component_types_with_type: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True diff --git a/tests/CxOne/KeycloakAPI/test_groups_api.py b/tests/CxOne/KeycloakAPI/test_groups_api.py index 55a41364..391e8025 100644 --- a/tests/CxOne/KeycloakAPI/test_groups_api.py +++ b/tests/CxOne/KeycloakAPI/test_groups_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.KeycloakAPI.GroupsApi import GroupsApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.GroupRepresentation import ( GroupRepresentation, ) @@ -14,37 +16,37 @@ def setup_method(self): def test_get_groups_by_realm(self): """Test get_groups_by_realm method with different parameters""" - print("\n=== Test 1: get_groups_by_realm ===") + logger.info("\n=== Test 1: get_groups_by_realm ===") # Test with basic parameters groups = self.groups_api.get_groups_by_realm(realm=self.realm) - print(f"get_groups_by_realm successful: {groups is not None}") - print(f"Number of groups: {len(groups)}") - print(f"Groups: {[g.name for g in groups]}") + logger.info(f"get_groups_by_realm successful: {groups is not None}") + logger.info(f"Number of groups: {len(groups)}") + logger.info(f"Groups: {[g.name for g in groups]}") assert groups is not None # Test with pagination parameters groups_paginated = self.groups_api.get_groups_by_realm( realm=self.realm, first=0, max=5 ) - print(f"Number of groups (paginated): {len(groups_paginated)}") - print(f"Groups (paginated): {[g.name for g in groups_paginated]}") + logger.info(f"Number of groups (paginated): {len(groups_paginated)}") + logger.info(f"Groups (paginated): {[g.name for g in groups_paginated]}") def test_get_groups_count_by_realm(self): """Test get_groups_count_by_realm method""" - print("\n=== Test 2: get_groups_count_by_realm ===") + logger.info("\n=== Test 2: get_groups_count_by_realm ===") try: count = self.groups_api.get_groups_count_by_realm(realm=self.realm) - print(f"get_groups_count_by_realm successful: {count is not None}") - print(f"Groups count: {count}") + logger.info(f"get_groups_count_by_realm successful: {count is not None}") + logger.info(f"Groups count: {count}") assert count is not None except Exception as e: - print(f"Error getting groups count: {e}") + logger.error(f"Error getting groups count: {e}") def test_group_crud(self): """Test group CRUD operations""" - print("\n=== Test 3: Group CRUD operations ===") + logger.info("\n=== Test 3: Group CRUD operations ===") test_group_name = "test_group_2026_02_24" updated_group_name = "updated_test_group" @@ -56,12 +58,10 @@ def test_group_crud(self): delete_successful = self.groups_api.delete_group_by_realm_by_id( realm=self.realm, id=group.id ) - print( - f"Delete group {test_group_name} successful: {delete_successful}" - ) + logger.info(f"Delete group {test_group_name} successful: {delete_successful}") break except Exception as e: - print(f"Error checking/deleting group: {e}") + logger.error(f"Error checking/deleting group: {e}") # Step 2: Create the group (C) group_id = None @@ -72,28 +72,28 @@ def test_group_crud(self): create_successful = self.groups_api.post_groups( realm=self.realm, group_representation=group_representation ) - print(f"Create group {test_group_name} successful: {create_successful}") + logger.info(f"Create group {test_group_name} successful: {create_successful}") # Get the created group created_groups = self.groups_api.get_groups_by_realm(realm=self.realm) for group in created_groups: if group.name == test_group_name: group_id = group.id - print(f"Created group ID: {group_id}") + logger.info(f"Created group ID: {group_id}") break except Exception as e: - print(f"Error creating group: {e}") + logger.error(f"Error creating group: {e}") # Step 3: Read the group (R) if group_id: try: group = self.groups_api.get_group(realm=self.realm, id=group_id) - print(f"get_group successful: {group is not None}") - print(f"Group: {group.name}") + logger.info(f"get_group successful: {group is not None}") + logger.info(f"Group: {group.name}") assert group is not None assert group.name == test_group_name except Exception as e: - print(f"Error getting group: {e}") + logger.error(f"Error getting group: {e}") # Step 4: Update the group (U) if group_id: @@ -106,13 +106,13 @@ def test_group_crud(self): id=group_id, group_representation=updated_group_representation, ) - print(f"Update group {test_group_name} successful: {update_successful}") + logger.info(f"Update group {test_group_name} successful: {update_successful}") # Verify the update updated_group = self.groups_api.get_group(realm=self.realm, id=group_id) - print(f"Updated group name: {updated_group.name}") + logger.info(f"Updated group name: {updated_group.name}") except Exception as e: - print(f"Error updating group: {e}") + logger.error(f"Error updating group: {e}") # Step 5: Delete the group (D) if group_id: @@ -120,81 +120,77 @@ def test_group_crud(self): delete_successful = self.groups_api.delete_group_by_realm_by_id( realm=self.realm, id=group_id ) - print( - f"Delete group {updated_group_name} successful: {delete_successful}" - ) + logger.info(f"Delete group {updated_group_name} successful: {delete_successful}") except Exception as e: - print(f"Error deleting group: {e}") + logger.error(f"Error deleting group: {e}") def test_group_children(self): """Test group children methods""" - print("\n=== Test 4: Group Children ===") + logger.info("\n=== Test 4: Group Children ===") # Get a test group groups = self.groups_api.get_groups_by_realm(realm=self.realm) test_group = groups[0] if groups else None if test_group: - print(f"Testing with group: {test_group.name} (id: {test_group.id})") + logger.info(f"Testing with group: {test_group.name} (id: {test_group.id})") # Test get_children try: children = self.groups_api.get_children( realm=self.realm, id=test_group.id ) - print(f"get_children successful: {children is not None}") - print(f"Number of children: {len(children)}") - print(f"Children: {[c.name for c in children]}") + logger.info(f"get_children successful: {children is not None}") + logger.info(f"Number of children: {len(children)}") + logger.info(f"Children: {[c.name for c in children]}") except Exception as e: - print(f"Error getting children: {e}") + logger.error(f"Error getting children: {e}") else: - print("No groups found for testing children") + logger.info("No groups found for testing children") def test_group_members(self): """Test group members method""" - print("\n=== Test 5: Group Members ===") + logger.info("\n=== Test 5: Group Members ===") # Get a test group groups = self.groups_api.get_groups_by_realm(realm=self.realm) test_group = groups[0] if groups else None if test_group: - print(f"Testing with group: {test_group.name} (id: {test_group.id})") + logger.info(f"Testing with group: {test_group.name} (id: {test_group.id})") # Test get_members try: members = self.groups_api.get_members( realm=self.realm, id=test_group.id ) - print(f"get_members successful: {members is not None}") - print(f"Number of members: {len(members)}") - print(f"Members: {[m.username for m in members]}") + logger.info(f"get_members successful: {members is not None}") + logger.info(f"Number of members: {len(members)}") + logger.info(f"Members: {[m.username for m in members]}") except Exception as e: - print(f"Error getting members: {e}") + logger.error(f"Error getting members: {e}") else: - print("No groups found for testing members") + logger.info("No groups found for testing members") def test_group_management_permissions(self): """Test group management permissions method""" - print("\n=== Test 6: Group Management Permissions ===") + logger.info("\n=== Test 6: Group Management Permissions ===") # Get a test group groups = self.groups_api.get_groups_by_realm(realm=self.realm) test_group = groups[0] if groups else None if test_group: - print(f"Testing with group: {test_group.name} (id: {test_group.id})") + logger.info(f"Testing with group: {test_group.name} (id: {test_group.id})") # Test get_group_management_permissions try: permissions = self.groups_api.get_group_management_permissions( realm=self.realm, id=test_group.id ) - print( - f"get_group_management_permissions successful: {permissions is not None}" - ) - print(f"Permissions: {permissions.to_dict()}") + logger.info(f"get_group_management_permissions successful: {permissions is not None}") + logger.info(f"Permissions: {permissions.to_dict()}") except Exception as e: - print(f"Error getting management permissions: {e}") + logger.error(f"Error getting management permissions: {e}") else: - print("No groups found for testing management permissions") + logger.info("No groups found for testing management permissions") diff --git a/tests/CxOne/KeycloakAPI/test_identity_providers_api.py b/tests/CxOne/KeycloakAPI/test_identity_providers_api.py index ed6411f5..555b5f2e 100644 --- a/tests/CxOne/KeycloakAPI/test_identity_providers_api.py +++ b/tests/CxOne/KeycloakAPI/test_identity_providers_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.KeycloakAPI import IdentityProvidersApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.IdentityProviderRepresentation import ( IdentityProviderRepresentation, ) @@ -15,9 +17,9 @@ def test_get_instances(self): realm=self.realm ) assert isinstance(identity_providers, list) - print(f"Got {len(identity_providers)} identity providers") + logger.info(f"Got {len(identity_providers)} identity providers") except Exception as e: - print(f"Error in test_get_instances: {e}") + logger.error(f"Error in test_get_instances: {e}") assert True def test_identity_provider_crud(self): @@ -43,9 +45,7 @@ def test_identity_provider_crud(self): realm=self.realm, identity_provider_representation=identity_provider_representation, ) - print( - f"Create identity provider {test_alias} successful: {create_successful}" - ) + logger.info(f"Create identity provider {test_alias} successful: {create_successful}") updated_identity_provider_representation = IdentityProviderRepresentation( alias=test_alias, provider_id="oidc", enabled=True @@ -55,14 +55,14 @@ def test_identity_provider_crud(self): alias=test_alias, identity_provider_representation=updated_identity_provider_representation, ) - print(f"Update identity provider successful: {update_successful}") + logger.info(f"Update identity provider successful: {update_successful}") delete_successful = self.identity_providers_api.delete_instance( realm=self.realm, alias=test_alias ) - print(f"Delete identity provider successful: {delete_successful}") + logger.info(f"Delete identity provider successful: {delete_successful}") except Exception as e: - print(f"Error in test_identity_provider_crud: {e}") + logger.error(f"Error in test_identity_provider_crud: {e}") assert True def test_identity_provider_methods(self): @@ -73,26 +73,26 @@ def test_identity_provider_methods(self): if identity_providers: test_provider = identity_providers[0] test_alias = test_provider.alias - print(f"Testing with identity provider: {test_alias}") + logger.info(f"Testing with identity provider: {test_alias}") instance = self.identity_providers_api.get_instance( realm=self.realm, alias=test_alias ) - print(f"Got instance: {instance is not None}") + logger.info(f"Got instance: {instance is not None}") permissions = ( self.identity_providers_api.get_instance_management_permissions( realm=self.realm, alias=test_alias ) ) - print(f"Got management permissions: {permissions is not None}") + logger.info(f"Got management permissions: {permissions is not None}") mappers = self.identity_providers_api.get_mappers( realm=self.realm, alias=test_alias ) - print(f"Got {len(mappers)} mappers") + logger.info(f"Got {len(mappers)} mappers") except Exception as e: - print(f"Error in test_identity_provider_methods: {e}") + logger.error(f"Error in test_identity_provider_methods: {e}") assert True def test_identity_provider_providers(self): @@ -101,7 +101,7 @@ def test_identity_provider_providers(self): provider = self.identity_providers_api.get_identity_provider_provider( realm=self.realm, provider_id=test_provider_id ) - print(f"Got identity provider provider: {provider is not None}") + logger.info(f"Got identity provider provider: {provider is not None}") except Exception as e: - print(f"Error in test_identity_provider_providers: {e}") + logger.error(f"Error in test_identity_provider_providers: {e}") assert True diff --git a/tests/CxOne/KeycloakAPI/test_key_api.py b/tests/CxOne/KeycloakAPI/test_key_api.py index 9b194497..423d489d 100644 --- a/tests/CxOne/KeycloakAPI/test_key_api.py +++ b/tests/CxOne/KeycloakAPI/test_key_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.KeycloakAPI import KeyApi +import logging +logger = logging.getLogger(__name__) class TestKeyApi: @@ -10,9 +12,9 @@ def test_get_keys(self): try: keys_metadata = self.key_api.get_keys(realm=self.realm) assert keys_metadata is not None - print(f"Got keys metadata: {keys_metadata is not None}") + logger.info(f"Got keys metadata: {keys_metadata is not None}") if keys_metadata and keys_metadata.keys: - print(f"Number of keys: {len(keys_metadata.keys)}") + logger.info(f"Number of keys: {len(keys_metadata.keys)}") except Exception as e: - print(f"Error in test_get_keys: {e}") + logger.error(f"Error in test_get_keys: {e}") assert True diff --git a/tests/CxOne/KeycloakAPI/test_role_mapper_api.py b/tests/CxOne/KeycloakAPI/test_role_mapper_api.py index 00ba748c..3d51ad28 100644 --- a/tests/CxOne/KeycloakAPI/test_role_mapper_api.py +++ b/tests/CxOne/KeycloakAPI/test_role_mapper_api.py @@ -1,5 +1,7 @@ import pytest from CheckmarxPythonSDK.CxOne.KeycloakAPI.RoleMapperApi import RoleMapperApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.RoleRepresentation import ( RoleRepresentation, ) @@ -22,9 +24,9 @@ def test_get_group_role_mappings(self): self.realm, self.test_group_id ) assert mappings is not None - print(f"Got group dev role mappings: {mappings.to_dict()}") + logger.info(f"Got group dev role mappings: {mappings.to_dict()}") except Exception as e: - print(f"Error in test_get_group_role_mappings: {e}") + logger.error(f"Error in test_get_group_role_mappings: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -35,11 +37,11 @@ def test_get_group_role_mappings_realm(self): self.realm, self.test_group_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} group realm role mappings") + logger.info(f"Got {len(roles)} group realm role mappings") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_group_role_mappings_realm: {e}") + logger.error(f"Error in test_get_group_role_mappings_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -57,10 +59,10 @@ def test_post_group_role_mappings_realm(self): id=self.test_group_id, role_representations=role_representations ) - print(f"Added group realm role mapping: {result}") + logger.info(f"Added group realm role mapping: {result}") assert result is True except Exception as e: - print(f"Error in test_post_group_role_mappings_realm: {e}") + logger.error(f"Error in test_post_group_role_mappings_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -78,10 +80,10 @@ def test_delete_group_role_mappings_realm(self): id=self.test_group_id, role_representations=role_representations ) - print(f"Deleted group realm role mapping: {result}") + logger.info(f"Deleted group realm role mapping: {result}") assert result is True except Exception as e: - print(f"Error in test_delete_group_role_mappings_realm: {e}") + logger.error(f"Error in test_delete_group_role_mappings_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -92,11 +94,11 @@ def test_get_group_role_mappings_realm_available(self): self.realm, self.test_group_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} available group realm roles") + logger.info(f"Got {len(roles)} available group realm roles") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_group_role_mappings_realm_available: {e}") + logger.error(f"Error in test_get_group_role_mappings_realm_available: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -107,11 +109,11 @@ def test_get_group_role_mappings_realm_composite(self): self.realm, self.test_group_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} composite group realm roles") + logger.info(f"Got {len(roles)} composite group realm roles") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_group_role_mappings_realm_composite: {e}") + logger.error(f"Error in test_get_group_role_mappings_realm_composite: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -123,9 +125,9 @@ def test_get_user_role_mappings(self): id=self.test_user_id ) assert mappings is not None - print(f"Got user role mappings: {mappings.to_dict()}") + logger.info(f"Got user role mappings: {mappings.to_dict()}") except Exception as e: - print(f"Error in test_get_user_role_mappings: {e}") + logger.error(f"Error in test_get_user_role_mappings: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -137,11 +139,11 @@ def test_get_user_role_mappings_realm(self): id=self.test_user_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} user realm role mappings") + logger.info(f"Got {len(roles)} user realm role mappings") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_user_role_mappings_realm: {e}") + logger.error(f"Error in test_get_user_role_mappings_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -159,9 +161,9 @@ def test_post_user_role_mappings_realm(self): id=self.test_user_id, role_representations=role_representations ) - print(f"Added user realm role mapping: {result}") + logger.info(f"Added user realm role mapping: {result}") except Exception as e: - print(f"Error in test_post_user_role_mappings_realm: {e}") + logger.error(f"Error in test_post_user_role_mappings_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -179,9 +181,9 @@ def test_delete_user_role_mappings_realm(self): id=self.test_user_id, role_representations=role_representations ) - print(f"Deleted user realm role mapping: {result}") + logger.info(f"Deleted user realm role mapping: {result}") except Exception as e: - print(f"Error in test_delete_user_role_mappings_realm: {e}") + logger.error(f"Error in test_delete_user_role_mappings_realm: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -192,11 +194,11 @@ def test_get_user_role_mappings_realm_available(self): self.realm, self.test_user_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} available user realm roles") + logger.info(f"Got {len(roles)} available user realm roles") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_user_role_mappings_realm_available: {e}") + logger.error(f"Error in test_get_user_role_mappings_realm_available: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -207,10 +209,10 @@ def test_get_user_role_mappings_realm_composite(self): self.realm, self.test_user_id ) assert isinstance(roles, list) - print(f"Got {len(roles)} composite user realm roles") + logger.info(f"Got {len(roles)} composite user realm roles") for role in roles: - print(f" - {role.name}") + logger.info(f" - {role.name}") except Exception as e: - print(f"Error in test_get_user_role_mappings_realm_composite: {e}") + logger.error(f"Error in test_get_user_role_mappings_realm_composite: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True diff --git a/tests/CxOne/KeycloakAPI/test_roles_api.py b/tests/CxOne/KeycloakAPI/test_roles_api.py index 988bfd4c..b986bcaa 100644 --- a/tests/CxOne/KeycloakAPI/test_roles_api.py +++ b/tests/CxOne/KeycloakAPI/test_roles_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.KeycloakAPI import RolesApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.RoleRepresentation import ( RoleRepresentation, ) @@ -16,9 +18,9 @@ def test_get_client_roles(self): realm=self.realm, id=self.client_id ) assert isinstance(client_roles, list) - print(f"Got {len(client_roles)} client roles") + logger.info(f"Got {len(client_roles)} client roles") except Exception as e: - print(f"Error in test_get_client_roles: {e}") + logger.error(f"Error in test_get_client_roles: {e}") assert True def test_client_role_crud(self): @@ -37,7 +39,7 @@ def test_client_role_crud(self): id=self.client_id, role_representation=role_representation, ) - print(f"Create role {test_role_name} successful: {create_successful}") + logger.info(f"Create role {test_role_name} successful: {create_successful}") created_role = self.roles_api.get_client_role( realm=self.realm, id=self.client_id, role_name=test_role_name @@ -56,14 +58,14 @@ def test_client_role_crud(self): role_name=test_role_name, role_representation=updated_role_representation, ) - print(f"Update role {test_role_name} successful: {update_successful}") + logger.info(f"Update role {test_role_name} successful: {update_successful}") delete_successful = self.roles_api.delete_client_role( realm=self.realm, id=self.client_id, role_name=test_role_name ) - print(f"Delete role {test_role_name} successful: {delete_successful}") + logger.info(f"Delete role {test_role_name} successful: {delete_successful}") except Exception as e: - print(f"Error in test_client_role_crud: {e}") + logger.error(f"Error in test_client_role_crud: {e}") assert True def test_composite_role_operations(self): @@ -86,7 +88,7 @@ def test_composite_role_operations(self): id=self.client_id, role_representation=composite_role_representation, ) - print(f"Create temporary composite role successful: {create_successful}") + logger.info(f"Create temporary composite role successful: {create_successful}") all_roles = self.roles_api.get_client_roles( realm=self.realm, id=self.client_id @@ -100,14 +102,14 @@ def test_composite_role_operations(self): role_name=temp_composite_role_name, role_representations=non_composite_roles, ) - print(f"Add child roles successful: {add_successful}") + logger.info(f"Add child roles successful: {add_successful}") composites = self.roles_api.get_client_role_composites( realm=self.realm, id=self.client_id, role_name=temp_composite_role_name, ) - print(f"Got {len(composites)} child roles") + logger.info(f"Got {len(composites)} child roles") remove_successful = self.roles_api.delete_client_role_composites( realm=self.realm, @@ -115,20 +117,20 @@ def test_composite_role_operations(self): role_name=temp_composite_role_name, role_representations=non_composite_roles, ) - print(f"Remove child roles successful: {remove_successful}") + logger.info(f"Remove child roles successful: {remove_successful}") self.roles_api.delete_client_role( realm=self.realm, id=self.client_id, role_name=temp_composite_role_name ) except Exception as e: - print(f"Error in test_composite_role_operations: {e}") + logger.error(f"Error in test_composite_role_operations: {e}") assert True def test_get_roles_by_realm(self): try: realm_roles = self.roles_api.get_roles_by_realm(realm=self.realm) assert isinstance(realm_roles, list) - print(f"Got {len(realm_roles)} realm roles") + logger.info(f"Got {len(realm_roles)} realm roles") except Exception as e: - print(f"Error in test_get_roles_by_realm: {e}") + logger.error(f"Error in test_get_roles_by_realm: {e}") assert True diff --git a/tests/CxOne/KeycloakAPI/test_roles_by_id_api.py b/tests/CxOne/KeycloakAPI/test_roles_by_id_api.py index cccd6bbd..298276da 100644 --- a/tests/CxOne/KeycloakAPI/test_roles_by_id_api.py +++ b/tests/CxOne/KeycloakAPI/test_roles_by_id_api.py @@ -1,6 +1,8 @@ import pytest from CheckmarxPythonSDK.CxOne.KeycloakAPI.RolesByIdApi import RolesByIdApi from CheckmarxPythonSDK.CxOne.KeycloakAPI.RolesApi import RolesApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.RoleRepresentation import ( RoleRepresentation, ) @@ -37,22 +39,18 @@ def test_client_role_crud_by_id(self): delete_response = self.roles_api.delete_client_role( self.realm, self.client_id, self.test_role_name ) - print(f"Deleted role: {delete_response}") + logger.info(f"Deleted role: {delete_response}") except Exception as e: - print( - f"Error deleting role (might not exist or no server connection): {e}" - ) + logger.error(f"Error deleting role (might not exist or no server connection): {e}") try: # Create test role role_representation = RoleRepresentation(name=self.test_role_name) created = self.roles_api.post_client_roles( self.realm, self.client_id, role_representation ) - print(f"Created role: {created}") + logger.info(f"Created role: {created}") except Exception as e: - print( - f"Error creating role (might already exist or no server connection): {e}" - ) + logger.error(f"Error creating role (might already exist or no server connection): {e}") try: # Get role ID try: @@ -62,8 +60,8 @@ def test_client_role_crud_by_id(self): if len(roles) > 0: test_role = roles[0] test_role_id = test_role.id - print(f"Found test role with ID: {test_role_id}") - print(f"Role details: {test_role.to_dict()}") + logger.info(f"Found test role with ID: {test_role_id}") + logger.info(f"Role details: {test_role.to_dict()}") # Test get_roles_by_id try: @@ -72,7 +70,7 @@ def test_client_role_crud_by_id(self): ) assert role_by_id is not None assert role_by_id.name == self.test_role_name - print(f"Got role by ID: {role_by_id.to_dict()}") + logger.info(f"Got role by ID: {role_by_id.to_dict()}") # Test put_roles_by_id (update role) updated_description = "Updated test role description" @@ -81,23 +79,21 @@ def test_client_role_crud_by_id(self): realm=self.realm, role_id=test_role_id, role_representation=role_by_id ) assert updated is True - print(f"Updated role: {updated}") + logger.info(f"Updated role: {updated}") # Verify update updated_role = self.roles_by_id_api.get_roles_by_id( realm=self.realm, role_id=test_role_id ) assert updated_role.description == updated_description - print( - f"Verified updated role description: {updated_role.description}" - ) + logger.info(f"Verified updated role description: {updated_role.description}") # Test delete_roles_by_id (delete role) deleted = self.roles_by_id_api.delete_roles_by_id( realm=self.realm, role_id=test_role_id ) assert deleted is True - print(f"Deleted role: {deleted}") + logger.info(f"Deleted role: {deleted}") # Verify deletion try: @@ -106,17 +102,15 @@ def test_client_role_crud_by_id(self): ) assert role_result is None, "Role should have been deleted" except Exception as e: - print(f"Verified role deletion: {e}") + logger.info(f"Verified role deletion: {e}") except Exception as e: - print(f"Error testing role operations: {e}") + logger.error(f"Error testing role operations: {e}") else: - print( - f"Role {self.test_role_name} not found, skipping detailed tests" - ) + logger.warning(f"Role {self.test_role_name} not found, skipping detailed tests") except Exception as e: - print(f"Error getting roles: {e}") + logger.error(f"Error getting roles: {e}") except Exception as e: - print(f"Error in test_client_role_crud_by_id: {e}") + logger.error(f"Error in test_client_role_crud_by_id: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True @@ -126,11 +120,9 @@ def test_role_composites_by_id(self): delete_response = self.roles_api.delete_client_role( self.realm, self.client_id, self.test_role_name ) - print(f"Deleted role: {delete_response}") + logger.info(f"Deleted role: {delete_response}") except Exception as e: - print( - f"Error deleting role (might not exist or no server connection): {e}" - ) + logger.error(f"Error deleting role (might not exist or no server connection): {e}") try: # Create test role role_representation = RoleRepresentation(name=self.test_role_name) @@ -138,9 +130,9 @@ def test_role_composites_by_id(self): created = self.roles_api.post_client_roles( self.realm, self.client_id, role_representation ) - print(f"Created test role: {created}") + logger.info(f"Created test role: {created}") except Exception as e: - print(f"Error creating test role: {e}") + logger.error(f"Error creating test role: {e}") # Get test role ID try: @@ -150,7 +142,7 @@ def test_role_composites_by_id(self): if len(roles) > 0: self.test_role = roles[0] self.test_role_id = self.test_role.id - print(f"Test role ID: {self.test_role_id}") + logger.info(f"Test role ID: {self.test_role_id}") # Get some non-composite roles as child roles try: @@ -171,9 +163,7 @@ def test_role_composites_by_id(self): if not role.composite and role.id != self.test_role_id ) if len(non_composite_roles) > 0: - print( - f"Non-composite roles to add: {[role.name for role in non_composite_roles]}" - ) + logger.info(f"Non-composite roles to add: {[role.name for role in non_composite_roles]}") # Test post_roles_by_id_composites (add child roles) try: added = ( @@ -181,7 +171,7 @@ def test_role_composites_by_id(self): self.realm, self.test_role_id, non_composite_roles ) ) - print(f"Added child role to composite: {added}") + logger.info(f"Added child role to composite: {added}") # Test get_roles_by_id_composites (get child roles) composites = ( @@ -189,35 +179,25 @@ def test_role_composites_by_id(self): self.realm, self.test_role_id ) ) - print(f"Number of composites: {len(composites)}") + logger.info(f"Number of composites: {len(composites)}") for role in composites: - print( - f"Composite role: {role.name} (ID: {role.id})" - ) + logger.info(f"Composite role: {role.name} (ID: {role.id})") # Test get_roles_by_id_composites_client (get client-level child roles) client_composites = self.roles_by_id_api.get_roles_by_id_composites_client( self.realm, self.test_role_id, self.client_id ) - print( - f"Number of client composites: {len(client_composites)}" - ) + logger.info(f"Number of client composites: {len(client_composites)}") for role in client_composites: - print( - f"Client composite role: {role.name} (ID: {role.id})" - ) + logger.info(f"Client composite role: {role.name} (ID: {role.id})") # Test get_roles_by_id_composites_realm (get realm-level child roles) realm_composites = self.roles_by_id_api.get_roles_by_id_composites_realm( self.realm, self.test_role_id ) - print( - f"Number of realm composites: {len(realm_composites)}" - ) + logger.info(f"Number of realm composites: {len(realm_composites)}") for role in realm_composites: - print( - f"Realm composite role: {role.name} (ID: {role.id})" - ) + logger.info(f"Realm composite role: {role.name} (ID: {role.id})") # Test delete_roles_by_id_composites (remove child roles) removed = ( @@ -225,7 +205,7 @@ def test_role_composites_by_id(self): self.realm, self.test_role_id, role_representations=non_composite_roles ) ) - print(f"Removed composites: {removed}") + logger.info(f"Removed composites: {removed}") # Verify removal composites_after_removal = ( @@ -233,36 +213,28 @@ def test_role_composites_by_id(self): self.realm, self.test_role_id ) ) - print( - f"Number of composites after removal: {len(composites_after_removal)}" - ) + logger.info(f"Number of composites after removal: {len(composites_after_removal)}") except Exception as e: - print(f"Error testing composite operations: {e}") + logger.error(f"Error testing composite operations: {e}") else: - print( - "No non-composite roles found, skipping composite tests" - ) + logger.warning("No non-composite roles found, skipping composite tests") except Exception as e: - print(f"Error getting roles for composites: {e}") + logger.error(f"Error getting roles for composites: {e}") else: - print( - f"Role {self.test_role_name} not found, skipping composite tests" - ) + logger.warning(f"Role {self.test_role_name} not found, skipping composite tests") except Exception as e: - print(f"Error getting roles: {e}") + logger.error(f"Error getting roles: {e}") except Exception as e: - print(f"Error in test_role_composites_by_id: {e}") + logger.error(f"Error in test_role_composites_by_id: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True try: delete_response = self.roles_api.delete_client_role( self.realm, self.client_id, role_representation.name ) - print(f"Deleted role: {delete_response}") + logger.info(f"Deleted role: {delete_response}") except Exception as e: - print( - f"Error deleting role (might not exist or no server connection): {e}" - ) + logger.error(f"Error deleting role (might not exist or no server connection): {e}") def test_role_management_permissions(self): """Test role management permissions""" @@ -273,9 +245,9 @@ def test_role_management_permissions(self): created = self.roles_api.post_client_roles( self.realm, self.client_id, role_representation ) - print(f"Created test role for permissions: {created}") + logger.info(f"Created test role for permissions: {created}") except Exception as e: - print(f"Error creating test role for permissions: {e}") + logger.error(f"Error creating test role for permissions: {e}") # Get test role ID try: @@ -285,7 +257,7 @@ def test_role_management_permissions(self): if len(roles) > 0: self.test_role = roles[0] self.test_role_id = self.test_role.id - print(f"Test role ID for permissions: {self.test_role_id}") + logger.info(f"Test role ID for permissions: {self.test_role_id}") # Test get_roles_by_id_management_permissions try: @@ -295,7 +267,7 @@ def test_role_management_permissions(self): ) ) assert permissions is not None - print(f"Management permissions: {permissions.to_dict()}") + logger.info(f"Management permissions: {permissions.to_dict()}") # Test put_roles_by_id_management_permissions # Create a ManagementPermissionReference object @@ -308,18 +280,14 @@ def test_role_management_permissions(self): ) ) assert updated_permissions is not None - print( - f"Updated management permissions: {updated_permissions.to_dict()}" - ) + logger.info(f"Updated management permissions: {updated_permissions.to_dict()}") except Exception as e: - print(f"Error testing permission operations: {e}") + logger.error(f"Error testing permission operations: {e}") else: - print( - f"Role {self.test_role_name} not found, skipping permission tests" - ) + logger.warning(f"Role {self.test_role_name} not found, skipping permission tests") except Exception as e: - print(f"Error getting roles: {e}") + logger.error(f"Error getting roles: {e}") except Exception as e: - print(f"Error in test_role_management_permissions: {e}") + logger.error(f"Error in test_role_management_permissions: {e}") # Even if we can't connect to the server, the test should pass as we're testing the code structure assert True diff --git a/tests/CxOne/KeycloakAPI/test_scope_mappings_api.py b/tests/CxOne/KeycloakAPI/test_scope_mappings_api.py index b62fa6c3..45f92b12 100644 --- a/tests/CxOne/KeycloakAPI/test_scope_mappings_api.py +++ b/tests/CxOne/KeycloakAPI/test_scope_mappings_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.KeycloakAPI import ScopeMappingsApi, ClientsApi +import logging +logger = logging.getLogger(__name__) class TestScopeMappingsApi: @@ -18,61 +20,61 @@ def test_client_scope_mappings(self): try: test_client = self.get_test_client() if test_client: - print(f"Testing with client: {test_client.client_id}") + logger.info(f"Testing with client: {test_client.client_id}") mappings = self.scope_mappings_api.get_client_scope_mappings( realm=self.realm, id=test_client.id ) - print(f"Got client scope mappings: {mappings is not None}") + logger.info(f"Got client scope mappings: {mappings is not None}") realm_roles = self.scope_mappings_api.get_client_scope_mappings_realm( realm=self.realm, id=test_client.id ) - print(f"Got {len(realm_roles)} realm roles") + logger.info(f"Got {len(realm_roles)} realm roles") available_realm_roles = ( self.scope_mappings_api.get_client_scope_mappings_realm_available( realm=self.realm, id=test_client.id ) ) - print(f"Got {len(available_realm_roles)} available realm roles") + logger.info(f"Got {len(available_realm_roles)} available realm roles") except Exception as e: - print(f"Error in test_client_scope_mappings: {e}") + logger.error(f"Error in test_client_scope_mappings: {e}") assert True def test_client_scope_mappings_client(self): try: test_client = self.get_test_client() if test_client: - print(f"Testing with client: {test_client.client_id}") + logger.info(f"Testing with client: {test_client.client_id}") client_roles = self.scope_mappings_api.get_client_scope_mappings_client( realm=self.realm, id=test_client.id, client=test_client.id ) - print(f"Got {len(client_roles)} client roles") + logger.info(f"Got {len(client_roles)} client roles") available_client_roles = ( self.scope_mappings_api.get_client_scope_mappings_client_available( realm=self.realm, id=test_client.id, client=test_client.id ) ) - print(f"Got {len(available_client_roles)} available client roles") + logger.info(f"Got {len(available_client_roles)} available client roles") except Exception as e: - print(f"Error in test_client_scope_mappings_client: {e}") + logger.error(f"Error in test_client_scope_mappings_client: {e}") assert True def test_client_scope_mappings_realm_composite(self): try: test_client = self.get_test_client() if test_client: - print(f"Testing with client: {test_client.client_id}") + logger.info(f"Testing with client: {test_client.client_id}") composite_realm_roles = ( self.scope_mappings_api.get_client_scope_mappings_realm_composite( realm=self.realm, id=test_client.id ) ) - print(f"Got {len(composite_realm_roles)} composite realm roles") + logger.info(f"Got {len(composite_realm_roles)} composite realm roles") except Exception as e: - print(f"Error in test_client_scope_mappings_realm_composite: {e}") + logger.error(f"Error in test_client_scope_mappings_realm_composite: {e}") assert True diff --git a/tests/CxOne/KeycloakAPI/test_users_api.py b/tests/CxOne/KeycloakAPI/test_users_api.py index cbe51cff..741921fb 100644 --- a/tests/CxOne/KeycloakAPI/test_users_api.py +++ b/tests/CxOne/KeycloakAPI/test_users_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.KeycloakAPI import UsersApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.UserRepresentation import ( UserRepresentation, ) @@ -16,19 +18,19 @@ def test_get_users_by_realm(self): try: users = self.users_api.get_users_by_realm(realm=self.realm) assert isinstance(users, list) - print(f"Got {len(users)} users") + logger.info(f"Got {len(users)} users") for user in users: - print(f"User: {user.username}") + logger.info(f"User: {user.username}") except Exception as e: - print(f"Error in test_get_users_by_realm: {e}") + logger.error(f"Error in test_get_users_by_realm: {e}") assert True def test_get_users_count(self): try: count = self.users_api.get_users_count(realm=self.realm) - print(f"Users count: {count}") + logger.info(f"Users count: {count}") except Exception as e: - print(f"Error in test_get_users_count: {e}") + logger.error(f"Error in test_get_users_count: {e}") assert True def test_user_crud(self): @@ -56,7 +58,7 @@ def test_user_crud(self): create_successful = self.users_api.create_a_new_user( realm=self.realm, user_representation=user_representation ) - print(f"Create user {test_username} successful: {create_successful}") + logger.info(f"Create user {test_username} successful: {create_successful}") user_id = None created_users = self.users_api.get_users_by_realm(realm=self.realm) @@ -84,14 +86,14 @@ def test_user_crud(self): id=user_id, user_representation=updated_user_representation, ) - print(f"Update user successful: {update_successful}") + logger.info(f"Update user successful: {update_successful}") delete_successful = self.users_api.delete_user_by_realm_by_id( realm=self.realm, id=user_id ) - print(f"Delete user successful: {delete_successful}") + logger.info(f"Delete user successful: {delete_successful}") except Exception as e: - print(f"Error in test_user_crud: {e}") + logger.error(f"Error in test_user_crud: {e}") assert True def test_user_groups(self): @@ -99,19 +101,19 @@ def test_user_groups(self): users = self.users_api.get_users_by_realm(realm=self.realm) if users: test_user = users[0] - print(f"Testing with user: {test_user.username}") + logger.info(f"Testing with user: {test_user.username}") user_groups = self.users_api.get_user_groups( realm=self.realm, id=test_user.id ) - print(f"Got {len(user_groups)} user groups") + logger.info(f"Got {len(user_groups)} user groups") groups_count = self.users_api.get_user_groups_count( realm=self.realm, id=test_user.id ) - print(f"User groups count: {groups_count}") + logger.info(f"User groups count: {groups_count}") except Exception as e: - print(f"Error in test_user_groups: {e}") + logger.error(f"Error in test_user_groups: {e}") assert True def test_user_credentials(self): @@ -119,14 +121,14 @@ def test_user_credentials(self): users = self.users_api.get_users_by_realm(realm=self.realm) if users: test_user = users[0] - print(f"Testing with user: {test_user.username}") + logger.info(f"Testing with user: {test_user.username}") credentials = self.users_api.get_credentials( realm=self.realm, id=test_user.id ) - print(f"Got {len(credentials)} credentials") + logger.info(f"Got {len(credentials)} credentials") except Exception as e: - print(f"Error in test_user_credentials: {e}") + logger.error(f"Error in test_user_credentials: {e}") assert True def test_user_sessions(self): @@ -134,12 +136,12 @@ def test_user_sessions(self): users = self.users_api.get_users_by_realm(realm=self.realm) if users: test_user = users[0] - print(f"Testing with user: {test_user.username}") + logger.info(f"Testing with user: {test_user.username}") sessions = self.users_api.get_sessions( realm=self.realm, id=test_user.id ) - print(f"Got {len(sessions)} sessions") + logger.info(f"Got {len(sessions)} sessions") except Exception as e: - print(f"Error in test_user_sessions: {e}") + logger.error(f"Error in test_user_sessions: {e}") assert True diff --git a/tests/CxOne/test_access_control_api.py b/tests/CxOne/test_access_control_api.py index a4dd4ba8..aa57887c 100644 --- a/tests/CxOne/test_access_control_api.py +++ b/tests/CxOne/test_access_control_api.py @@ -1,3 +1,5 @@ +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( AccessControlAPI, ) @@ -5,16 +7,16 @@ def test_get_groups(): groups = AccessControlAPI().get_groups(limit=100) - print(f"Groups count: {len(groups)}") - print("first 3 groups:") + logger.info(f"Groups count: {len(groups)}") + logger.info("first 3 groups:") for group in groups[:3]: - print(f"Group: {group.name}") + logger.info(f"Group: {group.name}") assert len(groups) > 1 def test_get_group_by_name(): group = AccessControlAPI().get_group_by_name(group_name="happy/test") - print(f"Group: {group}") + logger.info(f"Group: {group}") assert group.name == "happy/test" assert group.brief_name == "test" assert group is not None @@ -22,9 +24,9 @@ def test_get_group_by_name(): def test_get_users(): users = AccessControlAPI().get_users() - print(f"Users count: {len(users)}") + logger.info(f"Users count: {len(users)}") for user in users[:3]: - print(f"User name: {user.username}") + logger.info(f"User name: {user.username}") assert len(users) > 1 @@ -33,20 +35,20 @@ def test_get_users_by_groups(): group_id = group.id users = AccessControlAPI().get_users_by_groups(group_id=group_id) assert len(users) > 0 - print(f"Users count: {len(users)} in group All") + logger.info(f"Users count: {len(users)} in group All") for user in users[:3]: - print(f"User name: {user.username}") + logger.info(f"User name: {user.username}") def test_get_users_count(): users_count = AccessControlAPI().get_users_count() - print(f"Users count: {users_count}") + logger.info(f"Users count: {users_count}") assert users_count > 0 def test_get_logged_in_user_roles(): user_roles = AccessControlAPI().get_logged_in_user_roles() - print(f"User roles count: {len(user_roles)}") + logger.info(f"User roles count: {len(user_roles)}") def test_get_pip_users(): @@ -54,9 +56,9 @@ def test_get_pip_users(): try: users = AccessControlAPI().get_pip_users(term="happy") assert users is not None - print(f"PIP users count: {len(users)}") + logger.info(f"PIP users count: {len(users)}") except Exception as e: - print("get_pip_users skipped: {}".format(str(e))) + logger.warning("get_pip_users skipped: {}".format(str(e))) def test_get_group_managers(): @@ -64,9 +66,9 @@ def test_get_group_managers(): try: managers = AccessControlAPI().get_group_managers() assert managers is not None - print(f"Group managers: {len(managers)}") + logger.info(f"Group managers: {len(managers)}") except Exception as e: - print("get_group_managers skipped: {}".format(str(e))) + logger.warning("get_group_managers skipped: {}".format(str(e))) def test_get_api_keys(): @@ -74,9 +76,9 @@ def test_get_api_keys(): try: keys = AccessControlAPI().get_api_keys() assert keys is not None - print(f"API keys count: {len(keys)}") + logger.info(f"API keys count: {len(keys)}") except Exception as e: - print("get_api_keys skipped: {}".format(str(e))) + logger.warning("get_api_keys skipped: {}".format(str(e))) def test_get_api_keys_count(): @@ -84,9 +86,9 @@ def test_get_api_keys_count(): try: count = AccessControlAPI().get_api_keys_count() assert isinstance(count, int) - print(f"API keys count: {count}") + logger.info(f"API keys count: {count}") except Exception as e: - print("get_api_keys_count skipped: {}".format(str(e))) + logger.warning("get_api_keys_count skipped: {}".format(str(e))) def test_get_owner(): @@ -94,9 +96,9 @@ def test_get_owner(): try: owner = AccessControlAPI().get_owner() assert owner is not None - print(f"Owner: {owner.get('username')}") + logger.info(f"Owner: {owner.get('username')}") except Exception as e: - print("get_owner skipped: {}".format(str(e))) + logger.warning("get_owner skipped: {}".format(str(e))) def test_get_token_exchange(): @@ -106,14 +108,14 @@ def test_get_token_exchange(): assert token is not None assert "access_token" in token except Exception as e: - print("get_token_exchange skipped: {}".format(str(e))) + logger.warning("get_token_exchange skipped: {}".format(str(e))) def test_post_bulk_entities_find(): """POST /bulk-entities/find — find entities by IDs.""" users = AccessControlAPI().get_users(max_result_size=2) if len(users) < 1: - print("No users found, skipping bulk entities test") + logger.warning("No users found, skipping bulk entities test") return try: result = AccessControlAPI().post_bulk_entities_find( @@ -122,4 +124,4 @@ def test_post_bulk_entities_find(): ) assert result is not None except Exception as e: - print("post_bulk_entities_find skipped: {}".format(str(e))) + logger.warning("post_bulk_entities_find skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_access_management_api.py b/tests/CxOne/test_access_management_api.py index 7be1d8f8..1e5410d5 100644 --- a/tests/CxOne/test_access_management_api.py +++ b/tests/CxOne/test_access_management_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( AccessManagementAPI, create_an_assignment, @@ -87,7 +89,7 @@ def test_retrieve_entities(): result = retrieve_entities( resource_id=resource_id, resource_type=resource_type, entity_types=None ) - print(f"result: {result}") + logger.info(f"result: {result}") assert len(result) >= 1 @@ -98,7 +100,7 @@ def test_assignment_get_create_delete(): resource_id="71fe66b9-b3ea-4fc7-8594-541d0a07a697", ) if result is None: - print("assignment does not no exist, creating") + logger.info("assignment does not no exist, creating") result = create_an_assignment( assignment_input=AssignmentInput( entityID="3a7cf5fc-6554-4136-918b-6f494656b2b0", @@ -109,7 +111,7 @@ def test_assignment_get_create_delete(): ) ) assert result is not None - print("assignment exist, deleting") + logger.info("assignment exist, deleting") result = delete_an_assignment( entity_id="3a7cf5fc-6554-4136-918b-6f494656b2b0", resource_id="71fe66b9-b3ea-4fc7-8594-541d0a07a697", @@ -168,7 +170,7 @@ def test_retrieve_accessible_resources(): result = retrieve_accessible_resources( resource_types=[ResourceType.APPLICATION], action="view-applications" ) - print(f"result: {result}") + logger.info(f"result: {result}") assert result is not None @@ -187,7 +189,7 @@ def test_retrieve_groups(): offset = 0 # ids = ["ba2d28a4-aac7-4859-90ed-e9fbfc62d947", "fb1941cd-28d7-4a1d-b305-120c69a0e8d8"] result = retrieve_groups(limit=limit, offset=offset) - print(f"result: {result}") + logger.info(f"result: {result}") assert len(result) > 0 diff --git a/tests/CxOne/test_ai_assets_api.py b/tests/CxOne/test_ai_assets_api.py index 43774f05..c0303d09 100644 --- a/tests/CxOne/test_ai_assets_api.py +++ b/tests/CxOne/test_ai_assets_api.py @@ -15,6 +15,8 @@ get_asset_risks, ) from CheckmarxPythonSDK.CxOne import ScansAPI as _ScansAPI +import logging +logger = logging.getLogger(__name__) def test_get_ai_asset_types(): @@ -47,7 +49,7 @@ def test_get_ai_findings_aggregate(): assert result is not None assert "groupsCounter" in result except Exception as e: - print("get_ai_findings_aggregate skipped: {}".format(str(e))) + logger.warning("get_ai_findings_aggregate skipped: {}".format(str(e))) def test_get_ai_finding_by_id(): @@ -84,7 +86,7 @@ def test_aggregate_global_inventory_results(): assert result is not None assert "groupsCounter" in result except Exception as e: - print("aggregate_global_inventory_results skipped: {}".format(str(e))) + logger.warning("aggregate_global_inventory_results skipped: {}".format(str(e))) def _get_ai_scan_id(): @@ -104,7 +106,7 @@ def test_get_scan_results(): assert result is not None assert "data" in result except Exception as e: - print("get_scan_results skipped: {}".format(str(e))) + logger.warning("get_scan_results skipped: {}".format(str(e))) def test_aggregate_scan_results(): @@ -118,7 +120,7 @@ def test_aggregate_scan_results(): assert result is not None assert "scanGroupsCounter" in result except Exception as e: - print("aggregate_scan_results skipped: {}".format(str(e))) + logger.warning("aggregate_scan_results skipped: {}".format(str(e))) def test_get_asset_risks(): @@ -138,4 +140,4 @@ def test_get_asset_risks(): assert result is not None assert "risks" in result except Exception as e: - print("get_asset_risks skipped: {}".format(str(e))) + logger.warning("get_asset_risks skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_apisec_api.py b/tests/CxOne/test_apisec_api.py index c200d7f7..ef71a737 100644 --- a/tests/CxOne/test_apisec_api.py +++ b/tests/CxOne/test_apisec_api.py @@ -1,5 +1,7 @@ import pytest from CheckmarxPythonSDK.CxOne.apisecAPI import ApiSecAPI +import logging +logger = logging.getLogger(__name__) class TestApiSecAPI: @@ -15,62 +17,62 @@ def test_get_grouped_risk_summary(self): grouped_summary = self.apisec_api.get_grouped_risk_summary( scan_id=self.scan_id, group_column=self.group_column ) - print(f"Total records: {grouped_summary.total_records}") - print(f"Total pages: {grouped_summary.total_pages}") + logger.info(f"Total records: {grouped_summary.total_records}") + logger.info(f"Total pages: {grouped_summary.total_pages}") if grouped_summary.groups: for group in grouped_summary.groups: - print(f"- {group.top_level_group_value}: {group.total_records}") + logger.info(f"- {group.top_level_group_value}: {group.total_records}") assert grouped_summary is not None @pytest.mark.xfail(reason="Server returns 500 for this api_id") def test_get_api_parameters(self): api_parameters = self.apisec_api.get_api_parameters(api_id=self.api_id) if api_parameters.request_parameters: - print(f"Request parameters: {len(api_parameters.request_parameters)}") + logger.info(f"Request parameters: {len(api_parameters.request_parameters)}") if api_parameters.response_parameters: - print(f"Response parameters: {len(api_parameters.response_parameters)}") + logger.info(f"Response parameters: {len(api_parameters.response_parameters)}") if api_parameters.pii: - print(f"PII: {len(api_parameters.pii)}") + logger.info(f"PII: {len(api_parameters.pii)}") if api_parameters.api_origins: - print(f"API origins: {len(api_parameters.api_origins)}") + logger.info(f"API origins: {len(api_parameters.api_origins)}") assert api_parameters is not None def test_get_risk_summary_by_origin(self): risk_summary = self.apisec_api.get_risk_summary_by_origin(scan_id=self.scan_id) if risk_summary.entries: for entry in risk_summary.entries: - print(f"- {entry.name}: {entry.count}") + logger.info(f"- {entry.name}: {entry.count}") assert risk_summary is not None def test_get_scan_apisec_risk_overview(self): risk_overview = self.apisec_api.get_scan_apisec_risk_overview( scan_id=self.scan_id ) - print(f"API count: {risk_overview.api_count}") - print(f"Total risks count: {risk_overview.total_risks_count}") + logger.info(f"API count: {risk_overview.api_count}") + logger.info(f"Total risks count: {risk_overview.total_risks_count}") assert risk_overview is not None def test_get_all_risk_types(self): risk_types_response = self.apisec_api.get_all_risk_types(scan_id=self.scan_id) - print(f"risk_types_response: {risk_types_response}") + logger.info(f"risk_types_response: {risk_types_response}") assert risk_types_response is not None def test_get_number_of_sensitive_data_apis(self): sensitive_data_count = self.apisec_api.get_number_of_sensitive_data_apis( scan_id=self.scan_id ) - print(f"Sensitive data count: {sensitive_data_count}") + logger.info(f"Sensitive data count: {sensitive_data_count}") assert sensitive_data_count is not None def test_get_number_of_undocumented_apis(self): undocumented_count = self.apisec_api.get_number_of_undocumented_apis( scan_id=self.scan_id ) - print(f"Undocumented APIs count: {undocumented_count}") + logger.info(f"Undocumented APIs count: {undocumented_count}") def test_get_all_api_scan_metadata(self): metadata = self.apisec_api.get_all_api_scan_metadata() - print(f"Metadata entries: {len(metadata)}") + logger.info(f"Metadata entries: {len(metadata)}") for m in metadata: - print(f"- column: {m.column}, options: {len(m.options)}") + logger.info(f"- column: {m.column}, options: {len(m.options)}") assert metadata is not None diff --git a/tests/CxOne/test_byor_results_handler_v2_api.py b/tests/CxOne/test_byor_results_handler_v2_api.py index 1276bb66..381db880 100644 --- a/tests/CxOne/test_byor_results_handler_v2_api.py +++ b/tests/CxOne/test_byor_results_handler_v2_api.py @@ -10,6 +10,8 @@ bulk_triage_import_results, ) from CheckmarxPythonSDK.CxOne import ProjectsAPI as _ProjectsAPI +import logging +logger = logging.getLogger(__name__) def _get_project_id(): @@ -33,7 +35,7 @@ def test_get_latest_imports(): result = get_latest_imports(project_ids=[project_id]) assert result is not None except Exception as e: - print("get_latest_imports skipped: {}".format(str(e))) + logger.warning("get_latest_imports skipped: {}".format(str(e))) def test_get_imports_summaries(): @@ -46,7 +48,7 @@ def test_get_imports_summaries(): result = get_imports_summaries(import_ids=[import_id]) assert result is not None except Exception as e: - print("get_imports_summaries skipped: {}".format(str(e))) + logger.warning("get_imports_summaries skipped: {}".format(str(e))) def test_get_aggregate_results(): @@ -61,7 +63,7 @@ def test_get_aggregate_results(): ) assert result is not None except Exception as e: - print("get_aggregate_results skipped: {}".format(str(e))) + logger.warning("get_aggregate_results skipped: {}".format(str(e))) def test_get_import_results(): @@ -74,7 +76,7 @@ def test_get_import_results(): result = get_import_results(import_id=import_id) assert result is not None except Exception as e: - print("get_import_results skipped: {}".format(str(e))) + logger.warning("get_import_results skipped: {}".format(str(e))) def test_bulk_triage_import_results(): @@ -94,7 +96,7 @@ def test_bulk_triage_import_results(): ) assert result in (True, False) except Exception as e: - print("bulk_triage_import_results skipped: {}".format(str(e))) + logger.warning("bulk_triage_import_results skipped: {}".format(str(e))) def test_delete_import(): @@ -107,4 +109,4 @@ def test_delete_import(): result = delete_import(import_id=import_id) assert result in (True, False) except Exception as e: - print("delete_import skipped: {}".format(str(e))) + logger.warning("delete_import skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_data_retention_api.py b/tests/CxOne/test_data_retention_api.py index 9bf2a739..9ab0c5d4 100644 --- a/tests/CxOne/test_data_retention_api.py +++ b/tests/CxOne/test_data_retention_api.py @@ -10,6 +10,8 @@ abort_process, ) from CheckmarxPythonSDK.CxOne import ScansAPI as _ScansAPI +import logging +logger = logging.getLogger(__name__) def _get_scan_id(): @@ -69,4 +71,4 @@ def test_start_and_abort_process(): is_aborted = abort_process(id=process_id) assert is_aborted is True except Exception as e: - print("start_and_abort_process skipped: {}".format(str(e))) + logger.error("start_and_abort_process skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_fusion_dispatcher_api.py b/tests/CxOne/test_fusion_dispatcher_api.py index 2fff5f70..bbcc9810 100644 --- a/tests/CxOne/test_fusion_dispatcher_api.py +++ b/tests/CxOne/test_fusion_dispatcher_api.py @@ -5,6 +5,8 @@ get_scan_status, ) from CheckmarxPythonSDK.CxOne import FusionResultsAPI +import logging +logger = logging.getLogger(__name__) def _get_app_id(): @@ -26,7 +28,7 @@ def test_get_scan_status(): assert result is not None assert "scanStatus" in result except Exception as e: - print("get_scan_status skipped: {}".format(str(e))) + logger.warning("get_scan_status skipped: {}".format(str(e))) def test_correlate(): @@ -37,4 +39,4 @@ def test_correlate(): result = correlate(id=app_id) assert result is True except Exception as e: - print("correlate skipped: {}".format(str(e))) + logger.warning("correlate skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_fusion_results_api.py b/tests/CxOne/test_fusion_results_api.py index a2e05d52..1c707487 100644 --- a/tests/CxOne/test_fusion_results_api.py +++ b/tests/CxOne/test_fusion_results_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( get_applications, @@ -24,7 +26,7 @@ def test_get_applications(): assert result is not None assert "applications" in result except Exception as e: - print("get_applications skipped: {}".format(str(e))) + logger.warning("get_applications skipped: {}".format(str(e))) def test_get_application_summary(): diff --git a/tests/CxOne/test_global_inventory_reader_api.py b/tests/CxOne/test_global_inventory_reader_api.py index 05ce811b..1ac76a1d 100644 --- a/tests/CxOne/test_global_inventory_reader_api.py +++ b/tests/CxOne/test_global_inventory_reader_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( get_api_changes, @@ -20,7 +22,7 @@ def test_get_api_changes(): assert result is not None assert "api_changes" in result except Exception as e: - print("get_api_changes skipped: {}".format(str(e))) + logger.warning("get_api_changes skipped: {}".format(str(e))) def test_get_api_inventory(): @@ -29,7 +31,7 @@ def test_get_api_inventory(): assert result is not None assert "entries" in result except Exception as e: - print("get_api_inventory skipped: {}".format(str(e))) + logger.warning("get_api_inventory skipped: {}".format(str(e))) def test_get_data_origin(): @@ -37,7 +39,7 @@ def test_get_data_origin(): result = get_data_origin() assert result is not None except Exception as e: - print("get_data_origin skipped: {}".format(str(e))) + logger.warning("get_data_origin skipped: {}".format(str(e))) def test_get_api_inventory_group(): @@ -48,7 +50,7 @@ def test_get_api_inventory_group(): assert result is not None assert "groups" in result except Exception as e: - print("get_api_inventory_group skipped: {}".format(str(e))) + logger.warning("get_api_inventory_group skipped: {}".format(str(e))) def test_get_inventory_metadata(): @@ -56,7 +58,7 @@ def test_get_inventory_metadata(): result = get_inventory_metadata() assert result is not None except Exception as e: - print("get_inventory_metadata skipped: {}".format(str(e))) + logger.warning("get_inventory_metadata skipped: {}".format(str(e))) def test_get_global_parameters(): @@ -64,7 +66,7 @@ def test_get_global_parameters(): result = get_global_parameters() assert result is not None except Exception as e: - print("get_global_parameters skipped: {}".format(str(e))) + logger.warning("get_global_parameters skipped: {}".format(str(e))) def test_get_api_risks(): @@ -72,7 +74,7 @@ def test_get_api_risks(): result = get_api_risks(per_page=5) assert result is not None except Exception as e: - print("get_api_risks skipped: {}".format(str(e))) + logger.warning("get_api_risks skipped: {}".format(str(e))) def test_get_risk_groups(): @@ -81,7 +83,7 @@ def test_get_risk_groups(): assert result is not None assert "groups" in result except Exception as e: - print("get_risk_groups skipped: {}".format(str(e))) + logger.warning("get_risk_groups skipped: {}".format(str(e))) def test_get_risk_widget(): @@ -89,7 +91,7 @@ def test_get_risk_widget(): result = get_risk_widget() assert result is not None except Exception as e: - print("get_risk_widget skipped: {}".format(str(e))) + logger.warning("get_risk_widget skipped: {}".format(str(e))) def test_get_risk_details(): @@ -105,4 +107,4 @@ def test_get_risk_details(): result = get_risk_details(risk_id=risk_id) assert result is not None except Exception as e: - print("get_risk_details skipped: {}".format(str(e))) + logger.warning("get_risk_details skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_kics_results_predicates_api.py b/tests/CxOne/test_kics_results_predicates_api.py index 47c96525..7f1d61fa 100644 --- a/tests/CxOne/test_kics_results_predicates_api.py +++ b/tests/CxOne/test_kics_results_predicates_api.py @@ -7,6 +7,8 @@ ) from CheckmarxPythonSDK.CxOne import ScansAPI as _ScansAPI from CheckmarxPythonSDK.CxOne import KicsResultsAPI +import logging +logger = logging.getLogger(__name__) def _get_kics_data(): @@ -31,7 +33,7 @@ def test_get_predicates_by_similarity_id(): assert result is not None assert "predicateHistoryPerProject" in result except Exception as e: - print("get_predicates_by_similarity_id skipped: {}".format(str(e))) + logger.warning("get_predicates_by_similarity_id skipped: {}".format(str(e))) def test_get_predicates_changes(): @@ -46,7 +48,7 @@ def test_get_predicates_changes(): assert result is not None assert "predicates" in result except Exception as e: - print("get_predicates_changes skipped: {}".format(str(e))) + logger.warning("get_predicates_changes skipped: {}".format(str(e))) def test_create_predicate(): @@ -66,4 +68,4 @@ def test_create_predicate(): ) assert result is True except Exception as e: - print("create_predicate skipped: {}".format(str(e))) + logger.warning("create_predicate skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_logs_api.py b/tests/CxOne/test_logs_api.py index 2e9c0a44..d054fbb3 100644 --- a/tests/CxOne/test_logs_api.py +++ b/tests/CxOne/test_logs_api.py @@ -1,4 +1,6 @@ from CheckmarxPythonSDK.CxOne.logsAPI import LogsAPI +import logging +logger = logging.getLogger(__name__) class TestLogsAPI: @@ -14,47 +16,47 @@ def setup_method(self): def test_get_log(self): """Test get_log method""" - print(f"Testing get_log with scan_id: {self.scan_id}, scan_type: {self.scan_type}") + logger.info(f"Testing get_log with scan_id: {self.scan_id}, scan_type: {self.scan_type}") try: log_content = self.logs_api.get_log( scan_id=self.scan_id, scan_type=self.scan_type ) - print("Success!") - print(f"Log content length: {len(log_content)} characters") + logger.info("Success!") + logger.info(f"Log content length: {len(log_content)} characters") # 打印前500个字符作为预览 preview = log_content[:500] if len(log_content) > 500 else log_content - print(f"Log preview:\n{preview}") + logger.info(f"Log preview:\n{preview}") assert log_content is not None assert isinstance(log_content, str) except Exception as e: - print(f"Error: {str(e)}") + logger.error(f"Error: {str(e)}") # 由于API可能返回错误,这里不做断言,只记录错误 def test_get_log_with_invalid_scan_id(self): """Test get_log method with invalid scan_id""" - print("Testing get_log with invalid scan_id") + logger.info("Testing get_log with invalid scan_id") try: log_content = self.logs_api.get_log( scan_id="invalid-scan-id", scan_type=self.scan_type ) - print("Unexpected success!") + logger.info("Unexpected success!") assert False, "Should have raised an exception" except Exception as e: - print(f"Expected error: {str(e)}") + logger.error(f"Expected error: {str(e)}") # 预期会失败,所以这里不做断言 def test_get_log_with_invalid_scan_type(self): """Test get_log method with invalid scan_type""" - print("Testing get_log with invalid scan_type") + logger.info("Testing get_log with invalid scan_type") try: log_content = self.logs_api.get_log( scan_id=self.scan_id, scan_type="invalid-scan-type" ) - print("Unexpected success!") + logger.info("Unexpected success!") assert False, "Should have raised an exception" except Exception as e: - print(f"Expected error: {str(e)}") + logger.error(f"Expected error: {str(e)}") # 预期会失败,所以这里不做断言 diff --git a/tests/CxOne/test_micro_engines_api.py b/tests/CxOne/test_micro_engines_api.py index f3a5df65..aa86e56a 100644 --- a/tests/CxOne/test_micro_engines_api.py +++ b/tests/CxOne/test_micro_engines_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( get_projects, @@ -65,7 +67,7 @@ def test_get_engine_results(): ) assert result is not None except Exception as e: - print("get_engine_results skipped: {}".format(str(e))) + logger.warning("get_engine_results skipped: {}".format(str(e))) def test_get_result_groups(): @@ -79,7 +81,7 @@ def test_get_result_groups(): ) assert result is not None except Exception as e: - print("get_result_groups skipped: {}".format(str(e))) + logger.warning("get_result_groups skipped: {}".format(str(e))) def test_read_projects(): diff --git a/tests/CxOne/test_misc_endpoints.py b/tests/CxOne/test_misc_endpoints.py index 2a2abb1f..4c82fb7b 100644 --- a/tests/CxOne/test_misc_endpoints.py +++ b/tests/CxOne/test_misc_endpoints.py @@ -8,6 +8,8 @@ get_account_logs, ) from CheckmarxPythonSDK.CxOne import CloudInsightsServiceAPI +import logging +logger = logging.getLogger(__name__) def test_get_account_log_by_id(): @@ -36,7 +38,7 @@ def test_get_account_log_by_id(): assert result is not None assert "id" in result except Exception as e: - print("get_account_log_by_id skipped: {}".format(str(e))) + logger.warning("get_account_log_by_id skipped: {}".format(str(e))) def test_get_contributor_insights_details(): @@ -46,7 +48,7 @@ def test_get_contributor_insights_details(): assert result is not None assert "items" in result except Exception as e: - print("get_contributor_insights_details skipped: {}".format(str(e))) + logger.warning("get_contributor_insights_details skipped: {}".format(str(e))) def test_get_report_status(): @@ -58,7 +60,7 @@ def test_get_report_status(): ) assert result is not None except Exception as e: - print("get_report_status skipped: {}".format(str(e))) + logger.warning("get_report_status skipped: {}".format(str(e))) def test_get_parameters(): @@ -67,4 +69,4 @@ def test_get_parameters(): result = get_parameters() assert result is not None except Exception as e: - print("get_parameters skipped: {}".format(str(e))) + logger.warning("get_parameters skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_organizational_domains_api.py b/tests/CxOne/test_organizational_domains_api.py index a7a436b3..8bc6169b 100644 --- a/tests/CxOne/test_organizational_domains_api.py +++ b/tests/CxOne/test_organizational_domains_api.py @@ -1,3 +1,5 @@ +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( list_organizational_domains, add_organizational_domains, @@ -27,4 +29,4 @@ def test_add_and_delete_organizational_domain(): assert is_deleted is True break except Exception as e: - print("add/delete organizational domain skipped: {}".format(str(e))) + logger.warning("add/delete organizational domain skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_projects_api.py b/tests/CxOne/test_projects_api.py index bf18a5cd..e1bf572a 100644 --- a/tests/CxOne/test_projects_api.py +++ b/tests/CxOne/test_projects_api.py @@ -5,6 +5,8 @@ AccessControlAPI, ) from CheckmarxPythonSDK.CxOne.KeycloakAPI.GroupsApi import GroupsApi +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne.KeycloakAPI.dto.GroupRepresentation import ( GroupRepresentation, ) @@ -71,7 +73,7 @@ def setup_method(self): # If no groups exist, we'll set group_id to None self.group_id = None except Exception as e: - print(f"Error creating group: {str(e)}") + logger.error(f"Error creating group: {str(e)}") self.group_id = None def teardown_method(self): @@ -95,7 +97,7 @@ def teardown_method(self): def test_get_all_projects(self): projects = self.projects_api.get_all_projects() - print(f"number of all projects: {len(projects)}") + logger.info(f"number of all projects: {len(projects)}") assert projects is not None def test_create_a_project(self): @@ -129,14 +131,14 @@ def test_create_a_project_with_group(self): self.projects_api.delete_a_project(project_id=test_project_id) except Exception as e: # Skip this test if group or realm doesn't exist - print(f"Skipping test_create_a_project_with_group: {str(e)}") + logger.warning(f"Skipping test_create_a_project_with_group: {str(e)}") def test_get_a_list_of_projects(self): response = self.projects_api.get_a_list_of_projects() - print(f"number of projects: {len(response.projects)}") - print(f"first 10 projects:") + logger.info(f"number of projects: {len(response.projects)}") + logger.info(f"first 10 projects:") for project in response.projects[:10]: - print(f"Project: {project.name} (id: {project.id})") + logger.info(f"Project: {project.name} (id: {project.id})") assert len(response.projects) > 1 def test_get_a_list_of_projects_with_ids(self): @@ -159,14 +161,14 @@ def test_get_a_list_of_project_with_name(self): response = self.projects_api.get_a_list_of_projects(name="test") assert len(response.projects) > 0 for project in response.projects: - print(f"Project: {project.name} (id: {project.id})") + logger.info(f"Project: {project.name} (id: {project.id})") assert response is not None def test_get_a_list_of_project_with_name_regex(self): response = self.projects_api.get_a_list_of_projects(name_regex="(?i)test$") assert len(response.projects) >= 0 for project in response.projects: - print(f"Project: {project.name} (id: {project.id})") + logger.info(f"Project: {project.name} (id: {project.id})") assert response is not None def test_get_project_id_by_name(self): @@ -175,43 +177,43 @@ def test_get_project_id_by_name(self): def test_get_all_tags(self): tags = self.projects_api.get_all_project_tags() - print(f"number of tags: {len(tags)}") + logger.info(f"number of tags: {len(tags)}") for tag in tags: - print(f"Tag: {tag}") + logger.info(f"Tag: {tag}") assert tags is not None def test_get_last_scan_info(self): response = self.projects_api.get_last_scan_info(limit=100) - print(f"number of last scans: {len(response.keys())}") + logger.info(f"number of last scans: {len(response.keys())}") for key, value in list(response.items())[:3]: - print(f"project_id:{key} Scan: {value})") + logger.info(f"project_id:{key} Scan: {value})") assert response is not None def test_get_last_scan_info_filter_by_project_ids(self): response = self.projects_api.get_last_scan_info(project_ids=[self.project_id_1, self.project_id_2]) - print(f"number of last scans: {len(response.keys())}") + logger.info(f"number of last scans: {len(response.keys())}") for key, value in list(response.items())[:3]: - print(f"project_id:{key} Scan: {value})") + logger.info(f"project_id:{key} Scan: {value})") assert response is not None def test_get_last_scan_info_filter_by_application_id(self): try: application_id = "1247dffb-7dd3-4563-9170-1f10486fe00d" response = self.projects_api.get_last_scan_info(application_id=application_id) - print(f"number of last scans: {len(response.keys())}") + logger.info(f"number of last scans: {len(response.keys())}") for key, value in list(response.items())[:3]: - print(f"project_id:{key} Scan: {value})") + logger.info(f"project_id:{key} Scan: {value})") assert response is not None except Exception as e: # Skip this test if application doesn't exist - print(f"Skipping test_get_last_scan_info_filter_by_application_id: {str(e)}") + logger.warning(f"Skipping test_get_last_scan_info_filter_by_application_id: {str(e)}") def test_get_branches(self): branches = self.projects_api.get_branches() - print(f"number of branches: {len(branches)}") - print(f"first 10 branches:") + logger.info(f"number of branches: {len(branches)}") + logger.info(f"first 10 branches:") for branch in branches[:10]: - print(f"Branch: {branch} ") + logger.info(f"Branch: {branch} ") assert branches is not None if branches: assert len(branches) >= 1 @@ -220,28 +222,28 @@ def test_get_branches_filter_by_project_id(self): try: project_id = "" branches = self.projects_api.get_branches(project_id=project_id) - print(f"number of branches for project_id: {len(branches)}") + logger.info(f"number of branches for project_id: {len(branches)}") for branch in branches[:10]: - print(f"Branch: {branch} ") + logger.info(f"Branch: {branch} ") pass except Exception as e: # Skip this test if there's an error - print(f"Skipping test_get_branches_filter_by_project_id: {str(e)}") + logger.warning(f"Skipping test_get_branches_filter_by_project_id: {str(e)}") def test_get_branches_filter_by_branch_name(self): try: branches = self.projects_api.get_branches(branch_name="main") - print(f"number of branches for branch_name: {len(branches)}") + logger.info(f"number of branches for branch_name: {len(branches)}") for branch in branches[:10]: - print(f"Branch: {branch} ") + logger.info(f"Branch: {branch} ") pass except Exception as e: # Skip this test if there's an error - print(f"Skipping test_get_branches_filter_by_branch_name: {str(e)}") + logger.warning(f"Skipping test_get_branches_filter_by_branch_name: {str(e)}") def test_get_a_project_by_id(self): project = self.projects_api.get_a_project_by_id(project_id=self.project_id_1) - print(f"Project: {project.name} (id: {project.id})") + logger.info(f"Project: {project.name} (id: {project.id})") assert project.name == self.project_name_1 assert project.id == self.project_id_1 assert project is not None @@ -264,7 +266,7 @@ def test_schedule_crud_with_existing(self): schedules = self.projects_api.get_a_list_of_schedules(limit=10) schedule_list = schedules.get("schedules", []) if not schedule_list: - print("No existing schedules found, skipping schedule CRUD test") + logger.warning("No existing schedules found, skipping schedule CRUD test") return project_id = schedule_list[0].get("projectID") @@ -312,7 +314,7 @@ def test_schedule_create_and_delete(self): assert result.get("schedule_id") is not None self.projects_api.delete_a_schedule(project_id=project_id) except Exception as e: - print("Schedule create/delete skipped: {}".format(str(e))) + logger.warning("Schedule create/delete skipped: {}".format(str(e))) finally: self.projects_api.delete_a_project(project_id=project_id) @@ -346,4 +348,4 @@ def test_reassign_a_project(self): # Clean up self.projects_api.delete_a_project(project_id=project_id) except Exception as e: - print("Skipping test_reassign_a_project: {}".format(str(e))) + logger.warning("Skipping test_reassign_a_project: {}".format(str(e))) diff --git a/tests/CxOne/test_repo_manager_api.py b/tests/CxOne/test_repo_manager_api.py index 757295d0..f90767e5 100644 --- a/tests/CxOne/test_repo_manager_api.py +++ b/tests/CxOne/test_repo_manager_api.py @@ -1,5 +1,7 @@ import os from dotenv import load_dotenv +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( RepoManagerAPI, get_repos, @@ -21,7 +23,7 @@ def test_get_all_scm_types_v2(): all_scm_types = repo_manager.get_all_scm_types_v2() for scm in all_scm_types: - print(scm) + logger.info(scm) assert len(all_scm_types) > 1 @@ -37,7 +39,7 @@ def test_get_github_app_info(): result = repo_manager.get_github_app_info( auth_code=os.getenv("GITHUBAPP_AUTH_CODE") ) - print(result) + logger.info(result) assert result is not None def test_create_token_for_github_app(): @@ -54,8 +56,8 @@ def test_get_all_repo_orgs_for_a_scm_type(): page_size=50, ) for repo_org in repo_orgs.orgs: - print(type(repo_org)) - print(repo_org) + logger.info(type(repo_org)) + logger.info(repo_org) assert len(repo_orgs.orgs) > 0 @@ -65,7 +67,7 @@ def test_create_installation_of_scm_on_org(): auth_code=os.getenv("GITHUBAPP_AUTH_CODE"), org_name="happy-cook", ) - print(installation) + logger.info(installation) assert installation is not None @@ -82,8 +84,8 @@ def test_get_all_repos_of_an_org_for_a_scm(): is_user=False, ) for repo in all_repos.repos: - print(type(repo)) - print(repo) + logger.info(type(repo)) + logger.info(repo) assert len(all_repos.repos) > 0 @@ -113,7 +115,7 @@ def test_github_app_import(): webhook_enabled=True, ) for repo in all_repos.repos if repo.name != "WebGoat"] for repo_request in repo_requests: - print(repo_request) + logger.info(repo_request) response = repo_manager.repo_import( origin=origin, organization=github_org, diff --git a/tests/CxOne/test_repo_store_service_api.py b/tests/CxOne/test_repo_store_service_api.py index 096bc941..ce802a67 100644 --- a/tests/CxOne/test_repo_store_service_api.py +++ b/tests/CxOne/test_repo_store_service_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( RepoStoreServiceAPI, check_if_scan_has_source_code_available, @@ -30,5 +32,5 @@ def test_view_source_code_of_specified_file(): scan_id = "87cb64b1-044e-4f1b-81cb-ae9a594e819c" file_path = "src/main/webapp/ForgotPassword.jsp" file_source_code = RepoStoreServiceAPI().view_source_code_of_specified_file(scan_id=scan_id, file_path=file_path) - print(f"file_source_code: {file_source_code}") + logger.info(f"file_source_code: {file_source_code}") assert len(file_source_code) > 0 diff --git a/tests/CxOne/test_repository_insights_api.py b/tests/CxOne/test_repository_insights_api.py index 431dfae4..afe5632a 100644 --- a/tests/CxOne/test_repository_insights_api.py +++ b/tests/CxOne/test_repository_insights_api.py @@ -5,6 +5,8 @@ get_insights_by_repository, ) from CheckmarxPythonSDK.CxOne import ProjectsAPI as _ProjectsAPI +import logging +logger = logging.getLogger(__name__) def test_get_project_repositories(): @@ -17,7 +19,7 @@ def test_get_project_repositories(): assert result is not None assert "project_id" in result except Exception as e: - print("get_project_repositories skipped: {}".format(str(e))) + logger.warning("get_project_repositories skipped: {}".format(str(e))) def test_get_insights_by_repository(): @@ -28,4 +30,4 @@ def test_get_insights_by_repository(): assert result is not None assert "insights" in result except Exception as e: - print("get_insights_by_repository skipped: {}".format(str(e))) + logger.warning("get_insights_by_repository skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_results_overview_api.py b/tests/CxOne/test_results_overview_api.py index 9dd5a0ab..b7919b35 100644 --- a/tests/CxOne/test_results_overview_api.py +++ b/tests/CxOne/test_results_overview_api.py @@ -2,6 +2,8 @@ from CheckmarxPythonSDK.CxOne import get_projects_overview from CheckmarxPythonSDK.CxOne import ProjectsAPI as _ProjectsAPI +import logging +logger = logging.getLogger(__name__) def test_get_projects_overview(): @@ -17,4 +19,4 @@ def test_get_projects_overview(): assert result is not None assert isinstance(result, list) except Exception as e: - print("get_projects_overview skipped: {}".format(str(e))) + logger.warning("get_projects_overview skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_risk_management_api.py b/tests/CxOne/test_risk_management_api.py index a76a4d29..a44a4434 100644 --- a/tests/CxOne/test_risk_management_api.py +++ b/tests/CxOne/test_risk_management_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( get_summary, @@ -25,7 +27,7 @@ def test_get_summary(): assert result is not None assert "applications" in result except Exception as e: - print("get_summary skipped: {}".format(str(e))) + logger.warning("get_summary skipped: {}".format(str(e))) def test_get_results(): diff --git a/tests/CxOne/test_sast_queries_audit_api.py b/tests/CxOne/test_sast_queries_audit_api.py index c7b0f522..5e41f04e 100644 --- a/tests/CxOne/test_sast_queries_audit_api.py +++ b/tests/CxOne/test_sast_queries_audit_api.py @@ -1,4 +1,6 @@ import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( get_all_queries, create_new_query, @@ -109,7 +111,7 @@ def test_create_query(): )) assert result in (True, False) except Exception as e: - print("create_query skipped: {}".format(str(e))) + logger.warning("create_query skipped: {}".format(str(e))) def test_get_query_source_by_level_path(): @@ -121,7 +123,7 @@ def test_get_query_source_by_level_path(): ) assert result is not None except Exception as e: - print("get_query_source_by_level_path skipped: {}".format(str(e))) + logger.warning("get_query_source_by_level_path skipped: {}".format(str(e))) def test_update_query_source_by_level(): @@ -138,7 +140,7 @@ def test_update_query_source_by_level(): ) assert result in (True, False) except Exception as e: - print("update_query_source_by_level skipped: {}".format(str(e))) + logger.warning("update_query_source_by_level skipped: {}".format(str(e))) # # def test_update_query_source(): diff --git a/tests/CxOne/test_sast_results_api.py b/tests/CxOne/test_sast_results_api.py index 923c8286..55e8b46f 100644 --- a/tests/CxOne/test_sast_results_api.py +++ b/tests/CxOne/test_sast_results_api.py @@ -5,6 +5,8 @@ get_similar_results, ) from CheckmarxPythonSDK.CxOne import ScansAPI as _ScansAPI +import logging +logger = logging.getLogger(__name__) def _get_sast_scan_id(): @@ -35,7 +37,7 @@ def test_get_sast_results_by_scan_id(): page = 1 sast_results_collection = get_sast_results_by_scan_id(scan_id=scan_id, offset=offset, limit=limit, state=["TO_VERIFY", "CONFIRMED"], include_nodes=False,) total_count = int(sast_results_collection.get("totalCount")) - print(f"number of totalCount results: {total_count}") + logger.info(f"number of totalCount results: {total_count}") sast_results = sast_results_collection.get("results") if total_count > limit: while True: @@ -45,7 +47,7 @@ def test_get_sast_results_by_scan_id(): sast_results_collection = get_sast_results_by_scan_id(scan_id=scan_id, offset=offset, limit=limit, state=["TO_VERIFY", "CONFIRMED"], include_nodes=False,) page += 1 sast_results.extend(sast_results_collection.get("results")) - print(f"number of TO_VERIFY or CONFIRMED results: {len(sast_results)}") + logger.info(f"number of TO_VERIFY or CONFIRMED results: {len(sast_results)}") pass @@ -62,7 +64,7 @@ def test_get_sast_results_compare_by_scans(): assert result is not None assert "results" in result except Exception as e: - print("get_sast_results_compare_by_scans skipped: {}".format(str(e))) + logger.warning("get_sast_results_compare_by_scans skipped: {}".format(str(e))) def test_get_similar_results(): @@ -76,4 +78,4 @@ def test_get_similar_results(): ) assert result is not None except Exception as e: - print("get_similar_results skipped: {}".format(str(e))) + logger.warning("get_similar_results skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_sast_results_predicates_api.py b/tests/CxOne/test_sast_results_predicates_api.py index 9211e6a0..55239b18 100644 --- a/tests/CxOne/test_sast_results_predicates_api.py +++ b/tests/CxOne/test_sast_results_predicates_api.py @@ -23,6 +23,8 @@ ) from CheckmarxPythonSDK.CxOne import ScansAPI as _ScansAPI from CheckmarxPythonSDK.CxOne import ProjectsAPI as _ProjectsAPI +import logging +logger = logging.getLogger(__name__) def _get_sast_scan_and_project_id(): @@ -129,7 +131,7 @@ def test_get_predicates_by_attack_vector_id(): ) assert result is not None except Exception as e: - print("get_predicates_by_attack_vector_id skipped: {}".format(str(e))) + logger.warning("get_predicates_by_attack_vector_id skipped: {}".format(str(e))) def test_get_predicates_changelog(): @@ -145,7 +147,7 @@ def test_get_predicates_changelog(): ) assert result is not None except Exception as e: - print("get_predicates_changelog skipped: {}".format(str(e))) + logger.warning("get_predicates_changelog skipped: {}".format(str(e))) def test_create_predicates_by_attack_vector(): @@ -166,7 +168,7 @@ def test_create_predicates_by_attack_vector(): ) assert result is not None except Exception as e: - print("create_predicates_by_attack_vector skipped: {}".format(str(e))) + logger.warning("create_predicates_by_attack_vector skipped: {}".format(str(e))) def test_get_predicates_status(): @@ -182,4 +184,4 @@ def test_get_predicates_status(): assert result is not None assert "isUpdatePredicatesRunning" in result except Exception as e: - print("get_predicates_status skipped: {}".format(str(e))) + logger.warning("get_predicates_status skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_sast_scan_metadata_service_api.py b/tests/CxOne/test_sast_scan_metadata_service_api.py index 1910ee27..021ae0dd 100644 --- a/tests/CxOne/test_sast_scan_metadata_service_api.py +++ b/tests/CxOne/test_sast_scan_metadata_service_api.py @@ -14,6 +14,8 @@ ) from CheckmarxPythonSDK.CxOne import ScansAPI as _ScansAPI from CheckmarxPythonSDK.CxOne import ProjectsAPI as _ProjectsAPI +import logging +logger = logging.getLogger(__name__) def _get_sast_scan_id(): @@ -115,7 +117,7 @@ def test_check_persisted_dom_exists(): ) assert result in (True, False) except Exception as e: - print("check_persisted_dom_exists skipped: {}".format(str(e))) + logger.warning("check_persisted_dom_exists skipped: {}".format(str(e))) def test_delete_persisted_dom(): @@ -131,4 +133,4 @@ def test_delete_persisted_dom(): ) assert result in (True, False) except Exception as e: - print("delete_persisted_dom skipped: {}".format(str(e))) + logger.warning("delete_persisted_dom skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_scans_api.py b/tests/CxOne/test_scans_api.py index bd9f6c46..5e1b071e 100644 --- a/tests/CxOne/test_scans_api.py +++ b/tests/CxOne/test_scans_api.py @@ -1,5 +1,7 @@ import time import urllib.request +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( create_a_project, @@ -181,7 +183,7 @@ def test_get_and_update_scan_tags(): project_id = get_project_id_by_name(name=new_project_name) scans = get_a_list_of_scans(project_id=project_id, sort=["-created_at"], limit=1) if not scans.scans: - print("No scans found, skipping scan tags test") + logger.warning("No scans found, skipping scan tags test") return scan_id = scans.scans[0].id @@ -204,14 +206,14 @@ def test_rescan(): assert scan is not None assert scan.id is not None except Exception as e: - print("Rescan skipped (no valid prior scan): {}".format(str(e))) + logger.warning("Rescan skipped (no valid prior scan): {}".format(str(e))) def test_set_scan_recalculation_flag(): project_id = get_project_id_by_name(name=new_project_name) scans = get_a_list_of_scans(project_id=project_id, sort=["-created_at"], limit=1) if not scans.scans: - print("No scans found, skipping recalculation flag test") + logger.warning("No scans found, skipping recalculation flag test") return scan_id = scans.scans[0].id scan = get_a_scan_by_id(scan_id=scan_id) diff --git a/tests/CxOne/test_static_correlator_api.py b/tests/CxOne/test_static_correlator_api.py index a91c1819..e1d48443 100644 --- a/tests/CxOne/test_static_correlator_api.py +++ b/tests/CxOne/test_static_correlator_api.py @@ -2,6 +2,8 @@ from CheckmarxPythonSDK.CxOne import update_risk from CheckmarxPythonSDK.CxOne import ScansAPI as _ScansAPI +import logging +logger = logging.getLogger(__name__) def _get_apisec_scan_id(): @@ -27,4 +29,4 @@ def test_update_risk(): ) assert result is not None except Exception as e: - print("update_risk skipped: {}".format(str(e))) + logger.warning("update_risk skipped: {}".format(str(e))) diff --git a/tests/CxOne/test_token_expiry_integration.py b/tests/CxOne/test_token_expiry_integration.py index 7c7ae0c8..dcdf6ad1 100644 --- a/tests/CxOne/test_token_expiry_integration.py +++ b/tests/CxOne/test_token_expiry_integration.py @@ -1,5 +1,7 @@ from CheckmarxPythonSDK.CxOne.config import construct_configuration from CheckmarxPythonSDK.api_client import ApiClient +import logging +logger = logging.getLogger(__name__) def test_expired_token_is_refreshed_and_request_succeeds(): @@ -20,4 +22,4 @@ def test_expired_token_is_refreshed_and_request_succeeds(): assert response.status_code == 200 states = response.json() assert states is not None - print(f"states: {states}") + logger.info(f"states: {states}") diff --git a/tests/CxOne/test_uploads_api.py b/tests/CxOne/test_uploads_api.py index f13402e7..f048576a 100644 --- a/tests/CxOne/test_uploads_api.py +++ b/tests/CxOne/test_uploads_api.py @@ -1,4 +1,6 @@ import urllib.request +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxOne import ( create_a_pre_signed_url_to_upload_files, @@ -17,7 +19,7 @@ def test_create_a_pre_signed_url_to_upload_files(): zip_file_path, ) url = create_a_pre_signed_url_to_upload_files() - print("url: {}".format(url)) + logger.info("url: {}".format(url)) assert url is not None result = upload_zip_content_for_scanning( upload_link=url, diff --git a/tests/CxOne/test_webhook_api.py b/tests/CxOne/test_webhook_api.py index 2d824c3a..7b7f6469 100644 --- a/tests/CxOne/test_webhook_api.py +++ b/tests/CxOne/test_webhook_api.py @@ -6,6 +6,8 @@ ) from CheckmarxPythonSDK.CxOne import ProjectsAPI as _ProjectsAPI from CheckmarxPythonSDK.CxOne.dto import WebHookInput +import logging +logger = logging.getLogger(__name__) def test_webhook_api(): @@ -18,7 +20,7 @@ def test_get_webhook_by_id(): response = WebHookAPI().get_a_list_of_webhooks_related_to_tenant(limit=100) webhooks = response.webhooks if not webhooks: - print("No webhooks found, skipping get_webhook_by_id") + logger.warning("No webhooks found, skipping get_webhook_by_id") return webhook_id = webhooks[0].id webhook = get_webhook_by_id(webhook_id=webhook_id) @@ -30,7 +32,7 @@ def test_create_a_webhook_on_project(): """POST /api/webhooks/projects/{project-id} — create then delete.""" projects = _ProjectsAPI().get_a_list_of_projects(limit=1) if not projects.projects: - print("No projects found, skipping create webhook on project") + logger.warning("No projects found, skipping create webhook on project") return project_id = projects.projects[0].id diff --git a/tests/CxSAST/CxReporting/test_cxreporting_api.py b/tests/CxSAST/CxReporting/test_cxreporting_api.py index 8be02edb..940ee911 100644 --- a/tests/CxSAST/CxReporting/test_cxreporting_api.py +++ b/tests/CxSAST/CxReporting/test_cxreporting_api.py @@ -1,6 +1,8 @@ import time from datetime import datetime from os.path import normpath, join, dirname +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxReporting.api import ( retrieve_the_file_of_a_specific_report, @@ -23,9 +25,9 @@ def check_report_generation_status_and_write_to_file(report_request, report_name report_status = "NEW" while report_status.upper() != "FINISHED": report_status = retrieve_the_status_of_a_specific_report(report_id=report_id) - print("report status: {}".format(report_status)) + logger.info("report status: {}".format(report_status)) if report_status.upper() == "FAILED": - print("Report generation failed!") + logger.error("Report generation failed!") return result time.sleep(2) diff --git a/tests/CxSAST/CxRestAPI/test_projects_api.py b/tests/CxSAST/CxRestAPI/test_projects_api.py index 5bf9f45a..e905f4aa 100644 --- a/tests/CxSAST/CxRestAPI/test_projects_api.py +++ b/tests/CxSAST/CxRestAPI/test_projects_api.py @@ -12,6 +12,8 @@ from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI from CheckmarxPythonSDK.CxRestAPISDK import TeamAPI from CheckmarxPythonSDK.utilities.CxError import CxError +import logging +logger = logging.getLogger(__name__) from .. import get_project_id @@ -108,12 +110,12 @@ def test_get_branch_project_status(): ) branched_project = projects_api.create_branched_project(project_id, branched_project_name) branched_project_id = branched_project.id - print(f"branched project created with id: {branched_project_id}") + logger.info(f"branched project created with id: {branched_project_id}") - print("polling branch project status...") + logger.info("polling branch project status...") while True: status = projects_api.get_branch_project_status(branched_project_id) - print(f" status: {status}") + logger.info(f" status: {status}") if status == "Completed": break time.sleep(10) diff --git a/tests/CxSAST/CxRestAPI/test_sast_results_pagination.py b/tests/CxSAST/CxRestAPI/test_sast_results_pagination.py index d22a653c..163adbee 100644 --- a/tests/CxSAST/CxRestAPI/test_sast_results_pagination.py +++ b/tests/CxSAST/CxRestAPI/test_sast_results_pagination.py @@ -5,6 +5,8 @@ path_id as the unique key. """ from CheckmarxPythonSDK.CxRestAPISDK import ScansAPI +import logging +logger = logging.getLogger(__name__) from .. import get_project_id @@ -59,11 +61,9 @@ def test_sast_results_pagination_no_duplicates(): seen_path_ids.add(key) # Log page info for diagnostics - print( - f"Page {page_num}: offset={offset}, limit={limit}, " + logger.info(f"Page {page_num}: offset={offset}, limit={limit}, " f"fetched={len(batch)}, total={page.total_count}, " - f"seen={len(seen_path_ids)}" - ) + f"seen={len(seen_path_ids)}") # Exit when we've fetched all results if offset + limit >= page.total_count: @@ -72,21 +72,19 @@ def test_sast_results_pagination_no_duplicates(): page_num += 1 total_expected = all_results[0].total_count if all_results else 0 - print(f"\nSummary: fetched {len(all_results)} results across {page_num} pages") - print(f"Server reported totalCount: {total_expected}") - print(f"Unique path_ids: {len(seen_path_ids)}") + logger.info(f"\nSummary: fetched {len(all_results)} results across {page_num} pages") + logger.info(f"Server reported totalCount: {total_expected}") + logger.info(f"Unique path_ids: {len(seen_path_ids)}") if duplicates: dup_path_ids = {d["path_id"] for d in duplicates} dup_pages = {d["page"] for d in duplicates} - print(f"\nERROR: Found {len(duplicates)} duplicate result(s)!") - print(f"Duplicate path_ids: {dup_path_ids}") - print(f"Pages with duplicates: {dup_pages}") + logger.error(f"\nERROR: Found {len(duplicates)} duplicate result(s)!") + logger.info(f"Duplicate path_ids: {dup_path_ids}") + logger.info(f"Pages with duplicates: {dup_pages}") for d in duplicates: - print( - f" Duplicate: path_id={d['path_id']} on page {d['page']}, " - f"query={d['query']}, state={d['state']}, index={d['index']}" - ) + logger.info(f" Duplicate: path_id={d['path_id']} on page {d['page']}, " + f"query={d['query']}, state={d['state']}, index={d['index']}") assert len(duplicates) == 0, ( f"Found {len(duplicates)} duplicate result(s) across pages. " @@ -120,10 +118,8 @@ def test_sast_results_last_page_no_duplicate_with_previous(): batch_ids = {r.path_id for r in page.results} page_path_ids.append((page_num, batch_ids)) - print( - f"Page {page_num}: offset={offset}, count={len(page.results)}, " - f"total={page.total_count}" - ) + logger.info(f"Page {page_num}: offset={offset}, count={len(page.results)}, " + f"total={page.total_count}") if offset + limit >= page.total_count: break @@ -143,12 +139,10 @@ def test_sast_results_last_page_no_duplicate_with_previous(): }) if overlaps_found: - print(f"\nERROR: Found overlaps between consecutive pages!") + logger.error(f"\nERROR: Found overlaps between consecutive pages!") for ov in overlaps_found: - print( - f" Overlap between pages {ov['pages']}: " - f"path_ids={ov['overlapping_path_ids']}" - ) + logger.info(f" Overlap between pages {ov['pages']}: " + f"path_ids={ov['overlapping_path_ids']}") assert len(overlaps_found) == 0, ( f"Found {len(overlaps_found)} page overlap(s). " @@ -189,10 +183,10 @@ def test_get_all_scan_results_no_duplicates(): break offset += limit - print(f"Server totalCount: {total_from_server}") - print(f"Raw sum across pages: {raw_count}") - print(f"get_all_scan_results count: {len(results)}") - print(f"Unique path_ids: {len(unique_ids)}") + logger.info(f"Server totalCount: {total_from_server}") + logger.info(f"Raw sum across pages: {raw_count}") + logger.info(f"get_all_scan_results count: {len(results)}") + logger.info(f"Unique path_ids: {len(unique_ids)}") # No duplicates in helper result assert len(results) == len(unique_ids), ( @@ -202,7 +196,7 @@ def test_get_all_scan_results_no_duplicates(): # If server has the bug, raw_count > total_from_server, but helper result # should equal unique count from raw pages if raw_count > total_from_server: - print(f"NOTE: Server pagination bug confirmed - raw count {raw_count} " + logger.info(f"NOTE: Server pagination bug confirmed - raw count {raw_count} " f"exceeds totalCount {total_from_server}") # The helper should filter out duplicates assert len(results) <= raw_count diff --git a/tests/CxSCA/test_sca_api.py b/tests/CxSCA/test_sca_api.py index 9a833793..f30da557 100644 --- a/tests/CxSCA/test_sca_api.py +++ b/tests/CxSCA/test_sca_api.py @@ -1,5 +1,7 @@ import time import pytest +import logging +logger = logging.getLogger(__name__) from CheckmarxPythonSDK.CxScaApiSDK import ( get_all_projects, check_if_project_already_exists, @@ -544,14 +546,14 @@ def sbom_report_analysis(scan_id, file_format): response = get_scan_status(scan_id=scan_id) scan_status = response.get("name") if scan_status == "Scanning": - print("scanning ...") + logger.info("scanning ...") time.sleep(60) continue elif scan_status == "Done": - print("scan finished successfully!") + logger.info("scan finished successfully!") break elif scan_status == "Failed": - print("scan_status:{}, message:{}".format(scan_status, response.get("message"))) + logger.info("scan_status:{}, message:{}".format(scan_status, response.get("message"))) return export_id = create_sbom_report(scan_id, file_format) assert len(export_id) > 0 diff --git a/tests/test_sample.py b/tests/test_sample.py index 2b312bed..0ce94b2b 100644 --- a/tests/test_sample.py +++ b/tests/test_sample.py @@ -1,6 +1,8 @@ from CheckmarxPythonSDK.CxRestAPISDK import ProjectsAPI from CheckmarxPythonSDK.CxRestAPISDK import ScansAPI from CheckmarxPythonSDK.CxRestAPISDK import TeamAPI +import logging +logger = logging.getLogger(__name__) def test_sample(): @@ -15,7 +17,7 @@ def test_sample(): scans = scan_api.get_all_scans_for_project(project_id=project.project_id, scan_status='Finished') for scan in scans: - print(str(scan.id)) + logger.info(str(scan.id)) test_sample()