1 | var assert = require('assert');
|
2 | var async = require('async');
|
3 | var sinon = require('sinon');
|
4 | var shortid = require('shortid');
|
5 | var _ = require('lodash');
|
6 | var path = require('path');
|
7 | var parseUrl = require('url').parse;
|
8 | var rimraf = require('rimraf');
|
9 | var through = require('through2');
|
10 | var log = require('../lib/log');
|
11 | var fs = require('fs');
|
12 | var request = require('request');
|
13 | var inquirer = require('inquirer');
|
14 | var debug = require('debug')('4front:cli:test');
|
15 | var deploy = require('../commands/deploy');
|
16 | var os = require('os');
|
17 | var childProcess = require('child_process');
|
18 | var mockSpawn = require('./mock-spawn');
|
19 | var mockInquirer = require('./mock-inquirer');
|
20 |
|
21 | require('dash-assert');
|
22 |
|
23 | describe('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 |
|
55 | sinon.stub(request, 'put', function(options, callback) {
|
56 | callback(null, {statusCode: 200}, _.extend({}, options.json, {
|
57 | complete: true
|
58 | }));
|
59 | });
|
60 |
|
61 |
|
62 | sinon.stub(request, 'post', function(options, callback) {
|
63 |
|
64 | if (options.url.indexOf('/deploy') > 0) {
|
65 |
|
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 | });
|