mirror of
				https://github.com/zulip/zulip-desktop.git
				synced 2025-11-04 05:53:21 +00:00 
			
		
		
		
	xo: Lint *.js too.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
This commit is contained in:
		@@ -1,7 +1,5 @@
 | 
			
		||||
const path = require('path')
 | 
			
		||||
 | 
			
		||||
const TEST_APP_PRODUCT_NAME = 'ZulipTest'
 | 
			
		||||
const TEST_APP_PRODUCT_NAME = 'ZulipTest';
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  TEST_APP_PRODUCT_NAME
 | 
			
		||||
}
 | 
			
		||||
	TEST_APP_PRODUCT_NAME
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,16 @@
 | 
			
		||||
const test = require('tape')
 | 
			
		||||
const setup = require('./setup')
 | 
			
		||||
const test = require('tape');
 | 
			
		||||
const setup = require('./setup');
 | 
			
		||||
 | 
			
		||||
test('app runs', function (t) {
 | 
			
		||||
  t.timeoutAfter(10e3)
 | 
			
		||||
  setup.resetTestDataDir()
 | 
			
		||||
  const app = setup.createApp()
 | 
			
		||||
  setup.waitForLoad(app, t)
 | 
			
		||||
    .then(() => app.client.windowByIndex(1)) // focus on webview
 | 
			
		||||
    .then(() => app.client.waitForExist('//*[@id="connect"]')) // id of the connect button
 | 
			
		||||
    .then(() => setup.endTest(app, t),
 | 
			
		||||
          (err) => setup.endTest(app, t, err || 'error'))
 | 
			
		||||
})
 | 
			
		||||
