Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Unique name for this workflow
name: Run Unit Tests

# Workflow starts when receiving custom event sent by CI workflow
on: [push, pull_request]

# Jobs to be executed
jobs:
deploy-and-test:
runs-on: ubuntu-latest

steps:
# Setup Node (for LWC tests)
- name: Setup NPM
uses: actions/setup-node@v1
with:
node-version: 16

# Install Salesforce CLI
- name: "Install Salesforce CLI"
run: npm install sfdx-cli --global

# Checkout the source code
- name: "Checkout source code"
uses: actions/checkout@v2

# Store secret for dev hub
- name: "Populate auth file with DEVHUB_SFDX_URL secret"
shell: bash
run: echo ${{ secrets.DEVHUB_SFDX_URL}} > ./DEVHUB_SFDX_URL.txt

# Authenticate dev hub
- name: "Authenticate Dev Hub"
run: sfdx auth:sfdxurl:store -f ./DEVHUB_SFDX_URL.txt -a devhub -d
#node_modules/sfdx-cli/bin/run force:auth:jwt:grant --clientid ${{ secrets.SALESFORCE_CONSUMER_KEY }} --jwtkeyfile server/server.key --username ${{ secrets.SALESFORCE_DEVHUB_USERNAME}} --setdefaultdevhubusername --setalias devhub

# Remove auth file
- name: "Remove auth file"
run: rm -f ./DEVHUB_SFDX_URL.txt

# Create scratch org
- name: "Create scratch org"
run: sfdx force:org:create -f config/project-scratch-def.json -a scratch-org -s -d 1

# Push source to scratch org
- name: "Push source to scratch org"
run: sfdx force:source:push

# Run Apex tests
- name: "Run apex tests"
run: sfdx force:apex:test:run -w 5

