@isTest private class Oly_TriggerHandler_Test { private static final String TRIGGER_CONTEXT_ERROR = 'Trigger handler called outside of Trigger execution'; private static String lastMethodCalled; private static Oly_TriggerHandler_Test.TestHandler handler; static { handler = new Oly_TriggerHandler_Test.TestHandler(); // override its internal trigger detection handler.isTriggerExecuting = true; } /*************************************** * unit tests ***************************************/ // contexts tests @isTest static void testBeforeInsert() { beforeInsertMode(); handler.run(); System.assertEquals('beforeInsert', lastMethodCalled, 'last method should be beforeInsert'); } @isTest static void testBeforeUpdate() { beforeUpdateMode(); handler.run(); System.assertEquals('beforeUpdate', lastMethodCalled, 'last method should be beforeUpdate'); } @isTest static void testBeforeDelete() { beforeDeleteMode(); handler.run(); System.assertEquals('beforeDelete', lastMethodCalled, 'last method should be beforeDelete'); } @isTest static void testAfterInsert() { afterInsertMode(); handler.run(); System.assertEquals('afterInsert', lastMethodCalled, 'last method should be afterInsert'); } @isTest static void testAfterUpdate() { afterUpdateMode(); handler.run(); System.assertEquals('afterUpdate', lastMethodCalled, 'last method should be afterUpdate'); } @isTest static void testAfterDelete() { afterDeleteMode(); handler.run(); System.assertEquals('afterDelete', lastMethodCalled, 'last method should be afterDelete'); } @isTest static void testAfterUndelete() { afterUndeleteMode(); handler.run(); System.assertEquals('afterUndelete', lastMethodCalled, 'last method should be afterUndelete'); } @isTest static void testNonTriggerContext() { try{ handler.run(); System.assert(false, 'the handler ran but should have thrown'); } catch(Oly_TriggerHandler.Oly_TriggerHandlerException te) { System.assertEquals(TRIGGER_CONTEXT_ERROR, te.getMessage(), 'the exception message should match'); } catch(Exception e) { System.assert(false, 'the exception thrown was not expected: ' + e.getTypeName() + ': ' + e.getMessage()); } } // test bypass api @isTest static void testBypassAPI() { afterUpdateMode(); // test a bypass and run handler Oly_TriggerHandler.bypass('TestHandler'); handler.run(); System.assertEquals(null, lastMethodCalled, 'last method should be null when bypassed'); System.assertEquals(true, Oly_TriggerHandler.isBypassed('TestHandler'), 'test handler should be bypassed'); resetTest(); // clear that bypass and run handler Oly_TriggerHandler.clearBypass('TestHandler'); handler.run(); System.assertEquals('afterUpdate', lastMethodCalled, 'last method called should be afterUpdate'); System.assertEquals(false, Oly_TriggerHandler.isBypassed('TestHandler'), 'test handler should be bypassed'); resetTest(); // test a re-bypass and run handler Oly_TriggerHandler.bypass('TestHandler'); handler.run(); System.assertEquals(null, lastMethodCalled, 'last method should be null when bypassed'); System.assertEquals(true, Oly_TriggerHandler.isBypassed('TestHandler'), 'test handler should be bypassed'); resetTest(); // clear all bypasses and run handler Oly_TriggerHandler.clearAllBypasses(); handler.run(); System.assertEquals('afterUpdate', lastMethodCalled, 'last method called should be afterUpdate'); System.assertEquals(false, Oly_TriggerHandler.isBypassed('TestHandler'), 'test handler should be bypassed'); resetTest(); } // private method tests @isTest static void testGetHandlerName() { System.assertEquals('TestHandler', handler.getHandlerName(), 'handler name should match class name'); } // test virtual methods @isTest static void testVirtualMethods() { Oly_TriggerHandler h = new Oly_TriggerHandler(); h.beforeInsert(); h.beforeUpdate(); h.beforeDelete(); h.afterInsert(); h.afterUpdate(); h.afterDelete(); h.afterUndelete(); } /*************************************** * testing utilities ***************************************/ private static void resetTest() { lastMethodCalled = null; } // modes for testing private static void beforeInsertMode() { handler.setTriggerContext('before insert', true); } private static void beforeUpdateMode() { handler.setTriggerContext('before update', true); } private static void beforeDeleteMode() { handler.setTriggerContext('before delete', true); } private static void afterInsertMode() { handler.setTriggerContext('after insert', true); } private static void afterUpdateMode() { handler.setTriggerContext('after update', true); } private static void afterDeleteMode() { handler.setTriggerContext('after delete', true); } private static void afterUndeleteMode() { handler.setTriggerContext('after undelete', true); } // test implementation of the TriggerHandler private class TestHandler extends Oly_TriggerHandler { public override void beforeInsert() { Oly_TriggerHandler_Test.lastMethodCalled = 'beforeInsert'; } public override void beforeUpdate() { Oly_TriggerHandler_Test.lastMethodCalled = 'beforeUpdate'; } public override void beforeDelete() { Oly_TriggerHandler_Test.lastMethodCalled = 'beforeDelete'; } public override void afterInsert() { Oly_TriggerHandler_Test.lastMethodCalled = 'afterInsert'; } public override void afterUpdate() { Oly_TriggerHandler_Test.lastMethodCalled = 'afterUpdate'; } public override void afterDelete() { Oly_TriggerHandler_Test.lastMethodCalled = 'afterDelete'; } public override void afterUndelete() { Oly_TriggerHandler_Test.lastMethodCalled = 'afterUndelete'; } } }