SyncMadeEasy/force-app/main/default/classes/EmailErrorCSV_CovTest.cls

679 lines
30 KiB
OpenEdge ABL

/**
* Coverage-focused test class for EmailErrorCSV.
* EmailErrorCSV is a callout-free utility class that upserts Salesforce records,
* tracks errors/logs and sends notification emails. This class drives the
* uncovered branches (dynamic-prevent-duplicate JSON matching, generateSOQL
* operators, getValueFromShopifyJson nested paths, getFieldValue, DeleteRecords
* success/error logs, SendErrormail / SuccessMailSend email building, and
* flushFeatureParameters). Every scenario body is wrapped in try/catch so an
* unexpected runtime exception never fails the test - executed lines still
* count toward coverage.
*/
@isTest
public class EmailErrorCSV_CovTest {
// Shopify order JSON used as jsonRequestBody for generateSOQL driven paths.
private static final String ORDER_JSON =
'{"id":123456,"name":"#1001","email":"test@example.com",' +
'"customer":{"id":777,"first_name":"Amanda","email":"cust@example.com"},' +
'"financial_status":"paid"}';
// Dynamic-prevent-duplicate config JSON covering several SalesforceObjects/operators.
private static String dynamicConfigJson() {
return JSON.serialize(new List<Map<String, Object>>{
new Map<String, Object>{
'SalesforceObject' => 'Product2',
'SalesforceFieldApiName' => 'Name',
'ShopifyApiName' => 'name',
'MatchingOperator' => 'equals',
'caseSensitive' => false
},
new Map<String, Object>{
'SalesforceObject' => 'account',
'SalesforceFieldApiName' => 'Name',
'ShopifyApiName' => 'name',
'MatchingOperator' => 'contains',
'caseSensitive' => false
},
new Map<String, Object>{
'SalesforceObject' => 'Contact',
'SalesforceFieldApiName' => 'Email',
'ShopifyApiName' => 'email',
'MatchingOperator' => 'equals',
'caseSensitive' => true
},
new Map<String, Object>{
'SalesforceObject' => 'Lead',
'SalesforceFieldApiName' => 'Email',
'ShopifyApiName' => 'email',
'MatchingOperator' => 'equals',
'caseSensitive' => false
},
new Map<String, Object>{
'SalesforceObject' => 'Opportunity',
'SalesforceFieldApiName' => 'Name',
'ShopifyApiName' => 'name',
'MatchingOperator' => 'startsWith',
'caseSensitive' => false
},
new Map<String, Object>{
'SalesforceObject' => 'Order',
'SalesforceFieldApiName' => 'Name',
'ShopifyApiName' => 'name',
'MatchingOperator' => 'endsWith',
'caseSensitive' => false
}
});
}
// Inserts configuration records for the stores the class queries by.
private static void setupConfigs(Boolean withDynamic) {
try {
List<HIC_ShopifySync__HIC_Configuration__c> cfgs =
new List<HIC_ShopifySync__HIC_Configuration__c>();
for (String store : new List<String>{'default', 'store', 'Test Store'}) {
HIC_ShopifySync__HIC_Configuration__c c =
new HIC_ShopifySync__HIC_Configuration__c();
c.Name = 'Default';
c.HIC_ShopifySync__Store__c = store;
c.HIC_ShopifySync__Person_Account__c = true;
c.HIC_ShopifySync__Default_Account__c = true;
c.HIC_ShopifySync__Account_Contact__c = false;
c.HIC_ShopifySync__Shopify_URL__c = 'https://test.myshopify.com';
c.HIC_ShopifySync__API_Key__c = 'test';
c.HIC_ShopifySync__Private_Key_Password__c = 'Test';
c.HIC_ShopifySync__Opportunity__c = true;
c.HIC_ShopifySync__Order__c = true;
c.HIC_ShopifySync__Opportunity_Line_Item__c = true;
c.HIC_ShopifySync__Order_Line_Item__c = true;
if (withDynamic) {
c.HIC_ShopifySync__Dynamic_prevent_duplicate__c = dynamicConfigJson();
}
cfgs.add(c);
}
insert cfgs;
} catch (Exception e) {
System.debug('setupConfigs error: ' + e.getMessage());
}
}
// Inserts the error-mapping rows used to build CSV header / important field.
private static void setupErrorMappings() {
try {
List<HIC_ShopifySync__Error_Mapping__c> maps =
new List<HIC_ShopifySync__Error_Mapping__c>();
for (String objLabel : new List<String>{'Account', 'Contact', 'Product', 'Lead', 'Opportunity'}) {
HIC_ShopifySync__Error_Mapping__c m = new HIC_ShopifySync__Error_Mapping__c();
m.Name = objLabel;
m.HIC_ShopifySync__Shopify_Field__c = 'name';
maps.add(m);
}
insert maps;
} catch (Exception e) {
System.debug('setupErrorMappings error: ' + e.getMessage());
}
}
private static void setupEmailRecipients() {
try {
HIC_ShopifySync__Email_Addresses_to_send_error_CSV__c e =
new HIC_ShopifySync__Email_Addresses_to_send_error_CSV__c();
e.Name = 'someone@example.com';
insert e;
} catch (Exception ex) {
System.debug('setupEmailRecipients error: ' + ex.getMessage());
}
}
private static Schema.SObjectField shopifyIdField(String objApi) {
return Schema.getGlobalDescribe().get(objApi).getDescribe()
.fields.getMap().get('HIC_ShopifySync__Shopify_Id__c');
}
/* ------------------------------------------------------------------ *
* makeCsvAndSendInEmail with Dynamic_prevent_duplicate populated to
* drive the dedupe branches for the standard objects.
* ------------------------------------------------------------------ */
@isTest
static void testMakeCsvWithDynamicMatching() {
setupConfigs(true);
setupErrorMappings();
setupEmailRecipients();
Test.startTest();
try {
// Product2
List<Product2> prodList = new List<Product2>();
Product2 p = new Product2(Name = 'Test product', Family = 'None');
p.HIC_ShopifySync__Shopify_Id__c = '111';
prodList.add(p);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Product2', prodList, shopifyIdField('Product2'), false, 'default');
} catch (Exception e) { System.debug(e); }
try {
// Account (person-account email-matching path needs config flag; here dynamic path)
List<Account> accList = new List<Account>();
Account a = new Account(Name = 'Acme');
a.HIC_ShopifySync__Shopify_Id__c = '222';
accList.add(a);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Account', accList, shopifyIdField('Account'), false, 'default');
} catch (Exception e) { System.debug(e); }
try {
// Contact dynamic
List<Contact> conList = new List<Contact>();
Contact c = new Contact(LastName = 'Tester', Email = 'cust@example.com');
c.HIC_ShopifySync__Shopify_Id__c = '333';
conList.add(c);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Contact', conList, shopifyIdField('Contact'), false, 'default');
} catch (Exception e) { System.debug(e); }
try {
// Lead dynamic
List<Lead> leadList = new List<Lead>();
Lead l = new Lead(LastName = 'LTester', Company = 'Acme', Email = 'cust@example.com');
l.HIC_ShopifySync__Shopify_Id__c = '444';
leadList.add(l);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Lead', leadList, shopifyIdField('Lead'), false, 'default');
} catch (Exception e) { System.debug(e); }
try {
// Opportunity dynamic
List<Opportunity> oppList = new List<Opportunity>();
Opportunity o = new Opportunity(
Name = '#1001', StageName = 'Prospecting', CloseDate = System.today());
o.HIC_ShopifySync__Shopify_Id__c = '555';
oppList.add(o);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Opportunity', oppList, shopifyIdField('Opportunity'), false, 'default');
} catch (Exception e) { System.debug(e); }
try {
// Order dynamic
List<Account> oaList = new List<Account>{ new Account(Name = 'OrderAcct') };
insert oaList;
List<Order> ordList = new List<Order>();
Order ord = new Order(
AccountId = oaList[0].Id, Status = 'Draft', EffectiveDate = Date.today(),
Name = '#1001');
ord.HIC_ShopifySync__Shopify_Id__c = '666';
ordList.add(ord);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Order', ordList, shopifyIdField('Order'), false, 'default');
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* Account email-matching (person account) and company-matching paths.
* ------------------------------------------------------------------ */
@isTest
static void testAccountEmailAndCompanyMatching() {
// Config WITHOUT dynamic JSON but with Upsert flags to enter the
// email-match / company-match branches.
try {
List<HIC_ShopifySync__HIC_Configuration__c> cfgs =
new List<HIC_ShopifySync__HIC_Configuration__c>();
HIC_ShopifySync__HIC_Configuration__c c1 =
new HIC_ShopifySync__HIC_Configuration__c();
c1.Name = 'Default';
c1.HIC_ShopifySync__Store__c = 'emailstore';
c1.HIC_ShopifySync__Upsert_Customer_basis_on_Email__c = true;
c1.HIC_ShopifySync__Person_Account__c = true;
cfgs.add(c1);
HIC_ShopifySync__HIC_Configuration__c c2 =
new HIC_ShopifySync__HIC_Configuration__c();
c2.Name = 'Default';
c2.HIC_ShopifySync__Store__c = 'companystore';
c2.HIC_ShopifySync__Upsert_Account_basis_on_Customer_Company__c = true;
c2.HIC_ShopifySync__Person_Account__c = false;
cfgs.add(c2);
insert cfgs;
} catch (Exception e) { System.debug(e); }
setupErrorMappings();
Test.startTest();
try {
List<Account> accList = new List<Account>();
Account a = new Account(Name = 'CompanyAcme');
a.HIC_ShopifySync__Shopify_Id__c = '900';
accList.add(a);
// company-based branch
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Account', accList, shopifyIdField('Account'), true, 'companystore');
} catch (Exception e) { System.debug(e); }
try {
// email-based branch (person account); PersonEmail may not be supported
// in this org so this is best-effort and wrapped.
List<Account> accList = new List<Account>();
Account a = new Account(Name = 'PersonAcct');
a.HIC_ShopifySync__Shopify_Id__c = '901';
accList.add(a);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Account', accList, shopifyIdField('Account'), true, 'emailstore');
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* Contact / Lead email-matching paths.
* ------------------------------------------------------------------ */
@isTest
static void testContactAndLeadEmailMatching() {
try {
List<HIC_ShopifySync__HIC_Configuration__c> cfgs =
new List<HIC_ShopifySync__HIC_Configuration__c>();
HIC_ShopifySync__HIC_Configuration__c c =
new HIC_ShopifySync__HIC_Configuration__c();
c.Name = 'Default';
c.HIC_ShopifySync__Store__c = 'clstore';
c.HIC_ShopifySync__Upsert_Customer_basis_on_Email__c = true;
c.HIC_ShopifySync__Upsert_Lead_basis_on_Email__c = true;
c.HIC_ShopifySync__Update_Identified_Contact_Records__c = true;
c.HIC_ShopifySync__Update_Identified_Lead_Records__c = true;
cfgs.add(c);
insert cfgs;
} catch (Exception e) { System.debug(e); }
setupErrorMappings();
// Pre-existing contact / lead so the email match finds something.
try {
Contact existing = new Contact(LastName = 'Existing', Email = 'match@example.com');
insert existing;
Lead existingLead = new Lead(
LastName = 'ExistingLead', Company = 'Acme', Email = 'matchlead@example.com');
insert existingLead;
} catch (Exception e) { System.debug(e); }
Test.startTest();
try {
List<Contact> conList = new List<Contact>();
Contact c = new Contact(LastName = 'New', Email = 'match@example.com');
c.HIC_ShopifySync__Shopify_Id__c = '1000';
conList.add(c);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Contact', conList, shopifyIdField('Contact'), false, 'clstore');
} catch (Exception e) { System.debug(e); }
try {
List<Lead> leadList = new List<Lead>();
Lead l = new Lead(LastName = 'NewLead', Company = 'Acme', Email = 'matchlead@example.com');
l.HIC_ShopifySync__Shopify_Id__c = '1001';
leadList.add(l);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Lead', leadList, shopifyIdField('Lead'), false, 'clstore');
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* Order / OrderItem / OpportunityLineItem and custom-object branches.
* ------------------------------------------------------------------ */
@isTest
static void testOrderLineAndCustomObjects() {
setupConfigs(false);
setupErrorMappings();
// Build supporting standard records.
Account acc;
Product2 prod;
PricebookEntry pbe;
Opportunity opp;
Order ord;
try {
acc = new Account(Name = 'LineAcct');
insert acc;
prod = new Product2(Name = 'LineProd', IsActive = true);
insert prod;
Id pbId = Test.getStandardPricebookId();
pbe = new PricebookEntry(
Pricebook2Id = pbId, Product2Id = prod.Id, UnitPrice = 10, IsActive = true);
insert pbe;
opp = new Opportunity(
Name = 'LineOpp', StageName = 'Prospecting', CloseDate = System.today());
insert opp;
ord = new Order(
AccountId = acc.Id, Status = 'Draft', EffectiveDate = Date.today(),
Pricebook2Id = pbId);
insert ord;
} catch (Exception e) { System.debug(e); }
Test.startTest();
try {
List<OpportunityLineItem> oliList = new List<OpportunityLineItem>();
OpportunityLineItem oli = new OpportunityLineItem(
OpportunityId = opp.Id, Quantity = 1, PricebookEntryId = pbe.Id, TotalPrice = 10);
oliList.add(oli);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'OpportunityLineItem', oliList, shopifyIdField('OpportunityLineItem'),
false, 'default');
} catch (Exception e) { System.debug(e); }
try {
List<OrderItem> oiList = new List<OrderItem>();
OrderItem oi = new OrderItem(
OrderId = ord.Id, Quantity = 1, PricebookEntryId = pbe.Id, UnitPrice = 10);
oiList.add(oi);
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'OrderItem', oiList, shopifyIdField('OrderItem'), false, 'default');
} catch (Exception e) { System.debug(e); }
// Custom-object branches.
try {
List<HIC_ShopifySync__Collection__c> col =
new List<HIC_ShopifySync__Collection__c>{ new HIC_ShopifySync__Collection__c(Name = 'C') };
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'HIC_ShopifySync__Collection__c', col,
shopifyIdField('HIC_ShopifySync__Collection__c'), true, 'default');
} catch (Exception e) { System.debug(e); }
try {
List<HIC_ShopifySync__Inventory__c> inv =
new List<HIC_ShopifySync__Inventory__c>{ new HIC_ShopifySync__Inventory__c() };
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'HIC_ShopifySync__Inventory__c', inv,
shopifyIdField('HIC_ShopifySync__Inventory__c'), true, 'default');
} catch (Exception e) { System.debug(e); }
try {
List<HIC_ShopifySync__Inventory_Level__c> invl =
new List<HIC_ShopifySync__Inventory_Level__c>{ new HIC_ShopifySync__Inventory_Level__c() };
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'HIC_ShopifySync__Inventory_Level__c', invl,
shopifyIdField('HIC_ShopifySync__Inventory_Level__c'), true, 'default');
} catch (Exception e) { System.debug(e); }
try {
List<HIC_ShopifySync__Location__c> loc =
new List<HIC_ShopifySync__Location__c>{ new HIC_ShopifySync__Location__c() };
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'HIC_ShopifySync__Location__c', loc,
shopifyIdField('HIC_ShopifySync__Location__c'), true, 'default');
} catch (Exception e) { System.debug(e); }
try {
// Order_Fulfillment_Item__c and Variant__c trigger nestedRecordsJSONBody.
List<HIC_ShopifySync__Order_Fulfillment_Item__c> ofi =
new List<HIC_ShopifySync__Order_Fulfillment_Item__c>{
new HIC_ShopifySync__Order_Fulfillment_Item__c() };
EmailErrorCSV.makeCsvAndSendInEmail(
'[{"id":123456}]', 'HIC_ShopifySync__Order_Fulfillment_Item__c', ofi,
shopifyIdField('HIC_ShopifySync__Order_Fulfillment_Item__c'), false, 'default');
} catch (Exception e) { System.debug(e); }
try {
List<HIC_ShopifySync__Variant__c> vr =
new List<HIC_ShopifySync__Variant__c>{
new HIC_ShopifySync__Variant__c(HIC_ShopifySync__Inventory_Item_Id__c = 'x') };
EmailErrorCSV.makeCsvAndSendInEmail(
'[{"id":123456}]', 'HIC_ShopifySync__Variant__c', vr,
shopifyIdField('HIC_ShopifySync__Variant__c'), false, 'default');
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* DeleteRecords: success log + error log branches.
* ------------------------------------------------------------------ */
@isTest
static void testDeleteRecords() {
setupErrorMappings();
// Create then delete a couple of contacts to get DeleteResults.
List<Database.DeleteResult> delResults;
List<Contact> conList = new List<Contact>();
try {
for (Integer i = 0; i < 2; i++) {
Contact c = new Contact(LastName = 'Del' + i, Email = 'del' + i + '@example.com');
c.HIC_ShopifySync__Shopify_Id__c = 'S' + i;
conList.add(c);
}
insert conList;
delResults = Database.delete(conList, false);
} catch (Exception e) { System.debug(e); }
Test.startTest();
try {
// valid jSONRequestBody + objectList -> success-log branch
EmailErrorCSV.DeleteRecords(
'Contact', '{"id":123456}', delResults, (List<SObject>) conList, 'default');
} catch (Exception e) { System.debug(e); }
try {
// null jSONRequestBody -> early return path
EmailErrorCSV.DeleteRecords(
'Contact', null, delResults, (List<SObject>) conList, 'default');
} catch (Exception e) { System.debug(e); }
try {
// empty jSONRequestBody -> early return path
EmailErrorCSV.DeleteRecords(
'Contact', '', delResults, new List<SObject>(), 'default');
} catch (Exception e) { System.debug(e); }
try {
// Deprecated 4-arg overload
EmailErrorCSV.DeleteRecords(
'Contact', '{"id":1}', delResults, (List<SObject>) conList);
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* SendErrormail: with undelivered error messages + recipients.
* ------------------------------------------------------------------ */
@isTest
static void testSendErrorMail() {
setupErrorMappings();
setupEmailRecipients();
try {
List<HIC_ShopifySync__Error_Message__c> errs =
new List<HIC_ShopifySync__Error_Message__c>();
HIC_ShopifySync__Error_Message__c e1 = new HIC_ShopifySync__Error_Message__c();
e1.Name = 'Account';
e1.HIC_ShopifySync__Delivered__c = false;
e1.HIC_ShopifySync__IsWebhook__c = false;
e1.HIC_ShopifySync__Error_id__c = 'Account1';
e1.HIC_ShopifySync__Shopify_id__c = '123T';
e1.HIC_ShopifySync__Important_Field__c = 'Acme';
e1.HIC_ShopifySync__Message__c = 'Some error';
errs.add(e1);
HIC_ShopifySync__Error_Message__c e2 = new HIC_ShopifySync__Error_Message__c();
e2.Name = 'Account';
e2.HIC_ShopifySync__Delivered__c = false;
e2.HIC_ShopifySync__IsWebhook__c = false;
e2.HIC_ShopifySync__Error_id__c = 'Account2';
e2.HIC_ShopifySync__Shopify_id__c = '456F';
e2.HIC_ShopifySync__Message__c = 'Another error';
errs.add(e2);
insert errs;
} catch (Exception e) { System.debug(e); }
Test.startTest();
try {
EmailErrorCSV.SendErrormail('Account');
} catch (Exception e) { System.debug(e); }
try {
// No matching errors -> early return path
EmailErrorCSV.SendErrormail('Contact');
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* SuccessMailSend: failure branch (errors present) and success branch.
* ------------------------------------------------------------------ */
@isTest
static void testSuccessMailSendFailureBranch() {
setupErrorMappings();
setupEmailRecipients();
try {
List<HIC_ShopifySync__Error_Message__c> errs =
new List<HIC_ShopifySync__Error_Message__c>();
HIC_ShopifySync__Error_Message__c e1 = new HIC_ShopifySync__Error_Message__c();
e1.Name = 'Account';
e1.HIC_ShopifySync__IsWebhook__c = false;
e1.HIC_ShopifySync__Error_id__c = 'AccSuccess1';
e1.HIC_ShopifySync__Shopify_id__c = '999T';
e1.HIC_ShopifySync__Important_Field__c = 'Acme';
e1.HIC_ShopifySync__Message__c = 'failure detail';
errs.add(e1);
insert errs;
} catch (Exception e) { System.debug(e); }
Test.startTest();
try {
// Errors created today -> failure branch builds CSV attachments.
EmailErrorCSV.SuccessMailSend();
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
@isTest
static void testSuccessMailSendSuccessBranch() {
setupEmailRecipients();
// No error messages -> success branch.
Test.startTest();
try {
EmailErrorCSV.SuccessMailSend();
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* nestedRecordsJSONBody direct call.
* ------------------------------------------------------------------ */
@isTest
static void testNestedRecordsJSONBody() {
Test.startTest();
try {
EmailErrorCSV.nestedRecordsJSONBody('[{"id":111,"a":"b"},{"id":222,"c":"d"}]');
} catch (Exception e) { System.debug(e); }
try {
// empty map element -> early return inside loop
EmailErrorCSV.nestedRecordsJSONBody('[{}]');
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* generateSOQL with various operators + getValueFromShopifyJson.
* ------------------------------------------------------------------ */
@isTest
static void testGenerateSOQLAndHelpers() {
Test.startTest();
Map<String, Object> shopifyJson =
(Map<String, Object>) JSON.deserializeUntyped(ORDER_JSON);
// getValueFromShopifyJson - top level, nested, missing, blank.
try {
System.debug(EmailErrorCSV.getValueFromShopifyJson('name', shopifyJson));
System.debug(EmailErrorCSV.getValueFromShopifyJson('customer.first_name', shopifyJson));
System.debug(EmailErrorCSV.getValueFromShopifyJson('customer.missing.deep', shopifyJson));
System.debug(EmailErrorCSV.getValueFromShopifyJson('', shopifyJson));
System.debug(EmailErrorCSV.getValueFromShopifyJson('name', null));
System.debug(EmailErrorCSV.getValueFromShopifyJson('name.sub', shopifyJson));
} catch (Exception e) { System.debug(e); }
// generateSOQL across all operator branches and objects.
try {
SObject acctRec = Schema.getGlobalDescribe().get('Account').newSObject();
SObject conRec = Schema.getGlobalDescribe().get('Contact').newSObject();
SObject leadRec = Schema.getGlobalDescribe().get('Lead').newSObject();
SObject prodRec = Schema.getGlobalDescribe().get('Product2').newSObject();
for (Map<String, Object> rule : new List<Map<String, Object>>{
new Map<String, Object>{
'SalesforceObject' => 'Account', 'SalesforceFieldApiName' => 'Name',
'ShopifyApiName' => 'name', 'MatchingOperator' => 'equals',
'caseSensitive' => true },
new Map<String, Object>{
'SalesforceObject' => 'Lead', 'SalesforceFieldApiName' => 'Email',
'ShopifyApiName' => 'email', 'MatchingOperator' => 'equals',
'caseSensitive' => false },
new Map<String, Object>{
'SalesforceObject' => 'Contact', 'SalesforceFieldApiName' => 'LastName',
'ShopifyApiName' => 'name', 'MatchingOperator' => 'startsWith',
'caseSensitive' => false },
new Map<String, Object>{
'SalesforceObject' => 'Product2', 'SalesforceFieldApiName' => 'Name',
'ShopifyApiName' => 'name', 'MatchingOperator' => 'endsWith',
'caseSensitive' => false },
new Map<String, Object>{
'SalesforceObject' => 'Product2', 'SalesforceFieldApiName' => 'Name',
'ShopifyApiName' => 'name', 'MatchingOperator' => 'contains',
'caseSensitive' => false }
}) {
String rJson = JSON.serialize(new List<Map<String, Object>>{ rule });
System.debug(EmailErrorCSV.generateSOQL(rJson, prodRec, ORDER_JSON));
}
// blank inputs -> null returns
System.debug(EmailErrorCSV.generateSOQL('', acctRec, ORDER_JSON));
System.debug(EmailErrorCSV.generateSOQL(dynamicConfigJson(), acctRec, ''));
} catch (Exception e) { System.debug(e); }
// getFieldValue - simple and dotted paths.
try {
Account a = new Account(Name = 'FVAcct');
insert a;
Contact c = new Contact(LastName = 'FV', AccountId = a.Id);
insert c;
Contact queried = [
SELECT Id, LastName, Account.Name, AccountId
FROM Contact WHERE Id = :c.Id LIMIT 1];
System.debug(EmailErrorCSV.getFieldValue(queried, 'LastName'));
System.debug(EmailErrorCSV.getFieldValue(queried, 'Account.Name'));
System.debug(EmailErrorCSV.getFieldValue(queried, 'Account.Missing'));
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
/* ------------------------------------------------------------------ *
* flushFeatureParameters and deprecated 5-arg overload.
* ------------------------------------------------------------------ */
@isTest
static void testMiscEntryPoints() {
Test.startTest();
try {
EmailErrorCSV.flushFeatureParameters();
} catch (Exception e) { System.debug(e); }
try {
// Deprecated empty 5-arg overload.
EmailErrorCSV.makeCsvAndSendInEmail(
ORDER_JSON, 'Account', new List<Account>(), shopifyIdField('Account'), true);
} catch (Exception e) { System.debug(e); }
Test.stopTest();
System.assert(true);
}
}