1 | var server = require('../').server;
|
2 | var request = require('supertest');
|
3 | var assert = require('assert');
|
4 | var fs = require('fs');
|
5 | var validateTask = require('./validateTask');
|
6 |
|
7 | var tmpFiles = ['tmp1', 'tmp2', 'tmp3', 'tmp4', 'tmp5'];
|
8 |
|
9 | function cleanup() {
|
10 | tmpFiles.forEach(function(path){
|
11 | try {
|
12 |
|
13 | fs.unlinkSync(path);
|
14 | } catch (err) {
|
15 |
|
16 | }
|
17 | });
|
18 | }
|
19 | cleanup();
|
20 | process.on('exit', cleanup);
|
21 |
|
22 | describe('A server', function(){
|
23 | describe('just after startup, GET /tasks', function(){
|
24 | it('should respond with empty json', function(done){
|
25 | request(server())
|
26 | .get('/tasks')
|
27 | .set('Accept', 'application/json')
|
28 | .expect('Content-Type', /json/)
|
29 | .expect(200)
|
30 | .expect({}, done);
|
31 | });
|
32 | });
|
33 |
|
34 | describe('just after startup, GET /tasks/1', function(){
|
35 | it('should 404', function(done){
|
36 | request(server())
|
37 | .get('/tasks/1')
|
38 | .expect(404, done);
|
39 | });
|
40 | });
|
41 |
|
42 | describe('with a newly created task', function(){
|
43 | var app = server();
|
44 | var createdTask;
|
45 |
|
46 | it('should respond with a task object', function(done){
|
47 | request(app)
|
48 | .post('/tasks')
|
49 | .send({})
|
50 | .set('Accept', 'application/json')
|
51 | .expect('Content-Type', /json/)
|
52 | .expect(200)
|
53 | .end(function(err, res){
|
54 | if (err) {
|
55 | return done(err);
|
56 | }
|
57 |
|
58 | createdTask = res.body;
|
59 |
|
60 | validateTask(createdTask);
|
61 |
|
62 | done();
|
63 | });
|
64 | });
|
65 |
|
66 | it('should create GET /tasks/:id', function(done){
|
67 | request(app)
|
68 | .get('/tasks/'+createdTask.id)
|
69 | .set('Accept', 'application/json')
|
70 | .expect('Content-Type', /json/)
|
71 | .expect(200)
|
72 | .end(function(err, res){
|
73 | if (err) {
|
74 | return done(err);
|
75 | }
|
76 |
|
77 | var task = res.body;
|
78 |
|
79 | validateTask(task);
|
80 |
|
81 | assert.deepEqual(createdTask, task);
|
82 |
|
83 | done();
|
84 | });
|
85 | });
|
86 |
|
87 | it('should be accessible in GET /tasks', function(done){
|
88 | request(app)
|
89 | .get('/tasks')
|
90 | .set('Accept', 'application/json')
|
91 | .expect('Content-Type', /json/)
|
92 | .expect(200)
|
93 | .end(function(err, res){
|
94 | if (err) {
|
95 | return done(err);
|
96 | }
|
97 |
|
98 | var tasks = res.body;
|
99 |
|
100 | assert.deepEqual(Object.keys(tasks), [createdTask.id]);
|
101 |
|
102 | validateTask(tasks[createdTask.id]);
|
103 |
|
104 | assert.deepEqual(createdTask, tasks[createdTask.id]);
|
105 |
|
106 | done();
|
107 | });
|
108 | });
|
109 |
|
110 | it('should be appendable', function(done){
|
111 | request(app)
|
112 | .post('/tasks/'+createdTask.id)
|
113 | .send({commands: ['touch '+tmpFiles[0], 'touch '+tmpFiles[1]]})
|
114 | .set('Accept', 'application/json')
|
115 | .expect('Content-Type', /json/)
|
116 | .expect(200)
|
117 | .end(function(err, res){
|
118 | if (err) {
|
119 | return done(err);
|
120 | }
|
121 |
|
122 | var task = res.body;
|
123 |
|
124 | validateTask(task);
|
125 |
|
126 | assert.deepEqual(createdTask, task);
|
127 |
|
128 | var interval = setInterval(function(){
|
129 | if (typeof fs.existsSync === 'function') {
|
130 | if (fs.existsSync(process.cwd()+'/'+tmpFiles[0]) && fs.existsSync(process.cwd()+'/'+tmpFiles[1])) {
|
131 | clearInterval(interval);
|
132 | clearTimeout(timeout);
|
133 | done();
|
134 | }
|
135 | } else {
|
136 | try {
|
137 | fs.accessSync(process.cwd()+'/'+tmpFiles[0]);
|
138 | fs.accessSync(process.cwd()+'/'+tmpFiles[1]);
|
139 | clearInterval(interval);
|
140 | clearTimeout(timeout);
|
141 | done();
|
142 | } catch (err) {
|
143 |
|
144 | }
|
145 | }
|
146 | });
|
147 |
|
148 | var timeout = setTimeout(function(){
|
149 | clearInterval(interval);
|
150 | done(new Error('command was not run within 500ms'));
|
151 | }, 500);
|
152 | });
|
153 | });
|
154 |
|
155 | it('should be deletable', function(done){
|
156 | request(app)
|
157 | .delete('/tasks/'+createdTask.id)
|
158 | .expect(200, done);
|
159 | });
|
160 |
|
161 | it('should shown as stopped in GET /task/:id after it\'s deleted', function(done){
|
162 | request(app)
|
163 | .get('/tasks/'+createdTask.id)
|
164 | .end(function(err, res){
|
165 | if (err) {
|
166 | return done(err);
|
167 | }
|
168 |
|
169 | var task = res.body;
|
170 |
|
171 | validateTask(task, true, true, true);
|
172 |
|
173 | done();
|
174 | });
|
175 | });
|
176 |
|
177 | it('should be shown as stopped in GET /tasks after it\'s deleted', function(done){
|
178 | request(app)
|
179 | .get('/tasks')
|
180 | .set('Accept', 'application/json')
|
181 | .expect('Content-Type', /json/)
|
182 | .expect(200)
|
183 | .end(function(err, res){
|
184 | if (err) {
|
185 | return done(err);
|
186 | }
|
187 |
|
188 | var tasks = res.body;
|
189 | assert.equal(Object.keys(tasks).length, 1);
|
190 |
|
191 | validateTask(tasks[Object.keys(tasks)[0]], true, true, true);
|
192 |
|
193 | done();
|
194 | });
|
195 | });
|
196 | });
|
197 |
|
198 | describe('with a newly created task that has a timeout', function(){
|
199 | var app = server();
|
200 | var createdTask;
|
201 |
|
202 | it('should respond with a task object', function(done){
|
203 | request(app)
|
204 | .post('/tasks')
|
205 | .send({timeout: 1000, commands: ['sleep 10'], end: true})
|
206 | .set('Accept', 'application/json')
|
207 | .expect('Content-Type', /json/)
|
208 | .expect(200)
|
209 | .end(function(err, res){
|
210 | if (err) {
|
211 | return done(err);
|
212 | }
|
213 |
|
214 | createdTask = res.body;
|
215 |
|
216 | validateTask(createdTask, false, true);
|
217 | assert.equal(createdTask.timeout, 1000);
|
218 |
|
219 | done();
|
220 | });
|
221 | });
|
222 |
|
223 | it('should create time out', function(done){
|
224 | setTimeout(function(){
|
225 | request(app)
|
226 | .get('/tasks/'+createdTask.id)
|
227 | .set('Accept', 'application/json')
|
228 | .expect('Content-Type', /json/)
|
229 | .expect(200)
|
230 | .end(function(err, res){
|
231 | if (err) {
|
232 | return done(err);
|
233 | }
|
234 |
|
235 | var task = res.body;
|
236 |
|
237 | validateTask(task, true, true, true);
|
238 |
|
239 | done();
|
240 | });
|
241 | }, 1100);
|
242 | });
|
243 | });
|
244 | });
|