test('app runs', async t => {
 | 
			
		||||
	t.timeoutAfter(10e3);
 | 
			
		||||
	setup.resetTestDataDir();
 | 
			
		||||
	const app = setup.createApp();
 | 
			
		||||
	try {
 | 
			
		||||
		await setup.waitForLoad(app, t);
 | 
			
		||||
		await app.client.windowByIndex(1); // Focus on webview
 | 
			
		||||
		await app.client.waitForExist('//*[@id="connect"]'); // Id of the connect button
 | 
			
		||||
		await setup.endTest(app, t);
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		await setup.endTest(app, t, error || 'error');
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										136
									
								
								tests/setup.js
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								tests/setup.js
									
									
									
									
									
								
							@@ -1,97 +1,95 @@
 | 
			
		||||
const Application = require('spectron').Application
 | 
			
		||||
const fs = require('fs')
 | 
			
		||||
const mkdirp = require('mkdirp')
 | 
			
		||||
const path = require('path')
 | 
			
		||||
const rimraf = require('rimraf')
 | 
			
		||||
const {Application} = require('spectron');
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const path = require('path');
 | 
			
		||||
const rimraf = require('rimraf');
 | 
			
		||||
 | 
			
		||||
const config = require('./config')
 | 
			
		||||
const config = require('./config');
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  createApp,
 | 
			
		||||
  endTest,
 | 
			
		||||
  waitForLoad,
 | 
			
		||||
  wait,
 | 
			
		||||
  resetTestDataDir
 | 
			
		||||
}
 | 
			
		||||
	createApp,
 | 
			
		||||
	endTest,
 | 
			
		||||
	waitForLoad,
 | 
			
		||||
	wait,
 | 
			
		||||
	resetTestDataDir
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Runs Zulip Desktop.
 | 
			
		||||
// Returns a promise that resolves to a Spectron Application once the app has loaded.
 | 
			
		||||
// Takes a Tape test. Makes some basic assertions to verify that the app loaded correctly.
 | 
			
		||||
function createApp (t) {
 | 
			
		||||
  generateTestAppPackageJson()
 | 
			
		||||
  return new Application({
 | 
			
		||||
    path: path.join(__dirname, '..', 'node_modules', '.bin',
 | 
			
		||||
      'electron' + (process.platform === 'win32' ? '.cmd' : '')),
 | 
			
		||||
    args: [path.join(__dirname)], // Ensure this dir has a package.json file with a 'main' entry piont
 | 
			
		||||
    env: {NODE_ENV: 'test'},
 | 
			
		||||
    waitTimeout: 10e3
 | 
			
		||||
  })
 | 
			
		||||
function createApp() {
 | 
			
		||||
	generateTestAppPackageJson();
 | 
			
		||||
	return new Application({
 | 
			
		||||
		path: path.join(__dirname, '..', 'node_modules', '.bin',
 | 
			
		||||
			'electron' + (process.platform === 'win32' ? '.cmd' : '')),
 | 
			
		||||
		args: [path.join(__dirname)], // Ensure this dir has a package.json file with a 'main' entry piont
 | 
			
		||||
		env: {NODE_ENV: 'test'},
 | 
			
		||||
		waitTimeout: 10e3
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Generates package.json for test app
 | 
			
		||||
// Reads app package.json and updates the productName to config.TEST_APP_PRODUCT_NAME 
 | 
			
		||||
// Reads app package.json and updates the productName to config.TEST_APP_PRODUCT_NAME
 | 
			
		||||
// We do this so that the app integration doesn't doesn't share the same appDataDir as the dev application
 | 
			
		||||
function generateTestAppPackageJson () {
 | 
			
		||||
  let packageJson = require(path.join(__dirname, '../package.json'))
 | 
			
		||||
  packageJson.productName = config.TEST_APP_PRODUCT_NAME
 | 
			
		||||
  packageJson.main = '../app/main'
 | 
			
		||||
function generateTestAppPackageJson() {
 | 
			
		||||
	const packageJson = require(path.join(__dirname, '../package.json'));
 | 
			
		||||
	packageJson.productName = config.TEST_APP_PRODUCT_NAME;
 | 
			
		||||
	packageJson.main = '../app/main';
 | 
			
		||||
 | 
			
		||||
  const testPackageJsonPath = path.join(__dirname, 'package.json')
 | 
			
		||||
  fs.writeFileSync(testPackageJsonPath, JSON.stringify(packageJson, null, ' '), 'utf-8')
 | 
			
		||||
	const testPackageJsonPath = path.join(__dirname, 'package.json');
 | 
			
		||||
	fs.writeFileSync(testPackageJsonPath, JSON.stringify(packageJson, null, ' '), 'utf-8');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Starts the app, waits for it to load, returns a promise
 | 
			
		||||
function waitForLoad (app, t, opts) {
 | 
			
		||||
  if (!opts) opts = {}
 | 
			
		||||
  return app.start().then(function () {
 | 
			
		||||
    return app.client.waitUntilWindowLoaded()
 | 
			
		||||
  })
 | 
			
		||||
  .then(function() {
 | 
			
		||||
    return app.client.pause(2000);
 | 
			
		||||
  })
 | 
			
		||||
  .then(function () {
 | 
			
		||||
    return app.webContents.getTitle()
 | 
			
		||||
  }).then(function (title) {
 | 
			
		||||
    t.equal(title, 'Zulip', 'html title')
 | 
			
		||||
  })
 | 
			
		||||
async function waitForLoad(app, t, opts) {
 | 
			
		||||
	if (!opts) {
 | 
			
		||||
		opts = {};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	await app.start();
 | 
			
		||||
	await app.client.waitUntilWindowLoaded();
 | 
			
		||||
	await app.client.pause(2000);
 | 
			
		||||
	const title = await app.webContents.getTitle();
 | 
			
		||||
	t.equal(title, 'Zulip', 'html title');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a promise that resolves after 'ms' milliseconds. Default: 1 second
 | 
			
		||||
function wait (ms) {
 | 
			
		||||
  if (ms === undefined) ms = 1000 // Default: wait long enough for the UI to update
 | 
			
		||||
  return new Promise(function (resolve, reject) {
 | 
			
		||||
    setTimeout(resolve, ms)
 | 
			
		||||
  })
 | 
			
		||||
async function wait(ms) {
 | 
			
		||||
	if (ms === undefined) {
 | 
			
		||||
		ms = 1000;
 | 
			
		||||
	} // Default: wait long enough for the UI to update
 | 
			
		||||
 | 
			
		||||
	return new Promise((resolve => {
 | 
			
		||||
		setTimeout(resolve, ms);
 | 
			
		||||
	}));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Quit the app, end the test, either in success (!err) or failure (err)
 | 
			
		||||
function endTest (app, t, err) {
 | 
			
		||||
  return app.stop().then(function () {
 | 
			
		||||
    t.end(err)
 | 
			
		||||
  })
 | 
			
		||||
async function endTest(app, t, err) {
 | 
			
		||||
	await app.stop();
 | 
			
		||||
	t.end(err);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getAppDataDir () {
 | 
			
		||||
  let base
 | 
			
		||||
function getAppDataDir() {
 | 
			
		||||
	let base;
 | 
			
		||||
 | 
			
		||||
  if (process.platform === 'darwin') {
 | 
			
		||||
    base = path.join(process.env.HOME, 'Library', 'Application Support')
 | 
			
		||||
  } else if (process.platform === 'linux') {
 | 
			
		||||
    base = process.env.XDG_CONFIG_HOME ?
 | 
			
		||||
      process.env.XDG_CONFIG_HOME : path.join(process.env.HOME, '.config')
 | 
			
		||||
  } else if (process.platform === 'win32') {
 | 
			
		||||
    base = process.env.APPDATA
 | 
			
		||||
  } else {
 | 
			
		||||
    console.log('Could not detect app data dir base. Exiting...')
 | 
			
		||||
    process.exit(1)
 | 
			
		||||
  }
 | 
			
		||||
  console.log('Detected App Data Dir base:', base)
 | 
			
		||||
  return path.join(base, config.TEST_APP_PRODUCT_NAME)
 | 
			
		||||
	if (process.platform === 'darwin') {
 | 
			
		||||
		base = path.join(process.env.HOME, 'Library', 'Application Support');
 | 
			
		||||
	} else if (process.platform === 'linux') {
 | 
			
		||||
		base = process.env.XDG_CONFIG_HOME ?
 | 
			
		||||
			process.env.XDG_CONFIG_HOME : path.join(process.env.HOME, '.config');
 | 
			
		||||
	} else if (process.platform === 'win32') {
 | 
			
		||||
		base = process.env.APPDATA;
 | 
			
		||||
	} else {
 | 
			
		||||
		throw new Error('Could not detect app data dir base.');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	console.log('Detected App Data Dir base:', base);
 | 
			
		||||
	return path.join(base, config.TEST_APP_PRODUCT_NAME);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Resets the test directory, containing domain.json, window-state.json, etc
 | 
			
		||||
function resetTestDataDir () {
 | 
			
		||||
  appDataDir = getAppDataDir()
 | 
			
		||||
  rimraf.sync(appDataDir)
 | 
			
		||||
  rimraf.sync(path.join(__dirname, 'package.json'))
 | 
			
		||||
function resetTestDataDir() {
 | 
			
		||||
	const appDataDir = getAppDataDir();
 | 
			
		||||
	rimraf.sync(appDataDir);
 | 
			
		||||
	rimraf.sync(path.join(__dirname, 'package.json'));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,21 @@
 | 
			
		||||
const test = require('tape')
 | 
			
		||||
const setup = require('./setup')
 | 
			
		||||
 | 
			
		||||
test('add-organization', function (t) {
 | 
			
		||||
  t.timeoutAfter(50e3)
 | 
			
		||||
  setup.resetTestDataDir()
 | 
			
		||||
  const app = setup.createApp()
 | 
			
		||||
  setup.waitForLoad(app, t)
 | 
			
		||||
    .then(() => app.client.windowByIndex(1)) // focus on webview
 | 
			
		||||
    .then(() => app.client.setValue('.setting-input-value', 'chat.zulip.org'))
 | 
			
		||||
    .then(() => app.client.click('#connect'))
 | 
			
		||||
    .then(() => setup.wait(5000))
 | 
			
		||||
    .then(() => app.client.windowByIndex(0)) // Switch focus back to main win
 | 
			
		||||
    .then(() => app.client.windowByIndex(1)) // Switch focus back to org webview
 | 
			
		||||
    .then(() => app.client.waitForExist('//*[@id="id_username"]'))
 | 
			
		||||
    .then(() => setup.endTest(app, t),
 | 
			
		||||
          (err) => setup.endTest(app, t, err || 'error'))
 | 
			
		||||
})
 | 
			
		||||
const test = require('tape');
 | 
			
		||||
const setup = require('./setup');
 | 
			
		||||
 | 
			
		||||
test('add-organization', async t => {
 | 
			
		||||
	t.timeoutAfter(50e3);
 | 
			
		||||
	setup.resetTestDataDir();
 | 
			
		||||
	const app = setup.createApp();
 | 
			
		||||
	try {
 | 
			
		||||
		await setup.waitForLoad(app, t);
 | 
			
		||||
		await app.client.windowByIndex(1); // Focus on webview
 | 
			
		||||
		await app.client.setValue('.setting-input-value', 'chat.zulip.org');
 | 
			
		||||
		await app.client.click('#connect');
 | 
			
		||||
		await setup.wait(5000);
 | 
			
		||||
		await app.client.windowByIndex(0); // Switch focus back to main win
 | 
			
		||||
		await app.client.windowByIndex(1); // Switch focus back to org webview
 | 
			
		||||
		await app.client.waitForExist('//*[@id="id_username"]');
 | 
			
		||||
		await setup.endTest(app, t);
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		await setup.endTest(app, t, error || 'error');
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,19 @@
 | 
			
		||||
const test = require('tape')
 | 
			
		||||
const setup = require('./setup')
 | 
			
		||||
const test = require('tape');
 | 
			
		||||
const setup = require('./setup');
 | 
			
		||||
 | 
			
		||||
// Create new org link should open in the default browser [WIP]
 | 
			
		||||
 | 
			
		||||
test('new-org-link', function (t) {
 | 
			
		||||
  t.timeoutAfter(50e3)
 | 
			
		||||
  setup.resetTestDataDir()
 | 
			
		||||
  const app = setup.createApp()
 | 
			
		||||
  setup.waitForLoad(app, t)
 | 
			
		||||
    .then(() => app.client.windowByIndex(1)) // focus on webview
 | 
			
		||||
    .then(() => app.client.click('#open-create-org-link')) // Click on new org link button
 | 
			
		||||
    .then(() => setup.wait(5000))
 | 
			
		||||
    .then(() => setup.endTest(app, t),
 | 
			
		||||
          (err) => setup.endTest(app, t, err || 'error'))
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
test('new-org-link', async t => {
 | 
			
		||||
	t.timeoutAfter(50e3);
 | 
			
		||||
	setup.resetTestDataDir();
 | 
			
		||||
	const app = setup.createApp();
 | 
			
		||||
	try {
 | 
			
		||||
		await setup.waitForLoad(app, t);
 | 
			
		||||
		await app.client.windowByIndex(1); // Focus on webview
 | 
			
		||||
		await app.client.click('#open-create-org-link'); // Click on new org link button
 | 
			
		||||
		await setup.wait(5000);
 | 
			
		||||
		await setup.endTest(app, t);
 | 
			
		||||
	} catch (error) {
 | 
			
		||||
		await setup.endTest(app, t, error || 'error');
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user