/* * This is essentially an appstore pov test. * This tests a flow for cloudron owner creating a cloudron * from the appstore. Owner creates a cloudron, activates * it, installs and app and deletes the cloudron eventually */ 'use strict'; var assert = require('assert'), AppStore = require('../appstore.js'), async = require('async'), Cloudron = require('../cloudron.js'), common = require('../common.js'), dns = require('dns'), ImapProbe = require('../imap-probe.js'), request = require('superagent-sync'); require('colors'); process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; var BOX_VERSION = process.env.BOX_VERSION; describe('Appstore new user flow', function () { this.timeout(0); var appStore = new AppStore(); var owner = common.getOwner(); var admin = common.getAdmin(); var cloudron, appId, box; var imap = new ImapProbe({ user: process.env.IMAP_USERNAME, password: process.env.IMAP_PASSWORD, host: process.env.IMAP_HOST, port: 993, // imap port tls: true, readOnly: true }); it('can login to the store', function () { var accessToken = appStore.getAccessToken(owner); appStore.setCredentials(owner.password, accessToken); var adminAccessToken = appStore.getAccessToken(admin); appStore.setAdminCredentials(admin.password, adminAccessToken); }); it('can get profile', function () { var profile = appStore.getProfile(); owner.id = profile.id; }); it('can setup billing details', function (done) { appStore.setupBilling(owner, done); }); it('can create a cloudron', function () { box = appStore.createCloudron({ domain: common.cloudronDomain(__filename), region: 'sfo1', size: '1gb', version: BOX_VERSION }); box = appStore.waitForCloudron(box.id); cloudron = new Cloudron(box); }); it('sent a mail to the user about cloudron ready', function (done) { imap.probe({ subject: new RegExp('Cloudron ' + box.domain + ' is ready$'), from: /Cloudron Team/ }, done); }); it('can activate the box', function () { cloudron.activate(owner); }); it('can login to the box', function () { var token = cloudron.getOauthToken(owner); cloudron.setCredentials(owner.password, token); }); it('can enable email', function () { cloudron.setEmailEnabled(true); }); var location = 'haste' + (Math.random() * 10000).toFixed(); it('can install app', function () { appId = cloudron.installApp(location, 'com.hastebin.cloudronapp@0.3.0'); }); it('can configure app', function () { location = location + 'x'; cloudron.configureApp(appId, location); }); // clone requires a backup to work with it('can backup app', function () { cloudron.backupApp(appId); }); it('can clone app', function () { cloudron.cloneApp(appId, location + 'clone'); }); it('can uninstall app', function () { cloudron.uninstallApp(appId); }); it('can get the timezone', function () { // cloudron timezone is set async and this check is here to give Cloudron some time cloudron.checkTimeZone('America/New_York'); // this is the timezone of the ec2 ci machine }); it('gets redirected for IP based access', function () { var res = request.get('https://' + box.ip + '/api/v1/cloudron/status').end(); assert.strictEqual(res.statusCode, 200); assert.strictEqual(res.body.version, box.version); }); // check this after activation it('has setup DNS records correctly', function (done) { async.series([ cloudron.checkA.bind(cloudron), cloudron.checkSPF.bind(cloudron), cloudron.checkMX.bind(cloudron), cloudron.checkDKIM.bind(cloudron), cloudron.checkDMARC.bind(cloudron) ], done); }); it('does TCP ratelimiting', function (done) { this.timeout(12000); async.series([ cloudron.checkTcpRateLimit.bind(cloudron, 202, 5), // ssh cloudron.checkTcpRateLimit.bind(cloudron, 25, 50), // mail cloudron.checkTcpRateLimit.bind(cloudron, 587, 60), // msa cloudron.checkTcpRateLimit.bind(cloudron, 993, 60), // imap cloudron.checkTcpRateLimit.bind(cloudron, 4190, 60), // sieve ], done); }); it('does nginx ratelimiting', function (done) { cloudron.checkNginxRateLimit(owner, 10, done); }); it('can delete the cloudron', function () { appStore.deleteCloudron(box); }); xit('has setup DNS records cleaned up', function (done) { dns.setServers([ '205.251.199.12' ]); // use different dns server so as to not get cached results function expectError(tag, fn) { return function (cb) { fn(function (error, records) { if (!error) console.error('Records of %s is %j', tag, records); cb(error ? null : new Error('Expecting error for ' + tag)); }); }; } async.series([ expectError('checkA', cloudron.checkA.bind(cloudron)), expectError('checkSPF', cloudron.checkSPF.bind(cloudron)), expectError('checkDKIM', cloudron.checkDKIM.bind(cloudron)), expectError('checkDMARC', cloudron.checkDMARC.bind(cloudron)), expectError('checkMX', cloudron.checkMX.bind(cloudron)) ], done); }); });