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,361 @@
|
|
|
1
|
+
** Settings ***
|
|
2
|
+
|
|
3
|
+
Resource cumulusci/robotframework/Salesforce.robot
|
|
4
|
+
Library cumulusci.robotframework.PageObjects
|
|
5
|
+
Suite Setup Run keywords Create test data AND Open Test Browser
|
|
6
|
+
Suite Teardown Delete Records and Close Browser
|
|
7
|
+
Library Dialogs
|
|
8
|
+
Library cumulusci/robotframework/tests/salesforce/TestListener.py
|
|
9
|
+
|
|
10
|
+
*** Keywords ***
|
|
11
|
+
|
|
12
|
+
Create Account
|
|
13
|
+
[Arguments] &{fields}
|
|
14
|
+
${name} = Get fake data name
|
|
15
|
+
${account_id} = Salesforce Insert Account
|
|
16
|
+
... Name=${name}
|
|
17
|
+
... &{fields}
|
|
18
|
+
&{account} = Salesforce Get Account ${account_id}
|
|
19
|
+
[return] &{account}
|
|
20
|
+
|
|
21
|
+
Create Contact
|
|
22
|
+
[Arguments] &{fields}
|
|
23
|
+
${first_name} = Get fake data first_name
|
|
24
|
+
${last_name} = Get fake data last_name
|
|
25
|
+
${contact_id} = Salesforce Insert Contact
|
|
26
|
+
... FirstName=${first_name}
|
|
27
|
+
... LastName=${last_name}
|
|
28
|
+
... &{fields}
|
|
29
|
+
&{contact} = Salesforce Get Contact ${contact_id}
|
|
30
|
+
[return] &{contact}
|
|
31
|
+
|
|
32
|
+
Create test data
|
|
33
|
+
# This was added well after 'Create Account' and
|
|
34
|
+
# 'Create Contact'
|
|
35
|
+
${CONTACT ID}= Salesforce Insert Contact
|
|
36
|
+
... FirstName=Eleanor
|
|
37
|
+
... LastName=Rigby
|
|
38
|
+
Set suite variable ${CONTACT ID}
|
|
39
|
+
|
|
40
|
+
${ACCOUNT ID}= Salesforce Insert Account
|
|
41
|
+
... Name=Big Money Account
|
|
42
|
+
Set suite variable ${ACCOUNT ID}
|
|
43
|
+
|
|
44
|
+
${OPPORTUNITY ID}= Salesforce Insert Opportunity
|
|
45
|
+
... CloseDate=2020-01-27
|
|
46
|
+
... Name=Big Opportunity!
|
|
47
|
+
... StageName=Prospecting
|
|
48
|
+
... AccountId=${ACCOUNT ID}
|
|
49
|
+
... ContactId=${CONTACT ID}
|
|
50
|
+
Set suite variable ${OPPORTUNITY ID}
|
|
51
|
+
|
|
52
|
+
# add several more opportunities and cases
|
|
53
|
+
# this, so that related lists get pushed down
|
|
54
|
+
FOR ${i} IN RANGE 4
|
|
55
|
+
Salesforce Insert Opportunity
|
|
56
|
+
... CloseDate=2020-01-27
|
|
57
|
+
... Name=Big Opportunity!
|
|
58
|
+
... StageName=Prospecting
|
|
59
|
+
... AccountId=${ACCOUNT ID}
|
|
60
|
+
... ContactId=${CONTACT ID}
|
|
61
|
+
END
|
|
62
|
+
|
|
63
|
+
FOR ${i} IN RANGE 4
|
|
64
|
+
Salesforce Insert Case
|
|
65
|
+
... Subject=Something bad happened!
|
|
66
|
+
... Status=New
|
|
67
|
+
... Origin=Web
|
|
68
|
+
... ContactId=${CONTACT ID}
|
|
69
|
+
END
|
|
70
|
+
|
|
71
|
+
Object field should be
|
|
72
|
+
[Arguments] ${obj name} ${obj id} ${field} ${expected_value}
|
|
73
|
+
[Documentation]
|
|
74
|
+
... Fetches the object using the API, and verifies that the
|
|
75
|
+
... given field has the expected value
|
|
76
|
+
|
|
77
|
+
# it may take salesforce a second or two for the data
|
|
78
|
+
# to be saved and visible to the API, so we'll try this
|
|
79
|
+
# in a short loop
|
|
80
|
+
FOR ${i} IN RANGE 3
|
|
81
|
+
&{obj} = Salesforce Get ${obj name} ${obj id}
|
|
82
|
+
${actual_value}= Set variable ${obj}[${field}]
|
|
83
|
+
|
|
84
|
+
Return from keyword if $expected_value == $actual_value
|
|
85
|
+
log Retrying API call... WARN
|
|
86
|
+
Sleep 1 second
|
|
87
|
+
END
|
|
88
|
+
Fail Expected ${obj name} field ${field} to be '${expected_value}' but it was '${actual_value}'
|
|
89
|
+
|
|
90
|
+
*** Test Cases ***
|
|
91
|
+
|
|
92
|
+
Click Modal Button
|
|
93
|
+
Go To Object Home Contact
|
|
94
|
+
Click Object Button New
|
|
95
|
+
Click Modal Button Save
|
|
96
|
+
${locator} = Get Locator modal.has_error
|
|
97
|
+
Page Should Contain Element ${locator}
|
|
98
|
+
|
|
99
|
+
Click Object Button
|
|
100
|
+
Go To Object Home Contact
|
|
101
|
+
Click Object Button New
|
|
102
|
+
Page Should Contain New Contact
|
|
103
|
+
|
|
104
|
+
Click Related List Button
|
|
105
|
+
&{contact} = Create Contact
|
|
106
|
+
Go To Record Home ${contact}[Id]
|
|
107
|
+
Click Related List Button Opportunities New
|
|
108
|
+
Wait Until Modal Is Open
|
|
109
|
+
Wait Until Page Contains New Opportunity
|
|
110
|
+
|
|
111
|
+
Click related item link
|
|
112
|
+
[Documentation]
|
|
113
|
+
... Verify that 'Click related item link' works
|
|
114
|
+
[Setup] Create test data
|
|
115
|
+
|
|
116
|
+
Salesforce Insert Note
|
|
117
|
+
... Title=This is the title of the note
|
|
118
|
+
... Body=This is the body of the note
|
|
119
|
+
... ParentId=${CONTACT ID}
|
|
120
|
+
|
|
121
|
+
Go to page Detail Contact ${CONTACT ID}
|
|
122
|
+
Load related list Notes & Attachments
|
|
123
|
+
Click related item link
|
|
124
|
+
... Notes & Attachments
|
|
125
|
+
... This is the title of the note
|
|
126
|
+
|
|
127
|
+
Current page should be Detail Note
|
|
128
|
+
|
|
129
|
+
Click related item link exception
|
|
130
|
+
[Documentation]
|
|
131
|
+
... Verify that 'Click related item link' throws a useful error
|
|
132
|
+
|
|
133
|
+
[Setup] Create test data
|
|
134
|
+
|
|
135
|
+
Go to page Detail Contact ${CONTACT ID}
|
|
136
|
+
Run keyword and expect error
|
|
137
|
+
... Unable to find related link under heading 'Notes & Attachments' with the text 'Bogus'
|
|
138
|
+
... Click related item link Notes & Attachments Bogus
|
|
139
|
+
|
|
140
|
+
Load related list
|
|
141
|
+
[Setup] run keywords
|
|
142
|
+
... Go to page Detail Contact ${CONTACT ID}
|
|
143
|
+
... AND set test variable ${OLD LOG LEVEL} ${LOG LEVEL}
|
|
144
|
+
[Teardown] Set log level ${OLD LOG LEVEL}
|
|
145
|
+
|
|
146
|
+
# These should all work
|
|
147
|
+
Load related list Cases
|
|
148
|
+
Load related list Opportunities
|
|
149
|
+
Load related list Campaign History
|
|
150
|
+
Load related list Notes & Attachments
|
|
151
|
+
|
|
152
|
+
# This one s hould fail.
|
|
153
|
+
# We'll use the robot log to make sure we attempted to scroll.
|
|
154
|
+
Set log level DEBUG
|
|
155
|
+
Run keyword and expect error Timed out waiting for related list 'Bogus' to load.
|
|
156
|
+
... Load related list Bogus tries=2
|
|
157
|
+
Assert robot log related list 'Bogus' not found; scrolling... DEBUG
|
|
158
|
+
|
|
159
|
+
Click related item popup link
|
|
160
|
+
[Setup] Create test data
|
|
161
|
+
|
|
162
|
+
Go to page Detail Contact ${CONTACT ID}
|
|
163
|
+
Click Related item popup link
|
|
164
|
+
... Opportunities
|
|
165
|
+
... Big Opportunity!
|
|
166
|
+
... Edit
|
|
167
|
+
|
|
168
|
+
Wait for modal Edit Opportunity expected_heading=Edit Big Opportunity!
|
|
169
|
+
Click modal button Cancel
|
|
170
|
+
|
|
171
|
+
Close Modal
|
|
172
|
+
Go To Object Home Contact
|
|
173
|
+
Open App Launcher
|
|
174
|
+
Close Modal
|
|
175
|
+
Wait Until Modal Is Closed
|
|
176
|
+
Page Should Not Contain All Apps
|
|
177
|
+
|
|
178
|
+
Current App Should Be
|
|
179
|
+
Go To Object Home Contact
|
|
180
|
+
Select App Launcher App Service
|
|
181
|
+
Current App Should Be Service
|
|
182
|
+
|
|
183
|
+
Select App Launcher Tab
|
|
184
|
+
[Documentation] Verify that 'Select App Launcher Tab' works
|
|
185
|
+
[Setup] run keywords
|
|
186
|
+
... load page object Listing User
|
|
187
|
+
... AND load page object Home Event
|
|
188
|
+
|
|
189
|
+
Select App Launcher Tab People
|
|
190
|
+
Current page should be Listing User
|
|
191
|
+
|
|
192
|
+
# Just for good measure, let's switch to another page
|
|
193
|
+
# to make sure it's not a fluke and we really did
|
|
194
|
+
# switch to a different page.
|
|
195
|
+
Select App Launcher Tab Calendar
|
|
196
|
+
Current page should be Home Event
|
|
197
|
+
|
|
198
|
+
Get Current Record Id
|
|
199
|
+
&{contact} = Create Contact
|
|
200
|
+
Go To Record Home ${contact}[Id]
|
|
201
|
+
${contact_id} = Get Current Record Id
|
|
202
|
+
Should Be Equal ${contact}[Id] ${contact_id}
|
|
203
|
+
|
|
204
|
+
Get Related List Count
|
|
205
|
+
&{account} = Create Account
|
|
206
|
+
&{fields} = Create Dictionary
|
|
207
|
+
... AccountId=${account}[Id]
|
|
208
|
+
&{contact} = Create Contact &{fields}
|
|
209
|
+
Go To Record Home ${account}[Id]
|
|
210
|
+
${count} = Get Related List Count Contacts
|
|
211
|
+
Should Be Equal ${count} ${1}
|
|
212
|
+
|
|
213
|
+
Go To Setup Home
|
|
214
|
+
Go To Setup Home
|
|
215
|
+
|
|
216
|
+
Go To Setup Object Manager
|
|
217
|
+
Go To Setup Object Manager
|
|
218
|
+
|
|
219
|
+
Go To Object Home
|
|
220
|
+
[Tags] smoke
|
|
221
|
+
Go To Object List Contact
|
|
222
|
+
|
|
223
|
+
Go To Object List
|
|
224
|
+
[Tags] smoke
|
|
225
|
+
Go To Object List Contact
|
|
226
|
+
|
|
227
|
+
Go To Object List With Filter
|
|
228
|
+
[Tags] smoke
|
|
229
|
+
Go To Object List Contact filter=Recent
|
|
230
|
+
|
|
231
|
+
Go To Record Home
|
|
232
|
+
[Tags] smoke
|
|
233
|
+
&{contact} = Create Contact
|
|
234
|
+
Go To Record Home ${contact}[Id]
|
|
235
|
+
|
|
236
|
+
Header Field Should Have Value
|
|
237
|
+
&{fields} = Create Dictionary
|
|
238
|
+
... Phone=1234567890
|
|
239
|
+
&{account} = Create Account &{fields}
|
|
240
|
+
Go To Record Home ${account}[Id]
|
|
241
|
+
Header Field Should Have Value Phone
|
|
242
|
+
|
|
243
|
+
Header Field Should Not Have Value
|
|
244
|
+
&{account} = Create Account
|
|
245
|
+
Go To Record Home ${account}[Id]
|
|
246
|
+
Header Field Should Not Have Value Phone
|
|
247
|
+
|
|
248
|
+
Header Field Should Have Link
|
|
249
|
+
&{fields} = Create Dictionary
|
|
250
|
+
... Website=http://www.test.com
|
|
251
|
+
&{account} = Create Account &{fields}
|
|
252
|
+
Go To Record Home ${account}[Id]
|
|
253
|
+
Header Field Should Have Link Website
|
|
254
|
+
|
|
255
|
+
Header Field Should Not Have Link
|
|
256
|
+
&{account} = Create Account
|
|
257
|
+
Go To Record Home ${account}[Id]
|
|
258
|
+
Header Field Should Not Have Link Website
|
|
259
|
+
|
|
260
|
+
Click Header Field Link
|
|
261
|
+
&{contact} = Create Contact
|
|
262
|
+
Go To Record Home ${contact}[Id]
|
|
263
|
+
Click Header Field Link Contact Owner
|
|
264
|
+
Wait for page object Detail User
|
|
265
|
+
|
|
266
|
+
Open App Launcher
|
|
267
|
+
Go To Object Home Contact
|
|
268
|
+
Open App Launcher
|
|
269
|
+
Page Should Contain All Apps
|
|
270
|
+
|
|
271
|
+
Populate Field
|
|
272
|
+
[Setup] Run keywords
|
|
273
|
+
... Go to object home Account
|
|
274
|
+
... AND Click Object Button New
|
|
275
|
+
[Teardown] Run keywords
|
|
276
|
+
... Click modal button Cancel
|
|
277
|
+
... AND Wait Until Modal Is Closed
|
|
278
|
+
|
|
279
|
+
${account_name} = Get fake data company
|
|
280
|
+
Populate Field Account Name ${account_name}
|
|
281
|
+
${locator} = Get Locator object.field Account Name
|
|
282
|
+
${value} = Get Value ${locator}
|
|
283
|
+
Should Be Equal ${value} ${account_name}
|
|
284
|
+
Populate Field Account Name ${account_name}
|
|
285
|
+
${value} = Get Value ${locator}
|
|
286
|
+
Should Be Equal ${value} ${account_name}
|
|
287
|
+
|
|
288
|
+
Populate Lookup Field
|
|
289
|
+
[Setup] Run keywords
|
|
290
|
+
... Go to object home Contact
|
|
291
|
+
... AND Click Object Button New
|
|
292
|
+
[Teardown] Run keywords
|
|
293
|
+
... Click modal button Cancel
|
|
294
|
+
... AND Wait Until Modal Is Closed
|
|
295
|
+
|
|
296
|
+
&{account} = Create Account
|
|
297
|
+
Populate Lookup Field Account Name ${account}[Name]
|
|
298
|
+
Field value should be Account Name ${account}[Name]
|
|
299
|
+
|
|
300
|
+
Populate Form
|
|
301
|
+
[Setup] Run keywords
|
|
302
|
+
... Go to object home Account
|
|
303
|
+
... AND Click Object Button New
|
|
304
|
+
[Teardown] Run keywords
|
|
305
|
+
... Click modal button Cancel
|
|
306
|
+
... AND Wait Until Modal Is Closed
|
|
307
|
+
|
|
308
|
+
${account_name} = Get fake data company
|
|
309
|
+
Populate Form
|
|
310
|
+
... Ticker Symbol=CASH
|
|
311
|
+
... Account Name=${account_name}
|
|
312
|
+
|
|
313
|
+
Field value should be Ticker Symbol CASH
|
|
314
|
+
Field value should be Account Name ${account_name}
|
|
315
|
+
|
|
316
|
+
Select Dropdown Value
|
|
317
|
+
[Documentation] Select Dropdown Value happy path tests
|
|
318
|
+
[Setup] Run keywords
|
|
319
|
+
... Go to page Home Contact
|
|
320
|
+
... AND Click object button New
|
|
321
|
+
... AND Wait for modal New Contact
|
|
322
|
+
|
|
323
|
+
# required field
|
|
324
|
+
populate field Last Name ${faker.last_name()}
|
|
325
|
+
|
|
326
|
+
# these two fields look and act identical, but they are
|
|
327
|
+
# implemented differently in the DOM *sigh*
|
|
328
|
+
Select dropdown value Salutation Dr.
|
|
329
|
+
|
|
330
|
+
Select dropdown value Lead Source Purchased List
|
|
331
|
+
|
|
332
|
+
Click Modal Button Save
|
|
333
|
+
Wait Until Modal Is Closed
|
|
334
|
+
|
|
335
|
+
${contact id} = Get Current Record Id
|
|
336
|
+
Store Session Record Contact ${contact id}
|
|
337
|
+
|
|
338
|
+
# Without waiting, this will sometimes fail. I guess there can be
|
|
339
|
+
# a bit of a delay for the data to be saved such that the API
|
|
340
|
+
# can retrieve it.
|
|
341
|
+
Wait until keyword succeeds 5 seconds 2 seconds
|
|
342
|
+
... Object field should be Contact ${contact id} LeadSource Purchased List
|
|
343
|
+
Wait until keyword succeeds 5 seconds 2 seconds
|
|
344
|
+
... Object field should be Contact ${contact id} Salutation Dr.
|
|
345
|
+
|
|
346
|
+
Select Dropdown Value exceptions
|
|
347
|
+
[Documentation] Verify that the keyword throws appropriate errors
|
|
348
|
+
[Setup] Run keywords
|
|
349
|
+
... Go to page Home Contact
|
|
350
|
+
... AND Click object button New
|
|
351
|
+
... AND Wait for modal New Contact
|
|
352
|
+
|
|
353
|
+
# Bad input field name
|
|
354
|
+
Run keyword and continue on failure
|
|
355
|
+
... Run keyword and expect error Form element with label 'Bogus' was not found
|
|
356
|
+
... Select dropdown value Bogus Mr.
|
|
357
|
+
|
|
358
|
+
# Bad value
|
|
359
|
+
Run keyword and continue on failure
|
|
360
|
+
... Run keyword and expect error Dropdown value 'Bogus' not found
|
|
361
|
+
... Select dropdown value Lead Source Bogus
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from unittest import mock
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
import robot.api.logger
|
|
7
|
+
|
|
8
|
+
from cumulusci.core.config import BaseProjectConfig, UniversalConfig
|
|
9
|
+
from cumulusci.core.exceptions import TaskNotFoundError
|
|
10
|
+
from cumulusci.core.tests.utils import MockLoggerMixin
|
|
11
|
+
from cumulusci.robotframework.CumulusCI import CumulusCI
|
|
12
|
+
from cumulusci.tests.util import DummyKeychain, DummyOrgConfig
|
|
13
|
+
from cumulusci.utils import temporary_dir
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestCumulusCILibrary(MockLoggerMixin):
|
|
17
|
+
def setup_method(self):
|
|
18
|
+
self.universal_config = UniversalConfig()
|
|
19
|
+
self.project_config = BaseProjectConfig(
|
|
20
|
+
self.universal_config,
|
|
21
|
+
{
|
|
22
|
+
"project": {"name": "Test"},
|
|
23
|
+
"tasks": {
|
|
24
|
+
"get_pwd": {
|
|
25
|
+
"class_path": "cumulusci.tasks.command.Command",
|
|
26
|
+
"options": {
|
|
27
|
+
"command": "pwd",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
"sources": {
|
|
32
|
+
"example": {"path": "/tmp"},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
repo_info={"root": Path(__file__).parent.absolute()},
|
|
36
|
+
)
|
|
37
|
+
self.project_config.set_keychain(DummyKeychain())
|
|
38
|
+
|
|
39
|
+
self.cumulusci = CumulusCI()
|
|
40
|
+
self.cumulusci._project_config = self.project_config
|
|
41
|
+
self.cumulusci._org = mock.Mock()
|
|
42
|
+
self.cumulusci._org.name = "mock org"
|
|
43
|
+
self.cumulusci._org.instance_url = "https://test.example.com"
|
|
44
|
+
|
|
45
|
+
self._task_log_handler.reset()
|
|
46
|
+
self.task_log = self._task_log_handler.messages
|
|
47
|
+
|
|
48
|
+
def test_run_task(self):
|
|
49
|
+
"""Smoke test; can we run the command task?"""
|
|
50
|
+
result = self.cumulusci.run_task("get_pwd")
|
|
51
|
+
assert result["returncode"] == 0
|
|
52
|
+
|
|
53
|
+
def test_run_task_robot_logger(self):
|
|
54
|
+
"""Verify that 'run task' uses the robot logger"""
|
|
55
|
+
with mock.patch.object(self.cumulusci, "_run_task"):
|
|
56
|
+
self.cumulusci.run_task("get_pwd")
|
|
57
|
+
args, kwargs = self.cumulusci._run_task.call_args
|
|
58
|
+
task = args[0]
|
|
59
|
+
assert task.logger == robot.api.logger
|
|
60
|
+
|
|
61
|
+
def test_robot_logger_supports_warning(self):
|
|
62
|
+
"""Verify that 'run task' uses a logger that supports .warning()
|
|
63
|
+
|
|
64
|
+
Python deprecated the logger method "warn" in favor of
|
|
65
|
+
"warning". Robot didn't get the memo and has "warn" instead of
|
|
66
|
+
"warning". Since our tasks use "warning", this verifies that
|
|
67
|
+
we've patched the robot logger before passing it to the task
|
|
68
|
+
constructor.
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
with mock.patch.object(self.cumulusci, "_run_task"):
|
|
72
|
+
self.cumulusci.run_task("get_pwd")
|
|
73
|
+
args, kwargs = self.cumulusci._run_task.call_args
|
|
74
|
+
task = args[0]
|
|
75
|
+
assert hasattr(
|
|
76
|
+
task.logger, "warning"
|
|
77
|
+
), "robot logger should have a warning method but doesn't"
|
|
78
|
+
|
|
79
|
+
def test_robot_logger_supports_log(self):
|
|
80
|
+
"""Verify that 'run task' uses a logger that supports .log()
|
|
81
|
+
|
|
82
|
+
log() normally will be passed a predefined log level (eg:
|
|
83
|
+
logging.INFO, logging.DEBUG, etc), but it can take any integer
|
|
84
|
+
which get mapped to a robot log level as a string. This attempts
|
|
85
|
+
to catch all of the various mappings.
|
|
86
|
+
"""
|
|
87
|
+
with mock.patch.object(self.cumulusci, "_run_task"):
|
|
88
|
+
self.cumulusci.run_task("get_pwd")
|
|
89
|
+
args, kwargs = self.cumulusci._run_task.call_args
|
|
90
|
+
task = args[0]
|
|
91
|
+
with mock.patch.object(task.logger, "write") as logger_write:
|
|
92
|
+
|
|
93
|
+
task.logger.log(logging.CRITICAL, "a critical message")
|
|
94
|
+
task.logger.log(logging.ERROR, "an error message")
|
|
95
|
+
task.logger.log(logging.WARN, "a warning message")
|
|
96
|
+
task.logger.log(logging.INFO, "an info message")
|
|
97
|
+
task.logger.log(logging.DEBUG, "a debug message")
|
|
98
|
+
|
|
99
|
+
task.logger.log(0, "a message with level 0")
|
|
100
|
+
task.logger.log(1, "a message with level 1")
|
|
101
|
+
task.logger.log(11, "a message with level 11")
|
|
102
|
+
task.logger.log(21, "a message with level 21")
|
|
103
|
+
task.logger.log(31, "a message with level 31")
|
|
104
|
+
task.logger.log(41, "a message with level 41")
|
|
105
|
+
|
|
106
|
+
logger_write.assert_has_calls(
|
|
107
|
+
(
|
|
108
|
+
mock.call("a critical message", "ERROR"),
|
|
109
|
+
mock.call("an error message", "ERROR"),
|
|
110
|
+
mock.call("a warning message", "WARN"),
|
|
111
|
+
mock.call("an info message", "INFO"),
|
|
112
|
+
mock.call("a debug message", "DEBUG"),
|
|
113
|
+
mock.call("a message with level 0", "DEBUG"),
|
|
114
|
+
mock.call("a message with level 1", "DEBUG"),
|
|
115
|
+
mock.call("a message with level 11", "DEBUG"),
|
|
116
|
+
mock.call("a message with level 21", "INFO"),
|
|
117
|
+
mock.call("a message with level 31", "WARN"),
|
|
118
|
+
mock.call("a message with level 41", "ERROR"),
|
|
119
|
+
)
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
def test_run_task_class_robot_logger(self):
|
|
123
|
+
"""Verify that 'run task class' uses the robot logger"""
|
|
124
|
+
with mock.patch.object(self.cumulusci, "_run_task"):
|
|
125
|
+
self.cumulusci.run_task_class(
|
|
126
|
+
"cumulusci.tasks.command.Command", command="ls -l"
|
|
127
|
+
)
|
|
128
|
+
args, kwargs = self.cumulusci._run_task.call_args
|
|
129
|
+
task = args[0]
|
|
130
|
+
assert task.logger == robot.api.logger
|
|
131
|
+
|
|
132
|
+
def test_run_unknown_task(self):
|
|
133
|
+
with pytest.raises(TaskNotFoundError):
|
|
134
|
+
self.cumulusci.run_task("bogus")
|
|
135
|
+
|
|
136
|
+
def test_cross_project_task(self):
|
|
137
|
+
"""Verify that the cross-project task runs with the project config of the task
|
|
138
|
+
See W-8891667
|
|
139
|
+
"""
|
|
140
|
+
with temporary_dir() as tmpdir:
|
|
141
|
+
tmpdir = Path(tmpdir).resolve()
|
|
142
|
+
cumulusci_yml_path = tmpdir / "cumulusci.yml"
|
|
143
|
+
with open(cumulusci_yml_path, "w+") as cumulusci_yml:
|
|
144
|
+
self.project_config.sources["example"] = {"path": tmpdir}
|
|
145
|
+
cumulusci_yml.write(
|
|
146
|
+
"""
|
|
147
|
+
tasks:
|
|
148
|
+
whatever:
|
|
149
|
+
class_path: cumulusci.tasks.command.Command
|
|
150
|
+
options:
|
|
151
|
+
command: pwd
|
|
152
|
+
"""
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
with mock.patch.object(self.cumulusci, "_run_task"):
|
|
156
|
+
self.cumulusci.run_task("example:whatever")
|
|
157
|
+
|
|
158
|
+
args, kwargs = self.cumulusci._run_task.call_args
|
|
159
|
+
assert len(args) == 1
|
|
160
|
+
|
|
161
|
+
# make sure it's not using the current project config
|
|
162
|
+
# for the task, and that the config it _is_ using is
|
|
163
|
+
# rooted in the directory we created
|
|
164
|
+
task = args[0]
|
|
165
|
+
assert task.project_config != self.cumulusci.project_config
|
|
166
|
+
assert tmpdir == Path(task.project_config.repo_root)
|
|
167
|
+
|
|
168
|
+
def test_find_access_token_alias_connected_orgs_multiple_users(self):
|
|
169
|
+
"""Verify exception when more than one username matches the criteria"""
|
|
170
|
+
|
|
171
|
+
self.cumulusci.org.salesforce_client.query.side_effect = lambda query: {
|
|
172
|
+
"records": [
|
|
173
|
+
{"Username": "tester1@example.com"},
|
|
174
|
+
{"Username": "tester2@example.com"},
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
with pytest.raises(
|
|
178
|
+
Exception,
|
|
179
|
+
match=(
|
|
180
|
+
"More than one user matched the search critiera "
|
|
181
|
+
"for org mock org "
|
|
182
|
+
r"\(tester1@example.com, tester2@example.com\)."
|
|
183
|
+
),
|
|
184
|
+
):
|
|
185
|
+
self.cumulusci._find_access_token(
|
|
186
|
+
base_org=self.cumulusci.org, alias="tester1"
|
|
187
|
+
)
|
|
188
|
+
expected_query = "SELECT Username FROM User WHERE alias='tester1'"
|
|
189
|
+
self.cumulusci.org.salesforce_client.query.assert_called_once_with(
|
|
190
|
+
expected_query
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
def test_find_access_token_alias_connected_orgs_no_users(self):
|
|
194
|
+
"""Verify exception when no username matches the criteria"""
|
|
195
|
+
|
|
196
|
+
self.cumulusci.org.salesforce_client.query.side_effect = lambda query: {
|
|
197
|
+
"records": []
|
|
198
|
+
}
|
|
199
|
+
with pytest.raises(
|
|
200
|
+
Exception,
|
|
201
|
+
match=r"Couldn't find a username in org mock org for the specified user \(alias='tester1'\).",
|
|
202
|
+
):
|
|
203
|
+
self.cumulusci._find_access_token(
|
|
204
|
+
base_org=self.cumulusci.org, alias="tester1"
|
|
205
|
+
)
|
|
206
|
+
expected_query = "SELECT Username FROM User WHERE alias='tester1'"
|
|
207
|
+
self.cumulusci.org.salesforce_client.query.assert_called_once_with(
|
|
208
|
+
expected_query
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
def test_find_access_token_alias_connected_orgs_no_matching_org(self):
|
|
212
|
+
self.cumulusci.org.salesforce_client.query.side_effect = lambda query: {
|
|
213
|
+
"records": [
|
|
214
|
+
{"Username": "tester1@example.com"},
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
token = self.cumulusci._find_access_token(
|
|
219
|
+
base_org=self.cumulusci.org, alias="tester1"
|
|
220
|
+
)
|
|
221
|
+
assert token is None
|
|
222
|
+
|
|
223
|
+
def test_find_access_token_happy_path(self):
|
|
224
|
+
self.cumulusci.org.salesforce_client.query.side_effect = lambda query: {
|
|
225
|
+
"records": [
|
|
226
|
+
{"Username": "tester1@example.com"},
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
def get_org(org_name):
|
|
231
|
+
configs = {
|
|
232
|
+
"org1": DummyOrgConfig(
|
|
233
|
+
config={
|
|
234
|
+
"access_token": "super-secret-token-1",
|
|
235
|
+
"userinfo": {"preferred_username": "tester1@example.com"},
|
|
236
|
+
}
|
|
237
|
+
),
|
|
238
|
+
"org2": DummyOrgConfig(
|
|
239
|
+
config={
|
|
240
|
+
"access_token": "super-secret-token-2",
|
|
241
|
+
"userinfo": {"preferred_username": "tester2@example.com"},
|
|
242
|
+
}
|
|
243
|
+
),
|
|
244
|
+
}
|
|
245
|
+
return configs.get(org_name, None)
|
|
246
|
+
|
|
247
|
+
def list_orgs():
|
|
248
|
+
return ["org1", "org2"]
|
|
249
|
+
|
|
250
|
+
self.cumulusci.keychain.get_org = mock.Mock(wraps=get_org)
|
|
251
|
+
self.cumulusci.keychain.list_orgs = mock.Mock(wraps=list_orgs)
|
|
252
|
+
|
|
253
|
+
token = self.cumulusci._find_access_token(
|
|
254
|
+
base_org=self.cumulusci.org, alias="tester1"
|
|
255
|
+
)
|
|
256
|
+
assert token == "super-secret-token-1"
|
|
257
|
+
|
|
258
|
+
def test_login_url(self):
|
|
259
|
+
"""Verify that login_url by default returns the `start_url` of the org"""
|
|
260
|
+
url = self.cumulusci.login_url()
|
|
261
|
+
assert url == self.cumulusci.org.start_url
|
|
262
|
+
|
|
263
|
+
def test_login_url_user_org_with_get_access_token(self):
|
|
264
|
+
"""Verify login_url branch when org has a get_access_token method
|
|
265
|
+
|
|
266
|
+
This tests a specific branch were we're getting a url for a specific
|
|
267
|
+
user and the org has a `get_access_token` method.
|
|
268
|
+
"""
|
|
269
|
+
with mock.patch.object(
|
|
270
|
+
self.cumulusci.org, "get_access_token", return_value="super-secret-token"
|
|
271
|
+
):
|
|
272
|
+
|
|
273
|
+
url = self.cumulusci.login_url(username="test@example.com")
|
|
274
|
+
self.cumulusci.org.get_access_token.assert_called_once_with(
|
|
275
|
+
username="test@example.com"
|
|
276
|
+
)
|
|
277
|
+
assert (
|
|
278
|
+
url
|
|
279
|
+
== "https://test.example.com/secur/frontdoor.jsp?sid=super-secret-token"
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
def test_login_url_user_org_without_get_access_token(self):
|
|
283
|
+
"""Verify login_url branch when org DOES NOT have a get_access_token method
|
|
284
|
+
|
|
285
|
+
This tests a specific branch were we're getting a url for a specific
|
|
286
|
+
user and the org is missing the `get_access_token` method.
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
with mock.patch.object(self.cumulusci.org, "get_access_token"):
|
|
290
|
+
self.cumulusci.org.get_access_token = None
|
|
291
|
+
|
|
292
|
+
with mock.patch.object(
|
|
293
|
+
self.cumulusci, "_find_access_token", return_value="super-secret-token"
|
|
294
|
+
):
|
|
295
|
+
self.cumulusci._find_access_token.return_value = "super-secret-token"
|
|
296
|
+
|
|
297
|
+
url = self.cumulusci.login_url(username="test@example.com")
|
|
298
|
+
self.cumulusci._find_access_token.assert_called_with(
|
|
299
|
+
self.cumulusci.org, username="test@example.com"
|
|
300
|
+
)
|
|
301
|
+
assert (
|
|
302
|
+
url
|
|
303
|
+
== "https://test.example.com/secur/frontdoor.jsp?sid=super-secret-token"
|
|
304
|
+
)
|