Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 15d43a1

Browse files
committed
apex-enterprise-patterns#86 - Trigger Event Controls
Test harness completed
1 parent d8f8e27 commit 15d43a1

File tree

2 files changed

+185
-59
lines changed

2 files changed

+185
-59
lines changed

fflib/src/classes/fflib_SObjectDomain.cls

+21-59
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,8 @@ public virtual with sharing class fflib_SObjectDomain
361361
pushTriggerInstance(domainClass, domainObject);
362362
}
363363

364-
if(!isTriggerEventEnabled(domainClass))
364+
// has this event been disabled?
365+
if(!getTriggerEvent(domainClass).isEnabled(isBefore, isAfter, isInsert, isUpdate, isDelete, isUndelete))
365366
{
366367
return;
367368
}
@@ -406,64 +407,7 @@ public virtual with sharing class fflib_SObjectDomain
406407
return domain;
407408
}
408409

409-
/**
410-
* Utilise to check if the current trigger mode is turned off
411-
**/
412-
private static boolean isTriggerEventEnabled(Type domainClass)
413-
{
414-
if(domainClass == null || TriggerEventByClass == null)
415-
{
416-
return true;
417-
}
418-
419-
System.Debug(domainClass);
420-
System.Debug(TriggerEventByClass.keySet());
421-
422-
if(!TriggerEventByClass.containsKey(domainClass))
423-
{
424-
TriggerEventByClass.put(domainClass, new TriggerEvent());
425-
}
426-
427-
if(Trigger.isBefore)
428-
{
429-
if(Trigger.isInsert)
430-
{
431-
return TriggerEventByClass.get(domainClass).BeforeInsertEnabled;
432-
}
433-
else if(Trigger.isUpdate)
434-
{
435-
return TriggerEventByClass.get(domainClass).BeforeUpdateEnabled;
436-
}
437-
else if(Trigger.isDelete)
438-
{
439-
return TriggerEventByClass.get(domainClass).BeforeDeleteEnabled;
440-
}
441-
}
442-
else if(Trigger.isAfter)
443-
{
444-
if(Trigger.isInsert)
445-
{
446-
return TriggerEventByClass.get(domainClass).AfterInsertEnabled;
447-
}
448-
else if(Trigger.isUpdate)
449-
{
450-
return TriggerEventByClass.get(domainClass).AfterUpdateEnabled;
451-
}
452-
else if(Trigger.isDelete)
453-
{
454-
return TriggerEventByClass.get(domainClass).AfterDeleteEnabled;
455-
}
456-
else if(Trigger.isUndelete)
457-
{
458-
return TriggerEventByClass.get(domainClass).AfterUndeleteEnabled;
459-
}
460-
}
461-
462-
// will never get here unless there are some amazing updates to SFDC that allow tertiary logic :)
463-
return true;
464-
}
465-
466-
public TriggerEvent getTriggerEvent(Type domainClass)
410+
public static TriggerEvent getTriggerEvent(Type domainClass)
467411
{
468412
if(!TriggerEventByClass.containsKey(domainClass))
469413
{
@@ -539,6 +483,24 @@ public virtual with sharing class fflib_SObjectDomain
539483
{
540484
return this.disableAfterInsert().disableAfterUpdate().disableAfterDelete().disableAfterUndelete();
541485
}
486+
487+
public boolean isEnabled(Boolean isBefore, Boolean isAfter, Boolean isInsert, Boolean isUpdate, Boolean isDelete, Boolean isUndelete)
488+
{
489+
if(isBefore)
490+
{
491+
if(isInsert) return BeforeInsertEnabled;
492+
else if(isUpdate) return BeforeUpdateEnabled;
493+
else if(isDelete) return BeforeDeleteEnabled;
494+
}
495+
else if(isAfter)
496+
{
497+
if(isInsert) return AfterInsertEnabled;
498+
else if(isUpdate) return AfterUpdateEnabled;
499+
else if(isDelete) return AfterDeleteEnabled;
500+
else if(isUndelete) return AfterUndeleteEnabled;
501+
}
502+
return true; // shouldnt ever get here!
503+
}
542504
}
543505

544506
/**

fflib/src/classes/fflib_SObjectDomainTest.cls

+164
Original file line numberDiff line numberDiff line change
@@ -228,4 +228,168 @@ private with sharing class fflib_SObjectDomainTest
228228
}
229229
return testUser;
230230
}
231+
232+
/**
233+
* The following tests that the ability to enable/disable all trigger events works as required
234+
**/
235+
@IsTest
236+
private static void testDisableTriggerEventsBehaviour()
237+
{
238+
boolean bError = false;
239+
240+
String sErrorMessage = '';
241+
242+
Opportunity oldOpp = (Opportunity) Opportunity.sObjectType.newSObject('006E0000006mkRQ');
243+
oldOpp.Name = 'Test';
244+
oldOpp.Type = 'Existing';
245+
Opportunity newOpp = (Opportunity) Opportunity.sObjectType.newSObject('006E0000006mkRQ');
246+
newOpp.Name = 'Test';
247+
newOpp.Type = 'New';
248+
249+
250+
251+
// these will be called multiple times making sure the correct error message comes back out
252+
// so... there are alot of tests to do here sadly and remember everything is reversed and you need to run backwards!
253+
// 1 - all disabled
254+
try
255+
{
256+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).disableAll();
257+
fflib_SObjectDomain.Test.Database.onInsert(new Opportunity[] { newOpp } );
258+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
259+
}
260+
catch (Exception e)
261+
{
262+
bError = true;
263+
}
264+
265+
System.AssertEquals(false, bError, 'Error - Trigger events have been fired when they are disabled');
266+
267+
////////////////////////////
268+
// Insert!
269+
try
270+
{
271+
// now lets go after insert and then before
272+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).enableAfterInsert();
273+
fflib_SObjectDomain.Test.Database.onInsert(new Opportunity[] { newOpp } );
274+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
275+
}
276+
catch (Exception e)
277+
{
278+
sErrorMessage = e.getMessage();
279+
System.Debug('Exception Fired :' + e.getMEssage());
280+
}
281+
282+
System.AssertEquals('onAfterInsert called', sErrorMessage, 'Error - After Insert Event is enabled but did not run');
283+
284+
try
285+
{
286+
// now lets go after insert and then before
287+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).enableBeforeInsert();
288+
fflib_SObjectDomain.Test.Database.onInsert(new Opportunity[] { newOpp } );
289+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
290+
}
291+
catch (Exception e)
292+
{
293+
sErrorMessage = e.getMessage();
294+
}
295+
296+
System.AssertEquals('onBeforeInsert called', sErrorMessage, 'Error - Before Insert Event is enabled but did not run');
297+
298+
////////////////////////////
299+
// Update!
300+
try
301+
{
302+
// now lets go after insert and then before
303+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).enableAfterUpdate();
304+
fflib_SObjectDomain.Test.Database.onUpdate(new Opportunity[] { newOpp }, new Map<Id, SObject> { newOpp.Id => oldOpp } );
305+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
306+
}
307+
catch (Exception e)
308+
{
309+
sErrorMessage = e.getMessage();
310+
}
311+
312+
System.AssertEquals('onAfterUpdate called', sErrorMessage, 'Error - After Update Event is enabled but did not run');
313+
314+
try
315+
{
316+
// now lets go after insert and then before
317+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).enableBeforeUpdate();
318+
fflib_SObjectDomain.Test.Database.onUpdate(new Opportunity[] { newOpp }, new Map<Id, SObject> { newOpp.Id => oldOpp } );
319+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
320+
}
321+
catch (Exception e)
322+
{
323+
sErrorMessage = e.getMessage();
324+
}
325+
326+
System.AssertEquals('onBeforeUpdate called', sErrorMessage, 'Error - Before Update Event is enabled but did not run');
327+
328+
////////////////////////////
329+
// Delete!
330+
try
331+
{
332+
// now lets go after insert and then before
333+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).enableAfterDelete();
334+
fflib_SObjectDomain.Test.Database.onDelete(new Map<Id, Opportunity> { newOpp.Id => newOpp } );
335+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
336+
}
337+
catch (Exception e)
338+
{
339+
sErrorMessage = e.getMessage();
340+
}
341+
342+
System.AssertEquals('onAfterDelete called', sErrorMessage, 'Error - After Delete Event is enabled but did not run');
343+
344+
try
345+
{
346+
// now lets go after insert and then before
347+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).enableBeforeDelete();
348+
fflib_SObjectDomain.Test.Database.onDelete(new Map<Id, Opportunity> { newOpp.Id => newOpp } );
349+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
350+
}
351+
catch (Exception e)
352+
{
353+
sErrorMessage = e.getMessage();
354+
}
355+
356+
System.AssertEquals('onBeforeDelete called', sErrorMessage, 'Error - Before Delete Event is enabled but did not run');
357+
358+
////////////////////////////
359+
// Undelete!
360+
try
361+
{
362+
// now lets go after insert and then before
363+
fflib_SObjectDomain.getTriggerEvent(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class).enableAfterUndelete();
364+
fflib_SObjectDomain.Test.Database.onUndelete(new Opportunity[] { newOpp });
365+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectDisableBehaviourConstructor.class);
366+
}
367+
catch (Exception e)
368+
{
369+
sErrorMessage = e.getMessage();
370+
}
371+
372+
System.AssertEquals('onAfterUndelete called', sErrorMessage, 'Error - After Undelete Event is enabled but did not run');
373+
374+
/*
375+
376+
fflib_SObjectDomain.Test.Database.onInsert(new Opportunity[] { opp } );
377+
378+
379+
380+
fflib_SObjectDomain.Test.Database.onUpdate(new Opportunity[] { newOpp }, new Map<Id, SObject> { newOpp.Id => oldOpp } );
381+
382+
fflib_SObjectDomain.Test.Database.onDelete(new Map<ID, Opportunity> { opp.Id => opp } );
383+
384+
fflib_SObjectDomain.Test.Database.onUndelete(new list<Opportunity> { opp } );
385+
386+
387+
try {
388+
fflib_SObjectDomain.triggerHandler(fflib_SObjectDomain.TestSObjectOnValidateBehaviourConstructor.class);
389+
System.assert(false, 'Expected exception');
390+
} catch (Exception e) {
391+
System.assertEquals('onValidate called', e.getMessage());
392+
}
393+
*/
394+
}
231395
}

0 commit comments

Comments
 (0)