App developers can implement this interface to specify Apex code that runs automatically after a subscriber installs or upgrades a managed package. This makes it possible to customize the package install or upgrade, based on details of the subscriber’s organization. For instance, you can use the script to populate custom settings, create sample data, send an email to the installer, notify an external system, or kick off a batch operation to populate a new field across a large set of data.
The post install script is invoked after tests have been run, and is subject to default governor limits. It runs as a special system user that represents your package, so all operations performed by the script appear to be done by your package. You can access this user by using UserInfo. You will only see this user at runtime, not while running tests.
If the script fails, the install/upgrade is aborted. Any errors in the script are emailed to the user specified in the Notify on Apex Error field of the package. If no user is specified, the install/upgrade details will be unavailable.
global interface InstallHandler { void onInstall(InstallContext context) };
global interface InstallContext { ID organizationId(); ID installerId(); Boolean isUpgrade(); Boolean isPush(); Version previousVersion(); }
If the previous version is null, that is, the package is being installed for the first time, the script:
global class PostInstallClass implements InstallHandler { global void onInstall(InstallContext context) { if(context.previousVersion() == null) { Account a = new Account(name='Newco'); insert(a); Survey__c obj = new Survey__c(name='Client Satisfaction Survey'); insert obj; User u = [Select Id, Email from User where Id =:context.installerID()]; String toAddress= u.Email; String[] toAddresses = new String[]{toAddress}; Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); mail.setToAddresses(toAddresses); mail.setReplyTo('support@package.dev'); mail.setSenderDisplayName('My Package Support'); mail.setSubject('Package install successful'); mail.setPlainTextBody('Thanks for installing the package.'); Messaging.sendEmail(new Messaging.Email[] { mail }); } else if(context.previousVersion().compareTo(new Version(1,0)) == 0) { Survey__c obj = new Survey__c(name='Upgrading from Version 1.0'); insert(obj); } if(context.isUpgrade()) { Survey__c obj = new Survey__c(name='Sample Survey during Upgrade'); insert obj; } if(context.isPush()) { Survey__c obj = new Survey__c(name='Sample Survey during Push'); insert obj; } } }
@isTest static void testInstallScript() { PostInstallClass postinstall = new PostInstallClass(); Test.testInstall(postinstall, null); Test.testInstall(postinstall, new Version(1,0), true); List<Account> a = [Select id, name from Account where name ='Newco']; System.assertEquals(a.size(), 1, 'Account not found'); }