Files
switchmon/test/swm.tests.js
2016-03-06 11:11:49 +01:00

210 lines
6.5 KiB
JavaScript

'use strict';
const sinon = require('sinon');
const assert = require('assert');
const proxyquire = require('proxyquire');
describe('swm', () => {
let sandbox;
beforeEach(() => {
sandbox = sinon.sandbox.create();
});
afterEach(function() {
sandbox.restore();
});
describe('getDevices', () => {
let execStub;
let xrandrParseStub;
let swm;
beforeEach(() => {
execStub = sandbox.stub();
xrandrParseStub = sandbox.stub();
swm = proxyquire('../swm.js', {
child_process: {
exec: execStub
},
'xrandr-parse': xrandrParseStub
});
});
it('calls exec', () => {
swm.getDevices();
assert.equal(execStub.callCount, 1);
assert.equal(execStub.args[0][0], 'xrandr');
});
it('returns promise', () => {
const devices = swm.getDevices();
assert.equal(typeof devices.then, 'function');
assert.equal(typeof devices.catch, 'function');
});
it('rejects when exec passes error', (done) => {
const devices = swm.getDevices();
const cb = execStub.args[0][1];
cb('some error');
return devices.catch((err) => {
assert.equal(xrandrParseStub.callCount, 0);
assert.equal(err, 'some error');
done();
});
});
it('parses result', (done) => {
xrandrParseStub.returns('some result');
const devices = swm.getDevices();
const cb = execStub.args[0][1];
cb(null, 'stdout');
return devices.then((result) => {
assert.equal(xrandrParseStub.args[0][0], 'stdout');
assert.equal(xrandrParseStub.callCount, 1);
assert.equal(result, 'some result');
done();
});
});
});
describe('generateXrandrOptions', () => {
let swm;
let devices;
beforeEach(() => {
devices = {
'HDMI1': {
connected: true
},
'HDMI2': {
connected: true,
},
'LVDS1': {
connected: false
},
'DP1': {
connected: true,
}
}
swm = require('../swm.js');
});
describe('activation of monitor', () => {
it('for connected monitors if non is selected', () => {
const result = swm.generateXrandrOptions([], devices);
assert(result.indexOf('--output HDMI1 --auto') > -1);
assert(result.indexOf('--output HDMI2 --auto') > -1);
assert(result.indexOf('--output LVDS1 --off') > -1);
});
it('for connected selected monitors', () => {
const result = swm.generateXrandrOptions(['HDMI2'], devices);
assert(result.indexOf('--output HDMI1 --off') > -1);
assert(result.indexOf('--output HDMI2 --auto') > -1);
assert(result.indexOf('--output LVDS1 --off') > -1);
});
it('skipps selected monitors that are not connected', () => {
const result = swm.generateXrandrOptions(['LVDS1', 'HDMI2'], devices);
assert(result.indexOf('--output HDMI2 --auto') > -1);
assert(result.indexOf('--output LVDS1 --off') > -1);
});
});
it('aligns monitor n to the right of monitor n-1', () => {
const result = swm.generateXrandrOptions(['HDMI1', 'HDMI2', 'DP1'], devices);
assert(result.indexOf('--output HDMI1 --auto') > -1);
assert(result.indexOf('--output HDMI2 --auto --right-of HDMI1') > -1);
assert(result.indexOf('--output DP1 --auto --right-of HDMI2') > -1);
});
it('throws when no selected monitor is connected', () => {
assert.throws(() => {swm.generateXrandrOptions(['LVDS1'], devices)});
assert.throws(() => {swm.generateXrandrOptions(['BOGUS'], devices)});
devices = {};
assert.throws(() => {swm.generateXrandrOptions([], devices)});
});
});
describe('switchDevices', () => {
let execStub;
let swm;
beforeEach(() => {
execStub = sandbox.stub();
swm = proxyquire('../swm.js', {
child_process: {
exec: execStub
}
});
});
it('calls exec with xrandr and opitons', () => {
swm.switchDevices('[some options]');
assert.equal(execStub.callCount, 1);
assert.equal(execStub.args[0][0], 'xrandr [some options]');
});
it('returns promise', () => {
const promise = swm.switchDevices('[some options]');
assert.equal(typeof promise.then, 'function');
assert.equal(typeof promise.catch, 'function');
});
it('rejects when exec passes error', (done) => {
const promise = swm.switchDevices('[some options]');
const cb = execStub.args[0][1];
cb('some error');
return promise.catch((err) => {
assert.equal(err, 'some error');
done();
});
});
});
describe('executePostCmd', function() {
let execStub;
let swm;
beforeEach(() => {
execStub = sandbox.stub();
swm = proxyquire('../swm.js', {
child_process: {
exec: execStub
}
});
});
it('calls postCmd', () => {
swm.executePostCmd('[some cmd]');
assert.equal(execStub.callCount, 1);
assert.equal(execStub.args[0][0], '[some cmd]');
});
it('returns promise', () => {
const promise = swm.executePostCmd('[some cmd]');
assert.equal(typeof promise.then, 'function');
assert.equal(typeof promise.catch, 'function');
});
it('rejects when exec passes error', (done) => {
const promise = swm.executePostCmd('[some cmd]');
const cb = execStub.args[0][1];
cb('some error');
return promise.catch((err) => {
assert.equal(err, 'some error');
done();
});
});
});
});