blob: a8682f366a1f28dc742804451dcc868d0980b71f [file] [log] [blame]
/// <reference path="common/djstest.js" />
/// <reference path="../src/odata.js" />
/// <reference path="common/ODataReadOracle.js" />
(function (window, undefined) {
var unexpectedErrorHandler = function (err) {
djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
djstest.done();
};
var verifyRequest = function (request, done) {
if (request.method == "POST") {
if (request.headers && request.headers["X-HTTP-Method"] == "MERGE") {
verifyMerge(request, done);
}
else {
verifyPost(request, done);
}
}
else if (request.method == "PUT") {
verifyPut(request, done);
}
};
var verifyPost = function (request, done) {
var httpOperation = request.method + " " + request.requestUri;
OData.request(request, function (data, response) {
djstest.assertAreEqual(response.statusCode, httpStatusCode.created, "Verify response code: " + httpOperation);
ODataReadOracle.readJson(data.__metadata.uri, function (expectedData) {
djstest.assertAreEqualDeep(response.data, expectedData, "Verify new entry against response: " + httpOperation);
done();
}, request.headers.Accept);
}, unexpectedErrorHandler);
};
var verifyPut = function (request, done) {
var httpOperation = request.method + " " + request.requestUri;
OData.request(request, function (data, response) {
djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code: " + httpOperation);
ODataReadOracle.readJson(request.requestUri, function (actualData) {
djstest.assertAreEqualDeep(actualData, request.data, "Verify updated entry: " + httpOperation);
done();
}, request.headers.Accept);
}, unexpectedErrorHandler);
}
var verifyMerge = function (request, done) {
var httpOperation = request.method + " " + request.requestUri;
ODataReadOracle.readJson(request.requestUri, function (originalData) {
OData.request(request, function (data, response) {
djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code");
ODataReadOracle.readJson(request.requestUri, function (actualData) {
// Merge the original data with the updated data to get the expected data
var expectedData = $.extend(true, {}, originalData, request.data);
djstest.assertAreEqualDeep(actualData, expectedData, "Verify merged data");
done();
}, request.headers["Content-Type"]);
}, unexpectedErrorHandler);
}, request.headers["Content-Type"]);
}
// Returns a subset of object with the same set of properties (recursive) as the subsetObject
var subset = function (object, subsetObject) {
if (typeof (object) == "object" && typeof (subsetObject) == "object") {
var result = {};
for (subsetProp in subsetObject) {
result[subsetProp] = subset(object[subsetProp], subsetObject[subsetProp]);
}
return result;
}
else {
return object;
}
};
var service = "./endpoints/FoodStoreDataService.svc";
var foodsFeed = service + "/Foods";
var categoriesFeed = service + "/Categories";
//var mimeTypes = [undefined, "application/json", "application/atom+xml"];
var mimeTypes = ["application/json", "application/atom+xml"];
var httpStatusCode = {
created: 201,
noContent: 204,
notFound: 404
};
var newFood = {
"__metadata": {
type: "DataJS.Tests.Food"
},
FoodID: 42,
Name: "olive oil",
UnitPrice: 3.14,
ServingSize: "1",
MeasurementUnit: "Cup",
ProteinGrams: 5,
FatGrams: 9,
CarbohydrateGrams: 2,
CaloriesPerServing: "6",
IsAvailable: true,
ExpirationDate: new Date("2011/05/03 12:00:00 PM"),
ItemGUID: "27272727-2727-2727-2727-272727272727",
Weight: 10,
AvailableUnits: 1,
Packaging: {
Type: "Can",
Color: "White",
NumberPerPackage: 1,
RequiresRefridgeration: false,
PackageDimensions: {
Length: "4",
Height: 3,
Width: "2",
Volume: 1
},
ShipDate: new Date("2011/01/01 12:00:00 PM")
}
};
var newFoodLinks = {
uri: foodsFeed + "(1)"
}
module("Functional", {
setup: function () {
$.ajax({ async: false, type: "POST", url: service + "/ResetData" });
}
});
$.each(mimeTypes, function (_, mimeType) {
var headers = mimeType ? { "Content-Type": mimeType, Accept: mimeType} : undefined;
djstest.addTest(function addEntityTest(headers) {
var request = {
requestUri: categoriesFeed,
method: "POST",
headers: headers,
data: {
CategoryID: 42,
Name: "New Category"
}
};
verifyRequest(request, function () {
OData.read({ requestUri: categoriesFeed + "(42)", headers: { Accept: mimeType} }, function (actualData, response) {
actualData.CategoryID = 27;
var newRequest = {
requestUri: categoriesFeed,
method: "POST",
headers: headers,
data: actualData
};
verifyRequest(newRequest, function () { djstest.done(); });
}, request.headers["Content-Type"]);
});
}, "Post, read posted data, post read data (mimeType = " + mimeType + ")", headers);
djstest.addTest(function addLinkedEntityTest(headers) {
var request = {
requestUri: categoriesFeed + "(0)/Foods",
method: "POST",
headers: headers,
data: newFood
};
verifyRequest(request, function () {
OData.read({ requestUri: categoriesFeed + "(0)/Foods(42)", headers: { Accept: mimeType} }, function (actualData, response) {
actualData.FoodID = 94;
var newRequest = {
requestUri: categoriesFeed + "(0)/Foods",
method: "POST",
headers: headers,
data: actualData
};
verifyRequest(newRequest, function () { djstest.done(); });
}, request.headers["Content-Type"]);
});
}, "POST, read, POST an entry " + mimeType + ")", headers);
djstest.addTest(function addLinkedEntityTest(headers) {
var request = {
requestUri: categoriesFeed + "(0)/Foods(0)",
method: "PUT",
headers: headers,
data: newFood
};
verifyRequest(request, function () {
OData.read({ requestUri: categoriesFeed + "(0)/Foods(0)", headers: { Accept: mimeType} }, function (actualData, response) {
var newRequest = {
requestUri: categoriesFeed + "(0)/Foods(0)",
method: "PUT",
headers: headers,
data: {
"__metadata": { type: "DataJS.Tests.Food" },
Name: "New Food"
}
};
verifyRequest(newRequest, function () { djstest.done(); });
});
});
}, "PUT, read, PUT a new linked entry " + mimeType + ")", headers);
djstest.addTest(function addEntityWithInlineFeedTest(headers) {
var request = {
requestUri: categoriesFeed,
method: "POST",
headers: headers,
data: {
CategoryID: 42,
Name: "Olive Products",
Foods: [newFood]
}
};
verifyRequest(request, function () {
OData.read({ requestUri: foodsFeed + "(" + newFood.FoodID + ")", headers: { Accept: mimeType} }, function (actualData, response) {
var newRequest = {
requestUri: categoriesFeed,
method: "POST",
headers: headers,
data: {
CategoryID: 27,
Name: "Olive Products",
Foods: [actualData]
}
};
verifyRequest(newRequest, function () { djstest.done(); });
});
});
}, "POST, read, POST an entity with inline feed " + mimeType + ")", headers);
djstest.addTest(function addEntityWithInlineEntryTest(headers) {
var request = {
requestUri: foodsFeed,
method: "POST",
headers: headers,
data: $.extend({}, newFood, {
Category: {
"__metadata": { uri: "" },
CategoryID: 42,
Name: "Olive Products"
}
})
};
verifyRequest(request, function () {
OData.read({ requestUri: foodsFeed + "(" + newFood.FoodID + ")", headers: { Accept: mimeType} }, function (actualData, response) {
actualData.FoodID = 76;
var newRequest = {
requestUri: foodsFeed,
method: "POST",
headers: headers,
data: $.extend({}, actualData, {
Category: {
"__metadata": { uri: "" },
CategoryID: 27,
Name: "Olive Products"
}
})
};
verifyRequest(newRequest, function () { djstest.done(); });
});
});
}, "Add new entity with inline entry (mimeType = " + mimeType + ")", headers);
djstest.addTest(function addEntityTest(headers) {
var request = {
requestUri: categoriesFeed + "(1)",
method: "PUT",
headers: headers,
data: {
CategoryID: 1,
Name: "New Category"
}
};
verifyRequest(request, function () {
OData.read({ requestUri: categoriesFeed + "(1)", headers: { Accept: mimeType} }, function (actualData, response) {
actualData.CategoryID = 2;
var newRequest = {
requestUri: categoriesFeed + "(2)",
method: "PUT",
headers: headers,
data: actualData
};
verifyRequest(newRequest, function () { djstest.done(); });
}, request.headers["Content-Type"]);
});
}, "Put, read put data, put read data (mimeType = " + mimeType + ")", headers);
djstest.addTest(function addEntityTest(headers) {
OData.read({ requestUri: foodsFeed + "(0)", headers: { Accept: mimeType} },
function (actualData, response) {
actualData.CategoryID = 216;
var request = {
requestUri: foodsFeed,
method: "POST",
headers: headers,
data: actualData
};
verifyRequest(request,
function () {
OData.read({ requestUri: foodsFeed + "(216)", headers: { Accept: mimeType} },
function (data, response) {
ODataReadOracle.readJson(foodsFeed + "(216)",
function (expectedData) {
djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
djstest.done();
});
});
});
});
}, "Read data with dates, post read data with dates to new ID, read new ID data with dates" + mimeType + ")", headers);
djstest.addTest(function addEntityTest(headers) {
OData.read({ requestUri: categoriesFeed + "(0)", headers: { Accept: mimeType} },
function (actualData, response) {
actualData.CategoryID = 81;
var request = {
requestUri: categoriesFeed,
method: "POST",
headers: headers,
data: actualData
};
verifyRequest(request,
function () {
OData.read({ requestUri: categoriesFeed + "(81)", headers: { Accept: mimeType} },
function (data, response) {
ODataReadOracle.readJson(categoriesFeed + "(81)",
function (expectedData) {
djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
djstest.done();
}
);
}
);
}
);
}
);
}, "Read existing data, post existing data to new idea, read new ID data" + mimeType + ")", headers);
djstest.addTest(function addEntityTest(headers) {
OData.read({ requestUri: categoriesFeed + "(0)", headers: { Accept: mimeType} },
function (actualData, response) {
actualData.CategoryID = 81;
var request = {
requestUri: categoriesFeed,
method: "POST",
headers: headers,
data: actualData
};
verifyRequest(request,
function () {
OData.read({ requestUri: categoriesFeed + "(81)", headers: { Accept: mimeType} },
function (data, response) {
ODataReadOracle.readJson(categoriesFeed + "(81)",
function (expectedData) {
djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
djstest.done();
});
});
});
});
}, "Read existing data, post existing data to new idea, read new ID data" + mimeType + ")", headers);
});
})(this);