appium-ios-simulator
Version:
iOS Simulator interface for Appium.
259 lines (209 loc) • 19.2 kB
JavaScript
require('source-map-support').install();
;
var _slicedToArray = require('babel-runtime/helpers/sliced-to-array')['default'];
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _Promise = require('babel-runtime/core-js/promise')['default'];
var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _this = this;
var _libSimulatorXcode6 = require('../../lib/simulator-xcode-6');
var _libSimulatorXcode62 = _interopRequireDefault(_libSimulatorXcode6);
var _libSimulatorXcode7 = require('../../lib/simulator-xcode-7');
var _libSimulatorXcode72 = _interopRequireDefault(_libSimulatorXcode7);
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
var _appiumSupport = require('appium-support');
_chai2['default'].should();
_chai2['default'].use(_chaiAsPromised2['default']);
var simulatorClasses = {
'SimulatorXcode6': _libSimulatorXcode62['default'],
'SimulatorXcode7': _libSimulatorXcode72['default']
};
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
var _loop = function () {
var _step$value = _slicedToArray(_step.value, 2);
var name = _step$value[0];
var simClass = _step$value[1];
describe('common methods - ' + name, function () {
var sim = undefined;
beforeEach(function () {
sim = new simClass('123', '6.0.0');
});
it('should exist', function () {
simClass.should.exist;
});
it('should return a path for getDir()', function () {
sim.getDir().should.exist;
});
it('should return an array for getAppDirs()', function callee$2$0() {
var dirs;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
_sinon2['default'].stub(sim, 'getAppDir').returns(_Promise.resolve(['/App/Path/']));
sim._platformVersion = 9.1;
context$3$0.next = 4;
return _regeneratorRuntime.awrap(sim.getAppDirs('test'));
case 4:
dirs = context$3$0.sent;
dirs.should.have.length(2);
dirs.should.be.a('array');
_sinon2['default'].restore();
case 8:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
describe('cleanCustomApp', function () {
var sandbox = undefined;
var appBundleId = 'com.some.app';
beforeEach(function () {
sandbox = _sinon2['default'].sandbox.create();
sandbox.spy(_appiumSupport.fs, 'rimraf');
});
afterEach(function () {
sandbox.restore();
});
it('should not delete anything if no directories are found', function callee$3$0() {
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
sandbox.stub(sim, 'getPlatformVersion').returns(_Promise.resolve(7.1));
sandbox.stub(sim, 'getAppDir').returns(_Promise.resolve());
context$4$0.next = 4;
return _regeneratorRuntime.awrap(sim.cleanCustomApp('someApp', 'com.some.app'));
case 4:
_sinon2['default'].assert.notCalled(_appiumSupport.fs.rimraf);
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should delete app directories', function callee$3$0() {
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
sandbox.stub(sim, 'getPlatformVersion').returns(_Promise.resolve(7.1));
sandbox.stub(sim, 'getAppDirs').returns(_Promise.resolve(['/some/path', '/another/path']));
context$4$0.next = 4;
return _regeneratorRuntime.awrap(sim.cleanCustomApp('someApp', 'com.some.app'));
case 4:
_sinon2['default'].assert.called(_appiumSupport.fs.rimraf);
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should delete plist file for iOS8+', function callee$3$0() {
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
sandbox.stub(sim, 'getPlatformVersion').returns(_Promise.resolve(9));
sandbox.stub(sim, 'getAppDirs').returns(_Promise.resolve(['/some/path', '/another/path']));
context$4$0.next = 4;
return _regeneratorRuntime.awrap(sim.cleanCustomApp('someApp', appBundleId));
case 4:
_sinon2['default'].assert.calledWithMatch(_appiumSupport.fs.rimraf, /plist/);
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should not delete plist file for iOS7.1', function callee$3$0() {
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
sandbox.stub(sim, 'getPlatformVersion').returns(_Promise.resolve(7.1));
sandbox.stub(sim, 'getAppDirs').returns(_Promise.resolve(['/some/path', '/another/path']));
context$4$0.next = 4;
return _regeneratorRuntime.awrap(sim.cleanCustomApp('someApp', appBundleId));
case 4:
_sinon2['default'].assert.neverCalledWithMatch(_appiumSupport.fs.rimraf, /plist/);
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
});
it('should return a path for getLogDir', function () {
process.env.HOME = __dirname;
var logDir = sim.getLogDir();
logDir.should.equal(__dirname + '/Library/Logs/CoreSimulator/123');
});
describe('getPlatformVersion', function () {
var statStub = undefined;
var platformVersion = 8.9;
beforeEach(function () {
statStub = _sinon2['default'].stub(sim, 'stat').returns({ sdk: platformVersion });
});
afterEach(function () {
statStub.restore();
});
it('should get the correct platform version', function callee$3$0() {
var pv;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
context$4$0.next = 2;
return _regeneratorRuntime.awrap(sim.getPlatformVersion());
case 2:
pv = context$4$0.sent;
pv.should.equal(platformVersion);
case 4:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should only call stat once', function callee$3$0() {
var pv;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
context$4$0.next = 2;
return _regeneratorRuntime.awrap(sim.getPlatformVersion());
case 2:
pv = context$4$0.sent;
pv.should.equal(platformVersion);
statStub.calledOnce.should.be['true'];
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
});
});
};
for (var _iterator = _getIterator(_lodash2['default'].pairs(simulatorClasses)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
_loop();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdW5pdC9zaW11bGF0b3ItY29tbW9uLXNwZWNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBRTRCLDZCQUE2Qjs7OztrQ0FDN0IsNkJBQTZCOzs7O29CQUN4QyxNQUFNOzs7OzhCQUNJLGtCQUFrQjs7OztzQkFDL0IsUUFBUTs7OztxQkFDSixPQUFPOzs7OzZCQUNOLGdCQUFnQjs7QUFFbkMsa0JBQUssTUFBTSxFQUFFLENBQUM7QUFDZCxrQkFBSyxHQUFHLDZCQUFnQixDQUFDOztBQUV6QixJQUFJLGdCQUFnQixHQUFHO0FBQ3JCLG1CQUFpQixpQ0FBaUI7QUFDbEMsbUJBQWlCLGlDQUFpQjtDQUNuQyxDQUFDOzs7Ozs7Ozs7O1FBRVEsSUFBSTtRQUFFLFFBQVE7O0FBQ3RCLFlBQVEsdUJBQXFCLElBQUksRUFBSSxZQUFNO0FBQ3pDLFVBQUksR0FBRyxZQUFBLENBQUM7QUFDUixnQkFBVSxDQUFDLFlBQU07QUFDZixXQUFHLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ3BDLENBQUMsQ0FBQzs7QUFFSCxRQUFFLENBQUMsY0FBYyxFQUFFLFlBQU07QUFDdkIsZ0JBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO09BQ3ZCLENBQUMsQ0FBQzs7QUFFSCxRQUFFLENBQUMsbUNBQW1DLEVBQUUsWUFBTTtBQUM1QyxXQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztPQUMzQixDQUFDLENBQUM7O0FBRUgsUUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBR3hDLElBQUk7Ozs7QUFGUixpQ0FBTSxJQUFJLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFRLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RSxpQkFBRyxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQzs7K0NBQ1YsR0FBRyxD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LEVBQUU7OztBQUFuQyxrQkFBRTs7QUFDTixrQkFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDakMsd0JBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBSyxDQUFDOzs7Ozs7O1NBQ3BDLENBQUMsQ0FBQztPQUNKLENBQUMsQ0FBQztLQUNKLENBQUMsQ0FBQzs7O0FBckZMLG9DQUE2QixvQkFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsNEdBQUU7O0dBc0Z2RCIsImZpbGUiOiJ0ZXN0L3VuaXQvc2ltdWxhdG9yLWNvbW1vbi1zcGVjcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgU2ltdWxhdG9yWGNvZGU2IGZyb20gJy4uLy4uL2xpYi9zaW11bGF0b3IteGNvZGUtNic7XG5pbXBvcnQgU2ltdWxhdG9yWGNvZGU3IGZyb20gJy4uLy4uL2xpYi9zaW11bGF0b3IteGNvZGUtNyc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBjaGFpQXNQcm9taXNlZCBmcm9tICdjaGFpLWFzLXByb21pc2VkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgZnMgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5cbmNoYWkuc2hvdWxkKCk7XG5jaGFpLnVzZShjaGFpQXNQcm9taXNlZCk7XG5cbmxldCBzaW11bGF0b3JDbGFzc2VzID0ge1xuICAnU2ltdWxhdG9yWGNvZGU2JzogU2ltdWxhdG9yWGNvZGU2LFxuICAnU2ltdWxhdG9yWGNvZGU3JzogU2ltdWxhdG9yWGNvZGU3XG59O1xuXG5mb3IgKGxldCBbbmFtZSwgc2ltQ2xhc3NdIG9mIF8ucGFpcnMoc2ltdWxhdG9yQ2xhc3NlcykpIHtcbiAgZGVzY3JpYmUoYGNvbW1vbiBtZXRob2RzIC0gJHtuYW1lfWAsICgpID0+IHtcbiAgICBsZXQgc2ltO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc2ltID0gbmV3IHNpbUNsYXNzKCcxMjMnLCAnNi4wLjAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhpc3QnLCAoKSA9PiB7XG4gICAgICBzaW1DbGFzcy5zaG91bGQuZXhpc3Q7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIHBhdGggZm9yIGdldERpcigpJywgKCkgPT4ge1xuICAgICAgc2ltLmdldERpcigpLnNob3VsZC5leGlzdDtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFuIGFycmF5IGZvciBnZXRBcHBEaXJzKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBzaW5vbi5zdHViKHNpbSwgJ2dldEFwcERpcicpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKFsnL0FwcC9QYXRoLyddKSk7XG4gICAgICBzaW0uX3BsYXRmb3JtVmVyc2lvbiA9IDkuMTtcbiAgICAgIGxldCBkaXJzID0gYXdhaXQgc2ltLmdldEFwcERpcnMoJ3Rlc3QnKTtcbiAgICAgIGRpcnMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgICAgZGlycy5zaG91bGQuYmUuYSgnYXJyYXknKTtcbiAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjbGVhbkN1c3RvbUFwcCcsICgpID0+IHtcbiAgICAgIGxldCBzYW5kYm94O1xuICAgICAgbGV0IGFwcEJ1bmRsZUlkID0gJ2NvbS5zb21lLmFwcCc7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgc2FuZGJveCA9IHNpbm9uLnNhbmRib3guY3JlYXRlKCk7XG4gICAgICAgIHNhbmRib3guc3B5KGZzLCAncmltcmFmJyk7XG4gICAgICB9KTtcbiAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIG5vdCBkZWxldGUgYW55dGhpbmcgaWYgbm8gZGlyZWN0b3JpZXMgYXJlIGZvdW5kJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzYW5kYm94LnN0dWIoc2ltLCAnZ2V0UGxhdGZvcm1WZXJzaW9uJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoNy4xKSk7XG4gICAgICAgIHNhbmRib3guc3R1YihzaW0sICdnZXRBcHBEaXInKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgYXdhaXQgc2ltLmNsZWFuQ3VzdG9tQXBwKCdzb21lQXBwJywgJ2NvbS5zb21lLmFwcCcpO1xuICAgICAgICBzaW5vbi5hc3NlcnQubm90Q2FsbGVkKGZzLnJpbXJhZik7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZGVsZXRlIGFwcCBkaXJlY3RvcmllcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgc2FuZGJveC5zdHViKHNpbSwgJ2dldFBsYXRmb3JtVmVyc2lvbicpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKDcuMSkpO1xuICAgICAgICBzYW5kYm94LnN0dWIoc2ltLCAnZ2V0QXBwRGlycycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKFsnL3NvbWUvcGF0aCcsICcvYW5vdGhlci9wYXRoJ10pKTtcbiAgICAgICAgYXdhaXQgc2ltLmNsZWFuQ3VzdG9tQXBwKCdzb21lQXBwJywgJ2NvbS5zb21lLmFwcCcpO1xuICAgICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkKGZzLnJpbXJhZik7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZGVsZXRlIHBsaXN0IGZpbGUgZm9yIGlPUzgrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzYW5kYm94LnN0dWIoc2ltLCAnZ2V0UGxhdGZvcm1WZXJzaW9uJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoOSkpO1xuICAgICAgICBzYW5kYm94LnN0dWIoc2ltLCAnZ2V0QXBwRGlycycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKFsnL3NvbWUvcGF0aCcsICcvYW5vdGhlci9wYXRoJ10pKTtcbiAgICAgICAgYXdhaXQgc2ltLmNsZWFuQ3VzdG9tQXBwKCdzb21lQXBwJywgYXBwQnVuZGxlSWQpO1xuICAgICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aE1hdGNoKGZzLnJpbXJhZiwgL3BsaXN0Lyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgbm90IGRlbGV0ZSBwbGlzdCBmaWxlIGZvciBpT1M3LjEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNhbmRib3guc3R1YihzaW0sICdnZXRQbGF0Zm9ybVZlcnNpb24nKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSg3LjEpKTtcbiAgICAgICAgc2FuZGJveC5zdHViKHNpbSwgJ2dldEFwcERpcnMnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZShbJy9zb21lL3BhdGgnLCAnL2Fub3RoZXIvcGF0aCddKSk7XG4gICAgICAgIGF3YWl0IHNpbS5jbGVhbkN1c3RvbUFwcCgnc29tZUFwcCcsIGFwcEJ1bmRsZUlkKTtcbiAgICAgICAgc2lub24uYXNzZXJ0Lm5ldmVyQ2FsbGVkV2l0aE1hdGNoKGZzLnJpbXJhZiwgL3BsaXN0Lyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgcGF0aCBmb3IgZ2V0TG9nRGlyJywgKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5lbnYuSE9NRSA9IF9fZGlybmFtZTtcbiAgICAgIGxldCBsb2dEaXIgPSBzaW0uZ2V0TG9nRGlyKCk7XG4gICAgICBsb2dEaXIuc2hvdWxkLmVxdWFsKGAke19fZGlybmFtZX0vTGlicmFyeS9Mb2dzL0NvcmVTaW11bGF0b3IvMTIzYCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0UGxhdGZvcm1WZXJzaW9uJywgKCkgPT4ge1xuICAgICAgbGV0IHN0YXRTdHViO1xuICAgICAgbGV0IHBsYXRmb3JtVmVyc2lvbiA9IDguOTtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBzdGF0U3R1YiA9IHNpbm9uLnN0dWIoc2ltLCAnc3RhdCcpLnJldHVybnMoe3NkazogcGxhdGZvcm1WZXJzaW9ufSk7XG4gICAgICB9KTtcbiAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIHN0YXRTdHViLnJlc3RvcmUoKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBnZXQgdGhlIGNvcnJlY3QgcGxhdGZvcm0gdmVyc2lvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IHB2ID0gYXdhaXQgc2ltLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgICAgICBwdi5zaG91bGQuZXF1YWwocGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBvbmx5IGNhbGwgc3RhdCBvbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgcHYgPSBhd2FpdCBzaW0uZ2V0UGxhdGZvcm1WZXJzaW9uKCk7XG4gICAgICAgIHB2LnNob3VsZC5lcXVhbChwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBzdGF0U3R1Yi5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19