1@IsTest
2public with sharing class ConcurTestClass {
3
4 private static final String OAUTH_TOKEN = 'testToken';
5 private static final String STATE = 'mocktestState';
6 private static final String REFRESH_TOKEN = 'refreshToken';
7 private static final String LOGIN_ID = 'testLoginId';
8 private static final String USERNAME = 'testUsername';
9 private static final String FIRST_NAME = 'testFirstName';
10 private static final String LAST_NAME = 'testLastName';
11 private static final String EMAIL_ADDRESS = 'testEmailAddress';
12 private static final String LOCALE_NAME = 'testLocalName';
13 private static final String FULL_NAME = FIRST_NAME + ' ' + LAST_NAME;
14 private static final String PROVIDER = 'Concur';
15 private static final String REDIRECT_URL = 'http://localhost/services/authcallback/orgId/Concur';
16 private static final String KEY = 'testKey';
17 private static final String SECRET = 'testSecret';
18 private static final String STATE_TO_PROPOGATE = 'testState';
19 private static final String ACCESS_TOKEN_URL = 'http://www.dummyhost.com/accessTokenUri';
20 private static final String API_USER_VERSION_URL = 'http://www.dummyhost.com/user/20/1';
21 private static final String AUTH_URL = 'http://www.dummy.com/authurl';
22 private static final String API_USER_URL = 'www.concursolutions.com/user/api';
23
24 // in the real world scenario , the key and value would be read from the (custom fields in) custom metadata type record
25 private static Map<String,String> setupAuthProviderConfig () {
26 Map<String,String> authProviderConfiguration = new Map<String,String>();
27 authProviderConfiguration.put('Key__c', KEY);
28 authProviderConfiguration.put('Auth_Url__c', AUTH_URL);
29 authProviderConfiguration.put('Secret__c', SECRET);
30 authProviderConfiguration.put('Access_Token_Url__c', ACCESS_TOKEN_URL);
31 authProviderConfiguration.put('API_User_Url__c',API_USER_URL);
32 authProviderConfiguration.put('API_User_Version_Url__c',API_USER_VERSION_URL);
33 authProviderConfiguration.put('Redirect_Url__c',REDIRECT_URL);
34 return authProviderConfiguration;
35
36 }
37
38 @IsTest
39 static void testInitiateMethod() {
40 String stateToPropogate = 'mocktestState';
41 Map<String,String> authProviderConfiguration = setupAuthProviderConfig();
42 Concur concurCls = new Concur();
43 concurCls.redirectUrl = authProviderConfiguration.get('Redirect_Url__c');
44
45 PageReference expectedUrl = new PageReference(authProviderConfiguration.get('Auth_Url__c') + '?client_id='+
46 authProviderConfiguration.get('Key__c') +'&scope=USER,EXPRPT,LIST&redirect_uri='+
47 authProviderConfiguration.get('Redirect_Url__c') + '&state=' +
48 STATE_TO_PROPOGATE);
49 PageReference actualUrl = concurCls.initiate(authProviderConfiguration, STATE_TO_PROPOGATE);
50 Assert.areEqual(expectedUrl.getUrl(), actualUrl.getUrl());
51 }
52
53 @IsTest
54 static void testHandleCallback() {
55 Map<String,String> authProviderConfiguration = setupAuthProviderConfig();
56 Concur concurCls = new Concur();
57 concurCls.redirectUrl = authProviderConfiguration.get('Redirect_Url_c');
58
59 Test.setMock(HttpCalloutMock.class, new ConcurMockHttpResponseGenerator());
60
61 Map<String,String> queryParams = new Map<String,String>();
62 queryParams.put('code','code');
63 queryParams.put('state',authProviderConfiguration.get('State_c'));
64 Auth.AuthProviderCallbackState cbState = new Auth.AuthProviderCallbackState(null,null,queryParams);
65 Auth.AuthProviderTokenResponse actualAuthProvResponse = concurCls.handleCallback(authProviderConfiguration, cbState);
66 Auth.AuthProviderTokenResponse expectedAuthProvResponse = new Auth.AuthProviderTokenResponse('Concur', OAUTH_TOKEN, REFRESH_TOKEN, null);
67
68 Assert.areEqual(expectedAuthProvResponse.provider, actualAuthProvResponse.provider);
69 Assert.areEqual(expectedAuthProvResponse.oauthToken, actualAuthProvResponse.oauthToken);
70 Assert.areEqual(expectedAuthProvResponse.oauthSecretOrRefreshToken, actualAuthProvResponse.oauthSecretOrRefreshToken);
71 Assert.areEqual(expectedAuthProvResponse.state, actualAuthProvResponse.state);
72
73
74 }
75
76
77 @IsTest
78 static void testGetUserInfo() {
79 Map<String,String> authProviderConfiguration = setupAuthProviderConfig();
80 Concur concurCls = new Concur();
81
82 Test.setMock(HttpCalloutMock.class, new ConcurMockHttpResponseGenerator());
83
84 Auth.AuthProviderTokenResponse response = new Auth.AuthProviderTokenResponse(PROVIDER, OAUTH_TOKEN ,'sampleOauthSecret', STATE);
85 Auth.UserData actualUserData = concurCls.getUserInfo(authProviderConfiguration, response) ;
86
87 Map<String,String> provMap = new Map<String,String>();
88 provMap.put('key1', 'value1');
89 provMap.put('key2', 'value2');
90
91 Auth.UserData expectedUserData = new Auth.UserData(LOGIN_ID, FIRST_NAME, LAST_NAME, FULL_NAME, EMAIL_ADDRESS,
92 null, LOCALE_NAME, null, PROVIDER, null, provMap);
93
94 Assert.isNotNull(expectedUserData);
95 Assert.areEqual(expectedUserData.firstName, actualUserData.firstName);
96 Assert.areEqual(expectedUserData.lastName, actualUserData.lastName);
97 Assert.areEqual(expectedUserData.fullName, actualUserData.fullName);
98 Assert.areEqual(expectedUserData.email, actualUserData.email);
99 Assert.areEqual(expectedUserData.username, actualUserData.username);
100 Assert.areEqual(expectedUserData.locale, actualUserData.locale);
101 Assert.areEqual(expectedUserData.provider, actualUserData.provider);
102 Assert.areEqual(expectedUserData.siteLoginUrl, actualUserData.siteLoginUrl);
103 }
104
105
106 // implementing a mock http response generator for concur
107 public with sharing class ConcurMockHttpResponseGenerator implements HttpCalloutMock {
108 public HTTPResponse respond(HTTPRequest req) {
109 String namespace = API_USER_VERSION_URL;
110 String prefix = 'mockPrefix';
111
112 Dom.Document doc = new Dom.Document();
113 Dom.XmlNode xmlNode = doc.createRootElement('mockRootNodeName', namespace, prefix);
114 xmlNode.addChildElement('LoginId', namespace, prefix).addTextNode(LOGIN_ID);
115 xmlNode.addChildElement('FirstName', namespace, prefix).addTextNode(FIRST_NAME);
116 xmlNode.addChildElement('LastName', namespace, prefix).addTextNode(LAST_NAME);
117 xmlNode.addChildElement('EmailAddress', namespace, prefix).addTextNode(EMAIL_ADDRESS);
118 xmlNode.addChildElement('LocaleName', namespace, prefix).addTextNode(LOCALE_NAME);
119 xmlNode.addChildElement('AccessToken', null, null).addTextNode(OAUTH_TOKEN);
120 xmlNode.addChildElement('RefreshToken', null, null).addTextNode(REFRESH_TOKEN);
121 System.debug(doc.toXmlString());
122 // Create a fake response
123 HttpResponse res = new HttpResponse();
124 res.setHeader('Content-Type', 'application/xml');
125 res.setBody(doc.toXmlString());
126 res.setStatusCode(200);
127 return res;
128 }
129
130 }
131}