]> git.immae.eu Git - perso/Immae/Projets/Nodejs/Surfer.git/blame - test/test.js
Corretly send 404 status codes
[perso/Immae/Projets/Nodejs/Surfer.git] / test / test.js
CommitLineData
ebd7ed7a
GR
1#!/usr/bin/env node
2
3'use strict';
4
5var execSync = require('child_process').execSync,
6 expect = require('expect.js'),
7 path = require('path'),
1c3b94a7 8 util = require('util'),
5158ef83
JZ
9 fs = require('fs'),
10 superagent = require('superagent'),
11 webdriver = require('selenium-webdriver');
12
13var by = webdriver.By,
14 Keys = webdriver.Key,
15 until = webdriver.until;
ebd7ed7a
GR
16
17process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
18
5158ef83
JZ
19if (!process.env.USERNAME || !process.env.PASSWORD) {
20 console.log('USERNAME and PASSWORD env vars need to be set');
21 process.exit(1);
22}
23
ebd7ed7a
GR
24describe('Application life cycle test', function () {
25 this.timeout(0);
5158ef83 26
d9973759
JZ
27 var chrome = require('selenium-webdriver/chrome');
28 var server, browser = new chrome.Driver();
ebd7ed7a
GR
29
30 before(function (done) {
5158ef83
JZ
31 var seleniumJar= require('selenium-server-standalone-jar');
32 var SeleniumServer = require('selenium-webdriver/remote').SeleniumServer;
33 server = new SeleniumServer(seleniumJar.path, { port: 4444 });
34 server.start();
ebd7ed7a
GR
35
36 done();
37 });
38
39 after(function (done) {
5158ef83
JZ
40 browser.quit();
41 server.stop();
ebd7ed7a
GR
42 done();
43 });
44
f173d2d7 45 var LOCATION = 'test';
5158ef83
JZ
46 var TEST_TIMEOUT = 10000;
47 var TEST_FILE_NAME_0 = 'index.html';
48 var TEST_FILE_NAME_1 = 'test.txt';
49 var app;
50
51 // tests which are used more than once
52 function login(done) {
53 browser.manage().deleteAllCookies();
54 browser.get('https://' + app.fqdn + '/_admin');
55
56 browser.wait(until.elementLocated(by.id('inputUsername')), TEST_TIMEOUT).then(function () {
57 browser.wait(until.elementIsVisible(browser.findElement(by.id('inputUsername'))), TEST_TIMEOUT).then(function () {
58 browser.findElement(by.id('inputUsername')).sendKeys(process.env.USERNAME);
59 browser.findElement(by.id('inputPassword')).sendKeys(process.env.PASSWORD);
60 browser.findElement(by.id('loginForm')).submit();
61
62 browser.wait(until.elementIsVisible(browser.findElement(by.id('logoutButton'))), TEST_TIMEOUT).then(function () {
63 done();
64 });
65 });
66 });
67 }
68
69 function logout(done) {
70 browser.get('https://' + app.fqdn + '/_admin');
71
72 browser.wait(until.elementLocated(by.id('logoutButton')), TEST_TIMEOUT).then(function () {
73 browser.wait(until.elementIsVisible(browser.findElement(by.id('logoutButton'))), TEST_TIMEOUT).then(function () {
74 browser.findElement(by.id('logoutButton')).click();
75
76 browser.wait(until.elementIsVisible(browser.findElement(by.id('inputPassword'))), TEST_TIMEOUT).then(function () {
77 done();
78 });
79 });
80 });
81 }
82
83 function checkFileIsListed(name, done) {
84 browser.get('https://' + app.fqdn + '/_admin');
85
86 browser.wait(until.elementLocated(by.xpath('//*[text()="' + name + '"]')), TEST_TIMEOUT).then(function () {
87 done();
88 });
89 }
90
91 function checkFileIsPresent(done) {
92 browser.get('https://' + app.fqdn + '/' + TEST_FILE_NAME_0);
93
94 browser.wait(until.elementLocated(by.xpath('//*[text()="test"]')), TEST_TIMEOUT).then(function () {
95 done();
96 });
97 }
98
99 function checkIndexFileIsServedUp(done) {
100 browser.get('https://' + app.fqdn);
101
102 browser.wait(until.elementLocated(by.xpath('//*[text()="test"]')), TEST_TIMEOUT).then(function () {
103 done();
104 });
105 }
106
107 function checkFileIsGone(name, done) {
108 superagent.get('https://' + app.fqdn + '/' + name).end(function (error, result) {
109 expect(error).to.be.an('object');
110 expect(result.statusCode).to.equal(404);
111 done();
112 });
113 }
114
1c3b94a7
JZ
115 function cliLogin(done) {
116 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' } );
117 done();
118 }
119
5158ef83
JZ
120 function uploadFile(name, done) {
121 // File upload can't be tested with selenium, since the file input is not visible and thus can't be interacted with :-(
122
5158ef83
JZ
123 execSync(path.join(__dirname, '/../cli/surfer.js') + ' put ' + path.join(__dirname, name), { stdio: 'inherit' } );
124 done();
125 }
126
d9973759 127 xit('build app', function () {
ebd7ed7a
GR
128 execSync('cloudron build', { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
129 });
130
052333b5 131 it('install app', function () {
5158ef83 132 execSync('cloudron install --new --wait --location ' + LOCATION, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
ebd7ed7a
GR
133 });
134
135 it('can get app information', function () {
136 var inspect = JSON.parse(execSync('cloudron inspect'));
137
138 app = inspect.apps.filter(function (a) { return a.location === LOCATION; })[0];
139
140 expect(app).to.be.an('object');
141 });
142
5158ef83 143 it('can login', login);
1c3b94a7 144 it('can cli login', cliLogin);
5158ef83
JZ
145 it('can upload file', uploadFile.bind(null, TEST_FILE_NAME_0));
146 it('file is listed', checkFileIsListed.bind(null, TEST_FILE_NAME_0));
147 it('file is served up', checkFileIsPresent);
148 it('file is served up', checkIndexFileIsServedUp);
149 it('can upload second file', uploadFile.bind(null, TEST_FILE_NAME_1));
150 it('file is listed', checkFileIsListed.bind(null, TEST_FILE_NAME_1));
151 it('can delete second file with cli', function (done) {
5158ef83 152 execSync(path.join(__dirname, '/../cli/surfer.js') + ' del ' + TEST_FILE_NAME_1, { stdio: 'inherit' } );
ebd7ed7a
GR
153 done();
154 });
5158ef83
JZ
155 it('second file is gone', checkFileIsGone.bind(null, TEST_FILE_NAME_1));
156 it('can logout', logout);
ebd7ed7a
GR
157
158 it('backup app', function () {
badac4c7 159 execSync('cloudron backup create --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
ebd7ed7a
GR
160 });
161
162 it('restore app', function () {
163 execSync('cloudron restore --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
164 });
165
5158ef83
JZ
166 it('can login', login);
167 it('file is listed', checkFileIsListed.bind(null, TEST_FILE_NAME_0));
168 it('file is served up', checkFileIsPresent);
169 it('file is served up', checkIndexFileIsServedUp);
170 it('second file is still gone', checkFileIsGone.bind(null, TEST_FILE_NAME_1));
171 it('can logout', logout);
172
173 it('move to different location', function () {
174 browser.manage().deleteAllCookies();
1c3b94a7 175 execSync('cloudron configure --location ' + LOCATION + '2 --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
5158ef83
JZ
176 var inspect = JSON.parse(execSync('cloudron inspect'));
177 app = inspect.apps.filter(function (a) { return a.location === LOCATION + '2'; })[0];
178 expect(app).to.be.an('object');
ebd7ed7a
GR
179 });
180
5158ef83
JZ
181 it('can login', login);
182 it('file is listed', checkFileIsListed.bind(null, TEST_FILE_NAME_0));
183 it('file is served up', checkFileIsPresent);
184 it('file is served up', checkIndexFileIsServedUp);
185 it('can logout', logout);
186
052333b5 187 it('uninstall app', function () {
ebd7ed7a
GR
188 execSync('cloudron uninstall --app ' + app.id, { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' });
189 });
190});