Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

350 lines
15 KiB
JavaScript

/// <reference path="../Scripts/References.js" />
(function (global, upshot, undefined) {
module("DataSource.tests.js", {
teardown: function () {
testHelper.unmockAjax();
}
});
function createRemoteDataSource(options) {
options = $.extend({ providerParameters: { url: "unused", operationName: "" }, provider: upshot.riaDataProvider }, options || {});
return new upshot.RemoteDataSource(options);
}
function createTestDataContext() {
return new upshot.DataContext(new upshot.riaDataProvider());
}
// refreshStart
test("refreshStart RemoteDataSource", 3, function () {
stop();
dsTestDriver.simulateSuccessService();
dsTestDriver.ds = upshot.RemoteDataSource({ providerParameters: { url: "unused", operationName: "" }, provider: upshot.riaDataProvider });
dsTestDriver.ds.bind("refreshStart", dsTestDriver.onRefreshStart);
dsTestDriver.ds.refresh(function () { start(); });
});
test("refreshStart observer LocalDataSource over RemoteDataSource", 3, function () {
stop();
dsTestDriver.simulateSuccessService();
dsTestDriver.ds = upshot.LocalDataSource({ source: createRemoteDataSource() });
dsTestDriver.ds.bind({
refreshStart: dsTestDriver.onRefreshStart,
refreshSuccess: function () { start(); }
});
dsTestDriver.ds.refresh({ all: true });
});
test("refreshStart observer LocalDataSource over EntitySet", 3, function () {
stop();
dsTestDriver.simulateSuccessService();
var dataContext = upshot.DataContext(new upshot.riaDataProvider());
dataContext.__load({ providerParameters: { url: "unused", operationName: ""} }, function (entitySet) {
dsTestDriver.ds = new upshot.LocalDataSource({ source: entitySet });
dsTestDriver.ds.bind("refreshStart", dsTestDriver.onRefreshStart);
dsTestDriver.ds.bind("refreshSuccess", function () { start(); });
dsTestDriver.ds.refresh();
});
});
// refreshSuccess
test("refreshSuccess RemoteDataSource", 6, function () {
stop();
dsTestDriver.simulateSuccessService();
dsTestDriver.ds = createRemoteDataSource();
dsTestDriver.ds.refresh(dsTestDriver.onRefreshSuccess, dsTestDriver.onRefreshError);
});
test("refreshSuccess observer RemoteDataSource", 6, function () {
stop();
dsTestDriver.simulateSuccessService();
dsTestDriver.ds = createRemoteDataSource();
dsTestDriver.ds.bind("refreshSuccess", dsTestDriver.onRefreshSuccess);
dsTestDriver.ds.bind("refreshError", dsTestDriver.onRefreshError);
dsTestDriver.ds.refresh();
});
test("refreshSuccess LocalDataSource over RemoteDataSource", 6, function () {
stop();
dsTestDriver.simulateSuccessService();
dsTestDriver.ds = new upshot.LocalDataSource({ source: createRemoteDataSource() });
dsTestDriver.ds.refresh({ all: true }, dsTestDriver.onRefreshSuccess, dsTestDriver.onRefreshError);
});
test("refreshSuccess observer LocalDataSource over RemoteDataSource", 6, function () {
stop();
dsTestDriver.simulateSuccessService();
dsTestDriver.ds = new upshot.LocalDataSource({ source: createRemoteDataSource() })
.bind("refreshSuccess", dsTestDriver.onRefreshSuccess)
.bind("refreshError", dsTestDriver.onRefreshError);
dsTestDriver.ds.refresh({ all: true });
});
test("refreshSuccess LocalDataSource over EntitySet", 6, function () {
stop();
dsTestDriver.simulateSuccessService();
var dataContext = createTestDataContext();
dataContext.__load({ providerParameters: { url: "unused"} }, function (entitySet) {
dsTestDriver.ds = new upshot.LocalDataSource({ source: entitySet });
dsTestDriver.ds.refresh(dsTestDriver.onRefreshSuccess, dsTestDriver.onRefreshError);
});
});
test("refreshSuccess observer LocalDataSource over EntitySet", 6, function () {
stop();
dsTestDriver.simulateSuccessService();
var dataContext = createTestDataContext();
dataContext.__load({ providerParameters: { url: "unused"} }, function (entitySet) {
dsTestDriver.ds = new upshot.LocalDataSource({ source: entitySet })
.bind({
refreshSuccess: dsTestDriver.onRefreshSuccess,
refreshError: dsTestDriver.onRefreshError
});
dsTestDriver.ds.refresh();
});
});
// refreshError
test("refreshError RemoteDataSource", 5, function () {
stop();
dsTestDriver.simulateErrorService();
dsTestDriver.ds = createRemoteDataSource();
dsTestDriver.ds.refresh(dsTestDriver.onRefreshSuccess, dsTestDriver.onRefreshError);
});
test("refreshError observer RemoteDataSource", 5, function () {
stop();
dsTestDriver.simulateErrorService();
dsTestDriver.ds = createRemoteDataSource();
dsTestDriver.ds.bind("refreshSuccess", dsTestDriver.onRefreshSuccess);
dsTestDriver.ds.bind("refreshError", dsTestDriver.onRefreshError);
dsTestDriver.ds.refresh();
});
test("refreshError LocalDataSource over RemoteDataSource", 5, function () {
stop();
dsTestDriver.simulateErrorService();
dsTestDriver.ds = new upshot.LocalDataSource({ source: createRemoteDataSource() });
dsTestDriver.ds.refresh({ all: true }, dsTestDriver.onRefreshSuccess, dsTestDriver.onRefreshError);
});
test("refreshError observer LocalDataSource over RemoteDataSource", 5, function () {
stop();
dsTestDriver.simulateErrorService();
dsTestDriver.ds = new upshot.LocalDataSource({ source: createRemoteDataSource() });
dsTestDriver.ds.bind("refreshSuccess", dsTestDriver.onRefreshSuccess);
dsTestDriver.ds.bind("refreshError", dsTestDriver.onRefreshError);
dsTestDriver.ds.refresh({ all: true });
});
// entityChanged
asyncTest("entityChanged event is raised on a successful update", 12, function () {
var listener = {
events: [],
onEntityUpdated: function (entity, path, eventArgs) {
listener.events.push({ entity: entity, path: path, eventArgs: eventArgs });
}
};
dsTestDriver.ds = new upshot.RemoteDataSource({ providerParameters: { url: "unused", operationName: "" }, provider: upshot.riaDataProvider, entityType: "Product:#Sample.Models", bufferChanges: true });
dsTestDriver.ds.bind("entityUpdated", listener.onEntityUpdated);
dsTestDriver.simulateSuccessService();
dsTestDriver.ds.refresh(function (entities) {
var entity = entities[0];
equal(dsTestDriver.ds.isUpdated(entity), false, "The entity should not have changes");
equal(listener.events.length, 0, "There should have been one event");
$.observable(entity).property("Price", 700);
equal(dsTestDriver.ds.isUpdated(entity), true, "The entity should have changes");
equal(listener.events.length, 1, "There should have been one event");
equal(listener.events[0].entity, entity, "The event should have been for the entity");
equal(listener.events[0].path, "", "The event should have been directly on the entity");
equal(listener.events[0].eventArgs.newValues.Price, 700, "The event should have been a property change");
listener.events.length = 0;
dsTestDriver.simulatePostSuccessService();
dsTestDriver.ds.commitChanges(function () {
equal(dsTestDriver.ds.isUpdated(entity), false, "The entity should no longer have changes");
equal(listener.events.length, 1, "There should have been one event");
equal(listener.events[0].entity, entity, "The event should have been for the entity");
equal(listener.events[0].path, undefined, "The event should not include a path");
equal(listener.events[0].eventArgs, undefined, "The event should not include args");
start();
});
});
});
test("insert without initial refresh over RemoteDataSource", 5, function () {
stop();
dsTestDriver.ds = new upshot.RemoteDataSource({
providerParameters: { url: "unused" },
provider: upshot.riaDataProvider,
entityType: "Foo"
});
dsTestDriver.ds.bind("commitSuccess", dsTestDriver.onCommitSuccess);
upshot.metadata("Foo", { key: ["FooId"] });
dsTestDriver.simulatePostSuccessService();
$.observable(dsTestDriver.ds.getEntities()).insert({ FooId: 1 });
});
test("revertChanges without initial refresh over RemoteDataSource", 2, function () {
stop();
var entities = [],
ds = new upshot.RemoteDataSource({
entityType: "Foo",
result: entities,
bufferChanges: true,
provider: upshot.riaDataProvider
});
upshot.metadata("Foo", { key: ["FooId"] });
$.observable(entities).insert({});
equal(entities.length, 1);
ds.revertChanges();
equal(entities.length, 0);
start();
});
test("DataSource reset", 23, function () {
stop();
dsTestDriver.simulateSuccessService();
var rds = dsTestDriver.ds = createRemoteDataSource();
rds.refresh(function () {
stop();
dsTestDriver.onRefreshSuccess.apply(this, arguments);
var lds = upshot.LocalDataSource({ source: rds });
lds.refresh(function () {
// RDS and LDS should be loaded and in sync.
equal(lds.refreshNeeded(), false, "LocalDataSource should not need refresh");
ok(upshot.sameArrayContents(rds.getEntities(), lds.getEntities()), "LocalDataSource refreshed properly");
rds.reset();
// RDS should have been reset. LDS should need a refresh.
equal(rds.getEntities().length, 0, "RemoteDataSource has no entities");
equal(rds.getTotalEntityCount(), undefined, "RemoteDataSource has no total count");
equal(lds.refreshNeeded(), true, "LocalDataSource should need a refresh");
lds.reset();
// LDS should have been reset.
equal(lds.getEntities().length, 0, "LocalDataSource has no entities");
equal(lds.getTotalEntityCount(), undefined, "LocalDataSource has no total count");
// Put the RDS back in its loaded state.
dsTestDriver.simulateSuccessService();
rds.refresh(function () {
stop();
dsTestDriver.onRefreshSuccess.apply(this, arguments);
// Put the LDS back in sync with the RDS.
equal(lds.refreshNeeded(), true, "LocalDataSource should need a refresh");
lds.refresh(function () {
ok(upshot.sameArrayContents(rds.getEntities(), lds.getEntities()), "LocalDataSource refreshed properly");
lds.reset();
// LDS should have been reset.
equal(lds.getEntities().length, 0, "LocalDataSource has no entities");
equal(lds.getTotalEntityCount(), undefined, "LocalDataSource has no total count");
start();
});
});
});
});
});
test("refresh with edits", 5, function () {
stop();
var rds = dsTestDriver.ds = createRemoteDataSource();
dsTestDriver.simulateSuccessService();
rds.refresh(function (entities) {
ok(entities.length === 3, "Successful initial refresh");
var entity = entities[0];
$.observable(entity).property("Manufacturer", "Foo");
var exception;
try {
rds.refresh();
} catch (ex) {
exception = true;
}
ok(!!exception, "Can't load with edits to DataSource entities");
rds.revertChanges();
setTimeout(function () {
var emptyProductsResult = {
GetProductsResult: {
TotalCount: 3,
RootResults: [],
Metadata: [ $.extend({}, { type: "Product:#Sample.Models" }, upshot.metadata()["Product:#Sample.Models"]) ]
}
};
dsTestDriver.simulateSuccessService(emptyProductsResult);
rds.refresh(function (entities) {
ok(entities.length === 0, "'Canon' isn't in filtered result");
$.observable(entity).property("Manufacturer", "Foo");
setTimeout(function () {
var exception;
try {
dsTestDriver.simulateSuccessService(emptyProductsResult);
rds.refresh(function(entities) {
ok(entities.length === 0, "Can load with edits not included in DataSource entities");
start();
});
} catch (ex) {
exception = true;
}
ok(!exception, "Can load with edits not included in DataSource entities");
}, 0);
});
}, 0);
});
});
test("refresh with edits and 'allowRefreshWithEdits' option", 3, function () {
stop();
var rds = dsTestDriver.ds = createRemoteDataSource({ allowRefreshWithEdits: true });
dsTestDriver.simulateSuccessService();
rds.refresh(function (entities) {
ok(entities.length === 3, "Successful initial refresh");
var entity = entities[0];
$.observable(entity).property("Manufacturer", "Foo");
setTimeout(function () {
var exception;
try {
dsTestDriver.simulateSuccessService();
rds.refresh(function (entities) {
ok(entities.length === 3, "Can load with edits to DataSource entities (using allowRefreshWithEdits)");
start();
});
} catch (ex) {
exception = true;
}
ok(!exception, "Can load with edits to DataSource entities (using allowRefreshWithEdits)");
}, 0);
});
});
})(this, upshot);