1+ import app from '../../src/server' ;
2+ import DB from '../../src/models' ;
3+ import express = require( 'express' ) ;
4+ import { Router } from 'express' ;
5+ import * as utils from '../utils/utils' ;
6+
7+
8+ const chai = require ( 'chai' ) ;
9+ const chaiHttp = require ( 'chai-http' ) ;
10+
11+ chai . use ( chaiHttp ) ;
12+ const { expect} = chai ;
13+
14+ const APIKEY = '7718330d2794406c980bdbded6c9dc1d' ;
15+
16+
17+ function delay ( ms : number ) {
18+ return new Promise ( resolve => setTimeout ( resolve , ms ) ) ;
19+ }
20+
21+ describe ( 'POST api/project' , ( ) => {
22+ before ( async ( ) => {
23+ await DB . apikeys . create ( {
24+ id : 1 ,
25+ key : APIKEY ,
26+ whitelist_domains : [ '*' ] ,
27+ whitelist_ips : [ '*' ]
28+ } ) ;
29+ await DB . langs . create ( {
30+ lang_slug : 'node' ,
31+ lang_name : 'NodeJS' ,
32+ lang_version : '10'
33+ } ) ;
34+ await utils . setupMockQueue ( ) ;
35+
36+ } ) ;
37+ after ( utils . truncateTables ) ;
38+
39+ it ( 'should throw 403 error if API Key is absent' , async ( ) => {
40+ const res = await chai . request ( app ) . post ( `/api/project` ) ;
41+
42+ expect ( res . status ) . to . equal ( 403 ) ;
43+ expect ( res . body . message ) . to . equal ( 'No API Key in request' ) ;
44+ } ) ;
45+
46+ it ( 'should throw 404 error if GET request is made' , async ( ) => {
47+ const res = await chai . request ( app ) . get ( `/api/project` ) . set ( {
48+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
49+ Accept : 'application/json'
50+ } ) ;
51+
52+ expect ( res . status ) . to . equal ( 404 ) ;
53+ } ) ;
54+
55+ it ( 'should throw 400 error if correct params are not sent along with the POST request' , async ( ) => {
56+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
57+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
58+ Accept : 'application/json'
59+ } ) . send ( { } ) ;
60+
61+ expect ( res . status ) . to . equal ( 400 ) ;
62+ expect ( res . body . err . message ) . to . equal ( '"lang" is required' ) ;
63+ } ) ;
64+
65+ it ( 'should throw 400 error for incorrect language' , async ( ) => {
66+ const params = {
67+ lang : 'abcd' ,
68+ problem : 'https://minio.cb.lk/public/input' ,
69+ submission : 'https://minio.cb.lk/public/input' ,
70+ submissionDirs : 'src' ,
71+ mode : 'sync' ,
72+ timelimit : 1
73+ } ;
74+
75+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
76+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
77+ Accept : 'application/json'
78+ } ) . send ( params ) ;
79+
80+ expect ( res . status ) . to . equal ( 400 ) ;
81+ } ) ;
82+
83+ it ( 'should throw 400 error for problem missing' , async ( ) => {
84+ const params = {
85+ lang : 'node' ,
86+ submission : 'https://minio.cb.lk/public/input' ,
87+ submissionDirs : 'src' ,
88+ mode : 'sync' ,
89+ timelimit : 1
90+ } ;
91+
92+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
93+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
94+ Accept : 'application/json'
95+ } ) . send ( params ) ;
96+
97+ expect ( res . status ) . to . equal ( 400 ) ;
98+ expect ( res . body . err . message ) . to . equal ( '"problem" is required' ) ;
99+ } ) ;
100+
101+ it ( 'should throw 400 error when problem is not an url' , async ( ) => {
102+ const params = {
103+ lang : 'node' ,
104+ problem : 'not-a-url' ,
105+ submission : 'https://minio.cb.lk/public/input' ,
106+ submissionDirs : 'src' ,
107+ mode : 'sync' ,
108+ timelimit : 1
109+ } ;
110+
111+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
112+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
113+ Accept : 'application/json'
114+ } ) . send ( params ) ;
115+
116+ expect ( res . status ) . to . equal ( 400 ) ;
117+ expect ( res . body . err . message ) . to . equal ( '"problem" must be a valid uri' ) ;
118+ } ) ;
119+
120+ it ( 'should throw 400 error for submission missing' , async ( ) => {
121+ const params = {
122+ lang : 'node' ,
123+ problem : 'https://minio.cb.lk/public/input' ,
124+ submissionDirs : 'src' ,
125+ mode : 'sync' ,
126+ timelimit : 1
127+ } ;
128+
129+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
130+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
131+ Accept : 'application/json'
132+ } ) . send ( params ) ;
133+
134+ expect ( res . status ) . to . equal ( 400 ) ;
135+ expect ( res . body . err . message ) . to . equal ( '"submission" is required' ) ;
136+ } ) ;
137+
138+ it ( 'should throw 400 error when submission is not an url' , async ( ) => {
139+ const params = {
140+ lang : 'node' ,
141+ problem : 'https://minio.cb.lk/public/input' ,
142+ submission : 'not-a-url' ,
143+ submissionDirs : 'src' ,
144+ mode : 'sync' ,
145+ timelimit : 1
146+ } ;
147+
148+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
149+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
150+ Accept : 'application/json'
151+ } ) . send ( params ) ;
152+
153+ expect ( res . status ) . to . equal ( 400 ) ;
154+ expect ( res . body . err . message ) . to . equal ( '"submission" must be a valid uri' ) ;
155+ } ) ;
156+
157+ it ( 'should throw 400 error for submissionDirs missing' , async ( ) => {
158+ const params = {
159+ lang : 'node' ,
160+ problem : 'https://minio.cb.lk/public/input' ,
161+ submission : 'https://minio.cb.lk/public/input' ,
162+ mode : 'sync' ,
163+ timelimit : 1
164+ } ;
165+
166+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
167+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
168+ Accept : 'application/json'
169+ } ) . send ( params ) ;
170+
171+ expect ( res . status ) . to . equal ( 400 ) ;
172+ expect ( res . body . err . message ) . to . equal ( '"submissionDirs" is required' ) ;
173+ } ) ;
174+
175+ it ( 'should throw 400 error when submissionDirs is not a string' , async ( ) => {
176+ const params = {
177+ lang : 'node' ,
178+ problem : 'https://minio.cb.lk/public/input' ,
179+ submission : 'https://minio.cb.lk/public/input' ,
180+ submissionDirs : 123 ,
181+ mode : 'sync' ,
182+ timelimit : 1
183+ } ;
184+
185+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
186+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
187+ Accept : 'application/json'
188+ } ) . send ( params ) ;
189+
190+ expect ( res . status ) . to . equal ( 400 ) ;
191+ expect ( res . body . err . message ) . to . equal ( '"submissionDirs" must be a string' ) ;
192+ } ) ;
193+
194+ it ( 'should throw 400 error for incorrect mode ' , async ( ) => {
195+ const params = {
196+ lang : 'node' ,
197+ problem : 'https://minio.cb.lk/public/input' ,
198+ submission : 'https://minio.cb.lk/public/input' ,
199+ submissionDirs : 'src' ,
200+ mode : 'abc' ,
201+ timelimit : 1
202+ } ;
203+
204+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
205+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
206+ Accept : 'application/json'
207+ } ) . send ( params ) ;
208+
209+ expect ( res . status ) . to . equal ( 400 ) ;
210+ expect ( res . body . err . message ) . to . equal ( '"mode" must be one of [sync, callback, poll]' ) ;
211+ } ) ;
212+
213+ it ( 'should throw 400 if mode is callback but callback is not present' , async ( ) => {
214+ const params = {
215+ lang : 'node' ,
216+ problem : 'https://minio.cb.lk/public/input' ,
217+ submission : 'https://minio.cb.lk/public/input' ,
218+ submissionDirs : 'src' ,
219+ mode : 'callback' ,
220+ timelimit : 1
221+ } ;
222+
223+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
224+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
225+ Accept : 'application/json'
226+ } ) . send ( params ) ;
227+
228+ expect ( res . status ) . to . equal ( 400 ) ;
229+ expect ( res . body . err . message ) . to . equal ( '"callback" is required' ) ;
230+ } ) ;
231+
232+ it ( 'should return correct result in sync mode ' , async ( ) => {
233+ const params = {
234+ lang : 'node' ,
235+ problem : 'https://minio.cb.lk/public/input' ,
236+ submission : 'https://minio.cb.lk/public/input' ,
237+ submissionDirs : 'src' ,
238+ mode : 'sync' ,
239+ timelimit : 1
240+ } ;
241+
242+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
243+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
244+ Accept : 'application/json'
245+ } ) . send ( params ) ;
246+
247+ expect ( res . body . score ) . to . equal ( 100 ) ;
248+ expect ( res . status ) . to . equal ( 200 ) ;
249+ } ) ;
250+
251+
252+ it ( 'should return correct submission.id in poll mode' , async ( ) => {
253+ const params = {
254+ lang : 'node' ,
255+ problem : 'https://minio.cb.lk/public/input' ,
256+ submission : 'https://minio.cb.lk/public/input' ,
257+ submissionDirs : 'src' ,
258+ mode : 'poll' ,
259+ timelimit : 1
260+ } ;
261+
262+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
263+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
264+ Accept : 'application/json'
265+ } ) . send ( params ) ;
266+
267+
268+ // there is a delay of 1000 for onSuccess, so setting 2000ms delay here.
269+ await delay ( 2000 ) ;
270+ const submission = await DB . submissions . findById ( res . body . id ) ;
271+
272+ expect ( res . body . id ) . to . exist ;
273+ expect ( res . status ) . to . equal ( 200 ) ;
274+ expect ( submission . results . score ) . to . equal ( 100 ) ;
275+ } ) ;
276+
277+ it ( 'should return id and send result to callback url in callback mode' , async ( ) => {
278+ const params = {
279+ lang : 'node' ,
280+ problem : 'https://minio.cb.lk/public/input' ,
281+ submission : 'https://minio.cb.lk/public/input' ,
282+ submissionDirs : 'src' ,
283+ mode : 'callback' ,
284+ callback : 'http://localhost:2404' ,
285+ timelimit : 1
286+ } ;
287+
288+ const res = await chai . request ( app ) . post ( `/api/project` ) . set ( {
289+ Authorization : 'Bearer 7718330d2794406c980bdbded6c9dc1d' ,
290+ Accept : 'application/json'
291+ } ) . send ( params ) ;
292+
293+ let resultFromCallBack ;
294+
295+ // Mock server for callback
296+ const app2 = express ( ) ;
297+ app2 . use ( express . json ( ) ) ;
298+ const router = Router ( ) ;
299+ app2 . listen ( 2404 , ( ) => {
300+ router . post ( '/' , ( req , res ) => {
301+ resultFromCallBack = req . body ;
302+ } ) ;
303+ app2 . use ( '/' , router ) ;
304+ } ) ;
305+
306+ await delay ( 2000 ) ;
307+
308+ expect ( res . body . id ) . to . exist ;
309+ expect ( res . status ) . to . equal ( 200 ) ;
310+ expect ( resultFromCallBack . score ) . to . equal ( 100 ) ;
311+ } ) ;
312+ } ) ;
0 commit comments