diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..dbcfb21 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,5 @@ +include: + - project: devops/pipeline-components + ref: main + file: cloudron-app.gitlab-ci.yml + diff --git a/test/test.js b/test/test.js index 879a3bd..9c9fa22 100644 --- a/test/test.js +++ b/test/test.js @@ -1,11 +1,7 @@ #!/usr/bin/env node /* jshint esversion: 8 */ -/* global it:false */ -/* global xit:false */ -/* global describe:false */ -/* global before:false */ -/* global after:false */ +/* global it, xit, describe, before, after, afterEach */ 'use strict'; @@ -13,11 +9,11 @@ require('chromedriver'); const execSync = require('child_process').execSync, expect = require('expect.js'), + fs = require('fs'), path = require('path'), { Builder, By, Key, until } = require('selenium-webdriver'), { Options } = require('selenium-webdriver/chrome'); - if (!process.env.USERNAME || !process.env.PASSWORD) { console.log('USERNAME and PASSWORD env vars need to be set'); process.exit(1); @@ -27,7 +23,7 @@ describe('Application life cycle test', function () { this.timeout(0); const ELEMENT_LOCATION = 'element-test'; - const LOCATION = 'test'; + const LOCATION = process.env.LOCATION || 'test'; const TEST_TIMEOUT = parseInt(process.env.TIMEOUT, 10) || 10000; const EXEC_ARGS = { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' }; const USERNAME = process.env.USERNAME; @@ -40,19 +36,26 @@ describe('Application life cycle test', function () { let athenticated_by_oidc = false; before(function () { - const options = new Options().windowSize({ width: 1280, height: 1024 }); - if (process.env.HEADLESS) options.addArguments('headless'); - - browser = new Builder().forBrowser('chrome').setChromeOptions(options).build(); + const chromeOptions = new Options().windowSize({ width: 1280, height: 1024 }); + if (process.env.CI) chromeOptions.addArguments('no-sandbox', 'disable-dev-shm-usage', 'headless'); + browser = new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build(); + if (!fs.existsSync('./screenshots')) fs.mkdirSync('./screenshots'); }); after(function () { browser.quit(); }); - function sleep(millis) { - return new Promise(resolve => setTimeout(resolve, millis)); - } + afterEach(async function () { + if (!process.env.CI || !app) return; + + const currentUrl = await browser.getCurrentUrl(); + if (!currentUrl.includes(app.domain)) return; + expect(this.currentTest.title).to.be.a('string'); + + const screenshotData = await browser.takeScreenshot(); + fs.writeFileSync(`./screenshots/${new Date().getTime()}-${this.currentTest.title.replaceAll(' ', '_')}.png`, screenshotData, 'base64'); + }); async function waitForElement(elem) { await browser.wait(until.elementLocated(elem), TEST_TIMEOUT); @@ -80,7 +83,7 @@ describe('Application life cycle test', function () { execSync(`cloudron exec --app ${ELEMENT_LOCATION} -- bash -c "jq '.default_server_config[\\"m.homeserver\\"].base_url = \\"https://${app.fqdn}\\"' /app/data/config.json | sponge /app/data/config.json"`); execSync(`cloudron restart --app ${ELEMENT_LOCATION}`); // wait when all services are up and running - await sleep(15000); + await browser.sleep(15000); } async function checkLandingPage() { @@ -130,10 +133,6 @@ describe('Application life cycle test', function () { await browser.findElement(By.xpath('//a[contains(., "Continue")]')).click(); await browser.sleep(2000); - //if (await browser.findElements(By.xpath('//div[@aria-label="Skip verification for now"]')).then(found => !!found.length)) { -// await skipVerification(); - //} - if (await browser.findElements(By.xpath('//div[text()="Proceed with reset"]')).then(found => !!found.length)) { await browser.findElement(By.xpath('//div[text()="Proceed with reset"]')).click(); @@ -323,8 +322,7 @@ describe('Application life cycle test', function () { execSync(`cloudron configure --location ${LOCATION}2`, EXEC_ARGS); getAppInfo(); - // wait when all services are up and running - await sleep(15000); + await browser.sleep(15000); }); it('update element-app config', updateSynapseConfig); @@ -361,8 +359,7 @@ describe('Application life cycle test', function () { it('can update', async function () { await browser.get('about:blank'); execSync(`cloudron update --app ${app.id}`, EXEC_ARGS); - // wait when all services are up and running - await sleep(15000); + await browser.sleep(15000); }); it('can get Element app info', getElementAppInfo);