@getjones/test-infra 2.13.1 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getjones/test-infra",
3
- "version": "2.13.1",
3
+ "version": "2.14.0",
4
4
  "description": "Providing internal and openapi interface",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ ACTIVE: 'Active',
3
+ ARCHIVED: 'Archived',
4
+ DRAFT: 'Draft',
5
+ DELETED: 'Deleted'
6
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ tenantSolution: {
3
+ on: { tenantSolution: true },
4
+ off: { tenantSolution: false }
5
+ }
6
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ UNKNOWN: 'UNKNOWN'
3
+ };
@@ -41,6 +41,10 @@ const attributeNames = {
41
41
  perLocation: 'Per Location',
42
42
  eachOccurrence: 'Each Occurrence',
43
43
  generalAggregate: 'General Aggregate',
44
+ noticeOfCancelation: 'Notice of Cancellation',
45
+ noticeOfCancelationEndorsement: 'Notice of Cancellation Endorsement',
46
+ occurrenceBasis: 'Occurrence Basis',
47
+ perProjectAggregate: 'Per Project Aggregate',
44
48
  occur: 'Occur',
45
49
  text: 'text',
46
50
  limit: 'limit',
@@ -11,6 +11,7 @@ const requests = require('../../saas/internal-api/requests');
11
11
 
12
12
  const { complianceStatuses, getAuditConfigByStatus } = require('../../common/utils/complianceUtil');
13
13
  const httpResponseStatusCodes = require('../../common/httpResponseStatusCodes.json');
14
+ const activationStatuses = require('../../common/consts/activationStatuses');
14
15
  const timeUtils = require('../../common/utils/timeUtils');
15
16
 
16
17
  const filePath = path.join(__dirname, '../../resources/coi/coi.pdf');
@@ -135,6 +136,40 @@ const prepareAwaitingNewCoiRecord = async (recordCompany, recordEmail, tabId, re
135
136
  const prepareUnderReviewRecord = (recordCompany, recordEmail, tabId, requirementId, context, { recordConfig } = {}) => {
136
137
  return prepareRecord(recordCompany, recordEmail, complianceStatuses.underReview, tabId, requirementId, context, { recordConfig });
137
138
  };
139
+ const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail, requirementId, uploadCoi } = {}) => {
140
+ const requestData = await requests.services.getOrCreateRequest(
141
+ context,
142
+ tabId,
143
+ requirementId,
144
+ {
145
+ inviterEmail: credentials.superUser,
146
+ email: recordEmail,
147
+ companyName: recordCompany
148
+ },
149
+ activationStatuses.DRAFT
150
+ );
151
+
152
+ if (!(requestData && requestData.id)) {
153
+ throw Error(`Failed to create record ${recordCompany}\n${requestData}`);
154
+ }
155
+
156
+ if (uploadCoi) {
157
+ const recordId = requestData.record.contractorId;
158
+
159
+ const coiUpload = await coi.utils.uploadCoi(
160
+ recordId,
161
+ filePath,
162
+ uploaderType = coi.consts.UPLOADER_TYPES.ICS,
163
+ uploaderEmail = credentials.superUser
164
+ );
165
+
166
+ if (!(coiUpload && coiUpload.name)) {
167
+ throw Error(`Failed to upload COI for record ${recordCompany}\n${coiUpload}`);
168
+ }
169
+ }
170
+
171
+ return requestData;
172
+ };
138
173
 
