mobile-cli-lib
Version:
common lib used by different CLI
214 lines (213 loc) • 12.3 kB
JavaScript
;
var android_device_file_system_1 = require("../../../mobile/android/android-device-file-system");
var yok_1 = require("../../../yok");
var errors_1 = require("../../../errors");
var file_system_1 = require("../../../file-system");
var logger_1 = require("../../../logger");
var mobile_helper_1 = require("../../../mobile/mobile-helper");
var device_platforms_constants_1 = require("../../../mobile/device-platforms-constants");
var Future = require("fibers/future");
var path = require("path");
var chai_1 = require("chai");
var myTestAppIdentifier = "org.nativescript.myApp";
var isAdbPushExecuted = false;
var AndroidDebugBridgeMock = (function () {
function AndroidDebugBridgeMock() {
}
AndroidDebugBridgeMock.prototype.executeCommand = function (args) {
if (args[0] === "push") {
isAdbPushExecuted = true;
}
return Future.fromResult();
};
AndroidDebugBridgeMock.prototype.executeShellCommand = function () {
return Future.fromResult();
};
return AndroidDebugBridgeMock;
}());
var LocalToDevicePathDataMock = (function () {
function LocalToDevicePathDataMock(filePath) {
this.filePath = filePath;
}
LocalToDevicePathDataMock.prototype.getLocalPath = function () {
return this.filePath;
};
LocalToDevicePathDataMock.prototype.getDevicePath = function () {
return "/data/local/tmp/" + path.basename(this.filePath);
};
return LocalToDevicePathDataMock;
}());
var MobilePlatformsCapabilitiesMock = (function () {
function MobilePlatformsCapabilitiesMock() {
}
MobilePlatformsCapabilitiesMock.prototype.getPlatformNames = function () {
return _.keys(this.getAllCapabilities());
};
MobilePlatformsCapabilitiesMock.prototype.getAllCapabilities = function () {
return {
iOS: {
"wirelessDeploy": false,
"cableDeploy": true,
"companion": false,
"hostPlatformsForDeploy": ["darwin"]
},
Android: {
"wirelessDeploy": false,
"cableDeploy": true,
"companion": false,
"hostPlatformsForDeploy": ["win32", "darwin", "linux"]
}
};
};
return MobilePlatformsCapabilitiesMock;
}());
function mockFsStats(options) {
return function (filePath) { return Future.fromResult({
isDirectory: function () { return options.isDirectory; },
isFile: function () { return options.isFile; }
}); };
}
function createTestInjector() {
var injector = new yok_1.Yok();
injector.register("fs", file_system_1.FileSystem);
injector.register("logger", logger_1.Logger);
injector.register("mobileHelper", mobile_helper_1.MobileHelper);
injector.register("config", {});
injector.register("options", {});
injector.register("errors", errors_1.Errors);
injector.register("mobilePlatformsCapabilities", MobilePlatformsCapabilitiesMock);
injector.register("devicePlatformsConstants", device_platforms_constants_1.DevicePlatformsConstants);
return injector;
}
function createAndroidDeviceFileSystem(injector) {
var adb = new AndroidDebugBridgeMock();
var androidDeviceFileSystem = injector.resolve(android_device_file_system_1.AndroidDeviceFileSystem, { "adb": adb, "identifier": myTestAppIdentifier });
androidDeviceFileSystem.createFileOnDevice = function () { return Future.fromResult(); };
return androidDeviceFileSystem;
}
function createDeviceAppData() {
return { deviceProjectRootPath: "/data/local/tmp/sync", appIdentifier: myTestAppIdentifier };
}
describe("Android device file system tests", function () {
describe("Transfer directory unit tests", function () {
it("pushes the whole directory when hash file doesn't exist on device", function () {
var injector = createTestInjector();
var deviceAppData = createDeviceAppData();
var fileToShasumDictionary = {
"~/TestApp/app/test.js": "1",
"~/TestApp/app/myfile.js": "2"
};
var localToDevicePaths = _.keys(fileToShasumDictionary).map(function (file) { return injector.resolve(LocalToDevicePathDataMock, { filePath: file }); });
var fs = injector.resolve("fs");
fs.getFileShasum = function (filePath) { return (function () { return fileToShasumDictionary[filePath]; }).future()(); };
fs.exists = function (filePath) { return Future.fromResult(false); };
fs.exists = function (filePath) { return Future.fromResult(false); };
fs.getFsStats = mockFsStats({ isDirectory: false, isFile: true });
var androidDeviceFileSystem = createAndroidDeviceFileSystem(injector);
androidDeviceFileSystem.transferDirectory(deviceAppData, localToDevicePaths, "~/TestApp/app").wait();
chai_1.assert.isTrue(isAdbPushExecuted);
isAdbPushExecuted = false;
});
it("pushes the whole directory when force option is specified", function () {
var injector = createTestInjector();
var options = injector.resolve("options");
options.force = true;
var fs = injector.resolve("fs");
fs.getFileShasum = function (filePath) { return (function () { return "0"; }).future()(); };
var androidDeviceFileSystem = createAndroidDeviceFileSystem(injector);
androidDeviceFileSystem.transferDirectory(createDeviceAppData(), [], "~/TestApp/app").wait();
chai_1.assert.isTrue(isAdbPushExecuted);
isAdbPushExecuted = false;
});
it("pushes only changed file when hash file exists on device", function () {
var injector = createTestInjector();
var deviceAppData = createDeviceAppData();
var fileToShasumDictionary = {
"~/TestApp/app/test.js": "1",
"~/TestApp/app/myfile.js": "2"
};
var localToDevicePaths = _.keys(fileToShasumDictionary).map(function (file) { return injector.resolve(LocalToDevicePathDataMock, { filePath: file }); });
var fs = injector.resolve("fs");
fs.getFileShasum = function (filePath) { return (function () { return fileToShasumDictionary[filePath]; }).future()(); };
fs.exists = function (filePath) { return Future.fromResult(true); };
fs.readJson = function (filePath) { return (function () { return ({ "~/TestApp/app/test.js": "0", "~/TestApp/app/myfile.js": "2" }); }).future()(); };
fs.getFsStats = mockFsStats({ isDirectory: false, isFile: true });
fs.readText = function () { return Future.fromResult(""); };
var androidDeviceFileSystem = createAndroidDeviceFileSystem(injector);
androidDeviceFileSystem.transferFile = function (localPath, devicePath) {
chai_1.assert.equal(localPath, "~/TestApp/app/test.js");
return Future.fromResult();
};
androidDeviceFileSystem.transferDirectory(deviceAppData, localToDevicePaths, "~/TestApp/app").wait();
});
it("pushes only changed files when hashes file exists on device", function () {
var injector = createTestInjector();
var deviceAppData = createDeviceAppData();
var fileToShasumDictionary = {
"~/TestApp/app/test.js": "1",
"~/TestApp/app/myfile.js": "2",
"~/TestApp/app/notchangedFile.js": "3"
};
var localToDevicePaths = _.keys(fileToShasumDictionary).map(function (file) { return injector.resolve(LocalToDevicePathDataMock, { filePath: file }); });
var fs = injector.resolve("fs");
fs.getFileShasum = function (filePath) { return (function () { return fileToShasumDictionary[filePath]; }).future()(); };
fs.exists = function (filePath) { return Future.fromResult(true); };
fs.readJson = function (filePath) { return (function () { return ({ "~/TestApp/app/test.js": "0", "~/TestApp/app/myfile.js": "4", "~/TestApp/app/notchangedFile.js": "3" }); }).future()(); };
fs.getFsStats = mockFsStats({ isDirectory: false, isFile: true });
fs.readText = function () { return Future.fromResult(""); };
var androidDeviceFileSystem = createAndroidDeviceFileSystem(injector);
var transferedFilesOnDevice = [];
androidDeviceFileSystem.transferFile = function (localPath, devicePath) {
transferedFilesOnDevice.push(localPath);
return Future.fromResult();
};
androidDeviceFileSystem.transferDirectory(deviceAppData, localToDevicePaths, "~/TestApp/app").wait();
chai_1.assert.equal(transferedFilesOnDevice.length, 2);
chai_1.assert.isTrue(_.includes(transferedFilesOnDevice, "~/TestApp/app/test.js"));
chai_1.assert.isTrue(_.includes(transferedFilesOnDevice, "~/TestApp/app/myfile.js"));
chai_1.assert.isFalse(_.includes(transferedFilesOnDevice, "~/TestApp/app/notchangedFile.js"));
});
it("pushes files which has different location when hash file exists on device", function () {
var injector = createTestInjector();
var deviceAppData = createDeviceAppData();
var fileToShasumDictionary = {
"~/TestApp/app/newDir/test.js": "1",
"~/TestApp/app/myfile.js": "2"
};
var localToDevicePaths = _.keys(fileToShasumDictionary).map(function (file) { return injector.resolve(LocalToDevicePathDataMock, { filePath: file }); });
var fs = injector.resolve("fs");
fs.getFileShasum = function (filePath) { return (function () { return fileToShasumDictionary[filePath]; }).future()(); };
fs.exists = function (filePath) { return Future.fromResult(true); };
fs.readJson = function (filePath) { return (function () { return ({ "~/TestApp/app/test.js": "0", "~/TestApp/app/myfile.js": "2" }); }).future()(); };
fs.getFsStats = mockFsStats({ isDirectory: false, isFile: true });
fs.readText = function () { return Future.fromResult(""); };
var androidDeviceFileSystem = createAndroidDeviceFileSystem(injector);
androidDeviceFileSystem.transferFile = function (localPath, devicePath) {
chai_1.assert.equal(localPath, "~/TestApp/app/newDir/test.js");
return Future.fromResult();
};
androidDeviceFileSystem.transferDirectory(deviceAppData, localToDevicePaths, "~/TestApp/app").wait();
});
it("pushes files which has different location and different shasum when hash file exists on device", function () {
var injector = createTestInjector();
var deviceAppData = createDeviceAppData();
var fileToShasumDictionary = {
"~/TestApp/app/newDir/test.js": "2",
"~/TestApp/app/myfile.js": "2"
};
var localToDevicePaths = _.keys(fileToShasumDictionary).map(function (file) { return injector.resolve(LocalToDevicePathDataMock, { filePath: file }); });
var fs = injector.resolve("fs");
fs.getFileShasum = function (filePath) { return (function () { return fileToShasumDictionary[filePath]; }).future()(); };
fs.exists = function (filePath) { return Future.fromResult(true); };
fs.readJson = function (filePath) { return (function () { return ({ "~/TestApp/app/test.js": "0", "~/TestApp/app/myfile.js": "2" }); }).future()(); };
fs.getFsStats = mockFsStats({ isDirectory: false, isFile: true });
fs.readText = function () { return Future.fromResult(""); };
var androidDeviceFileSystem = createAndroidDeviceFileSystem(injector);
androidDeviceFileSystem.transferFile = function (localPath, devicePath) {
chai_1.assert.equal(localPath, "~/TestApp/app/newDir/test.js");
return Future.fromResult();
};
androidDeviceFileSystem.transferDirectory(deviceAppData, localToDevicePaths, "~/TestApp/app").wait();
});
});
});