UNPKG

5.25 kBJavaScriptView Raw
1var assert = require('assert');
2var async = require('async');
3var sinon = require('sinon');
4var shortid = require('shortid');
5var _ = require('lodash');
6var path = require('path');
7var parseUrl = require('url').parse;
8var rimraf = require('rimraf');
9var through = require('through2');
10var log = require('../lib/log');
11var fs = require('fs');
12var request = require('request');
13var inquirer = require('inquirer');
14var debug = require('debug')('4front:cli:test');
15var deploy = require('../commands/deploy');
16var os = require('os');
17var childProcess = require('child_process');
18var mockSpawn = require('./mock-spawn');
19var mockInquirer = require('./mock-inquirer');
20
21require('dash-assert');
22
23describe('deploy', function() {
24 var self;
25
26 beforeEach(function(done) {
27 self = this;
28
29 this.program = {
30 profile: {
31 name: 'default',
32 url: 'https://apphost.com/',
33 jwt: {
34 token: '23523454'
35 }
36 },
37 virtualApp: {
38 appId: shortid.generate(),
39 trafficControlEnabled: false
40 },
41 virtualAppManifest: {
42 scripts: {}
43 },
44 cwd: path.join(os.tmpdir(), 'test-app')
45 };
46
47 this.mockAnswers = {};
48
49 this.mockInquirer = require('./mock-inquirer')(this.mockAnswers);
50
51 sinon.stub(log, 'write', _.noop());
52 sinon.stub(childProcess, 'spawn', mockSpawn);
53
54 // Stub the PUT api call to activate the version
55 sinon.stub(request, 'put', function(options, callback) {
56 callback(null, {statusCode: 200}, _.extend({}, options.json, {
57 complete: true
58 }));
59 });
60
61 // Stub the POST api calls to deploy a file and create a new version.
62 sinon.stub(request, 'post', function(options, callback) {
63 // Mock the create app post request
64 if (options.url.indexOf('/deploy') > 0) {
65 // Create a dummy write stream
66 return through(function(chunk, enc, cb) {
67 cb();
68 }, function() {
69 callback(null, {statusCode: 201});
70 });
71 }
72 else {
73 callback(null, {statusCode: 201}, _.extend(options.json, {
74 appId: self.program.virtualApp.appId,
75 versionId: shortid.generate()
76 }));
77 }
78 });
79
80 sinon.stub(inquirer, 'prompt', this.mockInquirer.prompt);
81
82 async.series([
83 function(cb) {
84 rimraf(self.program.cwd, cb);
85 },
86 function(cb) {
87 fs.mkdir(self.program.cwd, cb);
88 },
89 function(cb) {
90 fs.writeFile(path.join(self.program.cwd, 'index.html'), '<html>', cb);
91 },
92 function(cb) {
93 fs.writeFile(path.join(self.program.cwd, 'app.js'), '// app.js', cb);
94 }
95 ], done);
96 });
97
98 afterEach(function() {
99 request.post.restore();
100 request.put.restore();
101 inquirer.prompt.restore();
102 childProcess.spawn.restore();
103 log.write.restore();
104 });
105
106 it('deploys new version', function(done) {
107 _.extend(this.mockAnswers, {
108 name: 'version-name',
109 message: 'foo',
110 runBuild: false
111 });
112
113 deploy(this.program, function(err) {
114 if (err) return done(err);
115
116 assert.ok(self.mockInquirer.wasAsked('name'));
117 assert.ok(self.mockInquirer.wasAsked('message'));
118 assert.isFalse(self.mockInquirer.wasAsked('runBuildStep'));
119
120 assert.ok(request.post.calledWith(sinon.match({
121 url: sinon.match('/versions'),
122 json: sinon.match({
123 name: 'version-name',
124 message: 'foo'
125 })
126 })));
127
128 assert.ok(request.post.calledWith(sinon.match({
129 url: sinon.match('/deploy/index.html')
130 })));
131
132 assert.ok(request.post.calledWith(sinon.match({
133 url: sinon.match('/deploy/app.js'),
134 headers: sinon.match({
135 'Content-Type': 'application/gzip'
136 })
137 })));
138
139 assert.ok(request.put.calledWith(sinon.match({
140 url: sinon.match('/complete')
141 })));
142
143 done();
144 });
145 });
146
147 it('does not ask to force traffic if trafficControl not enabled', function(done) {
148 self.program.virtualApp.trafficControlEnabled = false;
149 deploy(this.program, function(err) {
150 assert.isFalse(self.mockInquirer.wasAsked('force'));
151 done();
152 });
153 });
154
155 it('asks to force traffic if trafficControl enabled', function(done) {
156 self.program.virtualApp.trafficControlEnabled = true;
157 deploy(this.program, function(err) {
158 assert.isTrue(self.mockInquirer.wasAsked('force'));
159 done();
160 });
161 });
162
163 it('sends forceAllTrafficToNewVersion parameter', function(done) {
164 self.program.virtualApp.trafficControlEnabled = true;
165 this.mockAnswers.force = true;
166
167 deploy(this.program, function(err) {
168 debugger;
169 assert.isTrue(self.mockInquirer.wasAsked('force'));
170
171 assert.ok(request.put.calledWith(sinon.match({
172 url: sinon.match('/complete'),
173 json: sinon.match({
174 forceAllTrafficToNewVersion: true
175 })
176 })));
177
178 done();
179 });
180 });
181
182 it('runs npm build', function(done) {
183 self.program.virtualAppManifest.scripts.build = 'gulp build';
184 self.mockAnswers.runBuildStep= true;
185
186 deploy(this.program, function(err) {
187 if (err) return done(err);
188
189 assert.isTrue(childProcess.spawn.calledWith('npm', ['run-script', 'build']));
190
191 done();
192 });
193 });
194});