Skip to content

Commit c4ca028

Browse files
Merge pull request #5 from topcoder-platform/feature-challenge-term
Add support for challenge terms
2 parents 9974b23 + 87be91e commit c4ca028

File tree

7 files changed

+296
-158
lines changed

7 files changed

+296
-158
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,4 +215,4 @@ npm run cov-e2e
215215
- TBD
216216

217217
## Verification
218-
Refer to the verification document `Verification.md`
218+
Refer to the verification document `Verification.md`

Verification.md

Lines changed: 59 additions & 154 deletions
Large diffs are not rendered by default.

src/services/ProcessorService.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@ update.schema = {
120120
fileName: Joi.string().required(),
121121
challengeId: Joi.string().uuid().required()
122122
})).allow(null),
123+
terms: Joi.array().items(Joi.object().keys({
124+
id: Joi.number().strict(true).integer().positive().required(),
125+
agreeabilityType: Joi.string().required(),
126+
title: Joi.string(),
127+
url: Joi.string().allow(''),
128+
templateId: Joi.string()
129+
})).allow(null),
123130
groups: Joi.array().items(Joi.string()).allow(null), // group names
124131
created: Joi.date(),
125132
createdBy: Joi.string(), // user handle

test/common/testData.js

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,28 @@ const challengeUpdatedMessage = {
7373
created: '2019-02-03T00:00:00',
7474
createdBy: 'admin',
7575
updated: '2019-02-04T01:01:00',
76-
updatedBy: 'user'
76+
updatedBy: 'user',
77+
terms: [
78+
{
79+
id: 21343,
80+
agreeabilityType: 'DocuSignable',
81+
title: 'Competition Non-Disclosure Agreement',
82+
url: '',
83+
templateId: '0c5b7081-1fff-4484-a20f-824c97a03b9b'
84+
},
85+
{
86+
id: 20723,
87+
agreeabilityType: 'Non-electronically-agreeable',
88+
title: 'Subcontractor Services Agreement 2009-09-02',
89+
url: 'http://www.topcoder.com/i/terms/Subcontractor+Services+Agreement+2009-09-02.pdf'
90+
},
91+
{
92+
id: 20645,
93+
agreeabilityType: 'Electronically-agreeable',
94+
title: '2008 TCO Marathon Match Competition Official Rules',
95+
url: 'http://topcoder.com/mm-terms'
96+
}
97+
]
7798
}
7899
}
79100

@@ -98,7 +119,16 @@ const challengePartiallyUpdatedMessage = {
98119
}],
99120
groups: ['group4'],
100121
updated: '2019-01-02T00:00:00',
101-
updatedBy: 'user'
122+
updatedBy: 'user',
123+
terms: [
124+
{
125+
id: 21343,
126+
agreeabilityType: 'DocuSignable',
127+
title: 'Competition Non-Disclosure Agreement',
128+
url: '',
129+
templateId: '0c5b7081-1fff-4484-a20f-824c97a03b9b'
130+
}
131+
]
102132
}
103133
}
104134

test/common/testHelper.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@ const expect = require('chai').expect
99

1010
const client = helper.getESClient()
1111

