blob: 1b9dd5e70eed97464d805cfbee34d9449753c575 [file] [log] [blame]
/// <reference path="../src/odata-xml.js" />
/// <reference path="common/djstest.js" />
// odata-xml-tests.js
(function (window, undefined) {
djstest.addTest(function readLinksTest() {
var tests = [
{ i: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\r\n\
<links xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\">\r\n\
<uri>http://services.odata.org/OData/OData.svc/Products(1)</uri>\r\n\
<uri>http://services.odata.org/OData/OData.svc/Products(2)</uri>\r\n\
<uri></uri>\r\n\
</links>",
e: { results: [
{ uri: "http://services.odata.org/OData/OData.svc/Products(1)" },
{ uri: "http://services.odata.org/OData/OData.svc/Products(2)" },
{ uri: ""}]
}
},
{ i: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\r\n\
<links xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\"/>",
e: { results: [] }
},
{ i: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\r\n\
<uri xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\">http://services.odata.org/OData/OData.svc/Products(2)</uri>",
e: { uri: "http://services.odata.org/OData/OData.svc/Products(2)" }
},
{ i: "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\r\n\
<uri xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\"/>",
e: { uri: "" }
}
];
var i, len;
for (i = 0, len = tests.length; i < len; i++) {
OData.read("foo", function success(data) {
djstest.assertAreEqualDeep(data, tests[i].e, "Deserialized links object match");
},
function error(err) {
djstest.fail(err.message);
},
OData.defaultHttpHandler,
{
request: function (request, success) {
success({ headers: { "Content-Type": "application/xml" }, body: tests[i].i });
}
});
}
djstest.done();
});
// DATAJS INTERNAL START
djstest.addTest(function writeLinksTest() {
var tests = [
{
i: { uri: "" },
e: "<?xml version=\"1.0\"?>\r\n\
<uri xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\"/>"
},
{
i: { uri: null },
e: "<?xml version=\"1.0\"?>\r\n\
<uri xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\"/>"
},
{
i: { uri: undefined },
e: "<?xml version=\"1.0\"?>\r\n\
<uri xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\"/>"
},
{
i: { uri: "http://services.odata.org/OData/OData.svc/Products(2)" },
e: "<?xml version=\"1.0\"?>\r\n\
<uri xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\">http://services.odata.org/OData/OData.svc/Products(2)</uri>"
},
{
i: { results: [
{ uri: "http://services.odata.org/OData/OData.svc/Products(1)" },
{ uri: "http://services.odata.org/OData/OData.svc/Products(2)" },
{ uri: "" }
]
},
error: true
},
{
i: { __metadata: {}, uri: "http://services.odata.org/OData/OData.svc/Products(2)" },
error: true
},
{
i: {},
error: true
}
];
var i, len;
for (i = 0, len = tests.length; i < len; i++) {
OData.request({ headers: { "Content-Type": "application/xml" }, data: tests[i].i },
function success(data) { },
function error(err) {
if (tests[i].error) {
djstest.assert(true, "Error handler called when expected");
} else {
djstest.fail(err.message);
}
},
OData.defaultHttpHandler,
{
request: function (request, success) {
var expected = datajs.xmlParse(tests[i].e).documentElement;
var actual = datajs.xmlParse(request.body).documentElement;
djstest.assertAreEqual(expected.localName || expected.baseName, actual.localName || actual.baseName, "Nodes local names are equal");
djstest.assertAreEqual(expected.namespaceURI, actual.namespaceURI, "Nodes namespaces are equal");
expected = expected.firstChild;
actual = actual.firstChild;
while (expected) {
if (!actual) {
djstest.fail("actual is not defined");
break;
}
djstest.assertAreEqual(expected.localName || expected.baseName, actual.localName || actual.baseName, "Nodes local names are equal");
djstest.assertAreEqual(expected.namespaceURI, actual.namespaceURI, "Nodes namespaces are equal");
expected = expected.nextSibling;
actual = actual.nextSibling;
}
}
});
}
djstest.done();
});
djstest.addTest(function getURIInfoTest() {
var tests = [
{ input: "https://host.com:8080/path1/path2?p1=1&p2=2#fragment", expected: { scheme: "https:", authority: "//host.com:8080", path: "/path1/path2", query: "?p1=1&p2=2", fragment: "#fragment", isAbsolute: true} },
{ input: "http://host.com:8080/path1/path2?p1=1&p2=2#fragment", expected: { scheme: "http:", authority: "//host.com:8080", path: "/path1/path2", query: "?p1=1&p2=2", fragment: "#fragment", isAbsolute: true} },
{ input: "https:", expected: { scheme: "https:", isAbsolute: true} },
{ input: "http:", expected: { scheme: "http:", isAbsolute: true} },
{ input: "//host.com", expected: { authority: "//host.com", isAbsolute: false} },
{ input: "path1", expected: { path: "path1", isAbsolute: false} },
{ input: "?query", expected: { query: "?query", isAbsolute: false} },
{ input: "#fragment", expected: { fragment: "#fragment", isAbsolute: false} },
{ input: undefined, expected: { isAbsolute: false} },
{ input: "", expected: { isAbsolute: false} },
{ input: null, expected: { isAbsolute: false} }
];
var i, len;
for (i = 0, len = tests.length; i < len; i++) {
var actual = datajs.getURIInfo(tests[i].input);
djstest.assertAreEqualDeep(actual, tests[i].expected, "test " + i + "didn't return the expected URI parts");
}
djstest.done();
});
djstest.addTest(function normalizeURICaseTest() {
var tests = [
{ uri: "hTTp://HOST.com/path1/Path2/PATH3?Query1=x&query2=Y#Fragment", expected: "http://host.com/path1/Path2/PATH3?Query1=x&query2=Y#Fragment" },
{ uri: "http://fabrikam%20user%3AHisPassWord@www.FaBriKAM.com:5895/Path%3A%201?q1=hi%20%3Ato%20you", expected: "http://fabrikam%20user%3aHisPassWord@www.fabrikam.com:5895/Path%3a%201?q1=hi%20%3ato%20you" },
{ uri: "/PATH1/PATH2?P1=AbC#fraGment", expected: "/PATH1/PATH2?P1=AbC#fraGment" },
{ uri: "HttP://" + encodeURIComponent("FTP://www.example.com&story=breaking_news:password@www.HOST.CoM:5678/"), expected: "http://" + encodeURIComponent("FTP://www.example.com&story=breaking_news:password@www.HOST.CoM:5678/").toLowerCase() }
];
var i, len;
for (i = 0, len = tests.length; i < len; i++) {
var actual = datajs.normalizeURICase(tests[i].uri, tests[i].base);
djstest.assertAreEqual(actual, tests[i].expected, "test " + i + "didn't return the expected URI");
}
djstest.done();
});
djstest.addTest(function normalizeURITest() {
var tests = [
{ uri: "http://host.com/path1#fragment", base: "http://base", expected: "http://host.com/path1#fragment" },
{ uri: "//host.com/path1?p1=0", base: "http://base?p2=1", expected: "http://host.com/path1?p1=0" },
{ uri: "?p1=0#fragment", base: "http://base/basepath", expected: "http://base/basepath?p1=0#fragment" },
{ uri: "?p1=0#fragment", base: "http://base/basepath?p2=1", expected: "http://base/basepath?p1=0#fragment" },
{ uri: "#fragment", base: "http://base/basepath?p2=1", expected: "http://base/basepath?p2=1#fragment" },
{ uri: "/path1/path2?p1=0", base: "http://base/basePath", expected: "http://base/path1/path2?p1=0" },
{ uri: "path1/path2?p1=0", base: "http://base/basepath", expected: "http://base/path1/path2?p1=0" },
{ uri: "path1/path2?p1=0", base: "http://base/basepath/basepath2", expected: "http://base/basepath/path1/path2?p1=0" },
{ uri: "", base: "http://base/basepath?p1=0#fragment", expected: "http://base/basepath?p1=0" },
{ uri: "path1/path2?p1=0", base: "", expected: "path1/path2?p1=0" },
{ uri: "/a/b/c/./../../g", base: "http://base/basepath", expected: "http://base/a/g" },
{ uri: "a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/basepath/a/g" },
{ uri: "../a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/a/g" },
{ uri: "./a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/basepath/a/g" },
{ uri: "/../a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/a/g" },
{ uri: "/./a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/a/g" }
];
var i, len;
for (i = 0, len = tests.length; i < len; i++) {
var actual = datajs.normalizeURI(tests[i].uri, tests[i].base);
djstest.assertAreEqual(actual, tests[i].expected, "test " + i + "didn't return the expected normalized URI");
}
djstest.done();
});
djstest.addTest(function xmlParseTest() {
var xml = '<root xmlns:n1="http://namespace1" xml:base="http://base.org" />';
var root = datajs.xmlParse(xml);
djstest.assert(root, "xml._parse didn't return a xml dom object");
djstest.done();
});
djstest.addTest(function xmlbaseURITest() {
var xml = "\
<root xmlns:n1=\"http://namespace1\" \r\n\
xml:base=\"http://base.org\"> \r\n\
<element base=\"this is not a xml base attribute\" /> \r\n\
</root>\r\n";
var doc = datajs.xmlParse(xml);
var root = datajs.xmlFirstChildElement(doc);
var child = datajs.xmlFirstChildElement(root);
djstest.assertAreEqual(datajs.xmlBaseURI(root), "http://base.org", "xml._baseURI didn't return the expected value");
djstest.assert(!datajs.xmlBaseURI(child), "xml._baseURI returned a value when it wasn't expected");
djstest.done();
});
djstest.addTest(function xmlAttributeValueTest() {
var xml = "\
<root xmlns:n1=\"http://namespace1\" \r\n\
xml:base=\"http://base.org\"> \r\n\
<element attribute=\"value\" n1:nsAttribute=\"nsValue\" /> \r\n\
</root> \r\n";
var doc = datajs.xmlParse(xml);
var root = datajs.xmlFirstChildElement(doc);
var child = datajs.xmlFirstChildElement(root);
djstest.assertAreEqual(datajs.xmlAttributeValue(child, "attribute"), "value", "xml._attribute didn't return the expected value for attribute");
djstest.assertAreEqual(datajs.xmlAttributeValue(child, "nsAttribute", "http://namespace1"), "nsValue", "xml._attribute didn't return the expected value for nsAttribute");
djstest.assert(!datajs.xmlAttributeValue(child, "nsAttribute"), "xml._attribute returned a value for nsAttribute without specifying a namespace");
djstest.done();
});
djstest.addTest(function xmlLocalNameTest() {
var xml = "<root xmlns:n1=\"http://namespace1\" /> \r\n";
var doc = datajs.xmlParse(xml);
var root = datajs.xmlFirstChildElement(doc);
djstest.assertAreEqual(datajs.xmlLocalName(root), "root", "xml._localName didn't return the expected localName of the root element");
djstest.done();
});
djstest.addTest(function xmlFirstChildElement() {
var xml = "\
<root xmlns:n1=\"http://namespace1\" \r\n\
xml:base=\"http://base.org\"> \r\n\
<element1 /> \r\n\
<element2 /> \r\n\
</root>\r\n";
var doc = datajs.xmlParse(xml);
var root = datajs.xmlFirstChildElement(doc);
var child = datajs.xmlFirstChildElement(root);
djstest.assertAreEqual(datajs.xmlLocalName(child), "element1", "xml.firstElement returned didn't return the expected element");
djstest.done();
});
djstest.addTest(function xmlChildElementsTest() {
var xml = "\
<root xmlns:n1=\"http://namespace1\" \r\n\
xml:base=\"http://base.org\"> \r\n\
<element1 /> \r\n\
<element2 xml:base=\"http://otherBase.org\" /> \r\n\
<n1:element3 xml:base=\"path1/path2\" /> \r\n\
</root>\r\n";
var expected = [
{ localName: "element1", nsURI: null },
{ localName: "element2", nsURI: null },
{ localName: "element3", nsURI: "http://namespace1" }
];
var actual = [];
var doc = datajs.xmlParse(xml);
var root = datajs.xmlFirstChildElement(doc);
datajs.xmlChildElements(root, function (child) {
djstest.log("in child elements callback");
actual.push({
localName: datajs.xmlLocalName(child),
nsURI: datajs.xmlNamespaceURI(child)
});
});
djstest.assertAreEqualDeep(actual, expected, "xml.childElements didn't return the expected elements");
djstest.done();
});
djstest.addTest(function xmlAttributesTest() {
var xml = "\
<root xmlns:n1=\"http://namespace1\" \r\n\
xml:base=\"http://base.org\" \r\n\
attribute=\"value\" \r\n\
n1:nsAttribute=\"nsValue\" />\r\n";
var expected = {
n1: { localName: "n1", nsURI: "http://www.w3.org/2000/xmlns/", value: "http://namespace1" },
base: { localName: "base", nsURI: "http://www.w3.org/XML/1998/namespace", value: "http://base.org" },
attribute: { localName: "attribute", nsURI: null, value: "value" },
nsAttribute: { localName: "nsAttribute", nsURI: "http://namespace1", value: "nsValue" }
};
var actual = {};
var doc = datajs.xmlParse(xml);
var root = datajs.xmlFirstChildElement(doc);
datajs.xmlAttributes(root, function (attribute) {
djstest.log("in child elements callback");
var localName = datajs.xmlLocalName(attribute);
actual[localName] = {
localName: localName,
nsURI: datajs.xmlNamespaceURI(attribute),
value: attribute.value
};
});
djstest.assertAreEqualDeep(actual, expected, "xml.attributes returned didn't return the expected attributes");
djstest.done();
});
djstest.addTest(function hasLeadingOrTrailingWhitespaceTest() {
// tests are in text / expected format.
var tests = [
{ t: "", r: false },
{ t: " ", r: true },
{ t: "text", r: false },
{ t: "text with spaces", r: false },
{ t: "not \r\n really", r: false },
{ t: " at start", r: true },
{ t: "at end ", r: true },
{ t: "end\r", r: true },
{ t: "end\n", r: true },
{ t: "end\r\n", r: true }
];
var i, len;
for (i = 0, len = tests.length; i < len; i++) {
var result = datajs.hasLeadingOrTrailingWhitespace(tests[i].t);
djstest.assertAreEqual(result, tests[i].r, "match for " + tests[i].t);
}
djstest.done();
});
djstest.addTest(function xmlInnerTextTest() {
// Tests are in test / expected format.
var tests = [
{ t: "<t>text</t>", r: "text" },
{ t: "<t>text with a <![CDATA[cdata block]]></t>", r: "text with a cdata block" },
{ t: "<t> text </t>", r: " text " },
{ t: "<t> </t>", r: null },
{ t: "<t> <b>text</b> </t>", r: null },
{ t: "<t> preceding</t>", r: " preceding" },
{ t: "<t xml:space='preserve'> <b>text</b> </t>", r: " " },
{ t: "<t xml:space='default'> <b>text</b> </t>", r: null}
];
var i, len;
for (i = 0, len = tests.length; i < len; i++) {
var test = tests[i];
var doc = datajs.xmlParse(test.t);
var actual = datajs.xmlInnerText(doc);
djstest.assertAreEqual(actual, test.r, "test for [" + test.t + "]");
}
djstest.done();
});
// DATAJS INTERNAL END
})(this);