@salesforce/afv-skills 1.7.3 → 1.7.5
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/README.md +3 -3
- package/package.json +1 -1
- package/skills/developing-agentforce/README.md +4 -4
- package/skills/developing-agentforce/SKILL.md +37 -37
- package/skills/developing-agentforce/assets/README-legacy.md +8 -8
- package/skills/developing-agentforce/assets/agent-spec-template.md +9 -9
- package/skills/developing-agentforce/assets/agents/README.md +4 -4
- package/skills/developing-agentforce/assets/agents/hello-world.agent +3 -3
- package/skills/developing-agentforce/assets/agents/{multi-topic.agent → multi-subagent.agent} +30 -30
- package/skills/developing-agentforce/assets/agents/order-service.agent +25 -25
- package/skills/developing-agentforce/assets/agents/production-faq.agent +12 -12
- package/skills/developing-agentforce/assets/agents/simple-qa.agent +8 -8
- package/skills/developing-agentforce/assets/agents/verification-gate.agent +19 -19
- package/skills/developing-agentforce/assets/components/apex-action.agent +3 -3
- package/skills/developing-agentforce/assets/components/error-handling.agent +7 -7
- package/skills/developing-agentforce/assets/components/escalation-setup.agent +11 -11
- package/skills/developing-agentforce/assets/components/flow-action.agent +5 -5
- package/skills/developing-agentforce/assets/components/n-ary-conditions.agent +11 -11
- package/skills/developing-agentforce/assets/components/{topic-with-actions.agent → subagent-with-actions.agent} +9 -9
- package/skills/developing-agentforce/assets/deterministic-routing.agent +19 -19
- package/skills/developing-agentforce/assets/escalation-pattern.agent +13 -13
- package/skills/developing-agentforce/assets/flow-action-lookup.agent +3 -3
- package/skills/developing-agentforce/assets/hub-and-spoke.agent +18 -18
- package/skills/developing-agentforce/assets/local-info-agent-annotated.agent +37 -37
- package/skills/developing-agentforce/assets/metadata/genai-function-apex.xml +3 -3
- package/skills/developing-agentforce/assets/metadata/genai-function-flow.xml +1 -1
- package/skills/developing-agentforce/assets/metadata/genai-plugin.xml +10 -10
- package/skills/developing-agentforce/assets/minimal-starter.agent +4 -4
- package/skills/developing-agentforce/assets/patterns/README.md +21 -21
- package/skills/developing-agentforce/assets/patterns/action-callbacks.agent +4 -4
- package/skills/developing-agentforce/assets/patterns/advanced-input-bindings.agent +1 -1
- package/skills/developing-agentforce/assets/patterns/bidirectional-routing.agent +25 -25
- package/skills/developing-agentforce/assets/patterns/critical-input-collection.agent +8 -8
- package/skills/developing-agentforce/assets/patterns/delegation-routing.agent +21 -21
- package/skills/developing-agentforce/assets/patterns/lifecycle-events.agent +8 -8
- package/skills/developing-agentforce/assets/patterns/llm-controlled-actions.agent +5 -5
- package/skills/developing-agentforce/assets/patterns/multi-step-workflow.agent +3 -3
- package/skills/developing-agentforce/assets/patterns/open-gate-routing.agent +59 -58
- package/skills/developing-agentforce/assets/patterns/procedural-instructions.agent +15 -15
- package/skills/developing-agentforce/assets/patterns/prompt-template-action.agent +8 -8
- package/skills/developing-agentforce/assets/patterns/system-instruction-overrides.agent +40 -40
- package/skills/developing-agentforce/assets/prompt-rag-search.agent +9 -9
- package/skills/developing-agentforce/assets/{template-multi-topic.agent → template-multi-subagent.agent} +25 -25
- package/skills/developing-agentforce/assets/{template-single-topic.agent → template-single-subagent.agent} +14 -14
- package/skills/developing-agentforce/assets/verification-gate.agent +16 -16
- package/skills/developing-agentforce/references/action-prompt-templates.md +1 -1
- package/skills/developing-agentforce/references/actions-reference.md +4 -4
- package/skills/developing-agentforce/references/agent-design-and-spec-creation.md +107 -107
- package/skills/developing-agentforce/references/agent-metadata-and-lifecycle.md +5 -5
- package/skills/developing-agentforce/references/agent-script-core-language.md +79 -79
- package/skills/developing-agentforce/references/{agent-topic-map-diagrams.md → agent-subagent-map-diagrams.md} +65 -65
- package/skills/developing-agentforce/references/agent-user-setup.md +2 -2
- package/skills/developing-agentforce/references/agent-validation-and-debugging.md +55 -55
- package/skills/developing-agentforce/references/architecture-patterns.md +33 -33
- package/skills/developing-agentforce/references/deploy-reference.md +1 -1
- package/skills/developing-agentforce/references/discover-reference.md +1 -1
- package/skills/developing-agentforce/references/examples.md +32 -32
- package/skills/developing-agentforce/references/feature-validity.md +3 -3
- package/skills/developing-agentforce/references/instruction-resolution.md +29 -29
- package/skills/developing-agentforce/references/known-issues.md +10 -10
- package/skills/developing-agentforce/references/minimal-examples.md +6 -6
- package/skills/developing-agentforce/references/production-gotchas.md +22 -22
- package/skills/developing-agentforce/references/safety-review-reference.md +2 -2
- package/skills/developing-agentforce/references/scoring-rubric.md +3 -3
- package/skills/developing-datacloud-code-extension/SKILL.md +321 -0
- package/skills/developing-datacloud-code-extension/references/README.md +193 -0
- package/skills/developing-datacloud-code-extension/references/quick-reference.md +269 -0
- package/skills/generating-permission-set/SKILL.md +1 -1
- package/skills/getting-datacloud-schema/SKILL.md +380 -0
- package/skills/getting-datacloud-schema/references/README.md +191 -0
- package/skills/getting-datacloud-schema/scripts/get_dlo_schema.py +244 -0
- package/skills/getting-datacloud-schema/scripts/get_dmo_schema.py +233 -0
- package/skills/observing-agentforce/SKILL.md +8 -8
- package/skills/observing-agentforce/apex/AgentforceOptimizeService.cls +2 -2
- package/skills/observing-agentforce/references/improve-reference.md +40 -40
- package/skills/observing-agentforce/references/issue-classification.md +47 -47
- package/skills/observing-agentforce/references/reproduce-reference.md +7 -7
- package/skills/observing-agentforce/references/stdm-queries.md +7 -7
- package/skills/observing-agentforce/references/stdm-schema.md +2 -2
- package/skills/testing-agentforce/SKILL.md +9 -9
- package/skills/testing-agentforce/assets/basic-test-spec.yaml +4 -0
- package/skills/testing-agentforce/assets/guardrail-test-spec.yaml +4 -0
- package/skills/testing-agentforce/assets/standard-test-spec.yaml +8 -4
- package/skills/testing-agentforce/references/batch-testing.md +17 -17
- package/skills/testing-agentforce/references/preview-testing.md +25 -25
- package/skills/testing-agentforce/references/test-report-format.md +6 -6
- package/skills/trigger-refactor-pipeline/SKILL.md +0 -191
- package/skills/trigger-refactor-pipeline/assets/test_template.apex +0 -321
- package/skills/trigger-refactor-pipeline/references/handler_patterns.md +0 -442
- package/skills/trigger-refactor-pipeline/scripts/analyze_trigger.py +0 -258
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test class template for trigger handlers
|
|
3
|
-
*
|
|
4
|
-
* INSTRUCTIONS:
|
|
5
|
-
* 1. Replace [ObjectName] with your SObject (e.g., Opportunity)
|
|
6
|
-
* 2. Replace [HandlerClass] with your handler class name
|
|
7
|
-
* 3. Implement the setupTestData() method with your test records
|
|
8
|
-
* 4. Add specific test methods for each handler method
|
|
9
|
-
* 5. Ensure 100% code coverage
|
|
10
|
-
*/
|
|
11
|
-
@IsTest
|
|
12
|
-
private class [ObjectName]TriggerHandlerTest {
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Setup test data that all test methods can use
|
|
16
|
-
*/
|
|
17
|
-
@TestSetup
|
|
18
|
-
static void setupTestData() {
|
|
19
|
-
// TODO: Create test records here
|
|
20
|
-
// Example:
|
|
21
|
-
// List<Opportunity> testOpps = new List<Opportunity>();
|
|
22
|
-
// for (Integer i = 0; i < 10; i++) {
|
|
23
|
-
// testOpps.add(new Opportunity(
|
|
24
|
-
// Name = 'Test Opp ' + i,
|
|
25
|
-
// StageName = 'Prospecting',
|
|
26
|
-
// CloseDate = Date.today().addDays(30),
|
|
27
|
-
// Amount = 5000
|
|
28
|
-
// ));
|
|
29
|
-
// }
|
|
30
|
-
// insert testOpps;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Test beforeInsert handler - Positive case
|
|
35
|
-
*/
|
|
36
|
-
@IsTest
|
|
37
|
-
static void testBeforeInsert_Positive() {
|
|
38
|
-
Test.startTest();
|
|
39
|
-
|
|
40
|
-
// TODO: Create valid test records
|
|
41
|
-
// List<Opportunity> testRecords = new List<Opportunity>{
|
|
42
|
-
// new Opportunity(
|
|
43
|
-
// Name = 'Valid Opp',
|
|
44
|
-
// StageName = 'Prospecting',
|
|
45
|
-
// CloseDate = Date.today().addDays(30),
|
|
46
|
-
// Amount = 10000
|
|
47
|
-
// )
|
|
48
|
-
// };
|
|
49
|
-
|
|
50
|
-
// Insert should succeed
|
|
51
|
-
// insert testRecords;
|
|
52
|
-
|
|
53
|
-
Test.stopTest();
|
|
54
|
-
|
|
55
|
-
// TODO: Add assertions
|
|
56
|
-
// List<Opportunity> inserted = [SELECT Id, Name FROM Opportunity WHERE Name = 'Valid Opp'];
|
|
57
|
-
// System.Assert.areEqual(1, inserted.size(), 'Should insert 1 record');
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Test beforeInsert handler - Negative case
|
|
62
|
-
*/
|
|
63
|
-
@IsTest
|
|
64
|
-
static void testBeforeInsert_Negative() {
|
|
65
|
-
Test.startTest();
|
|
66
|
-
|
|
67
|
-
Boolean exceptionThrown = false;
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
// TODO: Create invalid test records that should fail validation
|
|
71
|
-
// List<Opportunity> testRecords = new List<Opportunity>{
|
|
72
|
-
// new Opportunity(
|
|
73
|
-
// Name = 'Invalid Opp',
|
|
74
|
-
// StageName = 'Closed Won',
|
|
75
|
-
// CloseDate = Date.today(),
|
|
76
|
-
// Amount = 500 // Below minimum
|
|
77
|
-
// )
|
|
78
|
-
// };
|
|
79
|
-
|
|
80
|
-
// insert testRecords;
|
|
81
|
-
|
|
82
|
-
} catch (DmlException e) {
|
|
83
|
-
exceptionThrown = true;
|
|
84
|
-
// TODO: Assert error message
|
|
85
|
-
// System.Assert.isTrue(e.getMessage().contains('must have Amount'),
|
|
86
|
-
// 'Should throw validation error');
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
Test.stopTest();
|
|
90
|
-
|
|
91
|
-
// System.Assert.isTrue(exceptionThrown, 'Should have thrown an exception');
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Test beforeUpdate handler - Positive case
|
|
96
|
-
*/
|
|
97
|
-
@IsTest
|
|
98
|
-
static void testBeforeUpdate_Positive() {
|
|
99
|
-
// TODO: Query existing test data from @TestSetup
|
|
100
|
-
// List<Opportunity> testOpps = [SELECT Id, StageName, Description FROM Opportunity LIMIT 1];
|
|
101
|
-
|
|
102
|
-
Test.startTest();
|
|
103
|
-
|
|
104
|
-
// TODO: Update records to trigger handler logic
|
|
105
|
-
// testOpps[0].StageName = 'Qualification';
|
|
106
|
-
// update testOpps;
|
|
107
|
-
|
|
108
|
-
Test.stopTest();
|
|
109
|
-
|
|
110
|
-
// TODO: Add assertions
|
|
111
|
-
// Opportunity updated = [SELECT Description FROM Opportunity WHERE Id = :testOpps[0].Id];
|
|
112
|
-
// System.Assert.isTrue(updated.Description.contains('Stage changed'),
|
|
113
|
-
// 'Description should be updated');
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Test beforeUpdate handler - Negative case
|
|
118
|
-
*/
|
|
119
|
-
@IsTest
|
|
120
|
-
static void testBeforeUpdate_Negative() {
|
|
121
|
-
// TODO: Implement negative test for beforeUpdate
|
|
122
|
-
Test.startTest();
|
|
123
|
-
|
|
124
|
-
// TODO: Attempt update that should fail
|
|
125
|
-
|
|
126
|
-
Test.stopTest();
|
|
127
|
-
|
|
128
|
-
// TODO: Assert failure occurred
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Test afterInsert handler - Positive case
|
|
133
|
-
*/
|
|
134
|
-
@IsTest
|
|
135
|
-
static void testAfterInsert_Positive() {
|
|
136
|
-
Test.startTest();
|
|
137
|
-
|
|
138
|
-
// TODO: Create and insert records
|
|
139
|
-
|
|
140
|
-
Test.stopTest();
|
|
141
|
-
|
|
142
|
-
// TODO: Query for related records created by handler
|
|
143
|
-
// List<Task> createdTasks = [SELECT Id FROM Task];
|
|
144
|
-
// System.Assert.areEqual(1, createdTasks.size(), 'Should create 1 task');
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Test afterUpdate handler - Positive case
|
|
149
|
-
*/
|
|
150
|
-
@IsTest
|
|
151
|
-
static void testAfterUpdate_Positive() {
|
|
152
|
-
// TODO: Query existing test data
|
|
153
|
-
// List<Opportunity> testOpps = [SELECT Id, StageName FROM Opportunity LIMIT 1];
|
|
154
|
-
|
|
155
|
-
Test.startTest();
|
|
156
|
-
|
|
157
|
-
// TODO: Update to trigger after-update logic
|
|
158
|
-
// testOpps[0].StageName = 'Closed Won';
|
|
159
|
-
// update testOpps;
|
|
160
|
-
|
|
161
|
-
Test.stopTest();
|
|
162
|
-
|
|
163
|
-
// TODO: Query for side effects (e.g., Tasks created)
|
|
164
|
-
// List<Task> tasks = [SELECT Id, Subject FROM Task WHERE WhatId = :testOpps[0].Id];
|
|
165
|
-
// System.Assert.areEqual(1, tasks.size(), 'Should create 1 task');
|
|
166
|
-
// System.Assert.areEqual('Send thank-you', tasks[0].Subject);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Test bulk operations - 200+ records
|
|
171
|
-
* Critical for validating bulkification
|
|
172
|
-
*/
|
|
173
|
-
@IsTest
|
|
174
|
-
static void testBulkInsert() {
|
|
175
|
-
Test.startTest();
|
|
176
|
-
|
|
177
|
-
// TODO: Create 200+ records
|
|
178
|
-
// List<Opportunity> bulkOpps = new List<Opportunity>();
|
|
179
|
-
// for (Integer i = 0; i < 200; i++) {
|
|
180
|
-
// bulkOpps.add(new Opportunity(
|
|
181
|
-
// Name = 'Bulk Opp ' + i,
|
|
182
|
-
// StageName = 'Prospecting',
|
|
183
|
-
// CloseDate = Date.today().addDays(30),
|
|
184
|
-
// Amount = 10000
|
|
185
|
-
// ));
|
|
186
|
-
// }
|
|
187
|
-
|
|
188
|
-
// insert bulkOpps;
|
|
189
|
-
|
|
190
|
-
Test.stopTest();
|
|
191
|
-
|
|
192
|
-
// TODO: Assert all records inserted successfully
|
|
193
|
-
// List<Opportunity> inserted = [SELECT Id FROM Opportunity WHERE Name LIKE 'Bulk Opp%'];
|
|
194
|
-
// System.Assert.areEqual(200, inserted.size(), 'Should insert all 200 records');
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Test bulk update with mixed scenarios
|
|
199
|
-
* Some records qualify for logic, others don't
|
|
200
|
-
*/
|
|
201
|
-
@IsTest
|
|
202
|
-
static void testBulkUpdate_Mixed() {
|
|
203
|
-
// Create test data
|
|
204
|
-
List<Opportunity> testOpps = new List<Opportunity>();
|
|
205
|
-
for (Integer i = 0; i < 50; i++) {
|
|
206
|
-
testOpps.add(new Opportunity(
|
|
207
|
-
Name = 'Bulk Update Opp ' + i,
|
|
208
|
-
StageName = 'Prospecting',
|
|
209
|
-
CloseDate = Date.today().addDays(30),
|
|
210
|
-
Amount = 10000
|
|
211
|
-
));
|
|
212
|
-
}
|
|
213
|
-
insert testOpps;
|
|
214
|
-
|
|
215
|
-
Test.startTest();
|
|
216
|
-
|
|
217
|
-
// Update half to trigger logic, half to not trigger
|
|
218
|
-
for (Integer i = 0; i < testOpps.size(); i++) {
|
|
219
|
-
if (Math.mod(i, 2) == 0) {
|
|
220
|
-
// TODO: Set condition that triggers handler logic
|
|
221
|
-
// testOpps[i].StageName = 'Closed Won';
|
|
222
|
-
} else {
|
|
223
|
-
// TODO: Set condition that doesn't trigger handler logic
|
|
224
|
-
// testOpps[i].Amount = 15000;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// update testOpps;
|
|
229
|
-
|
|
230
|
-
Test.stopTest();
|
|
231
|
-
|
|
232
|
-
// TODO: Assert only qualifying records triggered side effects
|
|
233
|
-
// List<Task> tasks = [SELECT Id FROM Task WHERE WhatId IN :testOpps];
|
|
234
|
-
// System.Assert.areEqual(25, tasks.size(), 'Should create tasks for 25 qualifying records');
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Test governor limits are not exceeded
|
|
239
|
-
*/
|
|
240
|
-
@IsTest
|
|
241
|
-
static void testGovernorLimits() {
|
|
242
|
-
Test.startTest();
|
|
243
|
-
|
|
244
|
-
// TODO: Create maximum allowed records
|
|
245
|
-
// List<Opportunity> maxOpps = new List<Opportunity>();
|
|
246
|
-
// for (Integer i = 0; i < 200; i++) {
|
|
247
|
-
// maxOpps.add(new Opportunity(
|
|
248
|
-
// Name = 'Limit Test ' + i,
|
|
249
|
-
// StageName = 'Closed Won',
|
|
250
|
-
// CloseDate = Date.today(),
|
|
251
|
-
// Amount = 10000
|
|
252
|
-
// ));
|
|
253
|
-
// }
|
|
254
|
-
|
|
255
|
-
// insert maxOpps;
|
|
256
|
-
|
|
257
|
-
Test.stopTest();
|
|
258
|
-
|
|
259
|
-
// Assert we're under governor limits
|
|
260
|
-
System.Assert.isTrue(Limits.getDmlStatements() < Limits.getLimitDmlStatements(),
|
|
261
|
-
'Should not exceed DML statement limit');
|
|
262
|
-
System.Assert.isTrue(Limits.getQueries() < Limits.getLimitQueries(),
|
|
263
|
-
'Should not exceed SOQL query limit');
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Test with null or empty collections
|
|
268
|
-
* Ensures handler doesn't break with edge cases
|
|
269
|
-
*/
|
|
270
|
-
@IsTest
|
|
271
|
-
static void testWithEmptyCollection() {
|
|
272
|
-
Test.startTest();
|
|
273
|
-
|
|
274
|
-
// TODO: Call handler methods with empty lists
|
|
275
|
-
// OpportunityTriggerHandler handler = new OpportunityTriggerHandler();
|
|
276
|
-
// handler.beforeInsert(new List<Opportunity>());
|
|
277
|
-
|
|
278
|
-
Test.stopTest();
|
|
279
|
-
|
|
280
|
-
// If we get here without exception, test passes
|
|
281
|
-
System.Assert.isTrue(true, 'Handler should handle empty collections gracefully');
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Helper method to create test data inline
|
|
286
|
-
* Use when @TestSetup is not sufficient
|
|
287
|
-
*/
|
|
288
|
-
private static List<Opportunity> createTestOpportunities(Integer count) {
|
|
289
|
-
List<Opportunity> testOpps = new List<Opportunity>();
|
|
290
|
-
|
|
291
|
-
for (Integer i = 0; i < count; i++) {
|
|
292
|
-
testOpps.add(new Opportunity(
|
|
293
|
-
Name = 'Test Opp ' + i,
|
|
294
|
-
StageName = 'Prospecting',
|
|
295
|
-
CloseDate = Date.today().addDays(30),
|
|
296
|
-
Amount = 10000
|
|
297
|
-
));
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
return testOpps;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Helper method to assert task creation
|
|
305
|
-
*/
|
|
306
|
-
private static void assertTasksCreated(List<Id> oppIds, Integer expectedCount, String subject) {
|
|
307
|
-
List<Task> tasks = [
|
|
308
|
-
SELECT Id, Subject, WhatId
|
|
309
|
-
FROM Task
|
|
310
|
-
WHERE WhatId IN :oppIds
|
|
311
|
-
];
|
|
312
|
-
|
|
313
|
-
System.Assert.areEqual(expectedCount, tasks.size(),
|
|
314
|
-
'Should create ' + expectedCount + ' task(s)');
|
|
315
|
-
|
|
316
|
-
if (expectedCount > 0) {
|
|
317
|
-
System.Assert.areEqual(subject, tasks[0].Subject,
|
|
318
|
-
'Task subject should match');
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|