# Housekeeping
- name: "Delete scratch org"
if: always()
run: sfdx force:org:delete -p -u scratch-org
20 changes: 20 additions & 0 deletions config/project-scratch-def.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"orgName": "salonitinker",
"edition": "Developer",
"features": [],
"settings": {
"lightningExperienceSettings": {
"enableS1DesktopEnabled": true
},
"mobileSettings": {
"enableS1EncryptedStoragePref2": false
},
"userManagementSettings": {
"enableNewProfileUI": true
},
"contentSettings": {
"skipContentAssetTriggers": true,
"skipContentAssetTriggersOnDeploy": true
}
}
}
17 changes: 17 additions & 0 deletions force-app/main/default/classes/AccountTrigger.trigger
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
trigger AccountTrigger on Account (before insert, before update, before delete, after insert, after update, after delete, after undelete) {

if (Trigger.isAfter) {

if (Trigger.isInsert) {}

if (Trigger.isUpdate) {
//AccountTriggerEmailTesting.method(Trigger.new, Trigger.Old, Trigger.newMap, Trigger.oldMap);
AccountTriggerHandler.onAfterUpdate (Trigger.new, Trigger.Old, Trigger.newMap, Trigger.oldMap);
}

if (Trigger.isDelete) {}

if (Trigger.isUndelete) {}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexTrigger xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>50.0</apiVersion>
<status>Active</status>
</ApexTrigger>
38 changes: 38 additions & 0 deletions force-app/main/default/classes/AccountTriggerHandler.cls
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
public with sharing class AccountTriggerHandler {
public static void onAfterUpdate (List <Account> lstNewAccount, List <Account> lstOldAccount, Map <Id, Account> mapNewAccount, Map <Id, Account> mapOldAccount) {
sendEmailToOldOwnerOnAccountOwnerChange (lstNewAccount, mapOldAccount);
}

public static void sendEmailToOldOwnerOnAccountOwnerChange (List <Account> lstNewAccount, Map <Id, Account> mapOldAccount){

try {
Map <Id, List <String>> mapOldOwnerIdWithAccountNames = new Map <Id, List <String>> ();

for (Account objAccount : [ SELECT Id, Name, OwnerId FROM Account WHERE ID IN : lstNewAccount ]) { // => Storing account Names and Old Owner Id if Account Owner has been changed
Account objOldAccount = (Account) mapOldAccount.get(objAccount.ID);
if (objAccount.OwnerId != objOldAccount.OwnerId) {
if (!mapOldOwnerIdWithAccountNames.containsKey(objOldAccount.OwnerId))
mapOldOwnerIdWithAccountNames.put(objOldAccount.OwnerId, new List <String> ());
mapOldOwnerIdWithAccountNames.get(objOldAccount.OwnerId).add(objAccount.Name);
}
}

if (mapOldOwnerIdWithAccountNames.size() > 0) { // => Sending Email to the Old Owner if Account Owner has been changed
for (User objUsers : [ SELECT ID, Name, Email FROM User WHERE ID IN : mapOldOwnerIdWithAccountNames.keySet() ]) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setSubject('Account Owner Changed!');
String [] toAddresses = new String [] { objUsers.Email };
mail.setToAddresses(toAddresses);
List <String> lstChangedOwnersAccountNames = new List <String>();
lstChangedOwnersAccountNames.addAll(mapOldOwnerIdWithAccountNames.get(objUsers.Id));
mail.setPlainTextBody('Dear '+ objUsers.Name + ',\n\nOwner of the following Account(s) has been changed on ' + System.now().format('dd/MM/yyyy HH:mm:ss') + ':\n' + lstChangedOwnersAccountNames + '\n\nThank you!');//mapOldOwnerIdWithAccountName.values()
Messaging.sendEmail(new Messaging.Email[] { mail });
}
}
}

catch (Exception e) {
System.debug ('--- Exception in sendEmailToOldOwnerOnAccountOwnerChange --- ' + e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>50.0</apiVersion>
<status>Active</status>
</ApexClass>
55 changes: 55 additions & 0 deletions force-app/main/default/classes/AccountTriggerHandlerTest.cls
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
@isTest
public with sharing class AccountTriggerHandlerTest {
@TestSetup
static void makeData() {
Profile objProfile = [SELECT Id FROM Profile WHERE Name='Standard User'];

User objUser1 = new User(
Alias = 'Test',
LastName='User 1',
Email='TestUser1@gmail.com',
EmailEncodingKey='UTF-8',
LanguageLocaleKey='en_US',
LocaleSidKey='en_US',
ProfileId = objProfile.Id,
TimeZoneSidKey='America/Los_Angeles',
UserName='testuserforownerchange1@gmail.com'
);
insert objUser1;

User objUser2 = new User(
Alias = 'Test',
LastName='User 2',
Email='testuser2@gmail.com',
EmailEncodingKey='UTF-8',
LanguageLocaleKey='en_US',
LocaleSidKey='en_US',
ProfileId = objProfile.Id,
TimeZoneSidKey='America/Los_Angeles',
UserName='testuserforownerchange2@gmail.com'
);
insert objUser2;
}
@isTest
static void changeAccountOwner() {

Test.startTest();

List <User> lstUser = new List <User> ();

for (User objUser : [ SELECT Id FROM User LIMIT 2 ])
lstUser.add(objUser);

Account objAccount = new Account(
Name = 'Test Account',
OwnerId = lstUser[0].Id
);
insert objAccount;

objAccount.OwnerId = lstUser[1].Id;

update objAccount;

Test.stopTest();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>50.0</apiVersion>
<status>Active</status>
</ApexClass>
27 changes: 27 additions & 0 deletions server/server.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA8HD1wvg8/p9LKngDcfssb8+bJIpQPpIpWpnvfkeQUzTn/HT7
pkFPqwQRclxyAp9lkchW+cdp/PXTPlwSVBMezL2glyrCFK3SKnXPvk2OVnhcKpF/
9rKB6u4PWRQ1yXpCP7b+RawUILRm7Kq+feaiXnwJSRLG4e5hBuqSLJii/ahuWnjt
NfMKIrmyrIddOqxW3mZbwIpaqaZ1h/n2wJ2VFWt+pk59TngcJXeRIQOBmxjPzPTD
RLui1RiVzLBhVOHITg+Ba7bWeKUNxDkeClcnf7Um9mkgdA3urQYQdhghMomnrfZi
VFTHkemx8/rooYO+79WA0x43JwwH/UbDyGsoCwIDAQABAoIBAQCN+YWEzOPnTdQq
jZcrNK82jpYDa5Cagd/dWcwq+sLj/veFAOafcy1BxDMxHhlMJybogC2ra+7PqbBE
wEUqU+f56XbsDBlx8HmLDOnQaydDM+roT+YJm7pPKKbzaJWiFIkN6lYWedegwCWO
VfwJh6gUtpUdCvNY8VNlrBkIMFD+CdOwXf2G6Q+Ax3j/kzT9iX7lHqaiADKN+ATe
HlAAA5NyvNkGkKXori1/va7CXM4VLbjtyHvMvvTAqZSLzTvFF/Zf/TXH7w4IY4bg
OQO2CKdOWfOiHU03QyFf0zxM8TAHhEv4+qafL5CujoJdmiOmkr4ZcoKPZdTDPoqb
J4sZzn7BAoGBAPhsA8IavQigN8LwI3aAPaP6Zsv9BErGbWsJu1Cco0iszJZJfYdW
S6cAihovwrwPlxgxxDBg+wJ0GgvyekcWZ5kOnIxaGZWktSUKuM1akEGa7b05mzta
GwDOSeVlCYbp6jekeDYjZ2S+UFv60e58dUftqk3oTAnvD+cNV0syc1exAoGBAPfG
n08I6LkPTUDixWGLJJCGypMNy4u5tuYRd7mqtVSi1WtnI2lAqfL+q4Gor4yMIT0R
L0RHNy0unBgqWdQAFVFKaCLaQG1aTCGyjkzosVzlk+SY0u1QWeLNi1wIOOvObBsn
ap7PNFRngoUjzJRDk7g4m98CUOl73N2YX7tCZ+Z7AoGALCf+7wSTrzHTV4oZs5mN
21TJ6t5ZYfUtQ8ZiDi0ZdPSKFPiRIHo9TjzxT0BIC+d1gu5toe/LDh+W9aKvC223
EmSffO8S9x9kt2XVfWLom1Cvi1/u8LjObfE8/1JbRCjV4fgRCgZ2/Vg6rm7B2/Mx
YYykJd7xjR56JCah6pLYH7ECgYBC5z7c+GrejWMuwgzJ6ehVng/U5USw1dStCspp
N87+q3k1JwRIx00cb+efewzrxmqzMpCwvwoHCS7c15Kpy9v1t0GnJ4d9/4PPFYeW
/L3nd5YXg6xwp+GdfCLFFvNHuNU3/8yqVQisQcbcbG4xGo4okCCGdvmiEe/xZdNz
nNqxQQKBgBozQM9V77lokVyisEC58VMyKttn8mhOuFeHQBNQ2v6LISJSQnSMRrm+
I0SVX0TKf/WC0cf/HC7zfJOLVNKLzggmWU4DtGyyp33kDPIrW/izFxoDFHBOP4T8
XO2gFkFQI2CWjEj1t/62cHhSACXStInB18orK3qYX5ju2+Ph/WNE
-----END RSA PRIVATE KEY-----
11 changes: 11 additions & 0 deletions sfdx-project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"packageDirectories": [
{
"path": "force-app",
"default": true
}
],
"namespace": "",
"sfdcLoginUrl": "https://login.salesforce.com",
"sourceApiVersion": "51.0"
}