mirror of
https://github.com/appium/appium.git
synced 2026-02-05 09:09:01 -06:00
291 lines
10 KiB
JavaScript
291 lines
10 KiB
JavaScript
import chai from 'chai';
|
|
import chaiAsPromised from 'chai-as-promised';
|
|
import {
|
|
parseCapsForInnerDriver, insertAppiumPrefixes, pullSettings,
|
|
removeAppiumPrefixes,
|
|
} from '../lib/utils';
|
|
import { BASE_CAPS, W3C_CAPS } from './helpers';
|
|
import _ from 'lodash';
|
|
|
|
|
|
const should = chai.should();
|
|
chai.use(chaiAsPromised);
|
|
|
|
describe('utils', function () {
|
|
describe('parseCapsForInnerDriver()', function () {
|
|
it('should return JSONWP caps unchanged if only JSONWP caps provided', function () {
|
|
let {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities, protocol} = parseCapsForInnerDriver(BASE_CAPS);
|
|
desiredCaps.should.deep.equal(BASE_CAPS);
|
|
processedJsonwpCapabilities.should.deep.equal(BASE_CAPS);
|
|
should.not.exist(processedW3CCapabilities);
|
|
protocol.should.equal('MJSONWP');
|
|
});
|
|
it('should return W3C caps unchanged if only W3C caps were provided', function () {
|
|
let {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities, protocol} = parseCapsForInnerDriver(undefined, W3C_CAPS);
|
|
desiredCaps.should.deep.equal(BASE_CAPS);
|
|
should.not.exist(processedJsonwpCapabilities);
|
|
processedW3CCapabilities.should.deep.equal(W3C_CAPS);
|
|
protocol.should.equal('W3C');
|
|
});
|
|
it('should return JSONWP and W3C caps if both were provided', function () {
|
|
let {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities, protocol} = parseCapsForInnerDriver(BASE_CAPS, W3C_CAPS);
|
|
desiredCaps.should.deep.equal(BASE_CAPS);
|
|
processedJsonwpCapabilities.should.deep.equal(BASE_CAPS);
|
|
processedW3CCapabilities.should.deep.equal(W3C_CAPS);
|
|
protocol.should.equal('W3C');
|
|
});
|
|
it('should include default capabilities in results', function () {
|
|
const defaultCaps = {
|
|
foo: 'bar',
|
|
baz: 'bla',
|
|
};
|
|
const {
|
|
desiredCaps,
|
|
processedJsonwpCapabilities,
|
|
processedW3CCapabilities
|
|
} = parseCapsForInnerDriver(BASE_CAPS, W3C_CAPS, {}, defaultCaps);
|
|
desiredCaps.should.deep.equal({
|
|
...defaultCaps,
|
|
...BASE_CAPS,
|
|
});
|
|
processedJsonwpCapabilities.should.deep.equal({
|
|
...defaultCaps,
|
|
...BASE_CAPS
|
|
});
|
|
processedW3CCapabilities.alwaysMatch.should.deep.equal({
|
|
...insertAppiumPrefixes(defaultCaps),
|
|
...insertAppiumPrefixes(BASE_CAPS)
|
|
});
|
|
});
|
|
it('should include default capabilities into incomplete W3C caps', function () {
|
|
const defaultCaps = {
|
|
foo: 'bar',
|
|
baz: 'bla',
|
|
};
|
|
const {
|
|
desiredCaps,
|
|
processedJsonwpCapabilities,
|
|
processedW3CCapabilities
|
|
} = parseCapsForInnerDriver({}, {
|
|
alwaysMatch: {},
|
|
}, {}, defaultCaps);
|
|
desiredCaps.should.deep.equal({
|
|
...defaultCaps,
|
|
});
|
|
processedJsonwpCapabilities.should.deep.equal(defaultCaps);
|
|
processedW3CCapabilities.alwaysMatch.should.deep.equal(
|
|
insertAppiumPrefixes(defaultCaps)
|
|
);
|
|
});
|
|
it('should rewrite default capabilities in results', function () {
|
|
const baseCapsWithDefault = Object.assign({}, BASE_CAPS, {
|
|
foo: 'baz',
|
|
'appium:foo2': 'baz2',
|
|
});
|
|
const w3cCapsWithDefault = _.cloneDeep(W3C_CAPS);
|
|
w3cCapsWithDefault.alwaysMatch.foo = 'baz';
|
|
w3cCapsWithDefault.alwaysMatch.foo2 = 'baz2';
|
|
let {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities} = parseCapsForInnerDriver(baseCapsWithDefault, w3cCapsWithDefault, {}, {
|
|
foo: 'bar',
|
|
'appium:foo2': 'bar2',
|
|
});
|
|
desiredCaps.should.deep.equal({foo: 'baz', foo2: 'baz2', ...BASE_CAPS});
|
|
processedJsonwpCapabilities.should.deep.equal({foo: 'baz', foo2: 'bar2', 'appium:foo2': 'baz2', ...BASE_CAPS});
|
|
processedW3CCapabilities.alwaysMatch.should.deep.equal({'appium:foo': 'baz', 'appium:foo2': 'baz2', ...insertAppiumPrefixes(BASE_CAPS)});
|
|
});
|
|
it('should reject if W3C caps are not passing constraints', function () {
|
|
const err = parseCapsForInnerDriver(undefined, W3C_CAPS, {hello: {presence: true}}).error;
|
|
err.message.should.match(/'hello' can't be blank/);
|
|
_.isError(err).should.be.true;
|
|
|
|
});
|
|
it('should only accept W3C caps that have passing constraints', function () {
|
|
let w3cCaps = {
|
|
...W3C_CAPS,
|
|
firstMatch: [
|
|
{foo: 'bar'},
|
|
{hello: 'world'},
|
|
],
|
|
};
|
|
let {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities, protocol} = parseCapsForInnerDriver(BASE_CAPS, w3cCaps, {hello: {presence: true}});
|
|
const expectedResult = {hello: 'world', ...BASE_CAPS};
|
|
desiredCaps.should.deep.equal(expectedResult);
|
|
processedJsonwpCapabilities.should.deep.equal({...BASE_CAPS});
|
|
processedW3CCapabilities.alwaysMatch.should.deep.equal(insertAppiumPrefixes(expectedResult));
|
|
protocol.should.equal('W3C');
|
|
});
|
|
it('should add appium prefixes to W3C caps that are not standard in W3C', function () {
|
|
parseCapsForInnerDriver(undefined, {
|
|
alwaysMatch: {
|
|
platformName: 'Fake',
|
|
propertyName: 'PROP_NAME',
|
|
},
|
|
}).processedW3CCapabilities.should.deep.equal({
|
|
alwaysMatch: {
|
|
platformName: 'Fake',
|
|
'appium:propertyName': 'PROP_NAME',
|
|
},
|
|
firstMatch: [{}],
|
|
});
|
|
});
|
|
it('should merge extraneous MJSONWP caps into W3C', function () {
|
|
let jsonwpCaps = {
|
|
...BASE_CAPS,
|
|
automationName: 'Fake',
|
|
};
|
|
const {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities, protocol} = parseCapsForInnerDriver(jsonwpCaps, {
|
|
alwaysMatch: {platformName: 'Fake', propertyName: 'PROP_NAME'},
|
|
});
|
|
|
|
// We expect a combo of jsonwp caps and w3c provided caps with `appium:` prefix for non-standard caps
|
|
const expectedCaps = {};
|
|
|
|
for (let [key, value] of _.toPairs(jsonwpCaps)) {
|
|
if (key !== 'platformName') {
|
|
expectedCaps[`appium:${key}`] = value;
|
|
} else {
|
|
expectedCaps[key] = value;
|
|
}
|
|
}
|
|
expectedCaps['appium:propertyName'] = 'PROP_NAME';
|
|
|
|
processedW3CCapabilities.alwaysMatch.should.eql(expectedCaps);
|
|
desiredCaps.should.eql({
|
|
...jsonwpCaps,
|
|
propertyName: 'PROP_NAME',
|
|
});
|
|
processedJsonwpCapabilities.should.eql(jsonwpCaps);
|
|
protocol.should.equal('W3C');
|
|
});
|
|
it('should fix W3C caps by using MJSONWP if invalid W3C caps were provided', function () {
|
|
let w3cCapabilities = {
|
|
alwaysMatch: {platformName: 'Fake', propertyName: 'PROP_NAME'},
|
|
};
|
|
let constraints = {
|
|
deviceName: {
|
|
presence: true,
|
|
}
|
|
};
|
|
const {desiredCaps, processedJsonwpCapabilities, processedW3CCapabilities, protocol} = parseCapsForInnerDriver({...BASE_CAPS}, w3cCapabilities, constraints);
|
|
processedW3CCapabilities.should.exist;
|
|
desiredCaps.should.eql({...BASE_CAPS, propertyName: 'PROP_NAME'});
|
|
processedJsonwpCapabilities.should.eql(BASE_CAPS);
|
|
protocol.should.equal('W3C');
|
|
});
|
|
});
|
|
|
|
describe('removeAppiumPrefixes()', function () {
|
|
it('should remove appium prefixes from cap names', function () {
|
|
removeAppiumPrefixes({
|
|
'appium:cap1': 'value1',
|
|
'ms:cap2': 'value2',
|
|
someCap: 'someCap',
|
|
}).should.eql({
|
|
'cap1': 'value1',
|
|
'ms:cap2': 'value2',
|
|
someCap: 'someCap',
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('insertAppiumPrefixes()', function () {
|
|
it('should apply prefixes to non-standard capabilities', function () {
|
|
insertAppiumPrefixes({
|
|
someCap: 'someCap',
|
|
}).should.deep.equal({
|
|
'appium:someCap': 'someCap',
|
|
});
|
|
});
|
|
it('should not apply prefixes to standard capabilities', function () {
|
|
insertAppiumPrefixes({
|
|
browserName: 'BrowserName',
|
|
platformName: 'PlatformName',
|
|
}).should.deep.equal({
|
|
browserName: 'BrowserName',
|
|
platformName: 'PlatformName',
|
|
});
|
|
});
|
|
it('should not apply prefixes to capabilities that already have a prefix', function () {
|
|
insertAppiumPrefixes({
|
|
'appium:someCap': 'someCap',
|
|
'moz:someOtherCap': 'someOtherCap',
|
|
}).should.deep.equal({
|
|
'appium:someCap': 'someCap',
|
|
'moz:someOtherCap': 'someOtherCap',
|
|
});
|
|
});
|
|
it('should apply prefixes to non-prefixed, non-standard capabilities; should not apply prefixes to any other capabilities', function () {
|
|
insertAppiumPrefixes({
|
|
'appium:someCap': 'someCap',
|
|
'moz:someOtherCap': 'someOtherCap',
|
|
browserName: 'BrowserName',
|
|
platformName: 'PlatformName',
|
|
someOtherCap: 'someOtherCap',
|
|
yetAnotherCap: 'yetAnotherCap',
|
|
}).should.deep.equal({
|
|
'appium:someCap': 'someCap',
|
|
'moz:someOtherCap': 'someOtherCap',
|
|
browserName: 'BrowserName',
|
|
platformName: 'PlatformName',
|
|
'appium:someOtherCap': 'someOtherCap',
|
|
'appium:yetAnotherCap': 'yetAnotherCap',
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('pullSettings()', function () {
|
|
it('should pull settings from caps', function () {
|
|
const caps = {
|
|
platformName: 'foo',
|
|
browserName: 'bar',
|
|
'settings[settingName]': 'baz',
|
|
'settings[settingName2]': 'baz2',
|
|
};
|
|
const settings = pullSettings(caps);
|
|
settings.should.eql({
|
|
settingName: 'baz',
|
|
settingName2: 'baz2',
|
|
});
|
|
caps.should.eql({
|
|
platformName: 'foo',
|
|
browserName: 'bar',
|
|
});
|
|
});
|
|
it('should pull settings dict if object values are present in caps', function () {
|
|
const caps = {
|
|
platformName: 'foo',
|
|
browserName: 'bar',
|
|
'settings[settingName]': {key: 'baz'},
|
|
};
|
|
const settings = pullSettings(caps);
|
|
settings.should.eql({
|
|
settingName: {key: 'baz'},
|
|
});
|
|
caps.should.eql({
|
|
platformName: 'foo',
|
|
browserName: 'bar',
|
|
});
|
|
});
|
|
it('should pull empty dict if no settings are present in caps', function () {
|
|
const caps = {
|
|
platformName: 'foo',
|
|
browserName: 'bar',
|
|
'setting[settingName]': 'baz',
|
|
};
|
|
const settings = pullSettings(caps);
|
|
settings.should.eql({});
|
|
caps.should.eql({
|
|
platformName: 'foo',
|
|
browserName: 'bar',
|
|
'setting[settingName]': 'baz',
|
|
});
|
|
});
|
|
it('should pull empty dict if caps are empty', function () {
|
|
const caps = {};
|
|
const settings = pullSettings(caps);
|
|
settings.should.eql({});
|
|
caps.should.eql({});
|
|
});
|
|
});
|
|
});
|