From cad360da8b3687e7f08b196fa8e96d98d5e162ba Mon Sep 17 00:00:00 2001 From: Mithun Kamath Date: Thu, 7 Nov 2019 12:53:47 +0530 Subject: [PATCH 1/3] #19 - Use review payload instead of review summation payload --- README.md | 3 +- config/default.js | 2 +- config/test.js | 2 +- docs/Leaderboard API.postman_collection.json | 20 +++--- package.json | 4 +- src/controllers/LeaderboardController.js | 4 +- src/models/Leaderboard.js | 2 +- src/routes.js | 2 +- src/services/LeaderboardService.js | 66 ++++++++++---------- src/test-data.js | 28 ++++----- test/e2e/test.js | 44 ++++++------- test/unit/test.js | 48 +++++++------- 12 files changed, 113 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index 650ddc1..af41df9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Dependencies -- nodejs (v10) +- Nodejs (v10) - Mongodb (v4) ## Configuration @@ -54,6 +54,7 @@ npm start ``` ## Mock API + For verification purpose, we need a mock app for Topcoder Challenge API and Topcoder Member API. You can run command `npm run mock-api` to start the mock app. ## Heroku Deployment diff --git a/config/default.js b/config/default.js index 4946f3c..e8e7d5a 100644 --- a/config/default.js +++ b/config/default.js @@ -7,7 +7,7 @@ module.exports = { PORT: process.env.PORT || 3000, MONGODB_URL: process.env.MONGODB_URL || 'mongodb://localhost:27017/leaderboardDB', - CHALLENGE_API_URL: process.env.CHALLENGE_API_URL || 'https://api.topcoder-dev.com/v3/challenges', + CHALLENGE_API_URL: process.env.CHALLENGE_API_URL || 'https://api.topcoder-dev.com/v4/challenges', MEMBER_API_URL: process.env.MEMBER_API_URL || 'https://api.topcoder-dev.com/v3/users', GROUP_IDS: process.env.GROUP_IDS || '202343,20000000', // Comma separated string of Group IDs diff --git a/config/test.js b/config/test.js index b75a658..786d355 100644 --- a/config/test.js +++ b/config/test.js @@ -3,7 +3,7 @@ */ module.exports = { - CHALLENGE_API_URL: 'https://api.topcoder-dev.com/v3/challenges', + CHALLENGE_API_URL: 'https://api.topcoder-dev.com/v4/challenges', MEMBER_API_URL: 'https://api.topcoder-dev.com/v3/users', MOCK_API_PORT: 3001 } diff --git a/docs/Leaderboard API.postman_collection.json b/docs/Leaderboard API.postman_collection.json index dce9803..28901c9 100755 --- a/docs/Leaderboard API.postman_collection.json +++ b/docs/Leaderboard API.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "85361413-4f1c-4fb2-9433-01dc999d7e4b", + "_postman_id": "adfe8d84-410e-4628-9a1c-f74e16e89c83", "name": "Leaderboard API", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -180,7 +180,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"assertions\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 10\n },\n \"tests\": {\n \"total\": 10\n }\n },\n \"aggregateScore\": 90\n}", + "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"assertions\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 10\n },\n \"tests\": {\n \"total\": 10\n }\n },\n \"score\": 90\n}", "options": { "raw": { "language": "json" @@ -217,7 +217,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"aggregateScore\": 0\n}", + "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"score\": 0\n}", "options": { "raw": { "language": "json" @@ -254,7 +254,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"aggregateScore\": 0\n}", + "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"score\": 0\n}", "options": { "raw": { "language": "json" @@ -296,7 +296,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"assertions\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 5\n },\n \"tests\": {\n \"total\": 5\n }\n },\n \"aggregateScore\": 80\n}" + "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"assertions\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 5\n },\n \"tests\": {\n \"total\": 5\n }\n },\n \"score\": 80\n}" }, "url": { "raw": "{{URL}}/leaderboard/challenge/30051825/member/8547899", @@ -327,7 +327,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"aggregateScore\": 80\n}" + "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"score\": 80\n}" }, "url": { "raw": "{{URL}}/leaderboard/challenge/30051825/member/5547899", @@ -388,13 +388,13 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{URL}}/leaderboard/reviewSummation/661d3655-9c80-4f90-8051-e209e8c21704", + "raw": "{{URL}}/leaderboard/review/661d3655-9c80-4f90-8051-e209e8c21704", "host": [ "{{URL}}" ], "path": [ "leaderboard", - "reviewSummation", + "review", "661d3655-9c80-4f90-8051-e209e8c21704" ] } @@ -407,13 +407,13 @@ "method": "DELETE", "header": [], "url": { - "raw": "{{URL}}/leaderboard/reviewSummation/231d3655-9c80-4f90-8051-e209e8c21704", + "raw": "{{URL}}/leaderboard/review/231d3655-9c80-4f90-8051-e209e8c21704", "host": [ "{{URL}}" ], "path": [ "leaderboard", - "reviewSummation", + "review", "231d3655-9c80-4f90-8051-e209e8c21704" ] } diff --git a/package.json b/package.json index 1bf0243..801de86 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "mock-api": "NODE_ENV=test node test/common/mock.js", "lint": "standard", "lint:fix": "standard --fix", - "test": "nyc --reporter=html --reporter=text mocha test/unit/test.js --require test/common/prepare.js --exit", - "e2e": "nyc --reporter=html --reporter=text mocha test/e2e/test.js --require test/common/prepare.js --exit" + "test": "nyc --reporter=html --reporter=text mocha test/unit/test.js --timeout=20000 --require test/common/prepare.js --exit", + "e2e": "nyc --reporter=html --reporter=text mocha test/e2e/test.js --timeout=20000 --require test/common/prepare.js --exit" }, "author": "TCSCODER", "license": "none", diff --git a/src/controllers/LeaderboardController.js b/src/controllers/LeaderboardController.js index 3b41b18..5b2af99 100644 --- a/src/controllers/LeaderboardController.js +++ b/src/controllers/LeaderboardController.js @@ -28,12 +28,12 @@ async function updateLeaderboard (req, res) { } /** - * Delete leaderboard detail by review summation id + * Delete leaderboard detail by review id * @param req the request * @param res the response */ async function deleteLeaderboard (req, res) { - await LeaderboardService.deleteLeaderboard(req.params.reviewSummationId) + await LeaderboardService.deleteLeaderboard(req.params.reviewId) res.status(204).end() } diff --git a/src/models/Leaderboard.js b/src/models/Leaderboard.js index b02d200..e413e09 100644 --- a/src/models/Leaderboard.js +++ b/src/models/Leaderboard.js @@ -5,7 +5,7 @@ const Schema = require('mongoose').Schema const LeaderboardSchema = new Schema({ - reviewSummationId: { type: String }, + reviewId: { type: String }, submissionId: { type: String }, challengeId: { type: String }, memberId: { type: String }, diff --git a/src/routes.js b/src/routes.js index a64d8da..9c29844 100644 --- a/src/routes.js +++ b/src/routes.js @@ -19,7 +19,7 @@ module.exports = { method: 'updateLeaderboard' } }, - '/leaderboard/reviewSummation/:reviewSummationId': { + '/leaderboard/review/:reviewId': { delete: { controller: 'LeaderboardController', method: 'deleteLeaderboard' diff --git a/src/services/LeaderboardService.js b/src/services/LeaderboardService.js index 771fdcb..c502540 100644 --- a/src/services/LeaderboardService.js +++ b/src/services/LeaderboardService.js @@ -28,7 +28,7 @@ async function getLeaderboard (challengeId, memberId) { * @returns {Number} the test passed number */ function getTestsPassed (metadata) { - const tests = metadata.tests || { total: 0, pending: 0, failed: 0} + const tests = metadata.tests || { total: 0, pending: 0, failed: 0 } let testsPassed = tests.total - tests.pending - tests.failed @@ -42,35 +42,35 @@ function getTestsPassed (metadata) { /** * Calculate test passed number and total test cases * - * @param {Object} reviewSummation the review summation + * @param {Object} review the review * @return {Object} testsPassed and totalTestCases */ -function calculateResult (reviewSummation) { +function calculateResult (review) { let testsPassed = 0 let totalTestCases = 0 - if (reviewSummation.metadata) { - testsPassed = getTestsPassed(reviewSummation.metadata) - totalTestCases = _.get(reviewSummation, 'metadata.tests.total', 0) + if (review.metadata) { + testsPassed = getTestsPassed(review.metadata) + totalTestCases = _.get(review, 'metadata.tests.total', 0) } return { testsPassed, totalTestCases } } /** - * Create leaderboard using review summation data + * Create leaderboard using review data * * @param {String} challengeId the challenge id * @param {String} memberId the member id - * @param {Object} reviewSummation the review summation data + * @param {Object} review the review data * @returns {Object} the created leaderboard */ -async function createLeaderboard (challengeId, memberId, reviewSummation) { +async function createLeaderboard (challengeId, memberId, review) { const existRecords = await getLeaderboard(challengeId, memberId) if (existRecords.length > 0) { throw new errors.ConflictError(`Leaderboard record with challenge # ${challengeId} and member # ${memberId} already exists.`) } - const { testsPassed, totalTestCases } = calculateResult(reviewSummation) + const { testsPassed, totalTestCases } = calculateResult(review) const challengeDetailRes = await helper.reqToAPI( `${config.CHALLENGE_API_URL}?filter=id=${challengeId}`) @@ -94,12 +94,12 @@ async function createLeaderboard (challengeId, memberId, reviewSummation) { // Record to be written into MongoDB const record = { - reviewSummationId: reviewSummation.id, - submissionId: reviewSummation.submissionId, + reviewId: review.id, + submissionId: review.submissionId, memberId, challengeId, handle: member.handle, - aggregateScore: reviewSummation.aggregateScore, + aggregateScore: review.score, // For TCO scenario, we will only have 1 review - per member and per challenge testsPassed, totalTestCases, groupIds: _.map(groupIds, e => String(e)) @@ -111,22 +111,22 @@ async function createLeaderboard (challengeId, memberId, reviewSummation) { createLeaderboard.schema = { challengeId: joi.string().required(), memberId: joi.string().required(), - reviewSummation: joi.object().keys({ + review: joi.object().keys({ id: joi.string().required(), submissionId: joi.string().required(), - aggregateScore: joi.number().required() + score: joi.number().required() }).unknown(true).required() } /** - * Update leaderboard detail using review summation data + * Update leaderboard detail using review data * * @param {String} challengeId the challenge id * @param {String} memberId the member id - * @param {Object} reviewSummation the review summation data + * @param {Object} review the review data * @returns the updated leaderboard detail */ -async function updateLeaderboard (challengeId, memberId, reviewSummation) { +async function updateLeaderboard (challengeId, memberId, review) { const existRecords = await getLeaderboard(challengeId, memberId) if (existRecords.length === 0) { throw new errors.NotFoundError(`Leaderboard record with challenge # ${challengeId} and member # ${memberId} doesn't exist`) @@ -134,17 +134,17 @@ async function updateLeaderboard (challengeId, memberId, reviewSummation) { let scoreLevel = 'na' - const { testsPassed, totalTestCases } = calculateResult(reviewSummation) + const { testsPassed, totalTestCases } = calculateResult(review) - if (existRecords[0].aggregateScore > reviewSummation.aggregateScore) { - scoreLevel = 'down'; - } else if (existRecords[0].aggregateScore < reviewSummation.aggregateScore) { - scoreLevel = 'up'; + if (existRecords[0].aggregateScore > review.score) { + scoreLevel = 'down' + } else if (existRecords[0].aggregateScore < review.score) { + scoreLevel = 'up' } _.assignIn(existRecords[0], { - aggregateScore: reviewSummation.aggregateScore, - reviewSummationId: reviewSummation.id, + aggregateScore: review.score, + reviewId: review.id, testsPassed, totalTestCases, scoreLevel @@ -156,9 +156,9 @@ async function updateLeaderboard (challengeId, memberId, reviewSummation) { updateLeaderboard.schema = { challengeId: joi.string().required(), memberId: joi.string().required(), - reviewSummation: joi.object().keys({ + review: joi.object().keys({ id: joi.string().required(), - aggregateScore: joi.number().required() + score: joi.number().required() }).unknown(true).required() } @@ -222,20 +222,20 @@ searchLeaderboards.schema = { } /** - * Delete leaderboard by review summation id. + * Delete leaderboard by review id. * - * @param {String} reviewSummationId the review summation id + * @param {String} reviewId the review id */ -async function deleteLeaderboard (reviewSummationId) { - const entity = await Leaderboard.findOne({ reviewSummationId }) +async function deleteLeaderboard (reviewId) { + const entity = await Leaderboard.findOne({ reviewId }) if (!entity) { - throw new errors.NotFoundError(`Leaderboard record with reviewSummation ID: ${reviewSummationId} doesn't exist`) + throw new errors.NotFoundError(`Leaderboard record with review id: ${reviewId} doesn't exist`) } await entity.remove() } deleteLeaderboard.schema = { - reviewSummationId: joi.string().required() + reviewId: joi.string().required() } module.exports = { diff --git a/src/test-data.js b/src/test-data.js index 8292b37..ab37129 100644 --- a/src/test-data.js +++ b/src/test-data.js @@ -7,78 +7,78 @@ const logger = require('./common/logger') const insertData = async () => { await Leaderboard.create({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21704', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21704', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf4', challengeId: '30104644', memberId: '123456', handle: 'user1', - aggregateScore: 100, + score: 100, testsPassed: 10, totalTestCases: 10, groupIds: ['100', '200'] }) await Leaderboard.create({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21705', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21705', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf5', challengeId: '30104644', memberId: '123457', handle: 'user2', - aggregateScore: 90, + score: 90, testsPassed: 9, totalTestCases: 10, groupIds: ['100', '200'] }) await Leaderboard.create({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21706', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21706', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf6', challengeId: '30104644', memberId: '123458', handle: 'user3', - aggregateScore: 80, + score: 80, testsPassed: 8, totalTestCases: 10, groupIds: ['100', '200'] }) await Leaderboard.create({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21701', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21701', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf1', challengeId: '30104645', memberId: '123456', handle: 'user1', - aggregateScore: 40, + score: 40, testsPassed: 8, totalTestCases: 20, groupIds: ['100', '200'] }) await Leaderboard.create({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21702', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21702', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf2', challengeId: '30104645', memberId: '123457', handle: 'user2', - aggregateScore: 50, + score: 50, testsPassed: 10, totalTestCases: 20, groupIds: ['100', '200'] }) await Leaderboard.create({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21703', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21703', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf3', challengeId: '30104646', memberId: '123456', handle: 'user1', - aggregateScore: 190, + score: 190, testsPassed: 4, totalTestCases: 6, groupIds: ['100'] }) await Leaderboard.create({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21709', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21709', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf9', challengeId: '30104646', memberId: '123458', handle: 'user3', - aggregateScore: 200, + score: 200, testsPassed: 5, totalTestCases: 6, groupIds: ['100'] diff --git a/test/e2e/test.js b/test/e2e/test.js index 0cae879..53b8f6e 100644 --- a/test/e2e/test.js +++ b/test/e2e/test.js @@ -87,7 +87,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { const result = res.body expect(result.length).to.equal(1) expect(result[0]).to.deep.equal({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21706', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21706', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf6', challengeId: '30104644', memberId: '123458', @@ -173,13 +173,13 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { .send({ id: '161d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', - aggregateScore: 0 + score: 0 }) expect(res.status).to.equal(200) expect(res.body).to.deep.equal({ groupIds: [ '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21701', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', memberId: '8547899', challengeId: '30051825', @@ -206,13 +206,13 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { total: 10 } }, - aggregateScore: 90 + score: 90 }) expect(res.status).to.equal(200) expect(res.body).to.deep.equal({ groupIds: [ '202343', '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21702', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21702', submissionId: '261d3655-9c80-4f90-8051-e209e8c21702', memberId: '8547899', challengeId: '30051826', @@ -235,13 +235,13 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { failed: 1 } }, - aggregateScore: 0 + score: 0 }) expect(res.status).to.equal(200) expect(res.body).to.deep.equal({ groupIds: [ '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21703', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21703', submissionId: '261d3655-9c80-4f90-8051-e209e8c21703', memberId: '22688726', challengeId: '30051825', @@ -259,13 +259,13 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { id: '161d3655-9c80-4f90-8051-e209e8c21704', submissionId: '261d3655-9c80-4f90-8051-e209e8c21704', metadata: { }, - aggregateScore: 0 + score: 0 }) expect(res.status).to.equal(200) expect(res.body).to.deep.equal({ groupIds: [ '202343', '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21704', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21704', submissionId: '261d3655-9c80-4f90-8051-e209e8c21704', memberId: '22688726', challengeId: '30051826', @@ -282,7 +282,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { .send({ id: '161d3655-9c80-4f90-8051-e209e8c21705', submissionId: '261d3655-9c80-4f90-8051-e209e8c21705', - aggregateScore: 50 + score: 50 }) expect(res.status).to.equal(400) @@ -295,7 +295,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { .send({ id: '161d3655-9c80-4f90-8051-e209e8c21706', submissionId: '261d3655-9c80-4f90-8051-e209e8c21706', - aggregateScore: 50 + score: 50 }) expect(res.status).to.equal(400) @@ -308,7 +308,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { .send({ id: '161d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', - aggregateScore: 0 + score: 0 }) expect(res.status).to.equal(409) @@ -348,7 +348,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { }) expect(res.status).to.equal(400) - expect(res.body.message).to.equal('"aggregateScore" is required') + expect(res.body.message).to.equal('"score" is required') }) it('ignore - create leaderboard with ignored challenge', async () => { @@ -357,7 +357,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { .send({ id: '161d3655-9c80-4f90-8051-e209e8c21707', submissionId: '261d3655-9c80-4f90-8051-e209e8c21707', - aggregateScore: 50 + score: 50 }) expect(res.status).to.equal(204) expect(debugLogs[3]).to.equal('Group ID of Challenge # 31000000 is not configured for processing!') @@ -380,13 +380,13 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { total: 5 } }, - aggregateScore: 80 + score: 80 }) expect(res.status).to.equal(200) expect(res.body).to.deep.equal({ groupIds: [ '20000000' ], - reviewSummationId: '361d3655-9c80-4f90-8051-e209e8c21701', + reviewId: '361d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', memberId: '8547899', challengeId: '30051825', @@ -402,7 +402,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { .patch('/v5/leaderboard/challenge/30051825/member/5547899') .send({ id: '361d3655-9c80-4f90-8051-e209e8c21701', - aggregateScore: 80 + score: 80 }) expect(res.status).to.equal(404) @@ -428,7 +428,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { }) expect(res.status).to.equal(400) - expect(res.body.message).to.equal('"aggregateScore" is required') + expect(res.body.message).to.equal('"score" is required') }) }) @@ -437,19 +437,19 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { it('delete leaderboard success', async () => { const res = await chai.request(expressApp) - .delete(`/v5/leaderboard/reviewSummation/${id}`) + .delete(`/v5/leaderboard/review/${id}`) expect(res.status).to.equal(204) - const result = await Leaderboard.find({ reviewSummationId: id }) + const result = await Leaderboard.find({ reviewId: id }) expect(result.length).to.equal(0) }) it('failure - delete leaderboard not found', async () => { const res = await chai.request(expressApp) - .delete(`/v5/leaderboard/reviewSummation/${id}`) + .delete(`/v5/leaderboard/review/${id}`) expect(res.status).to.equal(404) - expect(res.body.message).to.equal(`Leaderboard record with reviewSummation ID: ${id} doesn't exist`) + expect(res.body.message).to.equal(`Leaderboard record with review id: ${id} doesn't exist`) }) }) }) diff --git a/test/unit/test.js b/test/unit/test.js index 90da93e..aa00b22 100644 --- a/test/unit/test.js +++ b/test/unit/test.js @@ -59,7 +59,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { const result = await service.searchLeaderboards({ challengeId: '30104644', page: 2, perPage: 2 }) expect(result.length).to.equal(1) expect(_.omit(result[0]._doc, ['__v', '_id'])).to.deep.equal({ - reviewSummationId: '661d3655-9c80-4f90-8051-e209e8c21706', + reviewId: '661d3655-9c80-4f90-8051-e209e8c21706', submissionId: '2b5e54b9-f03c-418b-92f3-5f072b0f3bf6', challengeId: '30104644', memberId: '123458', @@ -137,11 +137,11 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { const result = await service.createLeaderboard('30051825', '8547899', { id: '161d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', - aggregateScore: 0 + score: 0 }) expect(_.omit(result._doc, ['__v', '_id'])).to.deep.equal({ groupIds: [ '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21701', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', memberId: '8547899', challengeId: '30051825', @@ -166,12 +166,12 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { total: 10 } }, - aggregateScore: 90 + score: 90 }) expect(_.omit(result._doc, ['__v', '_id'])).to.deep.equal({ groupIds: [ '202343', '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21702', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21702', submissionId: '261d3655-9c80-4f90-8051-e209e8c21702', memberId: '8547899', challengeId: '30051826', @@ -192,12 +192,12 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { failed: 1 } }, - aggregateScore: 0 + score: 0 }) expect(_.omit(result._doc, ['__v', '_id'])).to.deep.equal({ groupIds: [ '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21703', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21703', submissionId: '261d3655-9c80-4f90-8051-e209e8c21703', memberId: '22688726', challengeId: '30051825', @@ -213,12 +213,12 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { id: '161d3655-9c80-4f90-8051-e209e8c21704', submissionId: '261d3655-9c80-4f90-8051-e209e8c21704', metadata: { }, - aggregateScore: 0 + score: 0 }) expect(_.omit(result._doc, ['__v', '_id'])).to.deep.equal({ groupIds: [ '202343', '20000000' ], - reviewSummationId: '161d3655-9c80-4f90-8051-e209e8c21704', + reviewId: '161d3655-9c80-4f90-8051-e209e8c21704', submissionId: '261d3655-9c80-4f90-8051-e209e8c21704', memberId: '22688726', challengeId: '30051826', @@ -234,7 +234,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { await service.createLeaderboard('30000001', '8547899', { id: '161d3655-9c80-4f90-8051-e209e8c21705', submissionId: '261d3655-9c80-4f90-8051-e209e8c21705', - aggregateScore: 50 + score: 50 }) throw new Error('should not throw error here') } catch (err) { @@ -247,7 +247,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { await service.createLeaderboard('30051826', '10000', { id: '161d3655-9c80-4f90-8051-e209e8c21706', submissionId: '261d3655-9c80-4f90-8051-e209e8c21706', - aggregateScore: 50 + score: 50 }) throw new Error('should not throw error here') } catch (err) { @@ -260,7 +260,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { await service.createLeaderboard('30051825', '8547899', { id: '161d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', - aggregateScore: 0 + score: 0 }) throw new Error('should not throw error here') } catch (err) { @@ -272,7 +272,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { try { await service.createLeaderboard('30051825', '8547899', { submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', - aggregateScore: 0 + score: 0 }) throw new Error('should not throw error here') } catch (err) { @@ -284,7 +284,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { try { await service.createLeaderboard('30051825', '8547899', { id: '161d3655-9c80-4f90-8051-e209e8c21707', - aggregateScore: 0 + score: 0 }) throw new Error('should not throw error here') } catch (err) { @@ -300,7 +300,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { }) throw new Error('should not throw error here') } catch (err) { - assertValidationError(err, '"aggregateScore" is required') + assertValidationError(err, '"score" is required') } }) @@ -308,7 +308,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { await service.createLeaderboard('31000000', '22688726', { id: '161d3655-9c80-4f90-8051-e209e8c21707', submissionId: '261d3655-9c80-4f90-8051-e209e8c21707', - aggregateScore: 50 + score: 50 }) expect(debugLogs[3]).to.equal('Group ID of Challenge # 31000000 is not configured for processing!') }) @@ -328,11 +328,11 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { total: 5 } }, - aggregateScore: 80 + score: 80 }) expect(_.omit(result._doc, ['__v', '_id'])).to.deep.equal({ groupIds: [ '20000000' ], - reviewSummationId: '361d3655-9c80-4f90-8051-e209e8c21701', + reviewId: '361d3655-9c80-4f90-8051-e209e8c21701', submissionId: '261d3655-9c80-4f90-8051-e209e8c21701', memberId: '8547899', challengeId: '30051825', @@ -347,7 +347,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { try { await service.updateLeaderboard('30051825', '5547899', { id: '361d3655-9c80-4f90-8051-e209e8c21701', - aggregateScore: 80 + score: 80 }) throw new Error('should not throw error here') } catch (err) { @@ -358,7 +358,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { it('failure - update leaderboard with invalid parameter 1', async () => { try { await service.updateLeaderboard('30051825', '8547899', { - aggregateScore: 0 + score: 0 }) throw new Error('should not throw error here') } catch (err) { @@ -373,7 +373,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { }) throw new Error('should not throw error here') } catch (err) { - assertValidationError(err, '"aggregateScore" is required') + assertValidationError(err, '"score" is required') } }) }) @@ -383,7 +383,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { it('delete leaderboard success', async () => { await service.deleteLeaderboard(id) - const result = await Leaderboard.find({ reviewSummationId: id }) + const result = await Leaderboard.find({ reviewId: id }) expect(result.length).to.equal(0) }) @@ -392,7 +392,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { await service.deleteLeaderboard(id) throw new Error('should not throw error here') } catch (err) { - expect(err.message).to.equal(`Leaderboard record with reviewSummation ID: ${id} doesn't exist`) + expect(err.message).to.equal(`Leaderboard record with review id: ${id} doesn't exist`) } }) @@ -401,7 +401,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { await service.deleteLeaderboard() throw new Error('should not throw error here') } catch (err) { - assertValidationError(err, '"reviewSummationId" is required') + assertValidationError(err, '"reviewId" is required') } }) }) From 2954f901953213056e2a23ddc31abebb5812f614 Mon Sep 17 00:00:00 2001 From: Mithun Kamath Date: Thu, 7 Nov 2019 13:10:11 +0530 Subject: [PATCH 2/3] #19 - Fix tests --- src/test-data.js | 14 +++++++------- test/common/prepare.js | 8 ++++---- test/e2e/test.js | 15 +++++---------- test/unit/test.js | 15 +++++---------- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/test-data.js b/src/test-data.js index ab37129..5044617 100644 --- a/src/test-data.js +++ b/src/test-data.js @@ -12,7 +12,7 @@ const insertData = async () => { challengeId: '30104644', memberId: '123456', handle: 'user1', - score: 100, + aggregateScore: 100, testsPassed: 10, totalTestCases: 10, groupIds: ['100', '200'] @@ -23,7 +23,7 @@ const insertData = async () => { challengeId: '30104644', memberId: '123457', handle: 'user2', - score: 90, + aggregateScore: 90, testsPassed: 9, totalTestCases: 10, groupIds: ['100', '200'] @@ -34,7 +34,7 @@ const insertData = async () => { challengeId: '30104644', memberId: '123458', handle: 'user3', - score: 80, + aggregateScore: 80, testsPassed: 8, totalTestCases: 10, groupIds: ['100', '200'] @@ -45,7 +45,7 @@ const insertData = async () => { challengeId: '30104645', memberId: '123456', handle: 'user1', - score: 40, + aggregateScore: 40, testsPassed: 8, totalTestCases: 20, groupIds: ['100', '200'] @@ -56,7 +56,7 @@ const insertData = async () => { challengeId: '30104645', memberId: '123457', handle: 'user2', - score: 50, + aggregateScore: 50, testsPassed: 10, totalTestCases: 20, groupIds: ['100', '200'] @@ -67,7 +67,7 @@ const insertData = async () => { challengeId: '30104646', memberId: '123456', handle: 'user1', - score: 190, + aggregateScore: 190, testsPassed: 4, totalTestCases: 6, groupIds: ['100'] @@ -78,7 +78,7 @@ const insertData = async () => { challengeId: '30104646', memberId: '123458', handle: 'user3', - score: 200, + aggregateScore: 200, testsPassed: 5, totalTestCases: 6, groupIds: ['100'] diff --git a/test/common/prepare.js b/test/common/prepare.js index ff4cbce..c528b4c 100644 --- a/test/common/prepare.js +++ b/test/common/prepare.js @@ -11,13 +11,13 @@ prepare(function (done) { .persist() .post('/oauth/token') .reply(200, { access_token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIiwiQ29ubmVjdCBTdXBwb3J0IiwiYWRtaW5pc3RyYXRvciIsInRlc3RSb2xlIiwiYWFhIiwidG9ueV90ZXN0XzEiLCJDb25uZWN0IE1hbmFnZXIiLCJDb25uZWN0IEFkbWluIiwiY29waWxvdCIsIkNvbm5lY3QgQ29waWxvdCBNYW5hZ2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJUb255SiIsImV4cCI6MTU2NTY4MTkyMCwidXNlcklkIjoiODU0Nzg5OSIsImlhdCI6MTU1NTY4MTMyMCwiZW1haWwiOiJhamVmdHNAdG9wY29kZXIuY29tIiwianRpIjoiMTlhMDkzNzAtMjk4OC00N2I4LTkxODktMGRhODVjNjM0ZWQyIn0.V8nsQpbzQ_4iEd0dAbuYsfeydnhSAEQ95AKKwl8RONw' }) - .get('/v3/challenges?filter=id=30000001') + .get('/v4/challenges?filter=id=30000001') .reply(200, challengeAPIResponse[0]) - .get('/v3/challenges?filter=id=30051825') + .get('/v4/challenges?filter=id=30051825') .reply(200, challengeAPIResponse[1]) - .get('/v3/challenges?filter=id=30051826') + .get('/v4/challenges?filter=id=30051826') .reply(200, challengeAPIResponse[2]) - .get('/v3/challenges?filter=id=31000000') + .get('/v4/challenges?filter=id=31000000') .reply(200, challengeAPIResponse[3]) .get('/v3/users?filter=id=10000') .reply(200, memberAPIResponse[0]) diff --git a/test/e2e/test.js b/test/e2e/test.js index 53b8f6e..9b6a466 100644 --- a/test/e2e/test.js +++ b/test/e2e/test.js @@ -197,13 +197,10 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { id: '161d3655-9c80-4f90-8051-e209e8c21702', submissionId: '261d3655-9c80-4f90-8051-e209e8c21702', metadata: { - assertions: { + tests: { pending: 0, failed: 1, total: 10 - }, - tests: { - total: 10 } }, score: 90 @@ -360,7 +357,7 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { score: 50 }) expect(res.status).to.equal(204) - expect(debugLogs[3]).to.equal('Group ID of Challenge # 31000000 is not configured for processing!') + expect(debugLogs[3]).to.equal('Group ID ([30000]) of Challenge # 31000000 is not in the configured set of Ids (202343,20000000) configured for processing!') }) }) @@ -371,13 +368,10 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { .send({ id: '361d3655-9c80-4f90-8051-e209e8c21701', metadata: { - assertions: { + tests: { pending: 0, failed: 1, total: 5 - }, - tests: { - total: 5 } }, score: 80 @@ -393,7 +387,8 @@ describe('Topcoder - Leaderboard API E2E Tests', () => { handle: 'TonyJ', aggregateScore: 80, testsPassed: 4, - totalTestCases: 5 + totalTestCases: 5, + scoreLevel: 'up' }) }) diff --git a/test/unit/test.js b/test/unit/test.js index aa00b22..1b9f767 100644 --- a/test/unit/test.js +++ b/test/unit/test.js @@ -157,13 +157,10 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { id: '161d3655-9c80-4f90-8051-e209e8c21702', submissionId: '261d3655-9c80-4f90-8051-e209e8c21702', metadata: { - assertions: { + tests: { pending: 0, failed: 1, total: 10 - }, - tests: { - total: 10 } }, score: 90 @@ -310,7 +307,7 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { submissionId: '261d3655-9c80-4f90-8051-e209e8c21707', score: 50 }) - expect(debugLogs[3]).to.equal('Group ID of Challenge # 31000000 is not configured for processing!') + expect(debugLogs[3]).to.equal('Group ID ([30000]) of Challenge # 31000000 is not in the configured set of Ids (202343,20000000) configured for processing!') }) }) @@ -319,13 +316,10 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { const result = await service.updateLeaderboard('30051825', '8547899', { id: '361d3655-9c80-4f90-8051-e209e8c21701', metadata: { - assertions: { + tests: { pending: 0, failed: 1, total: 5 - }, - tests: { - total: 5 } }, score: 80 @@ -339,7 +333,8 @@ describe('Topcoder - Leaderboard API Unit Tests', () => { handle: 'TonyJ', aggregateScore: 80, testsPassed: 4, - totalTestCases: 5 + totalTestCases: 5, + scoreLevel: 'up' }) }) From 0831b142a211940e2a41dd7c1b4e4756354477f2 Mon Sep 17 00:00:00 2001 From: Mithun Kamath Date: Thu, 7 Nov 2019 13:12:00 +0530 Subject: [PATCH 3/3] #19 - Update postman collection payloads --- docs/Leaderboard API.postman_collection.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Leaderboard API.postman_collection.json b/docs/Leaderboard API.postman_collection.json index 28901c9..a53b0d2 100755 --- a/docs/Leaderboard API.postman_collection.json +++ b/docs/Leaderboard API.postman_collection.json @@ -180,7 +180,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"assertions\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 10\n },\n \"tests\": {\n \"total\": 10\n }\n },\n \"score\": 90\n}", + "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"submissionId\": \"261d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"tests\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 10\n }\n },\n \"score\": 90\n}", "options": { "raw": { "language": "json" @@ -296,7 +296,7 @@ ], "body": { "mode": "raw", - "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"assertions\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 5\n },\n \"tests\": {\n \"total\": 5\n }\n },\n \"score\": 80\n}" + "raw": "{\n\t\"id\": \"161d3655-9c80-4f90-8051-e209e8c21701\",\n \"metadata\": {\n \"test\": {\n \"pending\": 0,\n \"failed\": 1,\n \"total\": 5\n }\n },\n \"score\": 80\n}" }, "url": { "raw": "{{URL}}/leaderboard/challenge/30051825/member/8547899",