cumulusci-plus 5.0.0__py3-none-any.whl
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.
Potentially problematic release.
This version of cumulusci-plus might be problematic. Click here for more details.
- cumulusci/__about__.py +1 -0
- cumulusci/__init__.py +22 -0
- cumulusci/__main__.py +3 -0
- cumulusci/cli/__init__.py +0 -0
- cumulusci/cli/cci.py +244 -0
- cumulusci/cli/error.py +125 -0
- cumulusci/cli/flow.py +185 -0
- cumulusci/cli/logger.py +72 -0
- cumulusci/cli/org.py +692 -0
- cumulusci/cli/plan.py +181 -0
- cumulusci/cli/project.py +391 -0
- cumulusci/cli/robot.py +116 -0
- cumulusci/cli/runtime.py +190 -0
- cumulusci/cli/service.py +521 -0
- cumulusci/cli/task.py +295 -0
- cumulusci/cli/tests/__init__.py +0 -0
- cumulusci/cli/tests/test_cci.py +545 -0
- cumulusci/cli/tests/test_error.py +170 -0
- cumulusci/cli/tests/test_flow.py +276 -0
- cumulusci/cli/tests/test_logger.py +25 -0
- cumulusci/cli/tests/test_org.py +1438 -0
- cumulusci/cli/tests/test_plan.py +245 -0
- cumulusci/cli/tests/test_project.py +235 -0
- cumulusci/cli/tests/test_robot.py +177 -0
- cumulusci/cli/tests/test_runtime.py +197 -0
- cumulusci/cli/tests/test_service.py +853 -0
- cumulusci/cli/tests/test_task.py +266 -0
- cumulusci/cli/tests/test_ui.py +310 -0
- cumulusci/cli/tests/test_utils.py +122 -0
- cumulusci/cli/tests/utils.py +52 -0
- cumulusci/cli/ui.py +234 -0
- cumulusci/cli/utils.py +150 -0
- cumulusci/conftest.py +181 -0
- cumulusci/core/__init__.py +0 -0
- cumulusci/core/config/BaseConfig.py +5 -0
- cumulusci/core/config/BaseTaskFlowConfig.py +5 -0
- cumulusci/core/config/OrgConfig.py +5 -0
- cumulusci/core/config/ScratchOrgConfig.py +5 -0
- cumulusci/core/config/__init__.py +125 -0
- cumulusci/core/config/base_config.py +111 -0
- cumulusci/core/config/base_task_flow_config.py +82 -0
- cumulusci/core/config/marketing_cloud_service_config.py +83 -0
- cumulusci/core/config/oauth2_service_config.py +17 -0
- cumulusci/core/config/org_config.py +604 -0
- cumulusci/core/config/project_config.py +782 -0
- cumulusci/core/config/scratch_org_config.py +251 -0
- cumulusci/core/config/sfdx_org_config.py +220 -0
- cumulusci/core/config/tests/_test_config_backwards_compatibility.py +33 -0
- cumulusci/core/config/tests/test_config.py +1895 -0
- cumulusci/core/config/tests/test_config_expensive.py +839 -0
- cumulusci/core/config/tests/test_config_util.py +91 -0
- cumulusci/core/config/universal_config.py +88 -0
- cumulusci/core/config/util.py +18 -0
- cumulusci/core/datasets.py +303 -0
- cumulusci/core/debug.py +33 -0
- cumulusci/core/dependencies/__init__.py +55 -0
- cumulusci/core/dependencies/base.py +561 -0
- cumulusci/core/dependencies/dependencies.py +273 -0
- cumulusci/core/dependencies/github.py +177 -0
- cumulusci/core/dependencies/github_resolvers.py +244 -0
- cumulusci/core/dependencies/resolvers.py +580 -0
- cumulusci/core/dependencies/tests/__init__.py +0 -0
- cumulusci/core/dependencies/tests/conftest.py +385 -0
- cumulusci/core/dependencies/tests/test_dependencies.py +950 -0
- cumulusci/core/dependencies/tests/test_github.py +83 -0
- cumulusci/core/dependencies/tests/test_resolvers.py +1027 -0
- cumulusci/core/dependencies/utils.py +13 -0
- cumulusci/core/enums.py +11 -0
- cumulusci/core/exceptions.py +311 -0
- cumulusci/core/flowrunner.py +888 -0
- cumulusci/core/github.py +665 -0
- cumulusci/core/keychain/__init__.py +24 -0
- cumulusci/core/keychain/base_project_keychain.py +441 -0
- cumulusci/core/keychain/encrypted_file_project_keychain.py +945 -0
- cumulusci/core/keychain/environment_project_keychain.py +7 -0
- cumulusci/core/keychain/serialization.py +152 -0
- cumulusci/core/keychain/subprocess_keychain.py +24 -0
- cumulusci/core/keychain/tests/conftest.py +50 -0
- cumulusci/core/keychain/tests/test_base_project_keychain.py +299 -0
- cumulusci/core/keychain/tests/test_encrypted_file_project_keychain.py +1228 -0
- cumulusci/core/metadeploy/__init__.py +0 -0
- cumulusci/core/metadeploy/api.py +88 -0
- cumulusci/core/metadeploy/plans.py +25 -0
- cumulusci/core/metadeploy/tests/test_api.py +276 -0
- cumulusci/core/runtime.py +115 -0
- cumulusci/core/sfdx.py +162 -0
- cumulusci/core/source/__init__.py +16 -0
- cumulusci/core/source/github.py +50 -0
- cumulusci/core/source/local_folder.py +35 -0
- cumulusci/core/source_transforms/__init__.py +0 -0
- cumulusci/core/source_transforms/tests/test_transforms.py +1091 -0
- cumulusci/core/source_transforms/transforms.py +532 -0
- cumulusci/core/tasks.py +404 -0
- cumulusci/core/template_utils.py +59 -0
- cumulusci/core/tests/__init__.py +0 -0
- cumulusci/core/tests/cassettes/TestDatasetsE2E.test_datasets_e2e.yaml +215 -0
- cumulusci/core/tests/cassettes/TestDatasetsE2E.test_datasets_extract_standard_objects.yaml +199 -0
- cumulusci/core/tests/cassettes/TestDatasetsE2E.test_datasets_read_explicit_extract_declaration.yaml +3 -0
- cumulusci/core/tests/fake_remote_repo/cumulusci.yml +32 -0
- cumulusci/core/tests/fake_remote_repo/tasks/directory/example_2.py +6 -0
- cumulusci/core/tests/fake_remote_repo/tasks/example.py +43 -0
- cumulusci/core/tests/fake_remote_repo_2/cumulusci.yml +11 -0
- cumulusci/core/tests/fake_remote_repo_2/tasks/example_3.py +6 -0
- cumulusci/core/tests/test_datasets_e2e.py +386 -0
- cumulusci/core/tests/test_exceptions.py +11 -0
- cumulusci/core/tests/test_flowrunner.py +836 -0
- cumulusci/core/tests/test_github.py +942 -0
- cumulusci/core/tests/test_sfdx.py +138 -0
- cumulusci/core/tests/test_source.py +678 -0
- cumulusci/core/tests/test_tasks.py +262 -0
- cumulusci/core/tests/test_utils.py +141 -0
- cumulusci/core/tests/test_utils_merge_config.py +276 -0
- cumulusci/core/tests/test_versions.py +76 -0
- cumulusci/core/tests/untrusted_repo_child/cumulusci.yml +7 -0
- cumulusci/core/tests/untrusted_repo_child/tasks/untrusted_child.py +6 -0
- cumulusci/core/tests/untrusted_repo_parent/cumulusci.yml +26 -0
- cumulusci/core/tests/untrusted_repo_parent/tasks/untrusted_parent.py +6 -0
- cumulusci/core/tests/utils.py +116 -0
- cumulusci/core/tests/yaml/global.yaml +0 -0
- cumulusci/core/utils.py +402 -0
- cumulusci/core/versions.py +149 -0
- cumulusci/cumulusci.yml +1621 -0
- cumulusci/files/admin_profile.xml +20 -0
- cumulusci/files/delete_excludes.txt +424 -0
- cumulusci/files/templates/project/README.md +12 -0
- cumulusci/files/templates/project/cumulusci.yml +63 -0
- cumulusci/files/templates/project/dot-gitignore +60 -0
- cumulusci/files/templates/project/mapping.yml +45 -0
- cumulusci/files/templates/project/scratch_def.json +25 -0
- cumulusci/oauth/__init__.py +0 -0
- cumulusci/oauth/client.py +400 -0
- cumulusci/oauth/exceptions.py +9 -0
- cumulusci/oauth/salesforce.py +95 -0
- cumulusci/oauth/tests/__init__.py +0 -0
- cumulusci/oauth/tests/cassettes/test_get_device_code.yaml +22 -0
- cumulusci/oauth/tests/cassettes/test_get_device_oauth_token.yaml +74 -0
- cumulusci/oauth/tests/test_client.py +308 -0
- cumulusci/oauth/tests/test_salesforce.py +46 -0
- cumulusci/plugins/__init__.py +3 -0
- cumulusci/plugins/plugin_base.py +93 -0
- cumulusci/plugins/plugin_loader.py +59 -0
- cumulusci/robotframework/CumulusCI.py +340 -0
- cumulusci/robotframework/CumulusCI.robot +7 -0
- cumulusci/robotframework/Performance.py +165 -0
- cumulusci/robotframework/Salesforce.py +936 -0
- cumulusci/robotframework/Salesforce.robot +192 -0
- cumulusci/robotframework/SalesforceAPI.py +416 -0
- cumulusci/robotframework/SalesforcePlaywright.py +220 -0
- cumulusci/robotframework/SalesforcePlaywright.robot +40 -0
- cumulusci/robotframework/__init__.py +2 -0
- cumulusci/robotframework/base_library.py +39 -0
- cumulusci/robotframework/faker_mixin.py +89 -0
- cumulusci/robotframework/form_handlers.py +222 -0
- cumulusci/robotframework/javascript/cci_init.js +34 -0
- cumulusci/robotframework/javascript/cumulusci.js +4 -0
- cumulusci/robotframework/locator_manager.py +197 -0
- cumulusci/robotframework/locators_56.py +88 -0
- cumulusci/robotframework/locators_57.py +5 -0
- cumulusci/robotframework/pageobjects/BasePageObjects.py +433 -0
- cumulusci/robotframework/pageobjects/ObjectManagerPageObject.py +246 -0
- cumulusci/robotframework/pageobjects/PageObjectLibrary.py +45 -0
- cumulusci/robotframework/pageobjects/PageObjects.py +351 -0
- cumulusci/robotframework/pageobjects/__init__.py +12 -0
- cumulusci/robotframework/pageobjects/baseobjects.py +120 -0
- cumulusci/robotframework/perftests/short/collection_perf.robot +105 -0
- cumulusci/robotframework/tests/CustomObjectTestPage.py +10 -0
- cumulusci/robotframework/tests/FooTestPage.py +8 -0
- cumulusci/robotframework/tests/cumulusci/base.robot +40 -0
- cumulusci/robotframework/tests/cumulusci/bulkdata.robot +38 -0
- cumulusci/robotframework/tests/cumulusci/communities.robot +57 -0
- cumulusci/robotframework/tests/cumulusci/datagen.robot +84 -0
- cumulusci/robotframework/tests/salesforce/TestLibraryA.py +24 -0
- cumulusci/robotframework/tests/salesforce/TestLibraryB.py +20 -0
- cumulusci/robotframework/tests/salesforce/TestListener.py +93 -0
- cumulusci/robotframework/tests/salesforce/api.robot +178 -0
- cumulusci/robotframework/tests/salesforce/browsers.robot +143 -0
- cumulusci/robotframework/tests/salesforce/classic.robot +51 -0
- cumulusci/robotframework/tests/salesforce/create_contact.robot +59 -0
- cumulusci/robotframework/tests/salesforce/faker.robot +68 -0
- cumulusci/robotframework/tests/salesforce/forms.robot +172 -0
- cumulusci/robotframework/tests/salesforce/label_locator.robot +244 -0
- cumulusci/robotframework/tests/salesforce/labels.html +33 -0
- cumulusci/robotframework/tests/salesforce/locators.robot +149 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/base_pageobjects.robot +100 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/example_page_object.py +25 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/listing_page.robot +115 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/objectmanager.robot +74 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/pageobjects.robot +171 -0
- cumulusci/robotframework/tests/salesforce/performance.robot +109 -0
- cumulusci/robotframework/tests/salesforce/playwright/javascript_keywords.robot +33 -0
- cumulusci/robotframework/tests/salesforce/playwright/open_test_browser.robot +48 -0
- cumulusci/robotframework/tests/salesforce/playwright/playwright.robot +24 -0
- cumulusci/robotframework/tests/salesforce/playwright/ui.robot +32 -0
- cumulusci/robotframework/tests/salesforce/populate.robot +89 -0
- cumulusci/robotframework/tests/salesforce/test_testlistener.py +37 -0
- cumulusci/robotframework/tests/salesforce/ui.robot +361 -0
- cumulusci/robotframework/tests/test_cumulusci_library.py +304 -0
- cumulusci/robotframework/tests/test_locator_manager.py +158 -0
- cumulusci/robotframework/tests/test_pageobjects.py +291 -0
- cumulusci/robotframework/tests/test_performance.py +38 -0
- cumulusci/robotframework/tests/test_salesforce.py +79 -0
- cumulusci/robotframework/tests/test_salesforce_locators.py +73 -0
- cumulusci/robotframework/tests/test_template_util.py +53 -0
- cumulusci/robotframework/tests/test_utils.py +106 -0
- cumulusci/robotframework/utils.py +283 -0
- cumulusci/salesforce_api/__init__.py +0 -0
- cumulusci/salesforce_api/exceptions.py +23 -0
- cumulusci/salesforce_api/filterable_objects.py +96 -0
- cumulusci/salesforce_api/mc_soap_envelopes.py +89 -0
- cumulusci/salesforce_api/metadata.py +721 -0
- cumulusci/salesforce_api/org_schema.py +571 -0
- cumulusci/salesforce_api/org_schema_models.py +226 -0
- cumulusci/salesforce_api/package_install.py +265 -0
- cumulusci/salesforce_api/package_zip.py +301 -0
- cumulusci/salesforce_api/rest_deploy.py +148 -0
- cumulusci/salesforce_api/retrieve_profile_api.py +301 -0
- cumulusci/salesforce_api/soap_envelopes.py +177 -0
- cumulusci/salesforce_api/tests/__init__.py +0 -0
- cumulusci/salesforce_api/tests/metadata_test_strings.py +24 -0
- cumulusci/salesforce_api/tests/test_metadata.py +1015 -0
- cumulusci/salesforce_api/tests/test_package_install.py +219 -0
- cumulusci/salesforce_api/tests/test_package_zip.py +380 -0
- cumulusci/salesforce_api/tests/test_rest_deploy.py +264 -0
- cumulusci/salesforce_api/tests/test_retrieve_profile_api.py +337 -0
- cumulusci/salesforce_api/tests/test_utils.py +124 -0
- cumulusci/salesforce_api/utils.py +51 -0
- cumulusci/schema/cumulusci.jsonschema.json +782 -0
- cumulusci/tasks/__init__.py +0 -0
- cumulusci/tasks/apex/__init__.py +0 -0
- cumulusci/tasks/apex/anon.py +157 -0
- cumulusci/tasks/apex/batch.py +180 -0
- cumulusci/tasks/apex/testrunner.py +835 -0
- cumulusci/tasks/apex/tests/cassettes/ManualEditTestApexIntegrationTests.test_run_tests__integration_test.yaml +703 -0
- cumulusci/tasks/apex/tests/test_apex_tasks.py +1558 -0
- cumulusci/tasks/base_source_control_task.py +17 -0
- cumulusci/tasks/bulkdata/__init__.py +15 -0
- cumulusci/tasks/bulkdata/base_generate_data_task.py +96 -0
- cumulusci/tasks/bulkdata/dates.py +97 -0
- cumulusci/tasks/bulkdata/delete.py +156 -0
- cumulusci/tasks/bulkdata/extract.py +441 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/calculate_dependencies.py +117 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/extract_yml.py +123 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/hardcoded_default_declarations.py +49 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/synthesize_extract_declarations.py +283 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/tests/test_extract_yml.py +142 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/tests/test_synthesize_extract_declarations.py +575 -0
- cumulusci/tasks/bulkdata/factory_utils.py +134 -0
- cumulusci/tasks/bulkdata/generate.py +4 -0
- cumulusci/tasks/bulkdata/generate_and_load_data.py +232 -0
- cumulusci/tasks/bulkdata/generate_and_load_data_from_yaml.py +19 -0
- cumulusci/tasks/bulkdata/generate_from_yaml.py +183 -0
- cumulusci/tasks/bulkdata/generate_mapping.py +434 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/dependency_map.py +169 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/extract_mapping_file_generator.py +45 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/generate_mapping_from_declarations.py +121 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/load_mapping_file_generator.py +127 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/mapping_generator_post_processes.py +53 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/mapping_transforms.py +139 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_generate_extract_mapping_from_declarations.py +135 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_generate_load_mapping_from_declarations.py +330 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_mapping_generator_post_processes.py +60 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_mapping_transforms.py +188 -0
- cumulusci/tasks/bulkdata/load.py +1196 -0
- cumulusci/tasks/bulkdata/mapping_parser.py +811 -0
- cumulusci/tasks/bulkdata/query_transformers.py +264 -0
- cumulusci/tasks/bulkdata/select_utils.py +792 -0
- cumulusci/tasks/bulkdata/snowfakery.py +753 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/queue_manager.py +478 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/snowfakery_run_until.py +141 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/snowfakery_working_directory.py +53 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/subtask_configurator.py +64 -0
- cumulusci/tasks/bulkdata/step.py +1242 -0
- cumulusci/tasks/bulkdata/tests/__init__.py +0 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_random_strategy.yaml +147 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_annoy_strategy.yaml +123 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_select_and_insert_strategy.yaml +313 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_select_and_insert_strategy_bulk.yaml +550 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_strategy.yaml +175 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_standard_strategy.yaml +147 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_run_until_records_in_org__multiple_needed.yaml +69 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_run_until_records_in_org__none_needed.yaml +22 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_run_until_records_in_org__one_needed.yaml +24 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_snowfakery_query_salesforce.yaml +25 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpdatesIntegrationTests.test_updates_task.yaml +80 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_simple_upsert__rest.yaml +270 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert__rest.yaml +267 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert_complex_external_id_field__rest.yaml +369 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert_complex_external_id_field_rest__duplicate_error.yaml +204 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert_complex_fields__bulk.yaml +675 -0
- cumulusci/tasks/bulkdata/tests/dummy_data_factory.py +36 -0
- cumulusci/tasks/bulkdata/tests/integration_test_utils.py +49 -0
- cumulusci/tasks/bulkdata/tests/mapping-oid.yml +87 -0
- cumulusci/tasks/bulkdata/tests/mapping_after.yml +38 -0
- cumulusci/tasks/bulkdata/tests/mapping_poly.yml +34 -0
- cumulusci/tasks/bulkdata/tests/mapping_poly_incomplete.yml +20 -0
- cumulusci/tasks/bulkdata/tests/mapping_poly_wrong.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select.yml +20 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_strategy.yml +20 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_threshold__invalid_number.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_threshold__invalid_strategy.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_threshold__non_float.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_missing_priority_fields.yml +22 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_no_priority_fields.yml +18 -0
- cumulusci/tasks/bulkdata/tests/mapping_simple.yml +27 -0
- cumulusci/tasks/bulkdata/tests/mapping_v1.yml +28 -0
- cumulusci/tasks/bulkdata/tests/mapping_v2.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_v3.yml +32 -0
- cumulusci/tasks/bulkdata/tests/mapping_vanilla_sf.yml +69 -0
- cumulusci/tasks/bulkdata/tests/mock_data_factory_without_mapping.py +12 -0
- cumulusci/tasks/bulkdata/tests/person_accounts.yml +23 -0
- cumulusci/tasks/bulkdata/tests/person_accounts_minimal.yml +15 -0
- cumulusci/tasks/bulkdata/tests/recordtypes.yml +8 -0
- cumulusci/tasks/bulkdata/tests/recordtypes_2.yml +6 -0
- cumulusci/tasks/bulkdata/tests/recordtypes_with_ispersontype.yml +8 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/child/child2.yml +3 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/child.yml +4 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/gen_npsp_standard_objects.recipe.yml +89 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/include_parent.yml +3 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/npsp_standard_objects_macros.yml +34 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/options.recipe.yml +6 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/query_snowfakery.recipe.yml +16 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/sf_standard_object_macros.yml +83 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery.load.yml +2 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery.recipe.yml +13 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_2.load.yml +5 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_channels.load.yml +13 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_channels.recipe.yml +12 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_channels_2.load.yml +13 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/unique_values.recipe.yml +4 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/upsert.recipe.yml +23 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/upsert_2.recipe.yml +29 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/upsert_before.yml +10 -0
- cumulusci/tasks/bulkdata/tests/test_base_generate_data_tasks.py +61 -0
- cumulusci/tasks/bulkdata/tests/test_dates.py +99 -0
- cumulusci/tasks/bulkdata/tests/test_delete.py +404 -0
- cumulusci/tasks/bulkdata/tests/test_extract.py +1311 -0
- cumulusci/tasks/bulkdata/tests/test_factory_utils.py +55 -0
- cumulusci/tasks/bulkdata/tests/test_generate_and_load.py +252 -0
- cumulusci/tasks/bulkdata/tests/test_generate_from_snowfakery_task.py +343 -0
- cumulusci/tasks/bulkdata/tests/test_generatemapping.py +1039 -0
- cumulusci/tasks/bulkdata/tests/test_load.py +3175 -0
- cumulusci/tasks/bulkdata/tests/test_mapping_parser.py +1658 -0
- cumulusci/tasks/bulkdata/tests/test_query_db__joins_self_lookups.yml +12 -0
- cumulusci/tasks/bulkdata/tests/test_query_db_joins_lookups.yml +26 -0
- cumulusci/tasks/bulkdata/tests/test_query_db_joins_lookups_select.yml +48 -0
- cumulusci/tasks/bulkdata/tests/test_select.py +171 -0
- cumulusci/tasks/bulkdata/tests/test_select_utils.py +1057 -0
- cumulusci/tasks/bulkdata/tests/test_snowfakery.py +1153 -0
- cumulusci/tasks/bulkdata/tests/test_step.py +3957 -0
- cumulusci/tasks/bulkdata/tests/test_updates.py +513 -0
- cumulusci/tasks/bulkdata/tests/test_upsert.py +1015 -0
- cumulusci/tasks/bulkdata/tests/test_utils.py +158 -0
- cumulusci/tasks/bulkdata/tests/testdata.db +0 -0
- cumulusci/tasks/bulkdata/tests/update_describe.py +50 -0
- cumulusci/tasks/bulkdata/tests/update_person_accounts.yml +23 -0
- cumulusci/tasks/bulkdata/tests/utils.py +114 -0
- cumulusci/tasks/bulkdata/update_data.py +260 -0
- cumulusci/tasks/bulkdata/upsert_utils.py +130 -0
- cumulusci/tasks/bulkdata/utils.py +249 -0
- cumulusci/tasks/command.py +178 -0
- cumulusci/tasks/connectedapp.py +186 -0
- cumulusci/tasks/create_package_version.py +778 -0
- cumulusci/tasks/datadictionary.py +745 -0
- cumulusci/tasks/dx_convert_from.py +26 -0
- cumulusci/tasks/github/__init__.py +17 -0
- cumulusci/tasks/github/base.py +16 -0
- cumulusci/tasks/github/commit_status.py +13 -0
- cumulusci/tasks/github/merge.py +11 -0
- cumulusci/tasks/github/publish.py +11 -0
- cumulusci/tasks/github/pull_request.py +11 -0
- cumulusci/tasks/github/release.py +11 -0
- cumulusci/tasks/github/release_report.py +11 -0
- cumulusci/tasks/github/tag.py +11 -0
- cumulusci/tasks/github/tests/__init__.py +0 -0
- cumulusci/tasks/github/tests/test_util.py +202 -0
- cumulusci/tasks/github/tests/test_vcs_migration.py +44 -0
- cumulusci/tasks/github/tests/util_github_api.py +666 -0
- cumulusci/tasks/github/util.py +252 -0
- cumulusci/tasks/marketing_cloud/__init__.py +0 -0
- cumulusci/tasks/marketing_cloud/api.py +188 -0
- cumulusci/tasks/marketing_cloud/base.py +38 -0
- cumulusci/tasks/marketing_cloud/deploy.py +345 -0
- cumulusci/tasks/marketing_cloud/get_user_info.py +40 -0
- cumulusci/tasks/marketing_cloud/mc_constants.py +1 -0
- cumulusci/tasks/marketing_cloud/tests/__init__.py +0 -0
- cumulusci/tasks/marketing_cloud/tests/conftest.py +46 -0
- cumulusci/tasks/marketing_cloud/tests/expected-payload.json +110 -0
- cumulusci/tasks/marketing_cloud/tests/test_api.py +97 -0
- cumulusci/tasks/marketing_cloud/tests/test_api_soap_envelopes.py +145 -0
- cumulusci/tasks/marketing_cloud/tests/test_base.py +14 -0
- cumulusci/tasks/marketing_cloud/tests/test_deploy.py +400 -0
- cumulusci/tasks/marketing_cloud/tests/test_get_user_info.py +141 -0
- cumulusci/tasks/marketing_cloud/tests/validation-response.json +39 -0
- cumulusci/tasks/metadata/__init__.py +0 -0
- cumulusci/tasks/metadata/ee_src.py +94 -0
- cumulusci/tasks/metadata/managed_src.py +100 -0
- cumulusci/tasks/metadata/metadata_map.yml +868 -0
- cumulusci/tasks/metadata/modify.py +99 -0
- cumulusci/tasks/metadata/package.py +684 -0
- cumulusci/tasks/metadata/tests/__init__.py +0 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/.hidden/.keep +0 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/destructiveChanges.xml +9 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/package.xml +9 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/package_install_uninstall.xml +11 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/reports/namespace__TestFolder/TestReport.report +3 -0
- cumulusci/tasks/metadata/tests/sample_package.xml +9 -0
- cumulusci/tasks/metadata/tests/test_ee_src.py +112 -0
- cumulusci/tasks/metadata/tests/test_managed_src.py +111 -0
- cumulusci/tasks/metadata/tests/test_modify.py +123 -0
- cumulusci/tasks/metadata/tests/test_package.py +476 -0
- cumulusci/tasks/metadata_etl/__init__.py +29 -0
- cumulusci/tasks/metadata_etl/base.py +436 -0
- cumulusci/tasks/metadata_etl/duplicate_rules.py +24 -0
- cumulusci/tasks/metadata_etl/field_sets.py +70 -0
- cumulusci/tasks/metadata_etl/help_text.py +92 -0
- cumulusci/tasks/metadata_etl/layouts.py +550 -0
- cumulusci/tasks/metadata_etl/objects.py +68 -0
- cumulusci/tasks/metadata_etl/permissions.py +167 -0
- cumulusci/tasks/metadata_etl/picklists.py +221 -0
- cumulusci/tasks/metadata_etl/remote_site_settings.py +99 -0
- cumulusci/tasks/metadata_etl/sharing.py +138 -0
- cumulusci/tasks/metadata_etl/tests/test_base.py +512 -0
- cumulusci/tasks/metadata_etl/tests/test_duplicate_rules.py +22 -0
- cumulusci/tasks/metadata_etl/tests/test_field_sets.py +156 -0
- cumulusci/tasks/metadata_etl/tests/test_help_text.py +387 -0
- cumulusci/tasks/metadata_etl/tests/test_ip_ranges.py +85 -0
- cumulusci/tasks/metadata_etl/tests/test_layouts.py +858 -0
- cumulusci/tasks/metadata_etl/tests/test_objects.py +236 -0
- cumulusci/tasks/metadata_etl/tests/test_permissions.py +223 -0
- cumulusci/tasks/metadata_etl/tests/test_picklists.py +547 -0
- cumulusci/tasks/metadata_etl/tests/test_remote_site_settings.py +46 -0
- cumulusci/tasks/metadata_etl/tests/test_sharing.py +333 -0
- cumulusci/tasks/metadata_etl/tests/test_value_sets.py +298 -0
- cumulusci/tasks/metadata_etl/value_sets.py +106 -0
- cumulusci/tasks/metadeploy.py +393 -0
- cumulusci/tasks/metaxml.py +88 -0
- cumulusci/tasks/preflight/__init__.py +0 -0
- cumulusci/tasks/preflight/dataset_load.py +49 -0
- cumulusci/tasks/preflight/licenses.py +86 -0
- cumulusci/tasks/preflight/packages.py +14 -0
- cumulusci/tasks/preflight/permsets.py +23 -0
- cumulusci/tasks/preflight/recordtypes.py +16 -0
- cumulusci/tasks/preflight/retrieve_tasks.py +30 -0
- cumulusci/tasks/preflight/settings.py +77 -0
- cumulusci/tasks/preflight/sobjects.py +202 -0
- cumulusci/tasks/preflight/tests/test_dataset_load.py +85 -0
- cumulusci/tasks/preflight/tests/test_licenses.py +174 -0
- cumulusci/tasks/preflight/tests/test_packages.py +14 -0
- cumulusci/tasks/preflight/tests/test_permset_preflights.py +51 -0
- cumulusci/tasks/preflight/tests/test_recordtypes.py +30 -0
- cumulusci/tasks/preflight/tests/test_retrieve_tasks.py +62 -0
- cumulusci/tasks/preflight/tests/test_settings.py +130 -0
- cumulusci/tasks/preflight/tests/test_sobjects.py +231 -0
- cumulusci/tasks/push/README.md +59 -0
- cumulusci/tasks/push/__init__.py +0 -0
- cumulusci/tasks/push/push_api.py +659 -0
- cumulusci/tasks/push/pushfails.py +136 -0
- cumulusci/tasks/push/tasks.py +476 -0
- cumulusci/tasks/push/tests/conftest.py +263 -0
- cumulusci/tasks/push/tests/test_push_api.py +951 -0
- cumulusci/tasks/push/tests/test_push_tasks.py +659 -0
- cumulusci/tasks/release_notes/README.md +63 -0
- cumulusci/tasks/release_notes/__init__.py +0 -0
- cumulusci/tasks/release_notes/exceptions.py +5 -0
- cumulusci/tasks/release_notes/generator.py +137 -0
- cumulusci/tasks/release_notes/parser.py +232 -0
- cumulusci/tasks/release_notes/provider.py +44 -0
- cumulusci/tasks/release_notes/task.py +300 -0
- cumulusci/tasks/release_notes/tests/__init__.py +0 -0
- cumulusci/tasks/release_notes/tests/change_notes/full/example1.md +17 -0
- cumulusci/tasks/release_notes/tests/change_notes/multi/1.txt +1 -0
- cumulusci/tasks/release_notes/tests/change_notes/multi/2.txt +1 -0
- cumulusci/tasks/release_notes/tests/change_notes/multi/3.txt +1 -0
- cumulusci/tasks/release_notes/tests/change_notes/single/1.txt +1 -0
- cumulusci/tasks/release_notes/tests/test_generator.py +582 -0
- cumulusci/tasks/release_notes/tests/test_parser.py +867 -0
- cumulusci/tasks/release_notes/tests/test_provider.py +512 -0
- cumulusci/tasks/release_notes/tests/test_task.py +461 -0
- cumulusci/tasks/release_notes/tests/utils.py +153 -0
- cumulusci/tasks/robotframework/__init__.py +3 -0
- cumulusci/tasks/robotframework/debugger/DebugListener.py +100 -0
- cumulusci/tasks/robotframework/debugger/__init__.py +10 -0
- cumulusci/tasks/robotframework/debugger/model.py +87 -0
- cumulusci/tasks/robotframework/debugger/ui.py +259 -0
- cumulusci/tasks/robotframework/libdoc.py +269 -0
- cumulusci/tasks/robotframework/robotframework.py +392 -0
- cumulusci/tasks/robotframework/stylesheet.css +130 -0
- cumulusci/tasks/robotframework/template.html +109 -0
- cumulusci/tasks/robotframework/tests/TestLibrary.py +18 -0
- cumulusci/tasks/robotframework/tests/TestPageObjects.py +31 -0
- cumulusci/tasks/robotframework/tests/TestResource.robot +8 -0
- cumulusci/tasks/robotframework/tests/failing_tests.robot +16 -0
- cumulusci/tasks/robotframework/tests/performance.robot +23 -0
- cumulusci/tasks/robotframework/tests/test_browser_proxies.py +137 -0
- cumulusci/tasks/robotframework/tests/test_debugger.py +360 -0
- cumulusci/tasks/robotframework/tests/test_robot_parallel.py +141 -0
- cumulusci/tasks/robotframework/tests/test_robotframework.py +860 -0
- cumulusci/tasks/salesforce/BaseRetrieveMetadata.py +58 -0
- cumulusci/tasks/salesforce/BaseSalesforceApiTask.py +45 -0
- cumulusci/tasks/salesforce/BaseSalesforceMetadataApiTask.py +18 -0
- cumulusci/tasks/salesforce/BaseSalesforceTask.py +4 -0
- cumulusci/tasks/salesforce/BaseUninstallMetadata.py +41 -0
- cumulusci/tasks/salesforce/CreateCommunity.py +124 -0
- cumulusci/tasks/salesforce/CreatePackage.py +29 -0
- cumulusci/tasks/salesforce/Deploy.py +240 -0
- cumulusci/tasks/salesforce/DeployBundles.py +88 -0
- cumulusci/tasks/salesforce/DescribeMetadataTypes.py +26 -0
- cumulusci/tasks/salesforce/EnsureRecordTypes.py +202 -0
- cumulusci/tasks/salesforce/GetInstalledPackages.py +8 -0
- cumulusci/tasks/salesforce/ListCommunities.py +40 -0
- cumulusci/tasks/salesforce/ListCommunityTemplates.py +19 -0
- cumulusci/tasks/salesforce/PublishCommunity.py +62 -0
- cumulusci/tasks/salesforce/RetrievePackaged.py +41 -0
- cumulusci/tasks/salesforce/RetrieveReportsAndDashboards.py +82 -0
- cumulusci/tasks/salesforce/RetrieveUnpackaged.py +36 -0
- cumulusci/tasks/salesforce/SOQLQuery.py +39 -0
- cumulusci/tasks/salesforce/UninstallLocal.py +15 -0
- cumulusci/tasks/salesforce/UninstallLocalBundles.py +28 -0
- cumulusci/tasks/salesforce/UninstallLocalNamespacedBundles.py +58 -0
- cumulusci/tasks/salesforce/UninstallPackage.py +32 -0
- cumulusci/tasks/salesforce/UninstallPackaged.py +56 -0
- cumulusci/tasks/salesforce/UpdateAdminProfile.py +8 -0
- cumulusci/tasks/salesforce/__init__.py +79 -0
- cumulusci/tasks/salesforce/activate_flow.py +74 -0
- cumulusci/tasks/salesforce/check_components.py +324 -0
- cumulusci/tasks/salesforce/composite.py +142 -0
- cumulusci/tasks/salesforce/create_permission_sets.py +35 -0
- cumulusci/tasks/salesforce/custom_settings.py +134 -0
- cumulusci/tasks/salesforce/custom_settings_wait.py +132 -0
- cumulusci/tasks/salesforce/enable_prediction.py +107 -0
- cumulusci/tasks/salesforce/insert_record.py +40 -0
- cumulusci/tasks/salesforce/install_package_version.py +242 -0
- cumulusci/tasks/salesforce/license_preflights.py +8 -0
- cumulusci/tasks/salesforce/network_member_group.py +178 -0
- cumulusci/tasks/salesforce/nonsourcetracking.py +228 -0
- cumulusci/tasks/salesforce/org_settings.py +193 -0
- cumulusci/tasks/salesforce/package_upload.py +328 -0
- cumulusci/tasks/salesforce/profiles.py +74 -0
- cumulusci/tasks/salesforce/promote_package_version.py +376 -0
- cumulusci/tasks/salesforce/retrieve_profile.py +195 -0
- cumulusci/tasks/salesforce/salesforce_files.py +244 -0
- cumulusci/tasks/salesforce/sourcetracking.py +507 -0
- cumulusci/tasks/salesforce/tests/__init__.py +3 -0
- cumulusci/tasks/salesforce/tests/test_CreateCommunity.py +278 -0
- cumulusci/tasks/salesforce/tests/test_CreatePackage.py +22 -0
- cumulusci/tasks/salesforce/tests/test_Deploy.py +470 -0
- cumulusci/tasks/salesforce/tests/test_DeployBundles.py +76 -0
- cumulusci/tasks/salesforce/tests/test_EnsureRecordTypes.py +345 -0
- cumulusci/tasks/salesforce/tests/test_ListCommunities.py +84 -0
- cumulusci/tasks/salesforce/tests/test_ListCommunityTemplates.py +49 -0
- cumulusci/tasks/salesforce/tests/test_PackageUpload.py +547 -0
- cumulusci/tasks/salesforce/tests/test_ProfileGrantAllAccess.py +699 -0
- cumulusci/tasks/salesforce/tests/test_PublishCommunity.py +181 -0
- cumulusci/tasks/salesforce/tests/test_RetrievePackaged.py +24 -0
- cumulusci/tasks/salesforce/tests/test_RetrieveReportsAndDashboards.py +56 -0
- cumulusci/tasks/salesforce/tests/test_RetrieveUnpackaged.py +21 -0
- cumulusci/tasks/salesforce/tests/test_SOQLQuery.py +30 -0
- cumulusci/tasks/salesforce/tests/test_UninstallLocal.py +15 -0
- cumulusci/tasks/salesforce/tests/test_UninstallLocalBundles.py +19 -0
- cumulusci/tasks/salesforce/tests/test_UninstallLocalNamespacedBundles.py +22 -0
- cumulusci/tasks/salesforce/tests/test_UninstallPackage.py +19 -0
- cumulusci/tasks/salesforce/tests/test_UninstallPackaged.py +66 -0
- cumulusci/tasks/salesforce/tests/test_UninstallPackagedIncremental.py +127 -0
- cumulusci/tasks/salesforce/tests/test_activate_flow.py +132 -0
- cumulusci/tasks/salesforce/tests/test_base_tasks.py +110 -0
- cumulusci/tasks/salesforce/tests/test_check_components.py +445 -0
- cumulusci/tasks/salesforce/tests/test_composite.py +250 -0
- cumulusci/tasks/salesforce/tests/test_create_permission_sets.py +41 -0
- cumulusci/tasks/salesforce/tests/test_custom_settings.py +227 -0
- cumulusci/tasks/salesforce/tests/test_custom_settings_wait.py +174 -0
- cumulusci/tasks/salesforce/tests/test_describemetadatatypes.py +18 -0
- cumulusci/tasks/salesforce/tests/test_enable_prediction.py +240 -0
- cumulusci/tasks/salesforce/tests/test_insert_record.py +110 -0
- cumulusci/tasks/salesforce/tests/test_install_package_version.py +464 -0
- cumulusci/tasks/salesforce/tests/test_network_member_group.py +444 -0
- cumulusci/tasks/salesforce/tests/test_nonsourcetracking.py +235 -0
- cumulusci/tasks/salesforce/tests/test_org_settings.py +407 -0
- cumulusci/tasks/salesforce/tests/test_profiles.py +202 -0
- cumulusci/tasks/salesforce/tests/test_retrieve_profile.py +287 -0
- cumulusci/tasks/salesforce/tests/test_salesforce_files.py +228 -0
- cumulusci/tasks/salesforce/tests/test_sourcetracking.py +350 -0
- cumulusci/tasks/salesforce/tests/test_trigger_handlers.py +300 -0
- cumulusci/tasks/salesforce/tests/test_update_dependencies.py +509 -0
- cumulusci/tasks/salesforce/tests/util.py +79 -0
- cumulusci/tasks/salesforce/trigger_handlers.py +119 -0
- cumulusci/tasks/salesforce/uninstall_packaged_incremental.py +136 -0
- cumulusci/tasks/salesforce/update_dependencies.py +290 -0
- cumulusci/tasks/salesforce/update_profile.py +339 -0
- cumulusci/tasks/salesforce/users/permsets.py +227 -0
- cumulusci/tasks/salesforce/users/photos.py +162 -0
- cumulusci/tasks/salesforce/users/tests/photo.mock.txt +1 -0
- cumulusci/tasks/salesforce/users/tests/test_permsets.py +950 -0
- cumulusci/tasks/salesforce/users/tests/test_photos.py +373 -0
- cumulusci/tasks/sample_data/capture_sample_data.py +77 -0
- cumulusci/tasks/sample_data/load_sample_data.py +85 -0
- cumulusci/tasks/sample_data/test_capture_sample_data.py +117 -0
- cumulusci/tasks/sample_data/test_load_sample_data.py +121 -0
- cumulusci/tasks/sfdx.py +83 -0
- cumulusci/tasks/tests/__init__.py +1 -0
- cumulusci/tasks/tests/conftest.py +30 -0
- cumulusci/tasks/tests/test_command.py +129 -0
- cumulusci/tasks/tests/test_connectedapp.py +236 -0
- cumulusci/tasks/tests/test_create_package_version.py +847 -0
- cumulusci/tasks/tests/test_datadictionary.py +1575 -0
- cumulusci/tasks/tests/test_dx_convert_from.py +60 -0
- cumulusci/tasks/tests/test_metadeploy.py +624 -0
- cumulusci/tasks/tests/test_metaxml.py +99 -0
- cumulusci/tasks/tests/test_promote_package_version.py +488 -0
- cumulusci/tasks/tests/test_pushfails.py +96 -0
- cumulusci/tasks/tests/test_salesforce.py +72 -0
- cumulusci/tasks/tests/test_sfdx.py +105 -0
- cumulusci/tasks/tests/test_util.py +207 -0
- cumulusci/tasks/util.py +261 -0
- cumulusci/tasks/vcs/__init__.py +19 -0
- cumulusci/tasks/vcs/commit_status.py +58 -0
- cumulusci/tasks/vcs/create_commit_status.py +37 -0
- cumulusci/tasks/vcs/download_extract.py +199 -0
- cumulusci/tasks/vcs/merge.py +298 -0
- cumulusci/tasks/vcs/publish.py +207 -0
- cumulusci/tasks/vcs/pull_request.py +9 -0
- cumulusci/tasks/vcs/release.py +134 -0
- cumulusci/tasks/vcs/release_report.py +105 -0
- cumulusci/tasks/vcs/tag.py +31 -0
- cumulusci/tasks/vcs/tests/github/test_commit_status.py +196 -0
- cumulusci/tasks/vcs/tests/github/test_download_extract.py +896 -0
- cumulusci/tasks/vcs/tests/github/test_merge.py +1118 -0
- cumulusci/tasks/vcs/tests/github/test_publish.py +823 -0
- cumulusci/tasks/vcs/tests/github/test_pull_request.py +29 -0
- cumulusci/tasks/vcs/tests/github/test_release.py +390 -0
- cumulusci/tasks/vcs/tests/github/test_release_report.py +109 -0
- cumulusci/tasks/vcs/tests/github/test_tag.py +90 -0
- cumulusci/tasks/vlocity/exceptions.py +2 -0
- cumulusci/tasks/vlocity/tests/test_vlocity.py +283 -0
- cumulusci/tasks/vlocity/vlocity.py +342 -0
- cumulusci/tests/__init__.py +1 -0
- cumulusci/tests/cassettes/GET_sobjects_Account_PersonAccount_describe.yaml +18 -0
- cumulusci/tests/cassettes/TestIntegrationInfrastructure.test_integration_tests.yaml +19 -0
- cumulusci/tests/pytest_plugins/pytest_sf_orgconnect.py +307 -0
- cumulusci/tests/pytest_plugins/pytest_sf_vcr.py +275 -0
- cumulusci/tests/pytest_plugins/pytest_sf_vcr_serializer.py +160 -0
- cumulusci/tests/pytest_plugins/pytest_typeguard.py +5 -0
- cumulusci/tests/pytest_plugins/test_vcr_string_compressor.py +49 -0
- cumulusci/tests/pytest_plugins/vcr_string_compressor.py +97 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Account_describe.yaml +18 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Case_describe.yaml +18 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Contact_describe.yaml +4838 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Custom__c_describe.yaml +242 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Event_describe.yaml +19 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Global_describe.yaml +1338 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Lead_describe.yaml +18 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_OpportunityContactRole_describe.yaml +34 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Opportunity_describe.yaml +1261 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Organization.yaml +49 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/batchInfoList_xml.tpl +15 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/batchInfo_xml.tpl +13 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/jobInfo_insert_xml.tpl +24 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/jobInfo_upsert_xml.tpl +25 -0
- cumulusci/tests/test_entry_points.py +20 -0
- cumulusci/tests/test_integration_infrastructure.py +131 -0
- cumulusci/tests/test_main.py +9 -0
- cumulusci/tests/test_schema.py +32 -0
- cumulusci/tests/test_utils.py +657 -0
- cumulusci/tests/test_vcr_serializer.py +134 -0
- cumulusci/tests/uncompressed_cassette.yaml +83 -0
- cumulusci/tests/util.py +344 -0
- cumulusci/utils/__init__.py +731 -0
- cumulusci/utils/classutils.py +9 -0
- cumulusci/utils/collections.py +32 -0
- cumulusci/utils/deprecation.py +11 -0
- cumulusci/utils/encryption.py +31 -0
- cumulusci/utils/fileutils.py +295 -0
- cumulusci/utils/git.py +142 -0
- cumulusci/utils/http/multi_request.py +214 -0
- cumulusci/utils/http/requests_utils.py +103 -0
- cumulusci/utils/http/tests/cassettes/ManualEditTestCompositeParallelSalesforce.test_http_headers.yaml +32 -0
- cumulusci/utils/http/tests/cassettes/TestCompositeParallelSalesforce.test_composite_parallel_salesforce.yaml +65 -0
- cumulusci/utils/http/tests/cassettes/TestCompositeParallelSalesforce.test_errors.yaml +24 -0
- cumulusci/utils/http/tests/cassettes/TestCompositeParallelSalesforce.test_reference_ids.yaml +49 -0
- cumulusci/utils/http/tests/test_multi_request.py +255 -0
- cumulusci/utils/iterators.py +21 -0
- cumulusci/utils/logging.py +128 -0
- cumulusci/utils/metaprogramming.py +10 -0
- cumulusci/utils/options.py +138 -0
- cumulusci/utils/parallel/queries_in_parallel/run_queries_in_parallel.py +29 -0
- cumulusci/utils/parallel/queries_in_parallel/tests/test_run_queries_in_parallel.py +50 -0
- cumulusci/utils/parallel/task_worker_queues/parallel_worker.py +238 -0
- cumulusci/utils/parallel/task_worker_queues/parallel_worker_queue.py +243 -0
- cumulusci/utils/parallel/task_worker_queues/tests/test_parallel_worker.py +353 -0
- cumulusci/utils/salesforce/count_sobjects.py +46 -0
- cumulusci/utils/salesforce/soql.py +17 -0
- cumulusci/utils/salesforce/tests/cassettes/ManualEdit_TestCountSObjects.test_count_sobjects__network_errors.yaml +23 -0
- cumulusci/utils/salesforce/tests/cassettes/TestCountSObjects.test_count_sobjects__errors.yaml +33 -0
- cumulusci/utils/salesforce/tests/cassettes/TestCountSObjects.test_count_sobjects_simple.yaml +29 -0
- cumulusci/utils/salesforce/tests/test_count_sobjects.py +29 -0
- cumulusci/utils/salesforce/tests/test_soql.py +30 -0
- cumulusci/utils/tests/cassettes/ManualEditTestDescribeOrg.test_minimal_schema.yaml +36 -0
- cumulusci/utils/tests/cassettes/ManualEdit_test_describe_to_sql.yaml +191 -0
- cumulusci/utils/tests/test_fileutils.py +284 -0
- cumulusci/utils/tests/test_git.py +85 -0
- cumulusci/utils/tests/test_logging.py +70 -0
- cumulusci/utils/tests/test_option_parsing.py +188 -0
- cumulusci/utils/tests/test_org_schema.py +691 -0
- cumulusci/utils/tests/test_org_schema_models.py +79 -0
- cumulusci/utils/tests/test_waiting.py +25 -0
- cumulusci/utils/version_strings.py +391 -0
- cumulusci/utils/waiting.py +42 -0
- cumulusci/utils/xml/__init__.py +91 -0
- cumulusci/utils/xml/metadata_tree.py +299 -0
- cumulusci/utils/xml/robot_xml.py +114 -0
- cumulusci/utils/xml/salesforce_encoding.py +100 -0
- cumulusci/utils/xml/test/test_metadata_tree.py +251 -0
- cumulusci/utils/xml/test/test_salesforce_encoding.py +173 -0
- cumulusci/utils/yaml/cumulusci_yml.py +401 -0
- cumulusci/utils/yaml/model_parser.py +156 -0
- cumulusci/utils/yaml/safer_loader.py +74 -0
- cumulusci/utils/yaml/tests/bad_cci.yml +5 -0
- cumulusci/utils/yaml/tests/cassettes/TestCumulusciYml.test_validate_url__with_errors.yaml +20 -0
- cumulusci/utils/yaml/tests/test_cumulusci_yml.py +286 -0
- cumulusci/utils/yaml/tests/test_model_parser.py +175 -0
- cumulusci/utils/yaml/tests/test_safer_loader.py +88 -0
- cumulusci/utils/ziputils.py +61 -0
- cumulusci/vcs/base.py +143 -0
- cumulusci/vcs/bootstrap.py +272 -0
- cumulusci/vcs/github/__init__.py +24 -0
- cumulusci/vcs/github/adapter.py +689 -0
- cumulusci/vcs/github/release_notes/generator.py +219 -0
- cumulusci/vcs/github/release_notes/parser.py +151 -0
- cumulusci/vcs/github/release_notes/provider.py +143 -0
- cumulusci/vcs/github/service.py +569 -0
- cumulusci/vcs/github/tests/test_adapter.py +138 -0
- cumulusci/vcs/github/tests/test_service.py +408 -0
- cumulusci/vcs/models.py +586 -0
- cumulusci/vcs/tests/conftest.py +41 -0
- cumulusci/vcs/tests/dummy_service.py +241 -0
- cumulusci/vcs/tests/test_vcs_base.py +687 -0
- cumulusci/vcs/tests/test_vcs_bootstrap.py +727 -0
- cumulusci/vcs/utils/__init__.py +31 -0
- cumulusci/vcs/vcs_source.py +287 -0
- cumulusci_plus-5.0.0.dist-info/METADATA +145 -0
- cumulusci_plus-5.0.0.dist-info/RECORD +744 -0
- cumulusci_plus-5.0.0.dist-info/WHEEL +4 -0
- cumulusci_plus-5.0.0.dist-info/entry_points.txt +3 -0
- cumulusci_plus-5.0.0.dist-info/licenses/AUTHORS.rst +41 -0
- cumulusci_plus-5.0.0.dist-info/licenses/LICENSE +30 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
*** Settings ***
|
|
2
|
+
|
|
3
|
+
Resource cumulusci/robotframework/CumulusCI.robot
|
|
4
|
+
Force Tags no-browser
|
|
5
|
+
|
|
6
|
+
*** Test Cases ***
|
|
7
|
+
|
|
8
|
+
Test Set Login Url
|
|
9
|
+
Set Login Url
|
|
10
|
+
Variable Should Exist ${LOGIN_URL}
|
|
11
|
+
|
|
12
|
+
Test Login Url
|
|
13
|
+
${login_url} = Login Url
|
|
14
|
+
Should Contain ${login_url} secur/frontdoor.jsp?sid=
|
|
15
|
+
|
|
16
|
+
Test Get Org Info
|
|
17
|
+
&{org_info} = Get Org Info
|
|
18
|
+
Dictionary Should Contain Key ${org_info} org_id
|
|
19
|
+
Dictionary Should Contain Key ${org_info} username
|
|
20
|
+
|
|
21
|
+
Test Get Namespace Prefix
|
|
22
|
+
${ns} = Get Namespace Prefix
|
|
23
|
+
Should Be Empty ${ns}
|
|
24
|
+
|
|
25
|
+
Test Run Task
|
|
26
|
+
Run Task create_package
|
|
27
|
+
|
|
28
|
+
Test Run Task With Options
|
|
29
|
+
Run Task create_package package=Test Package
|
|
30
|
+
|
|
31
|
+
Test Run Task Missing
|
|
32
|
+
Run Keyword And Expect Error
|
|
33
|
+
... TaskNotFoundError: Task not found: does_not_exist
|
|
34
|
+
... Run Task does_not_exist
|
|
35
|
+
|
|
36
|
+
Test Run Task Class
|
|
37
|
+
Run Task Class cumulusci.tasks.salesforce.CreatePackage
|
|
38
|
+
|
|
39
|
+
Test Run Task Class With Options
|
|
40
|
+
Run Task Class cumulusci.tasks.salesforce.CreatePackage package=Test Package
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
*** Settings ***
|
|
2
|
+
|
|
3
|
+
Resource cumulusci/robotframework/Salesforce.robot
|
|
4
|
+
Resource cumulusci/robotframework/CumulusCI.robot
|
|
5
|
+
|
|
6
|
+
Force Tags bulkdata no-browser
|
|
7
|
+
|
|
8
|
+
*** Test Cases ***
|
|
9
|
+
|
|
10
|
+
Test Run Bulk Data Deletion With Error
|
|
11
|
+
|
|
12
|
+
${account_name} = Get fake data company
|
|
13
|
+
${account_id} = Salesforce Insert Account
|
|
14
|
+
... Name=${account_name}
|
|
15
|
+
... BillingStreet=Granville Ave., SFDO
|
|
16
|
+
|
|
17
|
+
${contract_id} = Salesforce Insert Contract
|
|
18
|
+
... AccountId=${account_id}
|
|
19
|
+
|
|
20
|
+
Salesforce Update Contract ${contract_id}
|
|
21
|
+
... status=Activated
|
|
22
|
+
|
|
23
|
+
${opportunity} = Salesforce Insert Opportunity
|
|
24
|
+
... AccountId=${account_id}
|
|
25
|
+
... StageName=Prospecting
|
|
26
|
+
... Name=${account_name}
|
|
27
|
+
... CloseDate=2025-05-05
|
|
28
|
+
|
|
29
|
+
Run Keyword and Expect Error *BulkDataException*
|
|
30
|
+
... Run Task Class cumulusci.tasks.bulkdata.delete.DeleteData
|
|
31
|
+
... objects=Account
|
|
32
|
+
... where=BillingStreet='Granville Ave., SFDO'
|
|
33
|
+
|
|
34
|
+
Salesforce Delete Contract ${contract_id}
|
|
35
|
+
|
|
36
|
+
Run Task Class cumulusci.tasks.bulkdata.delete.DeleteData
|
|
37
|
+
... objects=Account
|
|
38
|
+
... where=BillingStreet='Granville Ave., SFDO'
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
*** Settings ***
|
|
2
|
+
Resource cumulusci/robotframework/CumulusCI.robot
|
|
3
|
+
Library Collections
|
|
4
|
+
Force Tags no-browser
|
|
5
|
+
|
|
6
|
+
Suite Setup run keywords
|
|
7
|
+
# Note: the first community name intentionally includes a unicode
|
|
8
|
+
# character to make sure we can handle it.
|
|
9
|
+
... Ensure community exists Kōkua kokua
|
|
10
|
+
... AND Ensure community exists Ohana ohana
|
|
11
|
+
|
|
12
|
+
*** Keywords ***
|
|
13
|
+
Ensure community exists
|
|
14
|
+
[Arguments] ${community name} ${url prefix}
|
|
15
|
+
[Documentation] Creates a community with the given name if it doesn't exist
|
|
16
|
+
|
|
17
|
+
${passed}= run keyword and return status
|
|
18
|
+
... get community info ${community name}
|
|
19
|
+
|
|
20
|
+
run keyword if not $passed run task create_community
|
|
21
|
+
... template=VF Template
|
|
22
|
+
... name=${community name}
|
|
23
|
+
... url_path_prefix=${url prefix}
|
|
24
|
+
|
|
25
|
+
*** Test Cases ***
|
|
26
|
+
Get community info for specific community
|
|
27
|
+
# we'll just spot-check a few keys. I don't see a point
|
|
28
|
+
# in testing them all, since the API is either going to
|
|
29
|
+
# return everything or nothing
|
|
30
|
+
${info}= get community info Kōkua
|
|
31
|
+
Dictionary should contain key ${info} name
|
|
32
|
+
Dictionary should contain key ${info} loginUrl
|
|
33
|
+
Dictionary should contain key ${info} siteUrl
|
|
34
|
+
Should be equal ${info['name']} Kōkua
|
|
35
|
+
Should be equal ${info['urlPathPrefix']} kokua
|
|
36
|
+
|
|
37
|
+
# now get info for another community, to make sure
|
|
38
|
+
# it doesn't return the data from the previous community
|
|
39
|
+
${info}= get community info Ohana
|
|
40
|
+
Should be equal ${info['name']} Ohana
|
|
41
|
+
Should be equal ${info['urlPathPrefix']} ohana
|
|
42
|
+
|
|
43
|
+
Get community info for non-existing community throws error
|
|
44
|
+
[Documentation] Verify that an unknown community name throws a reasonable error message
|
|
45
|
+
run keyword and expect error
|
|
46
|
+
... Unable to find community information for 'bōgusCommunity'
|
|
47
|
+
... get community info bōgusCommunity
|
|
48
|
+
|
|
49
|
+
Get community info with key
|
|
50
|
+
[Documentation] Verify we can Fetch data for a single key
|
|
51
|
+
${loginUrl}= get community info Kōkua loginUrl
|
|
52
|
+
Should match regexp ${loginUrl} https://.*/kokua/login
|
|
53
|
+
|
|
54
|
+
Get community info with unknown key throws error
|
|
55
|
+
[Documentation] Verify that an unknown key throws a reasonable error message
|
|
56
|
+
run keyword and expect error Invalid key 'bōgus'
|
|
57
|
+
... get community info Kōkua bōgus
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
*** Settings ***
|
|
2
|
+
|
|
3
|
+
Resource cumulusci/robotframework/Salesforce.robot
|
|
4
|
+
Resource cumulusci/robotframework/CumulusCI.robot
|
|
5
|
+
|
|
6
|
+
Force Tags bulkdata no-browser
|
|
7
|
+
|
|
8
|
+
*** Keywords ***
|
|
9
|
+
Assert Row Count
|
|
10
|
+
[Arguments] ${count} ${object_name} &{kwargs}
|
|
11
|
+
|
|
12
|
+
${status} ${result} = Run Keyword And Ignore Error
|
|
13
|
+
... Salesforce Query ${object_name}
|
|
14
|
+
... select=COUNT(Id)
|
|
15
|
+
... &{kwargs}
|
|
16
|
+
|
|
17
|
+
Run Keyword If '${status}' != 'PASS'
|
|
18
|
+
... Log
|
|
19
|
+
... Salesforce query failed: probably timeout. ${object_name} ${result}
|
|
20
|
+
... console=True
|
|
21
|
+
|
|
22
|
+
Should Be Equal PASS ${status}
|
|
23
|
+
|
|
24
|
+
${matching_records} = Set Variable ${result}[0][expr0]
|
|
25
|
+
Should Be Equal As Numbers ${matching_records} ${count}
|
|
26
|
+
|
|
27
|
+
Attempt To Load Snowfakery
|
|
28
|
+
Import Library snowfakery
|
|
29
|
+
Return From Keyword True
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
*** Test Cases ***
|
|
33
|
+
|
|
34
|
+
Test Run Bulk Data Generation
|
|
35
|
+
Run Task Class cumulusci.tasks.bulkdata.delete.DeleteData
|
|
36
|
+
... objects=Account
|
|
37
|
+
... where=BillingStreet='Baker St.'
|
|
38
|
+
Run Task Class cumulusci.tasks.bulkdata.delete.DeleteData
|
|
39
|
+
... objects=Contact
|
|
40
|
+
... where=MailingStreet='Baker St.'
|
|
41
|
+
Run Task Class cumulusci.tasks.bulkdata.generate_and_load_data.GenerateAndLoadData
|
|
42
|
+
... num_records=20
|
|
43
|
+
... mapping=cumulusci/tasks/bulkdata/tests/mapping_vanilla_sf.yml
|
|
44
|
+
... data_generation_task=cumulusci.tasks.bulkdata.tests.dummy_data_factory.GenerateDummyData
|
|
45
|
+
Assert Row Count 20 Account BillingStreet=Baker St.
|
|
46
|
+
Assert Row Count 15 Contact MailingStreet=Baker St.
|
|
47
|
+
|
|
48
|
+
Test Batching
|
|
49
|
+
Run Task Class cumulusci.tasks.bulkdata.delete.DeleteData
|
|
50
|
+
... objects=Account
|
|
51
|
+
... where=BillingStreet='Baker St.'
|
|
52
|
+
Run Task Class cumulusci.tasks.bulkdata.delete.DeleteData
|
|
53
|
+
... objects=Contact
|
|
54
|
+
... where=MailingStreet='Baker St.'
|
|
55
|
+
Run Task Class cumulusci.tasks.bulkdata.generate_and_load_data.GenerateAndLoadData
|
|
56
|
+
... num_records=20
|
|
57
|
+
... mapping=cumulusci/tasks/bulkdata/tests/mapping_vanilla_sf.yml
|
|
58
|
+
... batch_size=4
|
|
59
|
+
... data_generation_task=cumulusci.tasks.bulkdata.tests.dummy_data_factory.GenerateDummyData
|
|
60
|
+
Assert Row Count 20 Account BillingStreet=Baker St.
|
|
61
|
+
Assert Row Count 15 Contact MailingStreet=Baker St.
|
|
62
|
+
|
|
63
|
+
Test Error Handling
|
|
64
|
+
Run Keyword and Expect Error STARTS:TaskOptionsError
|
|
65
|
+
... Run Task Class cumulusci.tasks.bulkdata.generate_and_load_data.GenerateAndLoadData
|
|
66
|
+
... num_records=20
|
|
67
|
+
... mapping=cumulusci/tasks/bulkdata/tests/mapping_vanilla_sf.yml
|
|
68
|
+
... batch_size=5
|
|
69
|
+
... database_url=sqlite:////tmp/foo.db
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
Test Snowfakery
|
|
74
|
+
${status} ${retVal}= Run Keyword And Ignore Error Attempt To Load Snowfakery
|
|
75
|
+
Log ${status}
|
|
76
|
+
|
|
77
|
+
Run Keyword Unless $status == 'PASS' Log Snowfakery is not available
|
|
78
|
+
|
|
79
|
+
Run Keyword If $status == 'PASS' Run Task Class
|
|
80
|
+
... cumulusci.tasks.bulkdata.generate_and_load_data_from_yaml.GenerateAndLoadDataFromYaml
|
|
81
|
+
... num_records=20
|
|
82
|
+
... num_records_tablename=Account
|
|
83
|
+
... batch_size=5
|
|
84
|
+
... generator_yaml=cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery.recipe.yml
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This is a library used by locators.robot for testing
|
|
3
|
+
custom locator strategies
|
|
4
|
+
"""
|
|
5
|
+
from cumulusci.robotframework.locator_manager import (
|
|
6
|
+
register_locators,
|
|
7
|
+
translate_locator,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
locators = {
|
|
11
|
+
# eg: A:breadcrumb:Home
|
|
12
|
+
"breadcrumb": "//span[contains(@class, 'breadcrumbDetail') and text()='{}']",
|
|
13
|
+
"something": "//whatever",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TestLibraryA:
|
|
18
|
+
ROBOT_LIBRARY_SCOPE = "global"
|
|
19
|
+
|
|
20
|
+
def __init__(self):
|
|
21
|
+
register_locators("A", locators)
|
|
22
|
+
|
|
23
|
+
def translate_locator(self, prefix, locator):
|
|
24
|
+
return translate_locator(prefix, locator)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This is a library used by locators.robot for testing
|
|
3
|
+
custom locator strategies
|
|
4
|
+
"""
|
|
5
|
+
from cumulusci.robotframework.locator_manager import (
|
|
6
|
+
register_locators,
|
|
7
|
+
translate_locator,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
locators = {"appname": "//div[contains(@class, 'appName') and .='{}']"}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TestLibraryB:
|
|
14
|
+
ROBOT_LIBRARY_SCOPE = "global"
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
register_locators("B", locators)
|
|
18
|
+
|
|
19
|
+
def translate_locator(self, prefix, locator):
|
|
20
|
+
return translate_locator(prefix, locator)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""This hybrid library/listener can be used to verify messages that
|
|
2
|
+
have been logged and keywords have been called.
|
|
3
|
+
|
|
4
|
+
This works by listening for log messages and keywords via the
|
|
5
|
+
listener interface, and saving them in a cache. Keywords are
|
|
6
|
+
provided for doing assertions on called keywords and for resetting
|
|
7
|
+
the cache.
|
|
8
|
+
|
|
9
|
+
The keyword cache is reset for each test case to help keep it
|
|
10
|
+
from growing too large.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
import re
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestListener(object):
|
|
17
|
+
__test__ = False # this class should be ignored by pytest
|
|
18
|
+
ROBOT_LIBRARY_SCOPE = "TEST SUITE"
|
|
19
|
+
ROBOT_LISTENER_API_VERSION = 2
|
|
20
|
+
|
|
21
|
+
def __init__(self):
|
|
22
|
+
self.ROBOT_LIBRARY_LISTENER = self
|
|
23
|
+
self.message_log = []
|
|
24
|
+
self.keyword_log = []
|
|
25
|
+
self.message_logging_enabled = True
|
|
26
|
+
|
|
27
|
+
def _log_message(self, message):
|
|
28
|
+
"""Called whenever a message is added to the log"""
|
|
29
|
+
if self.message_logging_enabled:
|
|
30
|
+
self.message_log.append(message)
|
|
31
|
+
|
|
32
|
+
def _start_test(self, name, attrs):
|
|
33
|
+
self.reset_test_listener_keyword_log()
|
|
34
|
+
|
|
35
|
+
def _end_keyword(self, name, attrs):
|
|
36
|
+
attrs_subset = {name: attrs[name] for name in ("status", "args")}
|
|
37
|
+
self.keyword_log.append((name, attrs_subset))
|
|
38
|
+
|
|
39
|
+
def reset_test_listener_keyword_log(self):
|
|
40
|
+
"""Reset the keyword cache
|
|
41
|
+
|
|
42
|
+
This can be used to reset the cache in the middle of a
|
|
43
|
+
testcase so that the 'Assert keyword Status' keyword will only
|
|
44
|
+
apply to keywords called from this point onwards.
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
self.keyword_log.clear()
|
|
48
|
+
|
|
49
|
+
def reset_test_listener_message_log(self):
|
|
50
|
+
self.message_log = []
|
|
51
|
+
|
|
52
|
+
def assert_keyword_status(self, expected_status, keyword_name, *args):
|
|
53
|
+
"""Assert that all keyword with the given name and args have the given status
|
|
54
|
+
|
|
55
|
+
Keyword names need to be passed in as fully qualified names
|
|
56
|
+
exactly as they appear in the logs.
|
|
57
|
+
|
|
58
|
+
expected_status should be either PASS or FAIL
|
|
59
|
+
|
|
60
|
+
Example
|
|
61
|
+
Log Hello, world
|
|
62
|
+
Assert keyword status PASS BuiltIn.log Hello, world
|
|
63
|
+
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
keyword_was_found = False
|
|
67
|
+
for name, attrs in self.keyword_log:
|
|
68
|
+
if name == keyword_name and args == tuple(attrs["args"]):
|
|
69
|
+
keyword_was_found = True
|
|
70
|
+
if attrs["status"] != expected_status:
|
|
71
|
+
message = (
|
|
72
|
+
f"Status of keyword {keyword_name} with args {args} "
|
|
73
|
+
f"expected to be {expected_status} but was {attrs['status']}"
|
|
74
|
+
)
|
|
75
|
+
raise AssertionError(message)
|
|
76
|
+
if not keyword_was_found:
|
|
77
|
+
raise AssertionError(
|
|
78
|
+
f"No keyword with name '{keyword_name}' with args '{args}' was found"
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def assert_robot_log(self, message_pattern, log_level=None):
|
|
82
|
+
"""Assert that a message matching the regex pattern was emitted"""
|
|
83
|
+
for message in self.message_log:
|
|
84
|
+
# note: message is a dictionary with the following keys:
|
|
85
|
+
# 'timestamp', 'message', 'level', 'html'
|
|
86
|
+
if re.search(message_pattern, message["message"], re.MULTILINE):
|
|
87
|
+
if log_level is None or message["level"] == log_level:
|
|
88
|
+
return True
|
|
89
|
+
raise AssertionError(
|
|
90
|
+
"Could not find a robot log message matching the pattern '{}'".format(
|
|
91
|
+
message_pattern
|
|
92
|
+
)
|
|
93
|
+
)
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
*** Settings ***
|
|
2
|
+
|
|
3
|
+
Resource cumulusci/robotframework/Salesforce.robot
|
|
4
|
+
Suite Teardown Delete Session Records
|
|
5
|
+
Force Tags api no-browser
|
|
6
|
+
|
|
7
|
+
*** Keywords ***
|
|
8
|
+
|
|
9
|
+
Create Contact
|
|
10
|
+
${first_name} = Get fake data first_name
|
|
11
|
+
${last_name} = Get fake data last_name
|
|
12
|
+
${contact_id} = Salesforce Insert Contact FirstName=${first_name} LastName=${last_name}
|
|
13
|
+
&{contact} = Salesforce Get Contact ${contact_id}
|
|
14
|
+
[return] &{contact}
|
|
15
|
+
|
|
16
|
+
*** Test Cases ***
|
|
17
|
+
|
|
18
|
+
Salesforce Delete
|
|
19
|
+
&{contact} = Create Contact
|
|
20
|
+
Salesforce Delete Contact ${contact}[Id]
|
|
21
|
+
&{result} = SOQL Query Select Id from Contact WHERE Id = '${contact}[Id]'
|
|
22
|
+
Should Be Equal ${result}[totalSize] ${0}
|
|
23
|
+
|
|
24
|
+
Salesforce Insert
|
|
25
|
+
${first_name} = Get fake data first_name
|
|
26
|
+
${last_name} = Get fake data last_name
|
|
27
|
+
${contact_id} = Salesforce Insert Contact
|
|
28
|
+
... FirstName=${first_name}
|
|
29
|
+
... LastName=${last_name}
|
|
30
|
+
&{contact} = Salesforce Get Contact ${contact_id}
|
|
31
|
+
Should Be Equal ${contact}[FirstName] ${first_name}
|
|
32
|
+
Should Be Equal ${contact}[LastName] ${last_name}
|
|
33
|
+
|
|
34
|
+
Salesforce Update
|
|
35
|
+
&{contact} = Create Contact
|
|
36
|
+
${new_last_name} = Get fake data last_name
|
|
37
|
+
Salesforce Update Contact ${contact}[Id] LastName=${new_last_name}
|
|
38
|
+
&{contact} = Salesforce Get Contact ${contact}[Id]
|
|
39
|
+
Should Be Equal ${contact}[LastName] ${new_last_name}
|
|
40
|
+
|
|
41
|
+
Salesforce Query
|
|
42
|
+
&{new_contact} = Create Contact
|
|
43
|
+
@{records} = Salesforce Query Contact
|
|
44
|
+
... select=Id,FirstName,LastName
|
|
45
|
+
... Id=${new_contact}[Id]
|
|
46
|
+
&{contact} = Get From List ${records} 0
|
|
47
|
+
Should Be Equal ${contact}[Id] ${new_contact}[Id]
|
|
48
|
+
Should Be Equal ${contact}[FirstName] ${new_contact}[FirstName]
|
|
49
|
+
Should Be Equal ${contact}[LastName] ${new_contact}[LastName]
|
|
50
|
+
|
|
51
|
+
Salesforce Query Where
|
|
52
|
+
&{new_contact} = Create Contact
|
|
53
|
+
@{records} = Salesforce Query Contact
|
|
54
|
+
... select=Id,FirstName,LastName
|
|
55
|
+
... where=FirstName='${new_contact}[FirstName]' AND LastName='${new_contact}[LastName]'
|
|
56
|
+
&{contact} = Get From List ${records} 0
|
|
57
|
+
Should Be Equal ${contact}[Id] ${new_contact}[Id]
|
|
58
|
+
Should Be Equal ${contact}[FirstName] ${new_contact}[FirstName]
|
|
59
|
+
Should Be Equal ${contact}[LastName] ${new_contact}[LastName]
|
|
60
|
+
|
|
61
|
+
Salesforce Query Where Plus Clauses
|
|
62
|
+
&{new_contact} = Create Contact
|
|
63
|
+
@{records} = Salesforce Query Contact
|
|
64
|
+
... select=Id,FirstName,LastName
|
|
65
|
+
... where=LastName='${new_contact}[LastName]'
|
|
66
|
+
... FirstName=${new_contact}[FirstName]
|
|
67
|
+
&{contact} = Get From List ${records} 0
|
|
68
|
+
Should Be Equal ${contact}[Id] ${new_contact}[Id]
|
|
69
|
+
Should Be Equal ${contact}[FirstName] ${new_contact}[FirstName]
|
|
70
|
+
Should Be Equal ${contact}[LastName] ${new_contact}[LastName]
|
|
71
|
+
|
|
72
|
+
Salesforce Query Where Not Equal
|
|
73
|
+
&{new_contact} = Create Contact
|
|
74
|
+
@{records} = Salesforce Query Contact
|
|
75
|
+
... select=Id,FirstName,LastName
|
|
76
|
+
... where= LastName!='${new_contact}[LastName]'
|
|
77
|
+
... Id=${new_contact}[Id]
|
|
78
|
+
${cnt}= Get length ${records}
|
|
79
|
+
Should Be Equal As Numbers ${cnt} 0
|
|
80
|
+
|
|
81
|
+
Salesforce Query Where Limit Order
|
|
82
|
+
&{anon_contact} = Create Contact
|
|
83
|
+
&{anon_contact} = Create Contact
|
|
84
|
+
${contact_id} = Salesforce Insert Contact FirstName=xyzzy LastName=xyzzy
|
|
85
|
+
@{records} = Salesforce Query Contact
|
|
86
|
+
... select=Id,FirstName,LastName
|
|
87
|
+
... where= LastName!='xyzzy'
|
|
88
|
+
... order_by=LastName desc
|
|
89
|
+
... limit=2
|
|
90
|
+
${cnt}= Get length ${records}
|
|
91
|
+
Should Be Equal As Numbers ${cnt} 2
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
SOQL Query - single line
|
|
95
|
+
&{new_contact} = Create Contact
|
|
96
|
+
&{result} = Soql Query Select Id, FirstName, LastName from Contact WHERE Id = '${new_contact}[Id]'
|
|
97
|
+
@{records} = Get From Dictionary ${result} records
|
|
98
|
+
&{contact} = Get From List ${records} 0
|
|
99
|
+
Should Be Equal ${result}[totalSize] ${1}
|
|
100
|
+
Should Be Equal ${contact}[FirstName] ${new_contact}[FirstName]
|
|
101
|
+
Should Be Equal ${contact}[LastName] ${new_contact}[LastName]
|
|
102
|
+
|
|
103
|
+
SOQL Query - multiline
|
|
104
|
+
[Documentation] Verify that a SOQL query can span multiple lines
|
|
105
|
+
[Tags] W-10244357
|
|
106
|
+
&{contact1} = Create Contact
|
|
107
|
+
&{contact2} = Create Contact
|
|
108
|
+
|
|
109
|
+
&{result}= SOQL Query
|
|
110
|
+
... SELECT Id, FirstName, LastName
|
|
111
|
+
... FROM Contact
|
|
112
|
+
... WHERE Id = '${contact1}[Id]' OR Id = '${contact2}[Id]'
|
|
113
|
+
|
|
114
|
+
Should Be Equal as numbers ${result}[totalSize] 2
|
|
115
|
+
|
|
116
|
+
Salesforce Delete Session Records
|
|
117
|
+
[Documentation]
|
|
118
|
+
... Verify that 'Delete Session Records' deletes all session records
|
|
119
|
+
... This verifies that we fixed a bug which resulted in some records
|
|
120
|
+
... not being deleted.
|
|
121
|
+
|
|
122
|
+
# We'll use this to uniquely identify all records created in this test
|
|
123
|
+
${random string}= Generate Random String
|
|
124
|
+
|
|
125
|
+
# First, make sure we have no records that match
|
|
126
|
+
@{query}= Salesforce Query Contact LastName=${random string}
|
|
127
|
+
length should be ${query} 0 Expected the query to return no records, but it returned ${query}
|
|
128
|
+
|
|
129
|
+
# Next, create some records
|
|
130
|
+
FOR ${i} IN RANGE 5
|
|
131
|
+
${contact_id} = Salesforce Insert Contact
|
|
132
|
+
... FirstName=User-${i}
|
|
133
|
+
... LastName=${random string}
|
|
134
|
+
END
|
|
135
|
+
@{query}= Salesforce Query Contact LastName=${random string}
|
|
136
|
+
length should be ${query} 5 Expected the query to return five records, but it returned ${query}
|
|
137
|
+
|
|
138
|
+
# Now, call 'Delete Session Records' and verify all five were deleted
|
|
139
|
+
Delete Session Records
|
|
140
|
+
@{query}= Salesforce Query Contact
|
|
141
|
+
... LastName=${random string}
|
|
142
|
+
length should be ${query} 0 Expected the query to return 0 records, but it returned ${query}
|
|
143
|
+
|
|
144
|
+
Collection API Test
|
|
145
|
+
@{objects} = Generate Test Data Contact 20
|
|
146
|
+
... FirstName=User {{number}}
|
|
147
|
+
... LastName={{fake.last_name}}
|
|
148
|
+
@{records} = Salesforce Collection Insert ${objects}
|
|
149
|
+
FOR ${record} IN @{records}
|
|
150
|
+
${new_last_name} = Get fake data last_name
|
|
151
|
+
set to dictionary ${record} LastName ${new_last_name}
|
|
152
|
+
END
|
|
153
|
+
Salesforce Collection Update ${records}
|
|
154
|
+
|
|
155
|
+
Collection API Errors Test
|
|
156
|
+
@{objects} = Generate Test Data Contact 20
|
|
157
|
+
... FirstName=User {{number}}
|
|
158
|
+
... LastName={{fake.last_name}}
|
|
159
|
+
... Xyzzy=qwertz
|
|
160
|
+
Run Keyword And Expect Error *No such column*Xyzzy* Salesforce Collection Insert ${objects}
|
|
161
|
+
|
|
162
|
+
@{objects} = Generate Test Data Contact 20
|
|
163
|
+
... FirstName=User {{number}}
|
|
164
|
+
... LastName=
|
|
165
|
+
Run Keyword And Expect Error Error* Salesforce Collection Insert ${objects}
|
|
166
|
+
|
|
167
|
+
@{objects} = Generate Test Data Contact 20
|
|
168
|
+
... FirstName=User {{number}}
|
|
169
|
+
... LastName={{fake.last_name}}
|
|
170
|
+
${records} = Salesforce Collection Insert ${objects}
|
|
171
|
+
FOR ${record} IN @{records}
|
|
172
|
+
set to dictionary ${record} Age Iron
|
|
173
|
+
END
|
|
174
|
+
Run Keyword And Expect Error *No such column*Age* Salesforce Collection Update ${objects}
|
|
175
|
+
|
|
176
|
+
Get Version
|
|
177
|
+
${version} = Get Latest Api Version
|
|
178
|
+
Should Be True ${version} > 46
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
*** Settings ***
|
|
2
|
+
|
|
3
|
+
Resource cumulusci/robotframework/Salesforce.robot
|
|
4
|
+
Library TestListener.py
|
|
5
|
+
Suite Teardown Close all browsers
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
*** Variables ***
|
|
9
|
+
${DEFAULT WINDOW SIZE} 1280x1024
|
|
10
|
+
|
|
11
|
+
*** Keywords ***
|
|
12
|
+
Assert active browser count
|
|
13
|
+
[Documentation] Assert that an expected number of browsers are active
|
|
14
|
+
[Arguments] ${expected count}
|
|
15
|
+
|
|
16
|
+
@{browsers}= get active browser ids
|
|
17
|
+
${actual count}= get length ${browsers}
|
|
18
|
+
Length should be ${browsers} ${expected count}
|
|
19
|
+
... Expected to find ${expected count} open browsers, found ${actual count}
|
|
20
|
+
|
|
21
|
+
Assert window size
|
|
22
|
+
[Documentation]
|
|
23
|
+
... Verify the actual window size is the expected size
|
|
24
|
+
... give or take a pixel or five.
|
|
25
|
+
[Arguments] ${expected width} ${expected height}
|
|
26
|
+
|
|
27
|
+
# On circleci, the browser size is sometimes off by a pixel. How rude!
|
|
28
|
+
# Since we don't so much care about the precise size as we do that
|
|
29
|
+
# we are able to change the size, we'll allow a tiny bit of wiggle room.
|
|
30
|
+
${actual width} ${actual height}= Get window size
|
|
31
|
+
${xdelta}= evaluate abs(int($actual_width)-int($expected_width))
|
|
32
|
+
${ydelta}= evaluate abs(int($actual_height)-int($expected_height))
|
|
33
|
+
Run keyword if $xdelta > 5 or $ydelta > 5
|
|
34
|
+
... Fail Window size of ${actual width}x${actual height} is not close enough to expected ${expected width}x${expected height}
|
|
35
|
+
|
|
36
|
+
*** Test Cases ***
|
|
37
|
+
Open Test Browser Twice
|
|
38
|
+
[Documentation] Verify that we can open two browsers in a single test
|
|
39
|
+
[Tags] issue:1068
|
|
40
|
+
[Teardown] Close all browsers
|
|
41
|
+
|
|
42
|
+
Assert active browser count 0
|
|
43
|
+
Open test browser
|
|
44
|
+
Open test browser alias=browser2
|
|
45
|
+
Assert active browser count 2
|
|
46
|
+
|
|
47
|
+
Browser aliases
|
|
48
|
+
[Documentation] Verify that aliases are properly handled in Open Test Browser
|
|
49
|
+
[Tags] issue:1068
|
|
50
|
+
[Teardown] Close all browsers
|
|
51
|
+
|
|
52
|
+
# Open the default browser, go to a specific page and
|
|
53
|
+
# save the location
|
|
54
|
+
Open test browser alias=browser1
|
|
55
|
+
Go to setup home
|
|
56
|
+
${browser1 location}= get location
|
|
57
|
+
|
|
58
|
+
# open a second browser to a different specific page
|
|
59
|
+
Open test browser alias=browser2
|
|
60
|
+
Go to about:blank
|
|
61
|
+
|
|
62
|
+
# Switch back to the first to verify that the location
|
|
63
|
+
# hasn't changed
|
|
64
|
+
Switch browser browser1
|
|
65
|
+
Location should be ${browser1 location}
|
|
66
|
+
|
|
67
|
+
# Go to a new location in the first browser,
|
|
68
|
+
Go to setup object manager
|
|
69
|
+
|
|
70
|
+
# ... and then verify the location of the second
|
|
71
|
+
# browser hasn't changed.
|
|
72
|
+
Switch browser browser2
|
|
73
|
+
Location should be about:blank
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
Default browser size
|
|
77
|
+
[Documentation] Verify that we automatically resize browser to minimum supported size
|
|
78
|
+
[Teardown] Close all browsers
|
|
79
|
+
|
|
80
|
+
Open test browser
|
|
81
|
+
Assert window size 1280 1024
|
|
82
|
+
|
|
83
|
+
Explicit browser size
|
|
84
|
+
[Documentation] Verify we can set an explicit browser size when opening the window
|
|
85
|
+
[Teardown] Close all browsers
|
|
86
|
+
|
|
87
|
+
Open test browser size=1400x1200
|
|
88
|
+
Assert window size 1400 1200
|
|
89
|
+
|
|
90
|
+
Open Test Browser calls Log Browser Capabilities
|
|
91
|
+
[Documentation]
|
|
92
|
+
... Verify that browser capabilities are logged when we call
|
|
93
|
+
... Open Test Browser
|
|
94
|
+
[Teardown] Close all browsers
|
|
95
|
+
|
|
96
|
+
Reset test listener message log
|
|
97
|
+
Set test variable ${BROWSER} headlesschrome
|
|
98
|
+
Open test browser alias=chrome
|
|
99
|
+
Assert robot log selenium browser capabilities: INFO
|
|
100
|
+
Assert robot log browserName.*chrome
|
|
101
|
+
|
|
102
|
+
# Make sure we don't just log the capabilities of the
|
|
103
|
+
# first browser that was opened
|
|
104
|
+
Reset test listener message log
|
|
105
|
+
Set test variable ${BROWSER} headlessfirefox
|
|
106
|
+
Open test browser alias=firefox
|
|
107
|
+
Assert robot log selenium browser capabilities: INFO
|
|
108
|
+
Assert robot log browserName.*firefox
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
Initializing selenium speed via global variable
|
|
112
|
+
[Documentation]
|
|
113
|
+
... Verify that the `Set Selenium Speed` is called when Open Test browser is called
|
|
114
|
+
[Setup] Close all browsers
|
|
115
|
+
[Teardown] Close all browsers
|
|
116
|
+
|
|
117
|
+
# First, verify that this variable has been initialized
|
|
118
|
+
# The default value is set in Salesforce.robot.
|
|
119
|
+
Variable should exist ${SELENIUM_SPEED}
|
|
120
|
+
|
|
121
|
+
Open test browser
|
|
122
|
+
Assert keyword status PASS SeleniumLibrary.Set Selenium Speed \${SELENIUM_SPEED}
|
|
123
|
+
|
|
124
|
+
Select Window calls Switch Window
|
|
125
|
+
[Documentation] Verify that 'Select Window' calls 'Switch Window'
|
|
126
|
+
... and also that it logs a deprecation warning
|
|
127
|
+
[Setup] Run keywords
|
|
128
|
+
... Open test browser
|
|
129
|
+
... AND go to setup home
|
|
130
|
+
... AND execute javascript window.open("about:blank", "window1")
|
|
131
|
+
[Teardown] Close all browsers
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
Reset test listener message log
|
|
135
|
+
Select Window window1
|
|
136
|
+
Assert robot log 'Select Window' is deprecated; use 'Switch Window' instead WARN
|
|
137
|
+
location should be about:blank
|
|
138
|
+
|
|
139
|
+
Reset test listener message log
|
|
140
|
+
Select Window # defaults to the original window
|
|
141
|
+
Assert robot log 'Select Window' is deprecated; use 'Switch Window' instead WARN
|
|
142
|
+
# let's make sure we actually are at the main window's location
|
|
143
|
+
Wait until location contains /lightning/setup/SetupOneHome/home
|