12+
/**
13+
* function to deeply compare arrays regardeless of the order
14+
*
15+
* @param {Array} arr1 The first array to compare
16+
* @param {Array} arr2 The second array to compare
17+
* @returns {Boolean} The flag indicating whether the arrays have the same content regardless of the order
18+
*/
19+
const deepCompareArrays = (arr1, arr2) => {
20+
return _(arr1).xorWith(arr2, _.isEqual).isEmpty()
21+
}
22+
1223
/**
1324
* Get elastic search data.
1425
* @param {String} id the Elastic search data id
@@ -54,5 +65,6 @@ function expectSamePhase (phase1, phase2) {
5465
module.exports = {
5566
getESData,
5667
expectObj,
57-
expectSamePhase
68+
expectSamePhase,
69+
deepCompareArrays
5870
}

test/e2e/processor.test.js

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ describe('TC Challenge Processor E2E Tests', () => {
8181
}
8282
expect(data.endDate).to.exist // eslint-disable-line
8383
expect(new Date(data.endDate).getTime() - new Date(challengeUpdatedMessage.payload.startDate).getTime()).to.equal(300000)
84+
expect(testHelper.deepCompareArrays(challengeUpdatedMessage.payload.terms, data.terms), true)
8485
})
8586

8687
it('partially update challenge message', async () => {
@@ -100,6 +101,97 @@ describe('TC Challenge Processor E2E Tests', () => {
100101
}
101102
expect(data.endDate).to.exist // eslint-disable-line
102103
expect(new Date(data.endDate).getTime() - new Date(expectedData.startDate).getTime()).to.equal(300000)
104+
expect(testHelper.deepCompareArrays(challengePartiallyUpdatedMessage.payload.terms, data.terms), true)
105+
})
106+
107+
it('update challenge message - invalid parameters, terms with negative id message', async () => {
108+
const message = _.cloneDeep(challengeUpdatedMessage)
109+
message.payload.terms[0].id = -20
110+
try {
111+
await ProcessorService.update(message)
112+
} catch (err) {
113+
expect(err).to.exist // eslint-disable-line
114+
expect(err.name).to.equal('ValidationError')
115+
const msg = '"id" must be a positive number'
116+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
117+
return
118+
}
119+
throw new Error('There should be validation error.')
120+
})
121+
122+
it('update challenge message - invalid parameters, terms with invalid aggreeability type message', async () => {
123+
const message = _.cloneDeep(challengeUpdatedMessage)
124+
message.payload.terms[0].agreeabilityType = 800
125+
try {
126+
await ProcessorService.update(message)
127+
} catch (err) {
128+
expect(err).to.exist // eslint-disable-line
129+
expect(err.name).to.equal('ValidationError')
130+
const msg = '"agreeabilityType" must be a string'
131+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
132+
return
133+
}
134+
throw new Error('There should be validation error.')
135+
})
136+
137+
it('update challenge message - invalid parameters, terms with missing aggreeability type message', async () => {
138+
const message = _.cloneDeep(challengeUpdatedMessage)
139+
delete message.payload.terms[0].agreeabilityType
140+
try {
141+
await ProcessorService.update(message)
142+
} catch (err) {
143+
expect(err).to.exist // eslint-disable-line
144+
expect(err.name).to.equal('ValidationError')
145+
const msg = '"agreeabilityType" is required'
146+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
147+
return
148+
}
149+
throw new Error('There should be validation error.')
150+
})
151+
152+
it('update challenge message - invalid parameters, terms with invalid title message', async () => {
153+
const message = _.cloneDeep(challengeUpdatedMessage)
154+
message.payload.terms[0].title = 800
155+
try {
156+
await ProcessorService.update(message)
157+
} catch (err) {
158+
expect(err).to.exist // eslint-disable-line
159+
expect(err.name).to.equal('ValidationError')
160+
const msg = '"title" must be a string'
161+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
162+
return
163+
}
164+
throw new Error('There should be validation error.')
165+
})
166+
167+
it('update challenge message - invalid parameters, terms with invalid url message', async () => {
168+
const message = _.cloneDeep(challengeUpdatedMessage)
169+
message.payload.terms[0].url = 800
170+
try {
171+
await ProcessorService.update(message)
172+
} catch (err) {
173+
expect(err).to.exist // eslint-disable-line
174+
expect(err.name).to.equal('ValidationError')
175+
const msg = '"url" must be a string'
176+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
177+
return
178+
}
179+
throw new Error('There should be validation error.')
180+
})
181+
182+
it('update challenge message - invalid parameters, terms with invalid templateId message', async () => {
183+
const message = _.cloneDeep(challengeUpdatedMessage)
184+
message.payload.terms[0].templateId = 800
185+
try {
186+
await ProcessorService.update(message)
187+
} catch (err) {
188+
expect(err).to.exist // eslint-disable-line
189+
expect(err.name).to.equal('ValidationError')
190+
const msg = '"templateId" must be a string'
191+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
192+
return
193+
}
194+
throw new Error('There should be validation error.')
103195
})
104196

105197
it('update challenge message - not found', async () => {

test/unit/processor.test.js

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ describe('TC Challenge Processor Unit Tests', () => {
8181
}
8282
expect(data.endDate).to.exist // eslint-disable-line
8383
expect(new Date(data.endDate).getTime() - new Date(challengeUpdatedMessage.payload.startDate).getTime()).to.equal(300000)
84+
expect(testHelper.deepCompareArrays(challengeUpdatedMessage.payload.terms, data.terms), true)
8485
})
8586

8687
it('partially update challenge message', async () => {
@@ -100,6 +101,97 @@ describe('TC Challenge Processor Unit Tests', () => {
100101
}
101102
expect(data.endDate).to.exist // eslint-disable-line
102103
expect(new Date(data.endDate).getTime() - new Date(expectedData.startDate).getTime()).to.equal(300000)
104+
expect(testHelper.deepCompareArrays(challengePartiallyUpdatedMessage.payload.terms, data.terms), true)
105+
})
106+
107+
it('update challenge message - invalid parameters, terms with negative id message', async () => {
108+
const message = _.cloneDeep(challengeUpdatedMessage)
109+
message.payload.terms[0].id = -20
110+
try {
111+
await ProcessorService.update(message)
112+
} catch (err) {
113+
expect(err).to.exist // eslint-disable-line
114+
expect(err.name).to.equal('ValidationError')
115+
const msg = '"id" must be a positive number'
116+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
117+
return
118+
}
119+
throw new Error('There should be validation error.')
120+
})
121+
122+
it('update challenge message - invalid parameters, terms with invalid aggreeability type message', async () => {
123+
const message = _.cloneDeep(challengeUpdatedMessage)
124+
message.payload.terms[0].agreeabilityType = 800
125+
try {
126+
await ProcessorService.update(message)
127+
} catch (err) {
128+
expect(err).to.exist // eslint-disable-line
129+
expect(err.name).to.equal('ValidationError')
130+
const msg = '"agreeabilityType" must be a string'
131+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
132+
return
133+
}
134+
throw new Error('There should be validation error.')
135+
})
136+
137+
it('update challenge message - invalid parameters, terms with missing aggreeability type message', async () => {
138+
const message = _.cloneDeep(challengeUpdatedMessage)
139+
delete message.payload.terms[0].agreeabilityType
140+
try {
141+
await ProcessorService.update(message)
142+
} catch (err) {
143+
expect(err).to.exist // eslint-disable-line
144+
expect(err.name).to.equal('ValidationError')
145+
const msg = '"agreeabilityType" is required'
146+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
147+
return
148+
}
149+
throw new Error('There should be validation error.')
150+
})
151+
152+
it('update challenge message - invalid parameters, terms with invalid title message', async () => {
153+
const message = _.cloneDeep(challengeUpdatedMessage)
154+
message.payload.terms[0].title = 800
155+
try {
156+
await ProcessorService.update(message)
157+
} catch (err) {
158+
expect(err).to.exist // eslint-disable-line
159+
expect(err.name).to.equal('ValidationError')
160+
const msg = '"title" must be a string'
161+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
162+
return
163+
}
164+
throw new Error('There should be validation error.')
165+
})
166+
167+
it('update challenge message - invalid parameters, terms with invalid url message', async () => {
168+
const message = _.cloneDeep(challengeUpdatedMessage)
169+
message.payload.terms[0].url = 800
170+
try {
171+
await ProcessorService.update(message)
172+
} catch (err) {
173+
expect(err).to.exist // eslint-disable-line
174+
expect(err.name).to.equal('ValidationError')
175+
const msg = '"url" must be a string'
176+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
177+
return
178+
}
179+
throw new Error('There should be validation error.')
180+
})
181+
182+
it('update challenge message - invalid parameters, terms with invalid templateId message', async () => {
183+
const message = _.cloneDeep(challengeUpdatedMessage)
184+
message.payload.terms[0].templateId = 800
185+
try {
186+
await ProcessorService.update(message)
187+
} catch (err) {
188+
expect(err).to.exist // eslint-disable-line
189+
expect(err.name).to.equal('ValidationError')
190+
const msg = '"templateId" must be a string'
191+
expect(err.message.indexOf(msg) >= 0).to.equal(true)
192+
return
193+
}
194+
throw new Error('There should be validation error.')
103195
})
104196

105197
it('update challenge message - not found', async () => {

0 commit comments

Comments
 (0)