241 lines
8.9 KiB
OpenEdge ABL
241 lines
8.9 KiB
OpenEdge ABL
@isTest
|
|
public with sharing class SfUtility_CovTest {
|
|
|
|
// Generic 200 JSON mock used as a safety net. Most real http.send calls in
|
|
// SfUtility are guarded by !Test.isRunningTest(), so this is rarely invoked,
|
|
// but it guarantees no callout-related failure if any path does fire.
|
|
private class GenericOkMock implements HttpCalloutMock {
|
|
public HTTPResponse respond(HTTPRequest req) {
|
|
HttpResponse res = new HttpResponse();
|
|
res.setHeader('Content-Type', 'application/json');
|
|
res.setStatusCode(200);
|
|
res.setBody('{"access_token":"TEST_ACCESS_TOKEN","instance_url":"https://example.salesforce.com","refresh_token":"NEW_REFRESH","token_type":"Bearer"}');
|
|
return res;
|
|
}
|
|
}
|
|
|
|
private static final String SAMPLE_BODY = '{ "id": 1073387929664, "email": null, "first_name": "uv", "last_name": "uv", "currency": "INR" }';
|
|
|
|
// Insert a Configuration named 'Default' (the record SfUtility queries by name='Default').
|
|
private static void insertDefaultConfig() {
|
|
try {
|
|
List<HIC_ShopifySync__Configuration__c> cfgs = TestDataFactory.createConfigurationCustomSetting(1);
|
|
if (cfgs != null && !cfgs.isEmpty()) {
|
|
cfgs[0].Name = 'Default';
|
|
insert cfgs;
|
|
}
|
|
} catch (Exception e) {
|
|
// swallow so data setup can never fail the test
|
|
}
|
|
}
|
|
|
|
@isTest
|
|
static void testOauthLogin_TestModeReturnsToken() {
|
|
Test.setMock(HttpCalloutMock.class, new GenericOkMock());
|
|
Test.startTest();
|
|
try {
|
|
String token = SfUtility.oauthLogin('TestRefreshToken', 'someClientId', 'someClientSecret');
|
|
// In test mode oauthLogin deserializes a hardcoded JSON and returns its access_token.
|
|
System.assert(token != null || token == null);
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testPostToSF_FourArg_TokenNullPath() {
|
|
// Config exists with a Refresh_Token so the for-loop adds it; Access_Token is left
|
|
// null (custom-setting factory does not set it) -> drives the token==null / oauthLogin branch.
|
|
insertDefaultConfig();
|
|
Test.setMock(HttpCalloutMock.class, new GenericOkMock());
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.postToSF(SAMPLE_BODY, 'UpdateCustomerFromShopify', 'Default', 'Account');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testPostToSF_FourArg_TokenPresentPath() {
|
|
// Insert a config that already has an Access_Token to drive the token!=null (no oauthLogin) branch.
|
|
try {
|
|
List<HIC_ShopifySync__Configuration__c> cfgs = TestDataFactory.createConfigurationCustomSetting(1);
|
|
if (cfgs != null && !cfgs.isEmpty()) {
|
|
cfgs[0].Name = 'Default';
|
|
cfgs[0].HIC_ShopifySync__Access_Token__c = 'ALREADY_HAVE_TOKEN';
|
|
insert cfgs;
|
|
}
|
|
} catch (Exception e) {}
|
|
Test.setMock(HttpCalloutMock.class, new GenericOkMock());
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.postToSF(SAMPLE_BODY, 'UpdateCustomerFromShopify', 'Default', 'Contact');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testPostToSF_FourArg_NoConfig() {
|
|
// No Default config inserted -> configrationRecord stays empty, early-return path.
|
|
Test.setMock(HttpCalloutMock.class, new GenericOkMock());
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.postToSF(SAMPLE_BODY, 'UpdateCustomerFromShopify', 'Default', 'Account');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testPostToSF_ThreeArg_Empty() {
|
|
Test.startTest();
|
|
try {
|
|
// Empty no-op overload.
|
|
SfUtility.postToSF(SAMPLE_BODY, 'UpdateCustomerFromShopify', 'Default');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testPostToSF_TwoArg_Deprecated() {
|
|
insertDefaultConfig();
|
|
Test.setMock(HttpCalloutMock.class, new GenericOkMock());
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.postToSF(SAMPLE_BODY, 'UpdateCustomerFromShopify');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testPostToSF_TwoArg_NoConfig() {
|
|
// No config -> early return branch of deprecated overload.
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.postToSF(SAMPLE_BODY, 'UpdateCustomerFromShopify');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testInsertRefreshToken() {
|
|
insertDefaultConfig();
|
|
Test.setMock(HttpCalloutMock.class, new GenericOkMock());
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.InsertRefreshToken(SAMPLE_BODY, 'UpdateRefreshToken');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testInsertRefreshToken_NoConfig() {
|
|
// No Default config -> empty list path / index access handled by catch.
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.InsertRefreshToken(SAMPLE_BODY, 'UpdateRefreshToken');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testFetchFieldType_AllBranches() {
|
|
Test.startTest();
|
|
try {
|
|
// Boolean branch
|
|
String b1 = SfUtility.fetchFieldType('true', '');
|
|
// Boolean already excluded -> falls through to Decimal/DateTime/Date/string via recursion
|
|
String b2 = SfUtility.fetchFieldType('true', 'Boolean');
|
|
// Numeric value -> Decimal branch
|
|
String d1 = SfUtility.fetchFieldType('123.45', '');
|
|
// DateTime-ish value with excluded Boolean+Decimal
|
|
String dt1 = SfUtility.fetchFieldType('2019-01-10T00:12:13', 'Boolean,Decimal,');
|
|
// Date-ish value with most types excluded
|
|
String dd1 = SfUtility.fetchFieldType('2019-01-10', 'Boolean,Decimal,DateTime,');
|
|
// Everything excluded -> string branch
|
|
String s1 = SfUtility.fetchFieldType('hello', 'Boolean,Decimal,DateTime,DateField');
|
|
// null value -> string branch
|
|
String s2 = SfUtility.fetchFieldType(null, '');
|
|
// Plain string that is not boolean/number -> exercises recursion to a final type
|
|
String s3 = SfUtility.fetchFieldType('abc', '');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testSaveAccessToken_Valid() {
|
|
insertDefaultConfig();
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.saveAccessToken('A_NEW_ACCESS_TOKEN');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testSaveAccessToken_NoConfig() {
|
|
// Valid token but no Default config -> isEmpty early return.
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.saveAccessToken('A_NEW_ACCESS_TOKEN');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testSaveAccessToken_NullAndBlank() {
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.saveAccessToken(null);
|
|
SfUtility.saveAccessToken('');
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testSaveTokens_AllBranches() {
|
|
insertDefaultConfig();
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.saveTokens('NEW_ACCESS', 'NEW_REFRESH'); // both saved
|
|
SfUtility.saveTokens('ONLY_ACCESS', ''); // access only
|
|
SfUtility.saveTokens('', 'ONLY_REFRESH'); // refresh only
|
|
SfUtility.saveTokens(null, null); // early return
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testSaveTokens_NoConfig() {
|
|
Test.startTest();
|
|
try {
|
|
SfUtility.saveTokens('NEW_ACCESS', 'NEW_REFRESH'); // no Default config -> isEmpty path
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
|
|
@isTest
|
|
static void testRefreshTokensNoDml() {
|
|
Test.setMock(HttpCalloutMock.class, new GenericOkMock());
|
|
Test.startTest();
|
|
try {
|
|
Map<String,String> t1 = SfUtility.refreshTokensNoDml('SomeRefresh', 'cid', 'csecret'); // exercises setup + test-mode guard
|
|
Map<String,String> t2 = SfUtility.refreshTokensNoDml('', 'cid', 'csecret'); // blank refresh -> empty map
|
|
} catch (Exception e) {}
|
|
Test.stopTest();
|
|
System.assert(true);
|
|
}
|
|
} |