UNPKG

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