@salesforce/afv-skills 1.8.0 → 1.9.0
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.
- package/package.json +1 -1
- package/skills/activating-datacloud/CREDITS.md +5 -0
- package/skills/activating-datacloud/README.md +39 -0
- package/skills/activating-datacloud/SKILL.md +118 -0
- package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
- package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
- package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
- package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
- package/skills/building-omnistudio-callable-apex/README.md +80 -0
- package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
- package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
- package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
- package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
- package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
- package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
- package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
- package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
- package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
- package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
- package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
- package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
- package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
- package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
- package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
- package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
- package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
- package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
- package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
- package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
- package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
- package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
- package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
- package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
- package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
- package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
- package/skills/building-sf-integrations/CREDITS.md +5 -0
- package/skills/building-sf-integrations/README.md +95 -0
- package/skills/building-sf-integrations/SKILL.md +192 -0
- package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
- package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
- package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
- package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
- package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
- package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
- package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
- package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
- package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
- package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
- package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
- package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
- package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
- package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
- package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
- package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
- package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
- package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
- package/skills/building-sf-integrations/references/cli-reference.md +94 -0
- package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
- package/skills/building-sf-integrations/references/event-patterns.md +838 -0
- package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
- package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
- package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
- package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
- package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
- package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
- package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
- package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
- package/skills/building-sf-integrations/scripts/README.md +100 -0
- package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
- package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
- package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
- package/skills/configuring-connected-apps/CREDITS.md +3 -0
- package/skills/configuring-connected-apps/README.md +99 -0
- package/skills/configuring-connected-apps/SKILL.md +224 -0
- package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
- package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
- package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
- package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
- package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
- package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
- package/skills/configuring-connected-apps/references/example-usage.md +256 -0
- package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
- package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
- package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
- package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
- package/skills/connecting-datacloud/CREDITS.md +5 -0
- package/skills/connecting-datacloud/README.md +59 -0
- package/skills/connecting-datacloud/SKILL.md +155 -0
- package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
- package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
- package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
- package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
- package/skills/debugging-apex-logs/CREDITS.md +22 -0
- package/skills/debugging-apex-logs/README.md +74 -0
- package/skills/debugging-apex-logs/SKILL.md +172 -0
- package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
- package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
- package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
- package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
- package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
- package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
- package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
- package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
- package/skills/debugging-apex-logs/references/common-issues.md +68 -0
- package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
- package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
- package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
- package/skills/deploying-metadata/CREDITS.md +25 -0
- package/skills/deploying-metadata/README.md +104 -0
- package/skills/deploying-metadata/SKILL.md +214 -0
- package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
- package/skills/deploying-metadata/assets/package.xml +121 -0
- package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
- package/skills/deploying-metadata/references/deploy.sh +73 -0
- package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
- package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
- package/skills/deploying-metadata/references/orchestration.md +183 -0
- package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
- package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
- package/skills/deploying-omnistudio-datapacks/README.md +88 -0
- package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
- package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
- package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
- package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
- package/skills/developing-agentforce/references/actions-reference.md +8 -8
- package/skills/fetching-salesforce-docs/README.md +66 -0
- package/skills/fetching-salesforce-docs/SKILL.md +209 -0
- package/skills/fetching-salesforce-docs/requirements.txt +2 -0
- package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
- package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
- package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
- package/skills/generating-apex/CREDITS.md +1 -26
- package/skills/generating-apex-test/CREDITS.md +2 -27
- package/skills/generating-lwc-components/CREDITS.md +5 -0
- package/skills/generating-lwc-components/README.md +126 -0
- package/skills/generating-lwc-components/SKILL.md +191 -0
- package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
- package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
- package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
- package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
- package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
- package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
- package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
- package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
- package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
- package/skills/generating-lwc-components/references/advanced-features.md +108 -0
- package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
- package/skills/generating-lwc-components/references/cli-commands.md +545 -0
- package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
- package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
- package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
- package/skills/generating-lwc-components/references/lms-guide.md +860 -0
- package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
- package/skills/generating-lwc-components/references/performance-guide.md +861 -0
- package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
- package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
- package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
- package/skills/generating-lwc-components/references/state-management.md +642 -0
- package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
- package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
- package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
- package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
- package/skills/generating-mermaid-diagrams/README.md +114 -0
- package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
- package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
- package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
- package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
- package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
- package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
- package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
- package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
- package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
- package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
- package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
- package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
- package/skills/generating-visual-diagrams/CREDITS.md +80 -0
- package/skills/generating-visual-diagrams/README.md +83 -0
- package/skills/generating-visual-diagrams/SKILL.md +208 -0
- package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
- package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
- package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
- package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
- package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
- package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
- package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
- package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
- package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
- package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
- package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
- package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
- package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
- package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
- package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
- package/skills/handling-sf-data/CREDITS.md +5 -0
- package/skills/handling-sf-data/README.md +112 -0
- package/skills/handling-sf-data/SKILL.md +235 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
- package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
- package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
- package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
- package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
- package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
- package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
- package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
- package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
- package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
- package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
- package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
- package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
- package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
- package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
- package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
- package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
- package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
- package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
- package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
- package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
- package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
- package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
- package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
- package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
- package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
- package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
- package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
- package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
- package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
- package/skills/handling-sf-data/references/orchestration.md +174 -0
- package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
- package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
- package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
- package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
- package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
- package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
- package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
- package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
- package/skills/harmonizing-datacloud/CREDITS.md +3 -0
- package/skills/harmonizing-datacloud/README.md +31 -0
- package/skills/harmonizing-datacloud/SKILL.md +117 -0
- package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
- package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
- package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
- package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
- package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
- package/skills/orchestrating-datacloud/CREDITS.md +15 -0
- package/skills/orchestrating-datacloud/README.md +129 -0
- package/skills/orchestrating-datacloud/SKILL.md +236 -0
- package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
- package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
- package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
- package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
- package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
- package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
- package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
- package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
- package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
- package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
- package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
- package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
- package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
- package/skills/preparing-datacloud/CREDITS.md +7 -0
- package/skills/preparing-datacloud/README.md +51 -0
- package/skills/preparing-datacloud/SKILL.md +191 -0
- package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
- package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
- package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
- package/skills/querying-soql/CREDITS.md +21 -0
- package/skills/querying-soql/README.md +41 -0
- package/skills/querying-soql/SKILL.md +143 -0
- package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
- package/skills/querying-soql/assets/basic-queries.soql +188 -0
- package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
- package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
- package/skills/querying-soql/assets/relationship-queries.soql +203 -0
- package/skills/querying-soql/assets/selector-class.cls +219 -0
- package/skills/querying-soql/references/anti-patterns.md +348 -0
- package/skills/querying-soql/references/cli-commands.md +358 -0
- package/skills/querying-soql/references/field-coverage-rules.md +514 -0
- package/skills/querying-soql/references/query-optimization.md +142 -0
- package/skills/querying-soql/references/selector-patterns.md +479 -0
- package/skills/querying-soql/references/soql-reference.md +227 -0
- package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
- package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
- package/skills/retrieving-datacloud/CREDITS.md +7 -0
- package/skills/retrieving-datacloud/README.md +44 -0
- package/skills/retrieving-datacloud/SKILL.md +120 -0
- package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
- package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
- package/skills/running-apex-tests/CREDITS.md +22 -0
- package/skills/running-apex-tests/README.md +94 -0
- package/skills/running-apex-tests/SKILL.md +158 -0
- package/skills/running-apex-tests/assets/basic-test.cls +169 -0
- package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
- package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
- package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
- package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
- package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
- package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
- package/skills/running-apex-tests/references/cli-commands.md +289 -0
- package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
- package/skills/running-apex-tests/references/performance-optimization.md +283 -0
- package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
- package/skills/running-apex-tests/references/test-patterns.md +154 -0
- package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
- package/skills/segmenting-datacloud/CREDITS.md +3 -0
- package/skills/segmenting-datacloud/README.md +36 -0
- package/skills/segmenting-datacloud/SKILL.md +115 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StubProvider Examples
|
|
3
|
+
*
|
|
4
|
+
* The Stub API enables dynamic mocking of interfaces and virtual classes.
|
|
5
|
+
* Use when you need conditional logic or method tracking in your mocks.
|
|
6
|
+
*
|
|
7
|
+
* See: references/mocking-patterns.md for detailed patterns and usage guidance
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
11
|
+
// EXAMPLE 1: Simple StubProvider for Interface
|
|
12
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Interface to be stubbed
|
|
16
|
+
*/
|
|
17
|
+
public interface IAccountService {
|
|
18
|
+
Account getAccount(Id accountId);
|
|
19
|
+
List<Account> getAccounts(Set<Id> accountIds);
|
|
20
|
+
Integer getAccountCount();
|
|
21
|
+
void updateAccount(Account acc);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Basic stub implementation with configurable responses
|
|
26
|
+
*/
|
|
27
|
+
@IsTest
|
|
28
|
+
public class AccountServiceStub implements System.StubProvider {
|
|
29
|
+
|
|
30
|
+
// Track method calls for verification
|
|
31
|
+
public List<String> calledMethods = new List<String>();
|
|
32
|
+
public Map<String, List<Object>> methodParams = new Map<String, List<Object>>();
|
|
33
|
+
|
|
34
|
+
// Configurable responses
|
|
35
|
+
private Map<String, Object> responses = new Map<String, Object>();
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Configure what a method should return
|
|
39
|
+
*/
|
|
40
|
+
public AccountServiceStub whenCalled(String methodName, Object response) {
|
|
41
|
+
responses.put(methodName, response);
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Required StubProvider method
|
|
47
|
+
*/
|
|
48
|
+
public Object handleMethodCall(
|
|
49
|
+
Object stubbedObject,
|
|
50
|
+
String stubbedMethodName,
|
|
51
|
+
Type returnType,
|
|
52
|
+
List<Type> paramTypes,
|
|
53
|
+
List<String> paramNames,
|
|
54
|
+
List<Object> paramValues
|
|
55
|
+
) {
|
|
56
|
+
// Track this call
|
|
57
|
+
calledMethods.add(stubbedMethodName);
|
|
58
|
+
methodParams.put(stubbedMethodName, paramValues);
|
|
59
|
+
|
|
60
|
+
// Return configured response if available
|
|
61
|
+
if (responses.containsKey(stubbedMethodName)) {
|
|
62
|
+
return responses.get(stubbedMethodName);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Default responses based on return type
|
|
66
|
+
if (returnType == Account.class) {
|
|
67
|
+
return new Account(Id = generateFakeId(), Name = 'Default Stub Account');
|
|
68
|
+
}
|
|
69
|
+
if (returnType == List<Account>.class) {
|
|
70
|
+
return new List<Account>{
|
|
71
|
+
new Account(Id = generateFakeId(), Name = 'Stub Account 1')
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (returnType == Integer.class) {
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Verify a method was called
|
|
83
|
+
*/
|
|
84
|
+
public Boolean wasCalled(String methodName) {
|
|
85
|
+
return calledMethods.contains(methodName);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Get call count for a method
|
|
90
|
+
*/
|
|
91
|
+
public Integer getCallCount(String methodName) {
|
|
92
|
+
Integer count = 0;
|
|
93
|
+
for (String called : calledMethods) {
|
|
94
|
+
if (called == methodName) {
|
|
95
|
+
count++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return count;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Fake ID generator
|
|
102
|
+
private static Integer idCounter = 1;
|
|
103
|
+
private static Id generateFakeId() {
|
|
104
|
+
String idBody = String.valueOf(idCounter++).leftPad(12, '0');
|
|
105
|
+
return Id.valueOf('001' + idBody);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
110
|
+
// EXAMPLE 2: Using the Stub in Tests
|
|
111
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
112
|
+
|
|
113
|
+
@IsTest
|
|
114
|
+
private class AccountServiceStubTest {
|
|
115
|
+
|
|
116
|
+
@IsTest
|
|
117
|
+
static void testWithConfiguredResponse() {
|
|
118
|
+
// Arrange - Configure stub responses
|
|
119
|
+
AccountServiceStub stub = new AccountServiceStub()
|
|
120
|
+
.whenCalled('getAccountCount', 42)
|
|
121
|
+
.whenCalled('getAccount', new Account(Name = 'Configured Account'));
|
|
122
|
+
|
|
123
|
+
// Create stubbed instance
|
|
124
|
+
IAccountService service = (IAccountService) Test.createStub(
|
|
125
|
+
IAccountService.class,
|
|
126
|
+
stub
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
// Act
|
|
130
|
+
Test.startTest();
|
|
131
|
+
Integer count = service.getAccountCount();
|
|
132
|
+
Account acc = service.getAccount(null);
|
|
133
|
+
Test.stopTest();
|
|
134
|
+
|
|
135
|
+
// Assert - Verify responses
|
|
136
|
+
Assert.areEqual(42, count, 'Should return configured count');
|
|
137
|
+
Assert.areEqual('Configured Account', acc.Name, 'Should return configured account');
|
|
138
|
+
|
|
139
|
+
// Assert - Verify calls were tracked
|
|
140
|
+
Assert.isTrue(stub.wasCalled('getAccountCount'), 'getAccountCount was called');
|
|
141
|
+
Assert.isTrue(stub.wasCalled('getAccount'), 'getAccount was called');
|
|
142
|
+
Assert.areEqual(1, stub.getCallCount('getAccountCount'), 'Called once');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@IsTest
|
|
146
|
+
static void testDefaultResponses() {
|
|
147
|
+
// Arrange - No configured responses
|
|
148
|
+
AccountServiceStub stub = new AccountServiceStub();
|
|
149
|
+
IAccountService service = (IAccountService) Test.createStub(
|
|
150
|
+
IAccountService.class,
|
|
151
|
+
stub
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
// Act
|
|
155
|
+
Test.startTest();
|
|
156
|
+
Account acc = service.getAccount(null);
|
|
157
|
+
Test.stopTest();
|
|
158
|
+
|
|
159
|
+
// Assert - Verify default response
|
|
160
|
+
Assert.isNotNull(acc, 'Should return default account');
|
|
161
|
+
Assert.areEqual('Default Stub Account', acc.Name, 'Should have default name');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
166
|
+
// EXAMPLE 3: Conditional StubProvider
|
|
167
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Stub with conditional logic based on parameters
|
|
171
|
+
*/
|
|
172
|
+
@IsTest
|
|
173
|
+
public class ConditionalStub implements System.StubProvider {
|
|
174
|
+
|
|
175
|
+
public Object handleMethodCall(
|
|
176
|
+
Object stubbedObject,
|
|
177
|
+
String stubbedMethodName,
|
|
178
|
+
Type returnType,
|
|
179
|
+
List<Type> paramTypes,
|
|
180
|
+
List<String> paramNames,
|
|
181
|
+
List<Object> paramValues
|
|
182
|
+
) {
|
|
183
|
+
// Conditional response based on method and params
|
|
184
|
+
if (stubbedMethodName == 'getAccount') {
|
|
185
|
+
Id requestedId = (Id) paramValues[0];
|
|
186
|
+
|
|
187
|
+
// Return different accounts based on ID pattern
|
|
188
|
+
String idStr = String.valueOf(requestedId);
|
|
189
|
+
if (idStr.startsWith('001')) {
|
|
190
|
+
return new Account(Id = requestedId, Name = 'Standard Account');
|
|
191
|
+
} else if (idStr.startsWith('0018')) {
|
|
192
|
+
return new Account(Id = requestedId, Name = 'Person Account');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (stubbedMethodName == 'getAccountCount') {
|
|
197
|
+
// Simulate different counts for different scenarios
|
|
198
|
+
return 100;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
206
|
+
// EXAMPLE 4: Exception-Throwing Stub
|
|
207
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Stub that throws exceptions for error testing
|
|
211
|
+
*/
|
|
212
|
+
@IsTest
|
|
213
|
+
public class ErrorStub implements System.StubProvider {
|
|
214
|
+
|
|
215
|
+
private String methodToFail;
|
|
216
|
+
private String errorMessage;
|
|
217
|
+
|
|
218
|
+
public ErrorStub failOn(String methodName, String message) {
|
|
219
|
+
this.methodToFail = methodName;
|
|
220
|
+
this.errorMessage = message;
|
|
221
|
+
return this;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public Object handleMethodCall(
|
|
225
|
+
Object stubbedObject,
|
|
226
|
+
String stubbedMethodName,
|
|
227
|
+
Type returnType,
|
|
228
|
+
List<Type> paramTypes,
|
|
229
|
+
List<String> paramNames,
|
|
230
|
+
List<Object> paramValues
|
|
231
|
+
) {
|
|
232
|
+
if (stubbedMethodName == methodToFail) {
|
|
233
|
+
throw new AuraHandledException(errorMessage);
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
@IsTest
|
|
240
|
+
private class ErrorStubTest {
|
|
241
|
+
|
|
242
|
+
@IsTest
|
|
243
|
+
static void testErrorHandling() {
|
|
244
|
+
// Arrange
|
|
245
|
+
ErrorStub stub = new ErrorStub().failOn('getAccount', 'Account not found');
|
|
246
|
+
IAccountService service = (IAccountService) Test.createStub(
|
|
247
|
+
IAccountService.class,
|
|
248
|
+
stub
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
// Act/Assert
|
|
252
|
+
try {
|
|
253
|
+
service.getAccount(null);
|
|
254
|
+
Assert.fail('Expected AuraHandledException');
|
|
255
|
+
} catch (AuraHandledException e) {
|
|
256
|
+
Assert.areEqual('Account not found', e.getMessage());
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
262
|
+
// EXAMPLE 5: Universal Mock (Flexible Stub)
|
|
263
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Highly flexible stub that can mock any interface
|
|
267
|
+
*
|
|
268
|
+
* Inspired by: Suraj Pillai's UniversalMock pattern
|
|
269
|
+
*/
|
|
270
|
+
@IsTest
|
|
271
|
+
public class UniversalMock implements System.StubProvider {
|
|
272
|
+
|
|
273
|
+
// Store method -> return value mappings
|
|
274
|
+
private Map<String, Object> returnValues = new Map<String, Object>();
|
|
275
|
+
|
|
276
|
+
// Store method -> exception mappings
|
|
277
|
+
private Map<String, Exception> exceptions = new Map<String, Exception>();
|
|
278
|
+
|
|
279
|
+
// Track all calls
|
|
280
|
+
private List<MethodCall> calls = new List<MethodCall>();
|
|
281
|
+
|
|
282
|
+
public class MethodCall {
|
|
283
|
+
public String methodName;
|
|
284
|
+
public List<Object> arguments;
|
|
285
|
+
public Datetime calledAt;
|
|
286
|
+
|
|
287
|
+
public MethodCall(String methodName, List<Object> arguments) {
|
|
288
|
+
this.methodName = methodName;
|
|
289
|
+
this.arguments = arguments;
|
|
290
|
+
this.calledAt = Datetime.now();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Configure return value for a method
|
|
296
|
+
*/
|
|
297
|
+
public UniversalMock setReturnValue(String methodName, Object value) {
|
|
298
|
+
returnValues.put(methodName, value);
|
|
299
|
+
return this;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Configure exception for a method
|
|
304
|
+
*/
|
|
305
|
+
public UniversalMock throwException(String methodName, Exception e) {
|
|
306
|
+
exceptions.put(methodName, e);
|
|
307
|
+
return this;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public Object handleMethodCall(
|
|
311
|
+
Object stubbedObject,
|
|
312
|
+
String stubbedMethodName,
|
|
313
|
+
Type returnType,
|
|
314
|
+
List<Type> paramTypes,
|
|
315
|
+
List<String> paramNames,
|
|
316
|
+
List<Object> paramValues
|
|
317
|
+
) {
|
|
318
|
+
// Track the call
|
|
319
|
+
calls.add(new MethodCall(stubbedMethodName, paramValues));
|
|
320
|
+
|
|
321
|
+
// Throw configured exception
|
|
322
|
+
if (exceptions.containsKey(stubbedMethodName)) {
|
|
323
|
+
throw exceptions.get(stubbedMethodName);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Return configured value
|
|
327
|
+
if (returnValues.containsKey(stubbedMethodName)) {
|
|
328
|
+
return returnValues.get(stubbedMethodName);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Return type-appropriate defaults
|
|
332
|
+
if (returnType == Boolean.class) return false;
|
|
333
|
+
if (returnType == Integer.class) return 0;
|
|
334
|
+
if (returnType == String.class) return '';
|
|
335
|
+
if (returnType == List<SObject>.class) return new List<SObject>();
|
|
336
|
+
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Get all calls to a specific method
|
|
342
|
+
*/
|
|
343
|
+
public List<MethodCall> getCalls(String methodName) {
|
|
344
|
+
List<MethodCall> result = new List<MethodCall>();
|
|
345
|
+
for (MethodCall call : calls) {
|
|
346
|
+
if (call.methodName == methodName) {
|
|
347
|
+
result.add(call);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Verify method was called with specific arguments
|
|
355
|
+
*/
|
|
356
|
+
public Boolean wasCalledWith(String methodName, List<Object> expectedArgs) {
|
|
357
|
+
for (MethodCall call : getCalls(methodName)) {
|
|
358
|
+
if (call.arguments.equals(expectedArgs)) {
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Test Data Factory for creating consistent test data across all test classes.
|
|
3
|
+
* Use this pattern to avoid hardcoded test data and ensure test isolation.
|
|
4
|
+
*
|
|
5
|
+
* USAGE:
|
|
6
|
+
* List<Account> accounts = TestDataFactory.createAccounts(5);
|
|
7
|
+
* insert accounts;
|
|
8
|
+
*
|
|
9
|
+
* // Or with auto-insert:
|
|
10
|
+
* List<Account> accounts = TestDataFactory.createAndInsertAccounts(5);
|
|
11
|
+
*
|
|
12
|
+
* @created {{Date}}
|
|
13
|
+
*/
|
|
14
|
+
@IsTest
|
|
15
|
+
public class TestDataFactory {
|
|
16
|
+
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
18
|
+
// ACCOUNT METHODS
|
|
19
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @description Creates Account records without inserting
|
|
23
|
+
* @param count Number of accounts to create
|
|
24
|
+
* @return List of Account records (not inserted)
|
|
25
|
+
*/
|
|
26
|
+
public static List<Account> createAccounts(Integer count) {
|
|
27
|
+
List<Account> accounts = new List<Account>();
|
|
28
|
+
for (Integer i = 0; i < count; i++) {
|
|
29
|
+
accounts.add(new Account(
|
|
30
|
+
Name = 'Test Account ' + i,
|
|
31
|
+
Industry = 'Technology',
|
|
32
|
+
BillingStreet = '123 Test Street',
|
|
33
|
+
BillingCity = 'San Francisco',
|
|
34
|
+
BillingState = 'CA',
|
|
35
|
+
BillingPostalCode = '94105',
|
|
36
|
+
BillingCountry = 'USA',
|
|
37
|
+
Phone = '555-000-' + String.valueOf(i).leftPad(4, '0'),
|
|
38
|
+
Website = 'https://testaccount' + i + '.example.com'
|
|
39
|
+
));
|
|
40
|
+
}
|
|
41
|
+
return accounts;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @description Creates and inserts Account records
|
|
46
|
+
* @param count Number of accounts to create
|
|
47
|
+
* @return List of inserted Account records
|
|
48
|
+
*/
|
|
49
|
+
public static List<Account> createAndInsertAccounts(Integer count) {
|
|
50
|
+
List<Account> accounts = createAccounts(count);
|
|
51
|
+
insert accounts;
|
|
52
|
+
return accounts;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @description Creates Account with specific attributes
|
|
57
|
+
* @param name Account name
|
|
58
|
+
* @param industry Industry value
|
|
59
|
+
* @return Account record (not inserted)
|
|
60
|
+
*/
|
|
61
|
+
public static Account createAccount(String name, String industry) {
|
|
62
|
+
return new Account(
|
|
63
|
+
Name = name,
|
|
64
|
+
Industry = industry,
|
|
65
|
+
BillingCity = 'San Francisco',
|
|
66
|
+
BillingState = 'CA',
|
|
67
|
+
BillingCountry = 'USA'
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
72
|
+
// CONTACT METHODS
|
|
73
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @description Creates Contact records without inserting
|
|
77
|
+
* @param count Number of contacts to create
|
|
78
|
+
* @param accountId Parent account ID
|
|
79
|
+
* @return List of Contact records (not inserted)
|
|
80
|
+
*/
|
|
81
|
+
public static List<Contact> createContacts(Integer count, Id accountId) {
|
|
82
|
+
List<Contact> contacts = new List<Contact>();
|
|
83
|
+
for (Integer i = 0; i < count; i++) {
|
|
84
|
+
contacts.add(new Contact(
|
|
85
|
+
FirstName = 'Test',
|
|
86
|
+
LastName = 'Contact ' + i,
|
|
87
|
+
AccountId = accountId,
|
|
88
|
+
Email = 'testcontact' + i + '@example.com',
|
|
89
|
+
Phone = '555-001-' + String.valueOf(i).leftPad(4, '0'),
|
|
90
|
+
Title = 'Test Title ' + i,
|
|
91
|
+
MailingStreet = '456 Test Ave',
|
|
92
|
+
MailingCity = 'San Francisco',
|
|
93
|
+
MailingState = 'CA',
|
|
94
|
+
MailingPostalCode = '94105',
|
|
95
|
+
MailingCountry = 'USA'
|
|
96
|
+
));
|
|
97
|
+
}
|
|
98
|
+
return contacts;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @description Creates and inserts Contact records
|
|
103
|
+
* @param count Number of contacts to create
|
|
104
|
+
* @param accountId Parent account ID
|
|
105
|
+
* @return List of inserted Contact records
|
|
106
|
+
*/
|
|
107
|
+
public static List<Contact> createAndInsertContacts(Integer count, Id accountId) {
|
|
108
|
+
List<Contact> contacts = createContacts(count, accountId);
|
|
109
|
+
insert contacts;
|
|
110
|
+
return contacts;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
114
|
+
// LEAD METHODS
|
|
115
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @description Creates Lead records without inserting
|
|
119
|
+
* @param count Number of leads to create
|
|
120
|
+
* @return List of Lead records (not inserted)
|
|
121
|
+
*/
|
|
122
|
+
public static List<Lead> createLeads(Integer count) {
|
|
123
|
+
List<Lead> leads = new List<Lead>();
|
|
124
|
+
for (Integer i = 0; i < count; i++) {
|
|
125
|
+
leads.add(new Lead(
|
|
126
|
+
FirstName = 'Test',
|
|
127
|
+
LastName = 'Lead ' + i,
|
|
128
|
+
Company = 'Test Company ' + i,
|
|
129
|
+
Email = 'testlead' + i + '@example.com',
|
|
130
|
+
Phone = '555-002-' + String.valueOf(i).leftPad(4, '0'),
|
|
131
|
+
Status = 'Open - Not Contacted',
|
|
132
|
+
Industry = 'Technology',
|
|
133
|
+
LeadSource = 'Web'
|
|
134
|
+
));
|
|
135
|
+
}
|
|
136
|
+
return leads;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @description Creates and inserts Lead records
|
|
141
|
+
* @param count Number of leads to create
|
|
142
|
+
* @return List of inserted Lead records
|
|
143
|
+
*/
|
|
144
|
+
public static List<Lead> createAndInsertLeads(Integer count) {
|
|
145
|
+
List<Lead> leads = createLeads(count);
|
|
146
|
+
insert leads;
|
|
147
|
+
return leads;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
151
|
+
// OPPORTUNITY METHODS
|
|
152
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @description Creates Opportunity records without inserting
|
|
156
|
+
* @param count Number of opportunities to create
|
|
157
|
+
* @param accountId Parent account ID
|
|
158
|
+
* @return List of Opportunity records (not inserted)
|
|
159
|
+
*/
|
|
160
|
+
public static List<Opportunity> createOpportunities(Integer count, Id accountId) {
|
|
161
|
+
List<Opportunity> opportunities = new List<Opportunity>();
|
|
162
|
+
for (Integer i = 0; i < count; i++) {
|
|
163
|
+
opportunities.add(new Opportunity(
|
|
164
|
+
Name = 'Test Opportunity ' + i,
|
|
165
|
+
AccountId = accountId,
|
|
166
|
+
StageName = 'Prospecting',
|
|
167
|
+
CloseDate = Date.today().addDays(30 + i),
|
|
168
|
+
Amount = 10000 * (i + 1)
|
|
169
|
+
));
|
|
170
|
+
}
|
|
171
|
+
return opportunities;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* @description Creates and inserts Opportunity records
|
|
176
|
+
* @param count Number of opportunities to create
|
|
177
|
+
* @param accountId Parent account ID
|
|
178
|
+
* @return List of inserted Opportunity records
|
|
179
|
+
*/
|
|
180
|
+
public static List<Opportunity> createAndInsertOpportunities(Integer count, Id accountId) {
|
|
181
|
+
List<Opportunity> opportunities = createOpportunities(count, accountId);
|
|
182
|
+
insert opportunities;
|
|
183
|
+
return opportunities;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
187
|
+
// CASE METHODS
|
|
188
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @description Creates Case records without inserting
|
|
192
|
+
* @param count Number of cases to create
|
|
193
|
+
* @param accountId Parent account ID (optional)
|
|
194
|
+
* @param contactId Related contact ID (optional)
|
|
195
|
+
* @return List of Case records (not inserted)
|
|
196
|
+
*/
|
|
197
|
+
public static List<Case> createCases(Integer count, Id accountId, Id contactId) {
|
|
198
|
+
List<Case> cases = new List<Case>();
|
|
199
|
+
for (Integer i = 0; i < count; i++) {
|
|
200
|
+
cases.add(new Case(
|
|
201
|
+
Subject = 'Test Case ' + i,
|
|
202
|
+
Description = 'Test case description ' + i,
|
|
203
|
+
Status = 'New',
|
|
204
|
+
Priority = 'Medium',
|
|
205
|
+
Origin = 'Web',
|
|
206
|
+
AccountId = accountId,
|
|
207
|
+
ContactId = contactId
|
|
208
|
+
));
|
|
209
|
+
}
|
|
210
|
+
return cases;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @description Creates and inserts Case records
|
|
215
|
+
* @param count Number of cases to create
|
|
216
|
+
* @param accountId Parent account ID (optional)
|
|
217
|
+
* @param contactId Related contact ID (optional)
|
|
218
|
+
* @return List of inserted Case records
|
|
219
|
+
*/
|
|
220
|
+
public static List<Case> createAndInsertCases(Integer count, Id accountId, Id contactId) {
|
|
221
|
+
List<Case> cases = createCases(count, accountId, contactId);
|
|
222
|
+
insert cases;
|
|
223
|
+
return cases;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
227
|
+
// USER METHODS (for System.runAs testing)
|
|
228
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* @description Creates a test User with specified profile
|
|
232
|
+
* Use with System.runAs() for permission testing
|
|
233
|
+
* @param profileName Name of the profile to assign
|
|
234
|
+
* @param uniqueIdentifier Unique string to avoid duplicate usernames
|
|
235
|
+
* @return User record (not inserted)
|
|
236
|
+
*/
|
|
237
|
+
public static User createUser(String profileName, String uniqueIdentifier) {
|
|
238
|
+
Profile p = [SELECT Id FROM Profile WHERE Name = :profileName LIMIT 1];
|
|
239
|
+
|
|
240
|
+
String uniqueEmail = uniqueIdentifier + '@testuser.example.com';
|
|
241
|
+
String uniqueUsername = uniqueIdentifier + '@testuser.example.com.test';
|
|
242
|
+
|
|
243
|
+
return new User(
|
|
244
|
+
FirstName = 'Test',
|
|
245
|
+
LastName = 'User ' + uniqueIdentifier,
|
|
246
|
+
Email = uniqueEmail,
|
|
247
|
+
Username = uniqueUsername,
|
|
248
|
+
Alias = uniqueIdentifier.left(8),
|
|
249
|
+
ProfileId = p.Id,
|
|
250
|
+
TimeZoneSidKey = 'America/Los_Angeles',
|
|
251
|
+
LocaleSidKey = 'en_US',
|
|
252
|
+
EmailEncodingKey = 'UTF-8',
|
|
253
|
+
LanguageLocaleKey = 'en_US'
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @description Creates and inserts a test User
|
|
259
|
+
* @param profileName Name of the profile to assign
|
|
260
|
+
* @param uniqueIdentifier Unique string to avoid duplicate usernames
|
|
261
|
+
* @return Inserted User record
|
|
262
|
+
*/
|
|
263
|
+
public static User createAndInsertUser(String profileName, String uniqueIdentifier) {
|
|
264
|
+
User u = createUser(profileName, uniqueIdentifier);
|
|
265
|
+
insert u;
|
|
266
|
+
return u;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
270
|
+
// CUSTOM OBJECT METHODS (Template)
|
|
271
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* @description Template for custom object creation
|
|
275
|
+
* Copy and modify for your custom objects
|
|
276
|
+
* @param count Number of records to create
|
|
277
|
+
* @return List of custom object records (not inserted)
|
|
278
|
+
*/
|
|
279
|
+
/*
|
|
280
|
+
public static List<Custom_Object__c> createCustomObjects(Integer count) {
|
|
281
|
+
List<Custom_Object__c> records = new List<Custom_Object__c>();
|
|
282
|
+
for (Integer i = 0; i < count; i++) {
|
|
283
|
+
records.add(new Custom_Object__c(
|
|
284
|
+
Name = 'Test Record ' + i,
|
|
285
|
+
Custom_Field__c = 'Value ' + i
|
|
286
|
+
// Add more fields as needed
|
|
287
|
+
));
|
|
288
|
+
}
|
|
289
|
+
return records;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
public static List<Custom_Object__c> createAndInsertCustomObjects(Integer count) {
|
|
293
|
+
List<Custom_Object__c> records = createCustomObjects(count);
|
|
294
|
+
insert records;
|
|
295
|
+
return records;
|
|
296
|
+
}
|
|
297
|
+
*/
|
|
298
|
+
|
|
299
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
300
|
+
// UTILITY METHODS
|
|
301
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* @description Generates a unique string for test data
|
|
305
|
+
* Useful for avoiding unique constraint violations
|
|
306
|
+
* @return Unique string based on timestamp
|
|
307
|
+
*/
|
|
308
|
+
public static String generateUniqueString() {
|
|
309
|
+
return String.valueOf(Datetime.now().getTime()) +
|
|
310
|
+
String.valueOf(Math.random()).substring(2, 8);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* @description Creates a map of records by a specified field
|
|
315
|
+
* Useful for test assertions
|
|
316
|
+
* @param records List of SObjects
|
|
317
|
+
* @param fieldName API name of the field to use as key
|
|
318
|
+
* @return Map with field values as keys
|
|
319
|
+
*/
|
|
320
|
+
public static Map<String, SObject> createMapByField(List<SObject> records, String fieldName) {
|
|
321
|
+
Map<String, SObject> recordMap = new Map<String, SObject>();
|
|
322
|
+
for (SObject record : records) {
|
|
323
|
+
String keyValue = String.valueOf(record.get(fieldName));
|
|
324
|
+
recordMap.put(keyValue, record);
|
|
325
|
+
}
|
|
326
|
+
return recordMap;
|
|
327
|
+
}
|
|
328
|
+
}
|