]>
git.immae.eu Git - perso/Immae/Projets/Nodejs/Surfer.git/blob - test/test.js
10 var execSync
= require('child_process').execSync
,
11 expect
= require('expect.js'),
12 path
= require('path'),
13 util
= require('util'),
14 superagent
= require('superagent'),
15 { Builder
, By
, until
} = require('selenium-webdriver'),
16 { Options
} = require('selenium-webdriver/chrome');
18 if (!process
.env
.USERNAME
|| !process
.env
.PASSWORD
) {
19 console
.log('USERNAME and PASSWORD env vars need to be set');
23 describe('Application life cycle test', function () {
26 const EXEC_ARGS
= { cwd: path
.resolve(__dirname
, '..'), stdio: 'inherit' };
27 const LOCATION
= 'test';
28 const TEST_TIMEOUT
= 10000;
29 const TEST_FILE_NAME_0
= 'index.html';
30 const TEST_FILE_NAME_1
= 'test.txt';
36 browser
= new Builder().forBrowser('chrome').setChromeOptions(new Options().windowSize({ width: 1280, height: 1024 })).build();
43 function getAppInfo() {
44 var inspect
= JSON
.parse(execSync('cloudron inspect'));
45 app
= inspect
.apps
.filter(function (a
) { return a
.location
=== LOCATION
; })[0];
46 expect(app
).to
.be
.an('object');
49 function waitForElement(elem
) {
50 return browser
.wait(until
.elementLocated(elem
), TEST_TIMEOUT
).then(function () {
51 return browser
.wait(until
.elementIsVisible(browser
.findElement(elem
)), TEST_TIMEOUT
);
55 // tests which are used more than once
56 function login(done
) {
57 browser
.manage().deleteAllCookies();
58 browser
.get('https://' + app
.fqdn
+ '/_admin');
60 waitForElement(By
.id('loginUsernameInput')).then(function () {
61 browser
.findElement(By
.id('loginUsernameInput')).sendKeys(process
.env
.USERNAME
);
62 browser
.findElement(By
.id('loginPasswordInput')).sendKeys(process
.env
.PASSWORD
);
63 browser
.findElement(By
.id('loginSubmitButton')).click();
65 waitForElement(By
.id('burgerMenuButton')).then(function () {
71 function logout(done
) {
72 browser
.get('https://' + app
.fqdn
+ '/_admin');
74 waitForElement(By
.id('burgerMenuButton')).then(function () {
75 browser
.findElement(By
.id('burgerMenuButton')).click();
77 // wait for open animation
80 waitForElement(By
.id('logoutButton')).then(function () {
81 browser
.findElement(By
.id('logoutButton')).click();
83 waitForElement(By
.id('loginUsernameInput')).then(function () {
90 function checkFileIsListed(name
, done
) {
91 browser
.get('https://' + app
.fqdn
+ '/_admin');
93 waitForElement(By
.xpath('//*[text()="' + name
+ '"]')).then(function () {
98 function checkFileIsPresent(done
) {
99 browser
.get('https://' + app
.fqdn
+ '/' + TEST_FILE_NAME_0
);
101 waitForElement(By
.xpath('//*[text()="test"]')).then(function () {
106 function checkIndexFileIsServedUp(done
) {
107 browser
.get('https://' + app
.fqdn
);
109 waitForElement(By
.xpath('//*[text()="test"]')).then(function () {
114 function checkFileIsGone(name
, done
) {
115 superagent
.get('https://' + app
.fqdn
+ '/' + name
).end(function (error
, result
) {
116 expect(error
).to
.be
.an('object');
117 expect(error
.response
.status
).to
.equal(404);
118 expect(result
).to
.be
.an('object');
123 function cliLogin(done
) {
124 execSync(util
.format('%s login %s --username %s --password %s', path
.join(__dirname
, '/../cli/surfer.js'), app
.fqdn
, process
.env
.USERNAME
, process
.env
.PASSWORD
), { stdio: 'inherit' } );
128 function uploadFile(name
, done
) {
129 // File upload can't be tested with selenium, since the file input is not visible and thus can't be interacted with :-(
131 execSync(path
.join(__dirname
, '/../cli/surfer.js') + ' put ' + path
.join(__dirname
, name
) + ' /', { stdio: 'inherit' } );
135 xit('build app', function () { execSync('cloudron build', EXEC_ARGS
); });
137 it('install app', function () { execSync(`cloudron install --location ${LOCATION}`, EXEC_ARGS
); });
139 it('can get app information', getAppInfo
);
141 it('can login', login
);
142 it('can cli login', cliLogin
);
143 it('can upload file', uploadFile
.bind(null, TEST_FILE_NAME_0
));
144 it('file is listed', checkFileIsListed
.bind(null, TEST_FILE_NAME_0
));
145 it('file is served up', checkFileIsPresent
);
146 it('file is served up', checkIndexFileIsServedUp
);
147 it('can upload second file', uploadFile
.bind(null, TEST_FILE_NAME_1
));
148 it('file is listed', checkFileIsListed
.bind(null, TEST_FILE_NAME_1
));
149 it('can delete second file with cli', function () {
150 execSync(path
.join(__dirname
, '/../cli/surfer.js') + ' del ' + TEST_FILE_NAME_1
, { stdio: 'inherit' } );
152 it('second file is gone', checkFileIsGone
.bind(null, TEST_FILE_NAME_1
));
153 it('can logout', logout
);
155 it('backup app', function () { execSync(`cloudron backup create --app ${app.id}`, EXEC_ARGS
); });
156 it('restore app', function () { execSync(`cloudron restore --app ${app.id}`, EXEC_ARGS
); });
158 it('can login', login
);
159 it('file is listed', checkFileIsListed
.bind(null, TEST_FILE_NAME_0
));
160 it('file is served up', checkFileIsPresent
);
161 it('file is served up', checkIndexFileIsServedUp
);
162 it('second file is still gone', checkFileIsGone
.bind(null, TEST_FILE_NAME_1
));
163 it('can logout', logout
);
165 it('move to different location', function (done
) {
166 browser
.manage().deleteAllCookies();
168 // ensure we don't hit NXDOMAIN in the mean time
169 browser
.get('about:blank').then(function () {
170 execSync(`cloudron configure --location ${LOCATION}2 --app ${app.id}`, EXEC_ARGS
);
178 it('can login', login
);
179 it('file is listed', checkFileIsListed
.bind(null, TEST_FILE_NAME_0
));
180 it('file is served up', checkFileIsPresent
);
181 it('file is served up', checkIndexFileIsServedUp
);
182 it('can logout', logout
);
184 it('uninstall app', function (done
) {
185 // ensure we don't hit NXDOMAIN in the mean time
186 browser
.get('about:blank').then(function () {
187 execSync(`cloudron uninstall --app ${app.id}`, EXEC_ARGS
);
193 it('can install app', function () {
194 execSync(`cloudron install --appstore-id io.cloudron.surfer --location ${LOCATION}`, EXEC_ARGS
);
197 it('can get app information', getAppInfo
);
198 it('can login', login
);
199 it('can cli login', cliLogin
);
200 it('can upload file', uploadFile
.bind(null, TEST_FILE_NAME_0
));
201 it('file is listed', checkFileIsListed
.bind(null, TEST_FILE_NAME_0
));
202 it('file is served up', checkFileIsPresent
);
203 it('file is served up', checkIndexFileIsServedUp
);
204 it('can logout', logout
);
206 it('can update', function () {
207 execSync(`cloudron update --app ${LOCATION}`, EXEC_ARGS
);
210 it('can login', login
);
211 it('file is listed', checkFileIsListed
.bind(null, TEST_FILE_NAME_0
));
212 it('file is served up', checkFileIsPresent
);
213 it('file is served up', checkIndexFileIsServedUp
);
214 it('can logout', logout
);
216 it('uninstall app', function (done
) {
217 // ensure we don't hit NXDOMAIN in the mean time
218 browser
.get('about:blank').then(function () {
219 execSync(`cloudron uninstall --app ${app.id}`, EXEC_ARGS
);