splunk-soar-sdk 1.5.0__tar.gz → 1.5.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/PKG-INFO +1 -1
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/pyproject.toml +1 -4
- splunk_soar_sdk-1.5.2/release_notes.txt +21 -0
- splunk_soar_sdk-1.5.2/release_version.txt +1 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/actions_manager.py +2 -4
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_cli_runner.py +3 -8
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/package/utils.py +7 -1
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/params.py +0 -2
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/action_result.py +3 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/views/template_filters.py +5 -2
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/manifests/test_processors.py +5 -4
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/conftest.py +0 -7
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/stubs.py +1 -1
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_actions_manager.py +42 -25
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_app_action.py +10 -9
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_app_runner.py +79 -99
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_generic_action.py +24 -16
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_logging.py +72 -59
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_on_poll.py +73 -61
- splunk_soar_sdk-1.5.2/tests/test_template_filters.py +207 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_test_connectivity.py +18 -12
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/uv.lock +1 -1
- splunk_soar_sdk-1.5.0/release_notes.txt +0 -39
- splunk_soar_sdk-1.5.0/release_version.txt +0 -1
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/ISSUE_TEMPLATE/bug.md +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/pull_request_template.md +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/utils/github.js +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/utils/update_version.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/workflows/code_quality.yml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/workflows/commit_hygiene.yml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/workflows/generate_docs.yml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.github/workflows/semantic_release.yml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.gitignore +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.pre-commit-config.yaml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/.releaserc +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/LICENSE +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/README.md +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/commitlint.config.js +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/api_reference.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/app_structure/index.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/app_structure/pre-commit-config.yaml.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/app_structure/pyproject.toml.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/app_structure/src_app.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/changelog.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/cli_reference.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/conf.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/custom_views/index.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/custom_views/reusable_components.md +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/custom_views/templates.md +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/custom_views/view_handlers.md +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/getting_started/defining_asset.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/getting_started/first_action.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/getting_started/index.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/getting_started/init_app.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/getting_started/installation.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/getting_started/testing_and_building.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/docs/index.rst +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/abstract.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/action_results.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/apis/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/apis/artifact.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/apis/container.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/apis/utils.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/apis/vault.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_client.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_templates/basic_app/.gitignore +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_templates/basic_app/.pre-commit-config.yaml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_templates/basic_app/logo.svg +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_templates/basic_app/logo_dark.svg +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_templates/basic_app/src/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/app_templates/basic_app/uv.lock +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/asset.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/async_utils.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/init/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/init/cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/manifests/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/manifests/cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/manifests/deserializers.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/manifests/processors.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/manifests/serializers.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/package/cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/path_utils.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/cli/utils.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/code_renderers/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/code_renderers/action_renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/code_renderers/app_renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/code_renderers/asset_renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/code_renderers/renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/code_renderers/templates/pyproject.toml.jinja +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/code_renderers/toml_renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/colors.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/compat.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/crypto.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/decorators/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/decorators/action.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/decorators/generic_action.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/decorators/on_poll.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/decorators/test_connectivity.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/decorators/view_handler.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/decorators/webhook.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/exceptions.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/input_spec.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/logging.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/meta/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/meta/actions.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/meta/adapters.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/meta/app.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/meta/datatypes.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/meta/dependencies.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/meta/webhooks.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/models/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/models/artifact.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/models/container.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/models/vault_attachment.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/models/view.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/paths.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/py.typed +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/app.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/base_connector.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/connector_result.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/consts.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/encryption_helper.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/install_info.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/json_keys.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/ph_ipc.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom/vault.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom_common/app_interface/app_interface.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/shims/phantom_common/encryption/encryption_manager_factory.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/templates/base/base_template.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/templates/base/error.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/templates/base/header.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/templates/base/logo_header.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/templates/components/pie_chart.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/templates/widgets/widget_resize_snippet.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/templates/widgets/widget_template.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/types.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/views/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/views/component_registry.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/views/components/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/views/components/pie_chart.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/views/template_renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/views/view_parser.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/webhooks/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/webhooks/models.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/src/soar_sdk/webhooks/routing.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/test.png +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/test.txt +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/datapath_parse.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/manifests/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_assets/converted_app/actions.py.txt +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_convert_cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_deserializers.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_init_cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_manifests_cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_package_cli.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_serializers.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/cli/test_utils.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/code_renderers/test_action_renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/app.json +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/example_asset.json +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/logo.svg +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/logo_dark.svg +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/pyproject.toml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/src/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/src/actions/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/src/actions/async_action.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/src/actions/generate_category.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/src/actions/reverse_string.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/src/app.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/src/ignoreme.txt +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/templates/reverse_string.html +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app/uv.lock +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app_with_webhook/app.json +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app_with_webhook/logo.svg +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app_with_webhook/logo_dark.svg +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app_with_webhook/pyproject.toml +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app_with_webhook/src/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app_with_webhook/src/app.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/example_app_with_webhook/uv.lock +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/interfaces/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/interfaces/test_artifact_interface.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/interfaces/test_container_interface.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/interfaces/test_vault_interface.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/meta/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/meta/test_actions.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/meta/test_adapters.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/meta/test_datatypes.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/meta/test_dependencies.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/meta/test_webhooks.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/mocks/__init__.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/mocks/dynamic_mocks.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/mocks/importable_action.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_action_results.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_app.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_app_action_params.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_app_action_results.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_app_client.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_asset.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_assets/splunk-sdk-2.1.0.tar.gz +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_async_integration.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_async_utils.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_code_renderers.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_compat.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_container.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_custom_views.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_encryption.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_params.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_template_renderer.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/test_view_parser.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/webhooks/test_models.py +0 -0
- {splunk_soar_sdk-1.5.0 → splunk_soar_sdk-1.5.2}/tests/webhooks/test_routing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splunk-soar-sdk
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.2
|
|
4
4
|
Summary: The official framework for developing and testing Splunk SOAR Apps
|
|
5
5
|
Project-URL: Homepage, https://github.com/phantomcyber/splunk-soar-sdk
|
|
6
6
|
Project-URL: Documentation, https://github.com/phantomcyber/splunk-soar-sdk
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "splunk-soar-sdk"
|
|
3
|
-
version = "1.5.
|
|
3
|
+
version = "1.5.2"
|
|
4
4
|
description = "The official framework for developing and testing Splunk SOAR Apps"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.9, <3.14"
|
|
@@ -137,10 +137,7 @@ source = [
|
|
|
137
137
|
"src/soar_sdk"
|
|
138
138
|
]
|
|
139
139
|
omit = [
|
|
140
|
-
"src/soar_sdk/api_callers.py", # moved 1:1 from App Wizard, not re-designed yet
|
|
141
140
|
"src/soar_sdk/shims/*", # shims for BaseConnector, should not need testing
|
|
142
|
-
"src/soar_sdk/views/components/*", # reusable components, testing deferred till actual usage
|
|
143
|
-
"src/soar_sdk/views/template_filters.py", # ported from platform, need to decide what we're keeping
|
|
144
141
|
"src/soar_sdk/code_renderers/templates/*" # jinja templates, not code
|
|
145
142
|
]
|
|
146
143
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
## [1.5.2](https://github.com/phantomcyber/splunk-soar-sdk/compare/1.5.1...1.5.2) (2025-09-17)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* bump connection and read timeouts for soarapps install ([783adec](https://github.com/phantomcyber/splunk-soar-sdk/commit/783adece918fb0e8113cc17df8ccdf6b8efefe8c))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
## [1.5.2](https://github.com/phantomcyber/splunk-soar-sdk/compare/1.5.1...1.5.2) (2025-09-17)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* bump connection and read timeouts for soarapps install ([783adec](https://github.com/phantomcyber/splunk-soar-sdk/commit/783adece918fb0e8113cc17df8ccdf6b8efefe8c))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.5.2
|
|
@@ -84,11 +84,9 @@ class ActionsManager(BaseConnector):
|
|
|
84
84
|
if handler := self.get_action(action_id):
|
|
85
85
|
try:
|
|
86
86
|
params = handler.meta.parameters.parse_obj(param)
|
|
87
|
-
except (ValueError, ValidationError):
|
|
88
|
-
# FIXME: Consider adding more details to this error, but be aware
|
|
89
|
-
# of possible PIIs.
|
|
87
|
+
except (ValueError, ValidationError) as e:
|
|
90
88
|
self.save_progress(
|
|
91
|
-
"Validation Error - the params data for action could not be parsed"
|
|
89
|
+
f"Validation Error - the params data for action could not be parsed: {e!s}"
|
|
92
90
|
)
|
|
93
91
|
return
|
|
94
92
|
handler(params)
|
|
@@ -257,20 +257,15 @@ class AppCliRunner:
|
|
|
257
257
|
)
|
|
258
258
|
print(f"Parsed webhook request: {args.webhook_request}")
|
|
259
259
|
|
|
260
|
-
def run(self) -> None:
|
|
260
|
+
def run(self, argv: Optional[list[str]] = None) -> None:
|
|
261
261
|
"""Run the app CLI."""
|
|
262
|
-
args = self.parse_args()
|
|
262
|
+
args = self.parse_args(argv=argv)
|
|
263
263
|
|
|
264
264
|
logger = PhantomLogger()
|
|
265
265
|
|
|
266
266
|
if input_data := getattr(args, "raw_input_data", None):
|
|
267
267
|
self.app.handle(input_data)
|
|
268
|
-
|
|
269
|
-
# yet, because the test will need to be rewritten. We shouldn't be posting our results
|
|
270
|
-
# into ActionResult.param...
|
|
271
|
-
for (
|
|
272
|
-
result
|
|
273
|
-
) in self.app.actions_manager.get_action_results(): # pragma: no cover
|
|
268
|
+
for result in self.app.actions_manager.get_action_results():
|
|
274
269
|
params_pretty = json.dumps(result.param, indent=2, ensure_ascii=False)
|
|
275
270
|
data_pretty = json.dumps(
|
|
276
271
|
result.get_data(), indent=2, ensure_ascii=False
|
|
@@ -8,7 +8,13 @@ async def phantom_get_login_session(
|
|
|
8
8
|
base_url: str, username: str, password: str
|
|
9
9
|
) -> AsyncGenerator[httpx.AsyncClient, None]:
|
|
10
10
|
"""Contextmanager that creates an authenticated client with CSRF token handling."""
|
|
11
|
-
|
|
11
|
+
# Set longer timeouts for large file uploads
|
|
12
|
+
timeout = httpx.Timeout(30.0, read=60.0)
|
|
13
|
+
async with httpx.AsyncClient(
|
|
14
|
+
base_url=base_url,
|
|
15
|
+
verify=False, # noqa: S501
|
|
16
|
+
timeout=timeout,
|
|
17
|
+
) as client:
|
|
12
18
|
# get the cookies from the get method
|
|
13
19
|
response = await client.get("/login")
|
|
14
20
|
response.raise_for_status()
|
|
@@ -28,8 +28,6 @@ def Param(
|
|
|
28
28
|
Use this function to define the default value for an action parameter that requires
|
|
29
29
|
extra metadata for the manifest. This function is a thin wrapper around pydantic.Field.
|
|
30
30
|
|
|
31
|
-
:param order: The order key, starting at 0, allows the app
|
|
32
|
-
author to control the display order of the controls in the UI.
|
|
33
31
|
:param description: A short description of this parameter.
|
|
34
32
|
The description is shown in the user interface when running an action manually.
|
|
35
33
|
:param default: To set the default value of a variable in the UI, use this key.
|
|
@@ -10,7 +10,7 @@ import uuid
|
|
|
10
10
|
import humanize
|
|
11
11
|
import bleach # type: ignore[import-untyped]
|
|
12
12
|
from datetime import datetime, timedelta
|
|
13
|
-
from typing import Optional, Union
|
|
13
|
+
from typing import Optional, TypeVar, Union
|
|
14
14
|
from collections.abc import Iterable
|
|
15
15
|
from collections.abc import Iterator
|
|
16
16
|
from jinja2 import Environment
|
|
@@ -47,7 +47,10 @@ def sorteditems(dictionary: dict) -> list:
|
|
|
47
47
|
return sorted(dictionary.items())
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
T = TypeVar("T")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def batch(iterable: Iterable[T], count: int) -> Iterator[list[T]]:
|
|
51
54
|
"""Batch items into groups of specified count."""
|
|
52
55
|
result = []
|
|
53
56
|
for item in iterable:
|
|
@@ -4,19 +4,20 @@ from unittest import mock
|
|
|
4
4
|
import json
|
|
5
5
|
from datetime import datetime
|
|
6
6
|
|
|
7
|
+
import pytest_mock
|
|
8
|
+
|
|
7
9
|
from soar_sdk.cli.manifests.processors import ManifestProcessor
|
|
8
10
|
from soar_sdk.compat import UPDATE_TIME_FORMAT
|
|
9
11
|
|
|
10
12
|
|
|
11
|
-
def test_manifest_processor_creating_json_from_meta():
|
|
13
|
+
def test_manifest_processor_creating_json_from_meta(mocker: pytest_mock.MockerFixture):
|
|
12
14
|
processor = ManifestProcessor(
|
|
13
15
|
"example_app.json", project_context="./tests/example_app"
|
|
14
16
|
)
|
|
15
|
-
processor.save_json_manifest = mock.Mock()
|
|
16
17
|
|
|
18
|
+
save_json_manifest = mocker.patch.object(processor, "save_json_manifest")
|
|
17
19
|
processor.create()
|
|
18
|
-
|
|
19
|
-
processor.save_json_manifest.assert_called_once()
|
|
20
|
+
save_json_manifest.assert_called_once()
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
@mock.patch("builtins.open", new_callable=mock.mock_open, read_data="data")
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import json
|
|
2
1
|
from unittest import mock
|
|
3
2
|
|
|
4
3
|
import pytest
|
|
@@ -45,12 +44,6 @@ def example_app() -> App:
|
|
|
45
44
|
product_name="Example App",
|
|
46
45
|
publisher="Splunk",
|
|
47
46
|
)
|
|
48
|
-
app.actions_manager._load_app_json = mock.Mock(return_value=True)
|
|
49
|
-
app.actions_manager.get_state_dir = mock.Mock(return_value="/tmp/")
|
|
50
|
-
app.actions_manager._load_app_json = mock.Mock(return_value=True)
|
|
51
|
-
|
|
52
|
-
with open("tests/example_app/app.json") as app_json:
|
|
53
|
-
app.actions_manager._BaseConnector__app_json = json.load(app_json)
|
|
54
47
|
|
|
55
48
|
return app
|
|
56
49
|
|
|
@@ -3,6 +3,7 @@ from unittest import mock
|
|
|
3
3
|
from zoneinfo import ZoneInfo
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
+
import pytest_mock
|
|
6
7
|
|
|
7
8
|
from soar_sdk.asset import AssetField, BaseAsset
|
|
8
9
|
from soar_sdk.input_spec import AppConfig, InputSpecification
|
|
@@ -238,15 +239,17 @@ def test_actions_provider_running_undefined_action(
|
|
|
238
239
|
|
|
239
240
|
|
|
240
241
|
def test_app_connector_handle_action_runs_app_action(
|
|
241
|
-
app_actions_manager: ActionsManager,
|
|
242
|
+
app_actions_manager: ActionsManager, mocker: pytest_mock.MockerFixture
|
|
242
243
|
):
|
|
243
244
|
mocked_handler = mock.Mock()
|
|
244
245
|
|
|
245
|
-
|
|
246
|
-
return_value="testing_handler"
|
|
246
|
+
mocker.patch.object(
|
|
247
|
+
app_actions_manager, "get_action_identifier", return_value="testing_handler"
|
|
247
248
|
)
|
|
248
|
-
|
|
249
|
-
|
|
249
|
+
mocker.patch.object(
|
|
250
|
+
app_actions_manager,
|
|
251
|
+
"get_actions",
|
|
252
|
+
return_value={"testing_handler": mocked_handler},
|
|
250
253
|
)
|
|
251
254
|
|
|
252
255
|
app_actions_manager.handle_action({})
|
|
@@ -254,9 +257,13 @@ def test_app_connector_handle_action_runs_app_action(
|
|
|
254
257
|
assert mocked_handler.call_count == 1
|
|
255
258
|
|
|
256
259
|
|
|
257
|
-
def test_handle_action_handler_not_existing(
|
|
258
|
-
app_actions_manager
|
|
259
|
-
|
|
260
|
+
def test_handle_action_handler_not_existing(
|
|
261
|
+
app_actions_manager: ActionsManager, mocker: pytest_mock.MockerFixture
|
|
262
|
+
):
|
|
263
|
+
mocker.patch.object(
|
|
264
|
+
app_actions_manager,
|
|
265
|
+
"get_action_identifier",
|
|
266
|
+
return_value="not_existing_handler",
|
|
260
267
|
)
|
|
261
268
|
|
|
262
269
|
with pytest.raises(RuntimeError):
|
|
@@ -264,17 +271,17 @@ def test_handle_action_handler_not_existing(app_actions_manager: ActionsManager)
|
|
|
264
271
|
|
|
265
272
|
|
|
266
273
|
def test_handle_raises_validation_error(
|
|
267
|
-
app_actions_manager: ActionsManager,
|
|
274
|
+
app_actions_manager: ActionsManager, mocker: pytest_mock.MockerFixture
|
|
268
275
|
):
|
|
269
276
|
testing_handler = mock.Mock()
|
|
270
277
|
testing_handler.meta.parameters = SampleActionParams
|
|
271
278
|
|
|
272
|
-
|
|
273
|
-
app_actions_manager
|
|
274
|
-
|
|
279
|
+
mocker.patch.object(app_actions_manager, "get_action_identifier")
|
|
280
|
+
mocker.patch.object(app_actions_manager, "get_action", return_value=testing_handler)
|
|
281
|
+
save_progress_mock = mocker.patch.object(app_actions_manager, "save_progress")
|
|
275
282
|
|
|
276
283
|
app_actions_manager.handle_action({"field1": "five"})
|
|
277
|
-
assert
|
|
284
|
+
assert save_progress_mock.call_count == 1
|
|
278
285
|
|
|
279
286
|
|
|
280
287
|
def test_app_connector_delegates_get_phantom_base_url():
|
|
@@ -286,7 +293,9 @@ def test_app_connector_delegates_get_phantom_base_url():
|
|
|
286
293
|
assert ActionsManager.get_soar_base_url() == "some_url"
|
|
287
294
|
|
|
288
295
|
|
|
289
|
-
def test_app_connector_initialize_loads_state(
|
|
296
|
+
def test_app_connector_initialize_loads_state(
|
|
297
|
+
app_actions_manager: ActionsManager, mocker: pytest_mock.MockerFixture
|
|
298
|
+
):
|
|
290
299
|
"""Test that initialize loads the state from load_state method."""
|
|
291
300
|
# Mock the load_state method to return a specific state
|
|
292
301
|
test_state_inner = {"test_key": "test_value"}
|
|
@@ -296,7 +305,9 @@ def test_app_connector_initialize_loads_state(app_actions_manager: ActionsManage
|
|
|
296
305
|
_CACHE_STATE_KEY: test_state_inner,
|
|
297
306
|
}
|
|
298
307
|
|
|
299
|
-
|
|
308
|
+
load_state = mocker.patch.object(
|
|
309
|
+
app_actions_manager, "load_state", return_value=test_state
|
|
310
|
+
)
|
|
300
311
|
|
|
301
312
|
# Call initialize
|
|
302
313
|
result = app_actions_manager.initialize()
|
|
@@ -305,7 +316,7 @@ def test_app_connector_initialize_loads_state(app_actions_manager: ActionsManage
|
|
|
305
316
|
assert result is True
|
|
306
317
|
|
|
307
318
|
# Verify load_state was called
|
|
308
|
-
|
|
319
|
+
load_state.assert_called_once()
|
|
309
320
|
|
|
310
321
|
# Verify the state was stored correctly
|
|
311
322
|
assert app_actions_manager.ingestion_state == test_state_inner
|
|
@@ -314,11 +325,13 @@ def test_app_connector_initialize_loads_state(app_actions_manager: ActionsManage
|
|
|
314
325
|
|
|
315
326
|
|
|
316
327
|
def test_app_connector_initialize_handles_empty_state(
|
|
317
|
-
app_actions_manager: ActionsManager,
|
|
328
|
+
app_actions_manager: ActionsManager, mocker: pytest_mock.MockerFixture
|
|
318
329
|
):
|
|
319
330
|
"""Test that initialize handles None return from load_state."""
|
|
320
331
|
# Mock the load_state method to return None
|
|
321
|
-
|
|
332
|
+
load_state = mocker.patch.object(
|
|
333
|
+
app_actions_manager, "load_state", return_value=None
|
|
334
|
+
)
|
|
322
335
|
|
|
323
336
|
# Call initialize
|
|
324
337
|
result = app_actions_manager.initialize()
|
|
@@ -327,7 +340,7 @@ def test_app_connector_initialize_handles_empty_state(
|
|
|
327
340
|
assert result is True
|
|
328
341
|
|
|
329
342
|
# Verify load_state was called
|
|
330
|
-
|
|
343
|
+
load_state.assert_called_once()
|
|
331
344
|
|
|
332
345
|
# Verify the state was initialized to an empty dict
|
|
333
346
|
assert app_actions_manager.ingestion_state == {}
|
|
@@ -335,7 +348,9 @@ def test_app_connector_initialize_handles_empty_state(
|
|
|
335
348
|
assert app_actions_manager.asset_cache == {}
|
|
336
349
|
|
|
337
350
|
|
|
338
|
-
def test_app_connector_finalize_saves_state(
|
|
351
|
+
def test_app_connector_finalize_saves_state(
|
|
352
|
+
app_actions_manager: ActionsManager, mocker: pytest_mock.MockerFixture
|
|
353
|
+
):
|
|
339
354
|
"""Test that finalize saves the current state using save_state."""
|
|
340
355
|
# Set up a test state
|
|
341
356
|
test_state = {"key1": "value1", "key2": "value2"}
|
|
@@ -344,7 +359,7 @@ def test_app_connector_finalize_saves_state(app_actions_manager: ActionsManager)
|
|
|
344
359
|
app_actions_manager.asset_cache = test_state
|
|
345
360
|
|
|
346
361
|
# Mock the save_state method
|
|
347
|
-
|
|
362
|
+
save_state = mocker.patch.object(app_actions_manager, "save_state")
|
|
348
363
|
|
|
349
364
|
# Call finalize
|
|
350
365
|
result = app_actions_manager.finalize()
|
|
@@ -353,7 +368,7 @@ def test_app_connector_finalize_saves_state(app_actions_manager: ActionsManager)
|
|
|
353
368
|
assert result is True
|
|
354
369
|
|
|
355
370
|
# Verify save_state was called with the correct state
|
|
356
|
-
|
|
371
|
+
save_state.assert_called_once_with(
|
|
357
372
|
{
|
|
358
373
|
_INGEST_STATE_KEY: test_state,
|
|
359
374
|
_AUTH_STATE_KEY: test_state,
|
|
@@ -362,9 +377,11 @@ def test_app_connector_finalize_saves_state(app_actions_manager: ActionsManager)
|
|
|
362
377
|
)
|
|
363
378
|
|
|
364
379
|
|
|
365
|
-
def test_app_connector_delegates_set_csrf_info(
|
|
366
|
-
app_actions_manager
|
|
380
|
+
def test_app_connector_delegates_set_csrf_info(
|
|
381
|
+
app_actions_manager: ActionsManager, mocker: pytest_mock.MockerFixture
|
|
382
|
+
):
|
|
383
|
+
set_csrf_info = mocker.patch.object(app_actions_manager, "_set_csrf_info")
|
|
367
384
|
|
|
368
385
|
app_actions_manager.set_csrf_info("", "")
|
|
369
386
|
|
|
370
|
-
assert
|
|
387
|
+
assert set_csrf_info.call_count == 1
|
|
@@ -6,6 +6,8 @@ import inspect
|
|
|
6
6
|
import sys
|
|
7
7
|
import types
|
|
8
8
|
|
|
9
|
+
import pytest_mock
|
|
10
|
+
|
|
9
11
|
from soar_sdk.abstract import SOARClient
|
|
10
12
|
from soar_sdk.app import App
|
|
11
13
|
from soar_sdk.params import Param, Params
|
|
@@ -115,7 +117,7 @@ def test_action_call_with_params_dict(simple_app, sample_params):
|
|
|
115
117
|
assert params.pass_value == "<PASSWORD>"
|
|
116
118
|
assert params.bool_value
|
|
117
119
|
|
|
118
|
-
client_mock = mock.Mock()
|
|
120
|
+
client_mock = mock.Mock(spec=SOARClient)
|
|
119
121
|
|
|
120
122
|
action_function(sample_params, soar=client_mock)
|
|
121
123
|
|
|
@@ -134,7 +136,7 @@ def test_action_call_with_state(simple_app, sample_params):
|
|
|
134
136
|
soar.auth_state = updated_state
|
|
135
137
|
soar.asset_cache = updated_state
|
|
136
138
|
|
|
137
|
-
client_mock = mock.Mock()
|
|
139
|
+
client_mock = mock.Mock(spec=SOARClient)
|
|
138
140
|
|
|
139
141
|
client_mock.ingestion_state = initial_state
|
|
140
142
|
client_mock.auth_state = initial_state
|
|
@@ -202,14 +204,13 @@ def test_action_with_mocked_client(simple_app, sample_params):
|
|
|
202
204
|
@simple_app.action()
|
|
203
205
|
def action_function(params: SampleParams, soar: SOARClient) -> ActionOutput:
|
|
204
206
|
container_id = str(soar.get_executing_container_id())
|
|
205
|
-
soar.
|
|
207
|
+
soar.set_summary(f"Container ID is: {container_id}")
|
|
206
208
|
|
|
207
|
-
client_mock = mock.Mock()
|
|
208
|
-
client_mock.save_progress = mock.Mock()
|
|
209
|
+
client_mock = mock.Mock(spec=SOARClient)
|
|
209
210
|
|
|
210
211
|
action_function(sample_params, soar=client_mock)
|
|
211
212
|
|
|
212
|
-
assert client_mock.
|
|
213
|
+
assert client_mock.set_summary.call_count == 1
|
|
213
214
|
|
|
214
215
|
|
|
215
216
|
def test_action_decoration_fails_without_return_type(simple_app):
|
|
@@ -269,17 +270,17 @@ def test_action_decoration_passing_output_type_as_argument(simple_app):
|
|
|
269
270
|
foo(SampleActionParams())
|
|
270
271
|
|
|
271
272
|
|
|
272
|
-
def test_action_failure_raised(simple_app: App):
|
|
273
|
+
def test_action_failure_raised(simple_app: App, mocker: pytest_mock.MockerFixture):
|
|
273
274
|
@simple_app.action()
|
|
274
275
|
def action_function(params: Params, soar: SOARClient) -> ActionOutput:
|
|
275
276
|
raise ActionFailure("Action failed")
|
|
276
277
|
|
|
277
278
|
# Mock the add_result method
|
|
278
|
-
|
|
279
|
+
add_result_mock = mocker.patch.object(simple_app.actions_manager, "add_result")
|
|
279
280
|
|
|
280
281
|
result = action_function(Params(), soar=simple_app.soar_client)
|
|
281
282
|
assert not result
|
|
282
|
-
assert
|
|
283
|
+
assert add_result_mock.call_count == 1
|
|
283
284
|
|
|
284
285
|
|
|
285
286
|
def test_other_failure_raised(simple_app: App):
|