139
174
  module.exports = {
140
175
  prepareCompliantRecord,
@@ -143,5 +178,6 @@ module.exports = {
143
178
  prepareWaivedRecord,
144
179
  prepareAboutToExpiredRecord,
145
180
  prepareAwaitingNewCoiRecord,
146
- prepareUnderReviewRecord
181
+ prepareUnderReviewRecord,
182
+ prepareDraftRecord
147
183
  };
@@ -0,0 +1,29 @@
1
+ const requests = require('../../../../../common/requests/cookieAuth/requests');
2
+ const internalRequests = require('../../../../../common/requests/internalAuth/requests');
3
+
4
+ const { backendUrl } = require('../../../../../env').getEnv();
5
+
6
+ const Endpoints = {
7
+ getCobranding: accountId => `${backendUrl}/saas/cobranding/fetch?accountId=${accountId}`,
8
+ deleteCobranding: accountId => `${backendUrl}/saas/cobranding/archive?accountId=${accountId}`,
9
+ publishCobranding: `${backendUrl}/saas/cobranding/publish`,
10
+ getAccountsByCobrandingEmail: email => `${backendUrl}/jcsc/account/from-email/${email}`
11
+ };
12
+
13
+ const getCobranding = (accountId, context) => {
14
+ return requests.getRequestHandler(Endpoints.getCobranding(accountId), {}, context);
15
+ };
16
+
17
+ const deleteCobranding = (accountId, context) => {
18
+ return requests.deleteRequestHandler(Endpoints.deleteCobranding(accountId), context);
19
+ };
20
+
21
+ const publishCobranding = (formData, context) => {
22
+ return requests.postRequestHandler(Endpoints.publishCobranding, formData, context, formData.getHeaders());
23
+ };
24
+
25
+ const getAccountsByCobrandingEmail = email => {
26
+ return internalRequests.getRequestHandler(Endpoints.getAccountsByCobrandingEmail(email), {});
27
+ };
28
+
29
+ module.exports = { getCobranding, deleteCobranding, publishCobranding, getAccountsByCobrandingEmail };
@@ -0,0 +1,61 @@
1
+ const FormData = require('form-data');
2
+
3
+ const emailCustomizationsAPI = require('./accounts.email.customizations.api');
4
+ const httpResponseStatusCodes = require('../../../../../common/httpResponseStatusCodes.json');
5
+
6
+ const getCobranding = async (accountId, context) => {
7
+ const response = await emailCustomizationsAPI.getCobranding(accountId, context);
8
+
9
+ if (response.status !== httpResponseStatusCodes.OK) {
10
+ throw Error(`Failed to get cobranding by account id: ${accountId} - Response: ${response.status}`);
11
+ }
12
+
13
+ return response.data;
14
+ };
15
+
16
+ const deleteCobranding = async (accountId, context) => {
17
+ const response = await emailCustomizationsAPI.deleteCobranding(accountId, context);
18
+
19
+ if (response.status !== httpResponseStatusCodes.OK) {
20
+ throw Error(`Failed to delete cobranding by account id: ${accountId} - Response: ${response.status}`);
21
+ }
22
+
23
+ return response.data;
24
+ };
25
+
26
+ const publishCobranding = async (publishCobrandingModel, context) => {
27
+ const publishCobrandingStr = JSON.stringify(publishCobrandingModel);
28
+
29
+ const formData = new FormData();
30
+ // File names are passed as empty so the integration tests won't need to start handle files
31
+ // In this case the backend just take the file name from the cobrandingData object
32
+ // and doesn't check against S3. This will work as long as we won't check the content of the cobranded
33
+ // emails themselves as there there won't be images.
34
+ formData.append('file', '');
35
+ formData.append('coBrandingData', publishCobrandingStr) ;
36
+
37
+ const response = await emailCustomizationsAPI.publishCobranding(formData, context);
38
+
39
+ if (response.status !== httpResponseStatusCodes.OK) {
40
+ throw Error(`Failed to publish cobranding with from email: ${publishCobrandingModel.fromEmailAddress} - Response: ${response.status}`);
41
+ }
42
+
43
+ return response.data;
44
+ };
45
+
46
+ const getAccountsByCobrandingEmail = async email => {
47
+ const response = await emailCustomizationsAPI.getAccountsByCobrandingEmail(email);
48
+
49
+ if (response.status !== httpResponseStatusCodes.OK) {
50
+ throw Error(`Failed to get account ids by email: ${email} - Response: ${response.status}`);
51
+ }
52
+
53
+ return response.data;
54
+ };
55
+
56
+ module.exports = {
57
+ getCobranding,
58
+ deleteCobranding,
59
+ publishCobranding,
60
+ getAccountsByCobrandingEmail
61
+ };
@@ -10,11 +10,13 @@ const consts = require('./consts/consts');
10
10
  const coreService = require('./api/core/accounts.core.service');
11
11
  const openApiServices = require('./api/openapi/accounts.openapi.service');
12
12
  const settingsServices = require('./api/settings/settings.service');
13
+ const emailCustomizationService = require('./api/emailCustomization/accounts.email.customizations.service');
13
14
 
14
15
  const services = {
15
16
  core: coreService,
16
17
  openApi: openApiServices,
17
- settings: settingsServices
18
+ settings: settingsServices,
19
+ emailCustomizations: emailCustomizationService
18
20
  };
19
21
 
20
22
  module.exports = { services, models, utils, consts };
@@ -6,6 +6,8 @@ const Endpoints = {
6
6
  addRequestToRecord: (recordId, tabId) => `${backendUrl}/saas/${tabId}/request/${recordId}`,
7
7
  publicLinkInvite: `${backendUrl}/_saas/requests/publicinvite`,
8
8
  edit: contractorId => `${backendUrl}/saas/requests/${contractorId}/update`,
9
+ saveDraftRequest: `${backendUrl}/saas/requests/draft/save`,
10
+ activateDraftRequest: `${backendUrl}/saas/requests/draft/activate`,
9
11
  getById: requestId => `${backendUrl}/saas/request/${requestId}`,
10
12
  getAccountRequests: accountId => `${backendUrl}/saas/requests/${accountId}`,
11
13
  getByTabId: `${backendUrl}/saas/requests`,
@@ -34,6 +36,14 @@ const editRequestAndRecordDetails = (editRequestModel, context) => {
34
36
  return requests.postRequestHandler(Endpoints.edit(contractorId), editRequestModel, context, {}, params);
35
37
  };
36
38
 
39
+ const saveDraftRequest = (draftRequestReportModel, context) => {
40
+ return requests.postRequestHandler(Endpoints.saveDraftRequest, draftRequestReportModel, context);
41
+ };
42
+
43
+ const activateDraftRequest = (draftRequestReportModel, context) => {
44
+ return requests.postRequestHandler(Endpoints.activateDraftRequest, draftRequestReportModel, context);
45
+ };
46
+
37
47
  const getRequestById = (requestId, context) => {
38
48
  return requests.getRequestHandler(Endpoints.getById(requestId), {}, context);
39
49
  };
@@ -68,6 +78,8 @@ module.exports = {
68
78
  addRequestToRecord,
69
79
  inviteRequestViaPublicLink,
70
80
  editRequestAndRecordDetails,
81
+ saveDraftRequest,
82
+ activateDraftRequest,
71
83
  getRequestById,
72
84
  getRequestsByAccountId,
73
85
  getRequestsByTabId,
@@ -1,5 +1,6 @@
1
1
  const requestsAPI = require('./requests.api');
2
2
  const { CreateRequestModel, ContractorInfo } = require('../models/create.request.model');
3
+ const { DraftRequestReportModel } = require('../models/draft.request.report.model');
3
4
  const { InnerPageRequestCriteriaModel } = require('../models/inner.page.request.criteria.model');
4
5
  const { RequestModel } = require('../models/edit.request.model');
5
6
  const { validateType } = require('../../../../common/validations/typeValidations');
@@ -24,6 +25,56 @@ const editRequestAndRecordDetails = (editRequestModel, context) => {
24
25
  return requestsAPI.editRequestAndRecordDetails(editRequestModel, context);
25
26
  };
26
27
 
28
+ const activateDraftRequest = (draftRequestReportModel, context) => {
29
+ validateType(draftRequestReportModel, DraftRequestReportModel);
30
+ return requestsAPI.activateDraftRequest(draftRequestReportModel, context);
31
+ };
32
+
33
+ const activateByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified } = {}) => {
34
+ const emailAddress = email || request.record.emailAddress;
35
+ const selectedRequirementsId = requirementId || request.record.requirementId;
36
+ const additionalEmails = additionalEmailList || request.record.additionalEmails;
37
+ const recordDateModified = dateModified || request.record.dateModified;
38
+
39
+ const draftRequestReportModel = new DraftRequestReportModel(
40
+ request.id,
41
+ {
42
+ emailAddress,
43
+ selectedRequirementsId,
44
+ additionalEmails,
45
+ recordDateModified,
46
+ overrideDateModified
47
+ }
48
+ );
49
+
50
+ return activateDraftRequest(draftRequestReportModel, context);
51
+ };
52
+
53
+ const saveDraftRequest = (draftRequestReportModel, context) => {
54
+ validateType(draftRequestReportModel, DraftRequestReportModel);
55
+ return requestsAPI.saveDraftRequest(draftRequestReportModel, context);
56
+ };
57
+
58
+ const saveDraftByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified } = {}) => {
59
+ const emailAddress = email || request.record.emailAddress;
60
+ const selectedRequirementsId = requirementId || request.record.requirementId;
61
+ const additionalEmails = additionalEmailList || request.record.additionalEmails;
62
+ const recordDateModified = dateModified || request.record.dateModified;
63
+
64
+ const draftRequestReportModel = new DraftRequestReportModel(
65
+ request.id,
66
+ {
67
+ emailAddress,
68
+ selectedRequirementsId,
69
+ additionalEmails,
70
+ recordDateModified,
71
+ overrideDateModified
72
+ }
73
+ );
74
+
75
+ return saveDraftRequest(draftRequestReportModel, context);
76
+ };
77
+
27
78
  const getAutocompleteAutoSelect = async (params, context) => {
28
79
  const { companyOrDba, tabId, requirementsId } = params;
29
80
  const autoSelectedRequest = await requestsAPI.getAutocompleteAutoSelect({ companyOrDba, tabId, requirementsId }, context);
@@ -101,8 +152,8 @@ const getTabTenantRequestsInProject = async (projectId, context) => {
101
152
  return response.data;
102
153
  };
103
154
 
104
- const getRequestFromTabByRecordId = async (recordId, tabId, context) => {
105
- const { data: requestsInTab } = await requestsAPI.getRequestsByTabId(tabId, context);
155
+ const getRequestFromTabByRecordId = async (recordId, tabId, context, activationStatus) => {
156
+ const { data: requestsInTab } = await requestsAPI.getRequestsByTabId(tabId, context, activationStatus);
106
157
  const request = requestsInTab.find(({ record }) => record.contractorId === recordId);
107
158
 
108
159
  return request;
@@ -139,6 +190,10 @@ module.exports = {
139
190
  addRequestToRecord,
140
191
  inviteRequestViaPublicLink,
141
192
  editRequestAndRecordDetails,
193
+ activateByRequest,
194
+ saveDraftRequest,
195
+ saveDraftByRequest,
196
+ activateDraftRequest,
142
197
  getRequestsByTabId,
143
198
  getRequestById,
144
199
  getRequestsByAccountId,
@@ -0,0 +1,14 @@
1
+ class DraftRequestReportModel {
2
+ constructor(requestId, { emailAddress, selectedRequirementsId, additionalEmails, recordDateModified, overrideDateModified } = {}) {
3
+ this.requestId = requestId;
4
+ this.emailAddress = emailAddress;
5
+ this.selectedRequirementsId = selectedRequirementsId;
6
+ this.additionalEmails = additionalEmails;
7
+ this.recordDateModified = recordDateModified;
8
+ this.overrideDateModified = overrideDateModified;
9
+ }
10
+ }
11
+
12
+ module.exports = {
13
+ DraftRequestReportModel
14
+ };
@@ -41,7 +41,7 @@ const getTenantUserByEmail = async (projectId, email, context) => {
41
41
  return tenant;
42
42
  };
43
43
 
44
- const getOrCreateTenantUser = async (projectId, email, company, requestId, context, { fullName = 'Tenant User', password = credentials.strongPassword, toSignUp = true } = {}) => {
44
+ const getOrCreateTenantUser = async (projectId, email, company, requestId, context, { fullName = 'Tenant User', password = credentials.strongPassword, toSignUp = true, expectError } = {}) => {
45
45
  let tenantUser = await getTenantUserByEmail(projectId, email, context);
46
46
 
47
47
  if (tenantUser && tenantUser.subuserId && tenantUser.isVerified) {
@@ -52,7 +52,11 @@ const getOrCreateTenantUser = async (projectId, email, company, requestId, conte
52
52
  const inviteResponse = await inviteTenantUser(projectId, inviteUserModel, context);
53
53
 
54
54
  if (inviteResponse.status !== httpResponseStatusCodes.OK) {
55
- throw new Error(`Failed to invite tenant user with email: ${email}\n${inviteResponse}`);
55
+ if (expectError) {
56
+ return inviteResponse;
57
+ } else {
58
+ throw new Error(`Failed to invite tenant user with email: ${email}\n${inviteResponse}`);
59
+ }
56
60
  }
57
61
 
58
62
  tenantUser = await getTenantUserByEmail(projectId, email, context);