///
import * as assert from "assert";
import * as express from "express";
import * as http from "http";
import * as acquisitionSdk from "../script/acquisition-sdk";
import * as mockApi from "./acquisition-rest-mock";
import * as rest from "rest-definitions";
var latestPackage: rest.UpdateCheckResponse = clone(mockApi.latestPackage);
var configuration: acquisitionSdk.Configuration = {
appVersion: "1.5.0",
clientUniqueId: "My iPhone",
deploymentKey: mockApi.validDeploymentKey,
serverUrl: mockApi.serverUrl,
}
var templateCurrentPackage: acquisitionSdk.Package = {
deploymentKey: mockApi.validDeploymentKey,
description: "sdfsdf",
label: "v1",
appVersion: latestPackage.appVersion,
packageHash: "hash001",
isMandatory: false,
packageSize: 100
};
var scriptUpdateResult: acquisitionSdk.RemotePackage = {
deploymentKey: mockApi.validDeploymentKey,
description: latestPackage.description,
downloadUrl: latestPackage.downloadURL,
label: latestPackage.label,
appVersion: latestPackage.appVersion,
isMandatory: latestPackage.isMandatory,
packageHash: latestPackage.packageHash,
packageSize: latestPackage.packageSize
};
var nativeUpdateResult: acquisitionSdk.NativeUpdateNotification = {
updateAppVersion: true,
appVersion: latestPackage.appVersion
};
describe("Acquisition SDK", () => {
beforeEach(() => {
mockApi.latestPackage = clone(latestPackage);
});
it("Package with lower label and different package hash gives update", (done: MochaDone) => {
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(templateCurrentPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.deepEqual(scriptUpdateResult, returnPackage);
done();
});
});
it("Package with equal package hash gives no update", (done: MochaDone) => {
var equalVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
equalVersionPackage.packageHash = latestPackage.packageHash;
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(equalVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.equal(null, returnPackage);
done();
});
});
it("Package with higher different hash and higher label version gives update", (done: MochaDone) => {
var higherVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
higherVersionPackage.packageHash = "hash990";
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(higherVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.deepEqual(scriptUpdateResult, returnPackage);
done();
});
});
it("Package with lower native version gives update notification", (done: MochaDone) => {
var lowerAppVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
lowerAppVersionPackage.appVersion = "0.0.1";
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(lowerAppVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.deepEqual(nativeUpdateResult, returnPackage);
done();
});
});
it("SDK forwards shouldRunBinaryVersion notification", (done: MochaDone) => {
mockApi.latestPackage.shouldRunBinaryVersion = true;
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(clone(templateCurrentPackage), (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.deepEqual({ shouldRunBinaryVersion: true }, returnPackage);
done();
});
});
it("Package with lower native version gives update notification together with shouldRunBinaryVersion notification", (done: MochaDone) => {
mockApi.latestPackage.shouldRunBinaryVersion = true;
var lowerAppVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
lowerAppVersionPackage.appVersion = "0.0.1";
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(lowerAppVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.deepEqual(nativeUpdateResult, returnPackage);
done();
});
});
it("Package with higher native version gives no update", (done: MochaDone) => {
var higherAppVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
higherAppVersionPackage.appVersion = "9.9.0";
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(higherAppVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.deepEqual(null, returnPackage);
done();
});
});
it("An empty response gives no update", (done: MochaDone) => {
var lowerAppVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
lowerAppVersionPackage.appVersion = "0.0.1";
var emptyReponse: acquisitionSdk.Http.Response = {
statusCode: 200,
body: JSON.stringify({})
};
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.CustomResponseHttpRequester(emptyReponse), configuration);
acquisition.queryUpdateWithCurrentPackage(lowerAppVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage|acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
done();
});
});
it("An unexpected (but valid) JSON response gives no update", (done: MochaDone) => {
var lowerAppVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
lowerAppVersionPackage.appVersion = "0.0.1";
var unexpectedResponse: acquisitionSdk.Http.Response = {
statusCode: 200,
body: JSON.stringify({ unexpected: "response" })
};
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.CustomResponseHttpRequester(unexpectedResponse), configuration);
acquisition.queryUpdateWithCurrentPackage(lowerAppVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage|acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
done();
});
});
it("Package for companion app ignores high native version and gives update", (done: MochaDone) => {
var higherAppVersionCompanionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
higherAppVersionCompanionPackage.appVersion = "9.9.0";
var companionAppConfiguration = clone(configuration);
configuration.ignoreAppVersion = true;
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(higherAppVersionCompanionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.equal(null, error);
assert.deepEqual(scriptUpdateResult, returnPackage);
done();
});
});
it("If latest package is mandatory, returned package is mandatory", (done: MochaDone) => {
mockApi.latestPackage.isMandatory = true;
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.queryUpdateWithCurrentPackage(templateCurrentPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage) => {
assert.equal(null, error);
assert.equal(true, returnPackage.isMandatory);
done();
});
});
it("If invalid arguments are provided, an error is raised", (done: MochaDone) => {
var invalidPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
invalidPackage.appVersion = null;
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
try {
acquisition.queryUpdateWithCurrentPackage(invalidPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage | acquisitionSdk.NativeUpdateNotification) => {
assert.fail("Should throw an error if the native implementation gave an incorrect package");
done();
});
} catch (error) {
done();
}
});
it("If an invalid JSON response is returned by the server, an error is raised", (done: MochaDone) => {
var lowerAppVersionPackage: acquisitionSdk.Package = clone(templateCurrentPackage);
lowerAppVersionPackage.appVersion = "0.0.1";
var invalidJsonReponse: acquisitionSdk.Http.Response = {
statusCode: 200,
body: "invalid {{ json"
};
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.CustomResponseHttpRequester(invalidJsonReponse), configuration);
acquisition.queryUpdateWithCurrentPackage(lowerAppVersionPackage, (error: Error, returnPackage: acquisitionSdk.RemotePackage|acquisitionSdk.NativeUpdateNotification) => {
assert.notEqual(null, error);
done();
});
});
it("If deploymentKey is not valid...", (done: MochaDone) => {
// TODO: behaviour is not defined
done();
});
it("reportStatusDeploy(...) signals completion", (done: MochaDone): void => {
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.reportStatusDeploy(templateCurrentPackage, acquisitionSdk.AcquisitionStatus.DeploymentFailed, "1.5.0", mockApi.validDeploymentKey, ((error: Error, parameter: void): void => {
if (error) {
throw error;
}
assert.equal(parameter, /*expected*/ null);
done();
}));
});
it("reportStatusDownload(...) signals completion", (done: MochaDone): void => {
var acquisition = new acquisitionSdk.AcquisitionManager(new mockApi.HttpRequester(), configuration);
acquisition.reportStatusDownload(templateCurrentPackage, ((error: Error, parameter: void): void => {
if (error) {
throw error;
}
assert.equal(parameter, /*expected*/ null);
done();
}));
});
});
function clone(initialObject: T): T {
return JSON.parse(JSON.stringify(initialObject));
}