blob: a00e941fcce6dbe9877a0a1e7d6b3ab7200c9c3b [file] [log] [blame]
/// <reference path="../src/odata-net.js" />
/// <reference path="../src/odata.js" />
/// <reference path="../src/odata-json-light.js" />
/// <reference path="../src/odata-json.js" />
/// <reference path="../common/djstest.js" />
// odata-json-light-tests.js
(function (window, undefined) {
// DATAJS INTERNAL START
var mockHttpClient;
module("Unit", {
setup: function () {
mockHttpClient = window.MockHttpClient.clear();
}
});
var getSampleModel = function () {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "NS",
"entityType": [{
"name": "EntityType",
"key": { "propertyRef": [{ "name": "Id"}] },
"property": [
{ "name": "Id", "type": "Edm.String" },
{ "name": "P1", "type": "Edm.Int32" }
]
}],
entityContainer: [{
name: "TestContainer",
isDefaultEntityContainer: "true",
entitySet: [{ "name": "EntityTypes", "entityType": "NS.EntityType"}]
}]
}]
}
};
return testModel;
};
var getSampleModelWithTwoKeys = function () {
var testModel = getSampleModel();
testModel.dataServices.schema[0].entityType[0].key = { "propertyRef": [{ "name": "Id" }, { "name": "P1"}] };
return testModel;
};
var getSampleModelWithOneConcurrencyProperty = function () {
var testModel = getSampleModel();
testModel.dataServices.schema[0].entityType[0].property[0].concurrencyMode = "Fixed";
return testModel;
};
var getSampleModelWithOneBinaryConcurrencyProperty = function () {
var testModel = getSampleModel();
testModel.dataServices.schema[0].entityType[0].property[1].concurrencyMode = "Fixed";
testModel.dataServices.schema[0].entityType[0].property[1].type = "Edm.Binary";
return testModel;
};
var getSampleModelWithMultipleConcurrencyProperties = function () {
var testModel = getSampleModel();
testModel.dataServices.schema[0].entityType[0].property[0].concurrencyMode = "Fixed";
testModel.dataServices.schema[0].entityType[0].property[1].concurrencyMode = "Fixed";
return testModel;
};
var getSampleModelWithDateTimeConcurrencyProperties = function () {
var testModel = getSampleModel();
testModel.dataServices.schema[0].entityType[0].property[1] = { "name": "P1", "type": "Edm.DateTime", concurrencyMode: "Fixed" };
return testModel;
};
var getSampleModelWithDecimalProperty = function () {
var testModel = getSampleModel();
testModel.dataServices.schema[0].entityType[0].property[1] = { "name": "P1", "type": "Edm.Decimal"};
return testModel;
};
var getSampleModelWithNavPropertiesAndInheritedTypes = function () {
return {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"maxDataServiceVersion": "4.0",
"schema": [
{
"namespace": "ODataDemo",
"entityType": [
{
"name": "Product",
"key": {
"propertyRef": [
{
"name": "ID"
}
]
},
"property": [
{
"name": "ID",
"nullable": "false",
"type": "Edm.Int32"
}
],
"navigationProperty": [
{
"name": "Category",
"toRole": "Category_Products",
"fromRole": "Product_Category",
"relationship": "ODataDemo.Product_Category_Category_Products"
}]
},
{
"name": "FeaturedProduct",
"baseType": "ODataDemo.Product",
"navigationProperty": [
{
"name": "Advertisement",
"toRole": "Advertisement_FeaturedProduct",
"fromRole": "FeaturedProduct_Advertisement",
"relationship": "ODataDemo.FeaturedProduct_Advertisement_Advertisement_FeaturedProduct"
}
]
},
{
"name": "Advertisement",
"key": {
"propertyRef": [
{
"name": "ID"
}
]
},
"property": [
{
"name": "ID",
"nullable": "false",
"type": "Edm.Guid"
}
],
"navigationProperty": [
{
"name": "FeaturedProduct",
"toRole": "FeaturedProduct_Advertisement",
"fromRole": "Advertisement_FeaturedProduct",
"relationship": "ODataDemo.FeaturedProduct_Advertisement_Advertisement_FeaturedProduct"
}
]
},
{
"name": "Category",
"key": {
"propertyRef": [
{
"name": "ID"
}
]
},
"property": [
{
"name": "ID",
"nullable": "false",
"type": "Edm.Int32"
}
],
"navigationProperty": [
{
"name": "Products",
"toRole": "Product_Category",
"fromRole": "Category_Products",
"relationship": "ODataDemo.Product_Category_Category_Products"
}
]
}
],
"association": [
{
"name": "Product_Category_Category_Products",
"end": [
{
"type": "ODataDemo.Category",
"multiplicity": "0..1",
"role": "Category_Products"
},
{
"type": "ODataDemo.Product",
"multiplicity": "*",
"role": "Product_Category"
}
]
},
{
"name": "FeaturedProduct_Advertisement_Advertisement_FeaturedProduct",
"end": [
{
"type": "ODataDemo.Advertisement",
"multiplicity": "0..1",
"role": "Advertisement_FeaturedProduct"
},
{
"type": "ODataDemo.FeaturedProduct",
"multiplicity": "0..1",
"role": "FeaturedProduct_Advertisement"
}
]
}
],
"entityContainer": [
{
"name": "DemoService",
"isDefaultEntityContainer": "true",
"entitySet": [
{
"name": "Products",
"entityType": "ODataDemo.Product"
},
{
"name": "Advertisements",
"entityType": "ODataDemo.Advertisement"
},
{
"name": "Categories",
"entityType": "ODataDemo.Category"
}
],
"associationSet": [
{
"name": "Products_Advertisement_Advertisements",
"association": "ODataDemo.FeaturedProduct_Advertisement_Advertisement_FeaturedProduct",
"end": [
{
"role": "FeaturedProduct_Advertisement",
"entitySet": "Products"
},
{
"role": "Advertisement_FeaturedProduct",
"entitySet": "Advertisements"
}
]
},
{
"name": "Products_Category_Categories",
"association": "ODataDemo.Product_Category_Category_Products",
"end": [
{
"role": "Product_Category",
"entitySet": "Products"
},
{
"role": "Category_Products",
"entitySet": "Categories"
}
]
}
]
}
]
}
]
}
};
};
var failTest = function (err) {
if (err && err.message) {
djstest.fail(err.message);
} else {
djstest.fail("unexpected failure");
}
djstest.done();
};
var verifySerializedJsonLightData = function (actual, expected, message, requestUri) {
mockHttpClient.addRequestVerifier("*", function (request) {
djstest.assertAreEqualDeep(JSON.parse(request.body), expected, message);
djstest.done();
});
OData.request({
requestUri: requestUri || "http://someUri",
headers: { "Content-Type": "application/json" },
method: "PUT",
data: actual
}, null, failTest, null, mockHttpClient);
};
var verifyReadJsonLightData = function (input, expected, message, model) {
var response = { headers: { "Content-Type": "application/json;odata.metadata=full", DataServiceVersion: "4.0" }, body: JSON.stringify(input) };
OData.jsonHandler.read(response, { metadata: model });
djstest.assertAreEqualDeep(response.data, expected, message);
};
var verifyReadJsonLightWithMinimalMetadata = function (input, expected, message, model) {
var response = { headers: { "Content-Type": "application/json;odata.metadata=minimal", DataServiceVersion: "4.0" }, body: JSON.stringify(input) };
OData.jsonHandler.read(response, { metadata: model });
djstest.assertAreEqualDeep(response.data, expected, message);
};
djstest.addTest(function jsonLightReadEmptySvcDocTest() {
var input = {
"odata.metadata": "http://someUri/ODataService.svc/OData/$metadata",
"value": []
};
var expected = {
workspaces: [
{
collections: []
}
]
};
verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadSvcDocTest() {
var input = {
"odata.metadata": "http://someUri/ODataService.svc/OData/$metadata",
"value": [
{ "name": "Customers", "url": "Customers" },
{ "name": "Employees", "url": "http://someUri/ODataService.svc/OData/Employees" }
]
};
var expected = {
workspaces: [
{
collections: [
{
title: "Customers",
href: "http://someUri/ODataService.svc/OData/Customers"
},
{
title: "Employees",
href: "http://someUri/ODataService.svc/OData/Employees"
}
]
}
]
};
verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadEntryMetadataUriTest() {
var tests = {
"Qualified entity set": {
input: { "odata.metadata": "http://someUri/$metadata#Ns.Container.EntitySet/@Element" },
expected: { __metadata: { type: null} }
},
"Unqualified entity set": {
input: { "odata.metadata": "http://someUri/$metadata#Ns.Container.EntitySet/@Element" },
expected: { __metadata: { type: null} }
},
"Qualified entity set with type cast": {
input: { "odata.metadata": "http://someUri/$metadata#Ns.Container.EntitySet/TypeCast/@Element" },
expected: { __metadata: { type: "TypeCast"} }
},
"Unqualified entity set with type cast": {
input: { "odata.metadata": "http://someUri/$metadata#EntitySet/TypeCast/@Element" },
expected: { __metadata: { type: "TypeCast"} }
}
};
for (name in tests) {
var test = tests[name];
verifyReadJsonLightData(test.input, test.expected, name + " - Json light entry metadata uri was read properly.");
}
djstest.done();
});
djstest.addTest(function jsonLightReadEntryMetadataUriWithMetadataDocumentTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Test.Catalog",
"entityContainer": [{
"name": "TestCatalog",
"isDefaultEntityContainer": "true",
"entitySet": [
{ "name": "Titles", "entityType": "TestCatalog.Model.Title" }
]
}, {
"name": "GenreCatalog",
"isDefaultEntityContainer": "false",
"entitySet": [
{ "name": "Genres", "entityType": "TestCatalog.Model.Genre" }
]
}]
}]
}
};
var tests = {
"Qualified entity set": {
input: { "odata.metadata": "http://someUri/$metadata#Test.Catalog.GenreCatalog.Genres/@Element" },
expected: { __metadata: { type: "TestCatalog.Model.Genre"} }
},
"Unqualified entity set": {
input: { "odata.metadata": "http://someUri/$metadata#Titles/@Element" },
expected: { __metadata: { type: "TestCatalog.Model.Title"} }
},
"Qualified entity set with type cast": {
input: { "odata.metadata": "http://someUri/$metadata#Test.Catalog.Titles/TestCatalog.Model.Songs/@Element" },
expected: { __metadata: { type: "TestCatalog.Model.Songs"} }
},
"Unqualified entity set with type cast": {
input: { "odata.metadata": "http://someUri/$metadata#Titles/TestCatalog.Model.Songs/@Element" },
expected: { __metadata: { type: "TestCatalog.Model.Songs"} }
},
"Unqualified entity set in non default entity container": {
input: { "odata.metadata": "http://someUri/$metadata#Generes/@Element" },
expected: { __metadata: { type: null} }
},
"Unqualified entity set in non default entity container with type cast": {
input: { "odata.metadata": "http://someUri/$metadata#Generes/TypeCast/@Element" },
expected: { __metadata: { type: "TypeCast"} }
}
};
for (name in tests) {
var test = tests[name];
verifyReadJsonLightData(test.input, test.expected, name + " - Json light entry metadata uri was read properly.", testModel);
}
djstest.done();
});
djstest.addTest(function jsonLightReadTypeInPayloadWinsOverModelTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "NS",
"entityType": [{
"name": "EntityType",
"hasStream": "true",
"key": { "propertyRef": [{ "name": "Id"}] },
"property": [
{ "name": "Id", "type": "Edm.String" },
{ "name": "P1", "type": "Edm.String" },
{ "name": "P2", "type": "NS.ComplexType" },
{ "name": "P3", "type": "Edm.Int64" }
]
}],
"complexType": [{
"name": "ComplexType",
"property": [
{ "name": "C1", "type": "Edm.String" }
]
}]
}]
}
};
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/NS.EntityType/@Element",
P1: "Hello",
P2: {
"odata.type": "Instance",
C1: "World"
},
"P2@odata.type": "Property",
P3: "500",
"P3@odata.type": "Property",
P4: {
"odata.type": "NS.ComplexType",
C1: "!!"
}
};
var expected = {
__metadata: {
type: "NS.EntityType",
properties: {
P1: { type: "Edm.String" },
P2: {
type: "Instance",
properties: {
C1: { type: null }
}
},
P3: { type: "Property" },
P4: {
type: "NS.ComplexType",
properties: {
C1: { type: "Edm.String" }
}
}
}
},
P1: "Hello",
P2: {
__metadata: {
type: "Instance"
},
C1: "World"
},
P3: "500",
P4: {
__metadata: {
type: "NS.ComplexType"
},
C1: "!!"
}
};
verifyReadJsonLightData(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", testModel);
djstest.done();
});
djstest.addTest(function jsonLightReadObjectWithCollectionPropertyTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "NS",
"entityType": [{
"name": "EntityType",
"property": [
{ "name": "p1", "type": "Collection(Edm.Int32)" }
]
}]
}]
}
};
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/NS.EntityType/@Element",
p1: [1, 2, 3],
p2: [
{ c1: 100, c2: 200 },
{ c1: 400, c2: 500, "odata.type": "NS.OtherType" }
],
"p2@odata.type": "Collection(NS.ComplexType)",
p3: [5, 6, 7]
};
var expected = {
__metadata: {
type: "NS.EntityType",
properties: {
p1: { type: "Collection(Edm.Int32)" },
p2: {
type: "Collection(NS.ComplexType)",
elements: [
{
type: "NS.ComplexType",
properties: {
c1: { type: null },
c2: { type: null }
}
},
{
type: "NS.OtherType",
properties: {
c1: { type: null },
c2: { type: null }
}
}
]
},
p3: { type: null }
}
},
p1: {
__metadata: { type: "Collection(Edm.Int32)" },
results: [1, 2, 3]
},
p2: {
__metadata: { type: "Collection(NS.ComplexType)" },
results: [
{
__metadata: {
type: "NS.ComplexType"
},
c1: 100,
c2: 200
},
{
__metadata: {
type: "NS.OtherType"
},
c1: 400,
c2: 500
}
]
},
p3: {
__metadata: { type: null },
results: [5, 6, 7]
}
};
verifyReadJsonLightData(input, expected, "Json light object with collection porperties was read properly", testModel);
djstest.done();
});
djstest.addTest(function jsonLightReadEntryODataAnnotationsTest() {
var input = {
"odata.metadata": "http://someUri/$metadata#NS.Container.Set/TypeCast/@Element",
"odata.id": "Customers(1)",
"odata.etag": "etag-value",
"odata.readLink": "read/Customers(1)",
"odata.editLink": "Customers(1)",
"odata.mediaReadLink": "Customers(1)/Image",
"odata.mediaEditLink": "Customers(1)/$value",
"odata.mediaETag": "stream-etag-value",
"odata.mediaContentType": "image/jpg"
};
var expected = {
__metadata: {
id: "Customers(1)",
type: "TypeCast",
etag: "etag-value",
self: "http://someUri/read/Customers(1)",
edit: "http://someUri/Customers(1)",
uri: "http://someUri/Customers(1)",
media_src: "http://someUri/Customers(1)/Image",
edit_media: "http://someUri/Customers(1)/$value",
media_etag: "stream-etag-value",
content_type: "image/jpg"
}
};
verifyReadJsonLightData(input, expected, "Json light entry OData annotations were read properly");
djstest.done();
});
djstest.addTest(function jsonLightReadObjectWithComplexPropertyTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Ns",
"entityType": [{
"name": "EntityType",
"property": [
{ "name": "p1", "type": "Ns.ComplexType" }
]
}],
"complexType": [{
"name": "ComplexType",
"property": [
{ "name": "c1", "type": "Edm.Int16" },
{ "name": "c2", "type": "Edm.Int32" },
{ "name": "c3", "type": "Ns.ComplexType" }
]
}]
}]
}
};
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/Ns.EntityType/@Element",
p1: {
c1: 100,
c2: 200,
c3: {
c1: 300,
c2: 400,
c3: {
c1: 500,
c2: 600,
c3: null
}
}
},
p2: {
"odata.type": "Ns.ComplexType2",
c4: 800,
"c4@odata.type": "Edm.Single",
c5: 900,
c6: {
c1: 1000,
c2: 2000,
c3: {
c1: 1100,
"c1@odata.type": "Edm.Double",
c2: 1200,
c3: null
}
},
"c6@odata.type": "Ns.ComplexType"
},
p3: {},
"p3@odata.type": "Ns.ComplexType3"
};
var expected = {
__metadata: {
type: "Ns.EntityType",
properties: {
p1: {
type: "Ns.ComplexType",
properties: {
c1: { type: "Edm.Int16" },
c2: { type: "Edm.Int32" },
c3: {
type: "Ns.ComplexType",
properties: {
c1: { type: "Edm.Int16" },
c2: { type: "Edm.Int32" },
c3: {
type: "Ns.ComplexType",
properties: {
c1: { type: "Edm.Int16" },
c2: { type: "Edm.Int32" },
c3: { type: "Ns.ComplexType" }
}
}
}
}
}
},
p2: {
type: "Ns.ComplexType2",
properties: {
c4: { type: "Edm.Single" },
c5: { type: null },
c6: {
type: "Ns.ComplexType",
properties: {
c1: { type: "Edm.Int16" },
c2: { type: "Edm.Int32" },
c3: {
type: "Ns.ComplexType",
properties: {
c1: { type: "Edm.Double" },
c2: { type: "Edm.Int32" },
c3: { type: "Ns.ComplexType" }
}
}
}
}
}
},
p3: { type: "Ns.ComplexType3" }
}
},
p1: {
__metadata: { type: "Ns.ComplexType" },
c1: 100,
c2: 200,
c3: {
__metadata: { type: "Ns.ComplexType" },
c1: 300,
c2: 400,
c3: {
__metadata: { type: "Ns.ComplexType" },
c1: 500,
c2: 600,
c3: null
}
}
},
p2: {
__metadata: { type: "Ns.ComplexType2" },
c4: 800,
c5: 900,
c6: {
__metadata: { type: "Ns.ComplexType" },
c1: 1000,
c2: 2000,
c3: {
__metadata: { type: "Ns.ComplexType" },
c1: 1100,
c2: 1200,
c3: null
}
}
},
p3: { __metadata: { type: "Ns.ComplexType3"} }
};
verifyReadJsonLightData(input, expected, "Json light object with complex type properties was read properly", testModel);
djstest.done();
});
djstest.addTest(function jsonLightReadObjectWithNamedStreamProperty() {
var input = {
"odata.metadata": "http://someUri/$metadata#NS.Container.Set/TypeCast/@Element",
"p1@odata.mediaReadLink": "Customers(1)/namedStream",
"p1@odata.mediaEditLink": "Customers(1)/namedStream/$value",
"p1@odata.mediaETag": "voice-etag-value",
"p1@odata.mediaContentType": "audio/basic"
};
var expected = {
__metadata: {
type: "TypeCast",
properties: {
p1: { type: null }
}
},
p1: {
__mediaresource: {
media_src: "http://someUri/Customers(1)/namedStream",
edit_media: "http://someUri/Customers(1)/namedStream/$value",
media_etag: "voice-etag-value",
content_type: "audio/basic"
}
}
};
verifyReadJsonLightData(input, expected, "Json light object with named stream properties was read properly");
djstest.done();
});
djstest.addTest(function jsonLightReadEntryWithDeferredNavigationPropertyTests() {
var input = {
"odata.metadata": "http://someUri/$metadata#NS.Container.Set/TypeCast/@Element",
"p1@odata.navigationLinkUrl": "entitySet(1)/deferred",
"p1@odata.associationLinkUrl": "entitySet(1)/$links/deferred"
};
var expected = {
__metadata: {
type: "TypeCast",
properties: {
p1: {
type: null,
associationLinkUrl: "http://someUri/entitySet(1)/$links/deferred"
}
}
},
p1: {
__deferred: {
uri: "http://someUri/entitySet(1)/deferred"
}
}
};
verifyReadJsonLightData(input, expected, "Json light object with deferred navigation properties was read properly");
djstest.done();
});
djstest.addTest(function jsonLightReadEntryWithInlinedNavigationPropertiesTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Ns",
"entityType": [{
"name": "EntityType",
"navigationProperty": [
{ "name": "p1", "relationship": "Ns.Rel1", "toRole": "p1s" },
{ "name": "p2", "relationship": "Ns.Rel2", "toRole": "p2s" }
]
}],
"association": [{
"name": "Rel1",
"end": [
{ "type": "Ns.EntityType1", "role": "p1s" },
{ "type": "Ns.EntityType", "role": "otherRole" }
]
},
{
"name": "Rel2",
"end": [
{ "type": "Ns.EntityType", "role": "otherRole" },
{ "type": "Ns.EntityType2", "role": "p2s" }
]
}]
}]
}
};
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/Ns.EntityType/@Element",
p1: [
{ e1: 100, e2: 200 },
{ e1: 110, e2: 220 }
],
"p1@odata.count": 50,
"p1@odata.nextLink": "nextToken",
p2: {
e3: 300
},
p3: [
{ e4: 400, e5: 500 },
{ e4: 440, e5: 550 }
],
"p3@odata.navigationLinkUrl": "http://someUri/entitySet(1)/p3",
"p3@odata.associationLinkUrl": "http://someUri/entitySet(1)/$links/p3",
p4: {
e6: 600
},
"p4@odata.navigationLinkUrl": "http://someUri/entitySet(1)/p4",
"p4@odata.associationLinkUrl": "http://someUri/entitySet(1)/$links/p4",
p5: [
{
"odata.id": 12345,
e7: 700,
e8: 800
}
],
p6: {
"odata.id": 78910,
e9: 900,
"e9@odata.type": "Edm.Int32"
}
};
var expected = {
__metadata: {
type: "Ns.EntityType",
properties: {
p1: {
type: "Ns.EntityType1"
},
p2: {
type: "Ns.EntityType2"
},
p3: {
type: null,
navigationLinkUrl: "http://someUri/entitySet(1)/p3",
associationLinkUrl: "http://someUri/entitySet(1)/$links/p3"
},
p4: {
type: null,
navigationLinkUrl: "http://someUri/entitySet(1)/p4",
associationLinkUrl: "http://someUri/entitySet(1)/$links/p4"
},
p5: {
type: null
},
p6: {
type: null
}
}
},
p1: {
__count: 50,
__next: "http://someUri/nextToken",
results: [
{
__metadata: {
type: "Ns.EntityType1",
properties: {
e1: { type: null },
e2: { type: null }
}
},
e1: 100,
e2: 200
},
{
__metadata: {
type: "Ns.EntityType1",
properties: {
e1: { type: null },
e2: { type: null }
}
},
e1: 110,
e2: 220
}
]
},
p2: {
__metadata: {
type: "Ns.EntityType2",
properties: {
e3: { type: null }
}
},
e3: 300
},
p3: {
results: [
{
__metadata: {
type: null,
properties: {
e4: { type: null },
e5: { type: null }
}
},
e4: 400,
e5: 500
},
{
__metadata: {
type: null,
properties: {
e4: { type: null },
e5: { type: null }
}
},
e4: 440,
e5: 550
}
]
},
p4: {
__metadata: {
type: null,
properties: {
e6: { type: null }
}
},
e6: 600
},
p5: {
results: [
{
__metadata: {
id: 12345,
type: null,
properties: {
e7: { type: null },
e8: { type: null }
}
},
e7: 700,
e8: 800
}
]
},
p6: {
__metadata: {
id: 78910,
type: null,
properties: {
e9: { type: "Edm.Int32" }
}
},
e9: 900
}
};
verifyReadJsonLightData(input, expected, "Json light object with inlined navigation properties was read properly", testModel);
djstest.done();
});
djstest.addTest(function jsonLightReadStringPropertiesTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Ns",
"entityType": [{
"name": "EntityType",
"property": [
{ "name": "p1", "type": "Edm.DateTime" },
{ "name": "p2", "type": "Edm.DateTimeOffset" },
{ "name": "p3", "type": "Edm.Time" }
]
}]
}]
}
};
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/Ns.EntityType/@Element",
p1: "2000-01-02T03:04:05",
p2: "2000-01-02T03:04:05+01:00",
p3: "P0Y0M05DT12H30M5S",
p4: "hello world",
p5: "2001-01-02T03:04:05",
"p5@odata.type": "Edm.DateTime",
p6: "2001-01-02T03:04:05+01:00",
"p6@odata.type": "Edm.DateTimeOffset",
p7: "P0Y0M05DT12H30M10S",
"p7@odata.type": "Edm.Time"
};
var p2 = new Date("01/02/2000 02:04:05 GMT");
p2.__edmType = "Edm.DateTimeOffset";
p2.__offset = "+01:00";
var p6 = new Date("01/02/2001 02:04:05 GMT");
p2.__edmType = "Edm.DateTimeOffset";
p2.__offset = "+01:00";
var expected = {
__metadata: {
type: "Ns.EntityType",
properties: {
p1: { type: "Edm.DateTime" },
p2: { type: "Edm.DateTimeOffset" },
p3: { type: "Edm.Time" },
p4: { type: null },
p5: { type: "Edm.DateTime" },
p6: { type: "Edm.DateTimeOffset" },
p7: { type: "Edm.Time" }
}
},
p1: new Date("01/02/2000 03:04:05 GMT"),
p3: { ms: 477005000, __edmType: "Edm.Time" },
p2: p2,
p4: "hello world",
p5: new Date("01/02/2001 03:04:05 GMT"),
p6: p6,
p7: { ms: 477010000, __edmType: "Edm.Time" }
};
verifyReadJsonLightData(input, expected, "Json light object with string properties was read properly", testModel);
djstest.done();
});
djstest.addTest(function jsonLightReadRecognizeDateLiteralsTest() {
var input = {
p1: "2000-01-02T03:04:05",
p2: "2000-01-02T03:04:05+01:00"
};
var p2 = new Date("01/02/2000 02:04:05 GMT");
p2.__edmType = "Edm.DateTimeOffset";
p2.__offset = "+01:00";
var expected = {
__metadata: {
properties: {
p1: {
type: null
},
p2: {
type: null
}
},
type: null
},
p1: new Date("01/02/2000 03:04:05 GMT"),
p2: p2
};
OData.jsonHandler.recognizeDates = true;
verifyReadJsonLightData(input, expected, "Json light datetime literals were recognized. ");
OData.jsonHandler.recognizeDates = false;
expected.p1 = input.p1;
expected.p2 = input.p2;
verifyReadJsonLightData(input, expected, "Json light datetime literals were ignored");
djstest.done();
});
djstest.addTest(function jsonLightReadEmptyFeedTest() {
var input = { "odata.metadata": "http://someUri#entitySet/Set", value: [] };
var expected = { results: [] };
verifyReadJsonLightData(input, expected, "Json light feed object was read properly");
djstest.done();
});
djstest.addTest(function jsonLightReadFeedTest() {
var input = {
"odata.metadata": "http://someUri#entitySet/Type",
value: [
{ "odata.id": 12345 },
{ "odata.id": 56789 }
],
"odata.count": 50,
"odata.nextLink": "skipToken"
};
var expected = {
__count: 50,
__next: "http://someUri/skipToken",
results: [
{
__metadata: {
id: 12345,
type: "Type"
}
},
{
__metadata: {
id: 56789,
type: "Type"
}
}
]
};
verifyReadJsonLightData(input, expected, "Json light feed object was read properly");
djstest.done();
});
djstest.addTest(function jsonLightReadFeedUsingMetadataTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Test.Catalog",
"entityContainer": [{
"name": "TestCatalog",
"isDefaultEntityContainer": "true",
"entitySet": [
{ "name": "Titles", "entityType": "TestCatalog.Model.Title" }
]
}
]
}
]
}
};
var tests = {
"Unqualified entity set": {
input: { "odata.metadata": "http://someUri#Titles", value: [{}] },
expected: { results: [{ __metadata: { type: "TestCatalog.Model.Title"}}] }
},
"Qualified entity set": {
input: { "odata.metadata": "http://someUri#Test.Catalog.TestCatalog.Titles", value: [{}] },
expected: { results: [{ __metadata: { type: "TestCatalog.Model.Title"}}] }
},
"Type casted entity set": {
input: { "odata.metadata": "http://someUri#TestCatalog.Titles/TypeCast", value: [{}] },
expected: { results: [{ __metadata: { type: "TypeCast"}}] }
}
};
for (var name in tests) {
var test = tests[name];
verifyReadJsonLightData(test.input, test.expected, name + " - Json light feed was read properly.", testModel);
}
djstest.done();
});
djstest.addTest(function jsonLightReadInferFeedAsObjectTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Test.Catalog",
"entityContainer": [{
"name": "TestCatalog",
"isDefaultEntityContainer": "true",
"entitySet": [
{ "name": "Titles", "entityType": "TestCatalog.Model.Title" }
]
}
]
}
]
}
};
var tests = {
"Feed as object": {
input: { "odata.metadata": "http://someUri#EntitySet", value: [] },
expected: {
__metadata: {
type: "EntitySet",
properties: {
value: { type: null }
}
},
value: { __metadata: { type: null }, results: [] }
}
},
"Feed as feed using value": {
input: { "odata.metadata": "http://someUri#EntiySet", value: [{ "odata.id": 12345}] },
expected: { results: [{ __metadata: { type: null, id: 12345}}] }
},
"Feed as feed using metadata": {
input: { "odata.metadata": "http://someUri#Titles", value: [] },
expected: { results: [] }
},
"Collection of primitive": {
input: { "odata.metadata": "http://someUri#Collection(Edm.Int32)", value: [] },
expected: { __metadata: { type: "Collection(Edm.Int32)" }, results: [] }
},
"Collection of complex": {
input: { "odata.metadata": "http://someUri#Collection(My.Type)", value: [] },
expected: { __metadata: { type: "Collection(My.Type)" }, results: [] }
}
};
for (var name in tests) {
var test = tests[name];
var response = {
headers: {
"Content-Type": "application/json;odata.metadata=full",
DataServiceVersion: "4.0"
},
body: JSON.stringify(test.input)
};
OData.jsonHandler.read(response, { metadata: testModel });
djstest.assertAreEqualDeep(response.data, test.expected, name + " - Json light object was read properly ");
}
djstest.done();
});
djstest.addTest(function jsonLightReadEmptyLinksDocumentTest() {
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/$links/NavProp",
value: []
};
var expected = {
results: []
};
verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadLinksDocumentTest() {
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/$links/NavProp",
value: [
{ url: "Products(1)" },
{ url: "http://someUri/Products(2)" }
]
};
var expected = {
results: [
{ uri: "http://someUri/Products(1)" },
{ uri: "http://someUri/Products(2)" }
]
};
verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadSingleLinkDocumentTest() {
var input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/$links/NavProp/@Element",
url: "Products(1)"
};
var expected = {
uri: "http://someUri/Products(1)"
};
verifyReadJsonLightData(input, expected, "Json light single link document was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadTopLevelPrimitiveProperty() {
var input = {
"odata.metadata": "http://someUri#Edm.GeometryPoint",
value: {
type: "Point",
coordinates: [1.0, 2.0],
crs: {
type: name,
properties: {
name: "EPSG:4326"
}
}
}
};
var expected = {
__metadata: {
type: "Edm.GeometryPoint"
},
value: {
type: "Point",
coordinates: [1.0, 2.0],
crs: {
type: name,
properties: {
name: "EPSG:4326"
}
}
}
};
verifyReadJsonLightData(input, expected, "Json light top level primitive property was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadTopLevelComplexTypeTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Ns",
"complexType": [{
"name": "ComplexType",
"property": [
{ "name": "value", "type": "Collection(Ns.ComplexType2)" }
]
}]
}]
}
};
var input = {
"odata.metadata": "http://someUri#Ns.ComplexType",
value: [{
p1: 100,
p2: 200
}]
};
var expected = {
__metadata: {
type: "Ns.ComplexType",
properties: {
value: {
type: "Collection(Ns.ComplexType2)",
elements: [
{
type: "Ns.ComplexType2",
properties: {
p1: { type: null },
p2: { type: null }
}
}
]
}
}
},
value: {
__metadata: { type: "Collection(Ns.ComplexType2)" },
results: [
{
__metadata: { type: "Ns.ComplexType2" },
p1: 100,
p2: 200
}
]
}
};
verifyReadJsonLightData(input, expected, "Json light top level complex type property was read properly.", testModel);
djstest.done();
});
djstest.addTest(function jsonLightReadTopPrimitiveCollectionPropertyTest() {
var input = {
"odata.metadata": "http://someUri#Collection(Edm.GeometryPoint)",
value: [{
type: "Point",
coordinates: [1.0, 2.0],
crs: {
type: "name",
properties: {
name: "EPSG:4326"
}
}
}]
};
var expected = {
__metadata: {
type: "Collection(Edm.GeometryPoint)"
},
results: [{
type: "Point",
coordinates: [1.0, 2.0],
crs: {
type: "name",
properties: {
name: "EPSG:4326"
}
}
}]
};
verifyReadJsonLightData(input, expected, "Json light top level primitive collection property was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadTopLevelComplexTypeCollectionTest() {
var input = {
"odata.metadata": "http://someUri#Collection(Ns.ComplexType2)",
value: [{
p1: 100,
p2: 200,
"p2@odata.type": "Edm.Int16"
}]
};
var expected = {
__metadata: {
type: "Collection(Ns.ComplexType2)",
elements: [
{
type: "Ns.ComplexType2",
properties: {
p1: { type: null },
p2: { type: "Edm.Int16" }
}
}
]
},
results: [
{
__metadata: { type: "Ns.ComplexType2" },
p1: 100,
p2: 200
}
]
};
verifyReadJsonLightData(input, expected, "Json light top level complex type collection property was read properly.");
djstest.done();
});
djstest.addTest(function jsonLightReadFeedAdvertisedActionsTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Ns",
"entityContainer": [{
"name": "EntityContainer",
"isDefaultEntityContainer": "true",
"entitySet": [
{ "name": "EntitySet", "entityType": "Ns.EntityType" }
]
}
]
}
]
}
};
input = {
"odata.metadata": "http://someUri/$metadata#EntitySet",
"#action1": {
target: "action1/item(0)",
title: "Action1"
},
"#action2": {
target: "action2/item(0)",
title: "Action2"
},
value: []
};
expected = {
__metadata: {
actions: [
{
metadata: "http://someUri/action1",
target: "http://someUri/action1/item(0)",
title: "Action1"
},
{
metadata: "http://someUri/action2",
target: "http://someUri/action2/item(0)",
title: "Action2"
}
]
},
results: []
};
verifyReadJsonLightData(input, expected, "Json light feed with advertised actions was read properly.", testModel);
djstest.done();
});
djstest.addTest(function jsonLightReadAdvertisedActionsAndFunctionsTest() {
var testModel = {
"version": "1.0",
"dataServices": {
"dataServiceVersion": "4.0",
"schema": [{
"namespace": "Test.Catalog",
"entityContainer": [{
"name": "TestCatalog",
"isDefaultEntityContainer": "true",
"functionImport": [
{ "name": "function1", "isSideEffecting": "false" },
{ "name": "function2", "isSideEffecting": "false" },
{ "name": "action1", "isSideEffecting": "true" },
{ "name": "action2" }
]
}, {
"name": "OtherCatalog",
"isDefaultEntityContainer": "false",
"functionImport": [
{ "name": "function1", "isSideEffecting": "false" }
]
}]
}]
}
};
input = {
"odata.metadata": "http://someUri/$metadata#EntitySet/@Element",
"#function2": [
{
target: "function2/item(0)",
title: "Function2 overload1"
},
{
target: "function2/item(0)",
title: "Function2 overload2"
}
],
"#action1": {
target: "action1/item(0)",
title: "Action1"
},
"#action2": {
target: "action2/item(0)",
title: "Action2"
},
"#function1": {
target: "function1/item(0)",
title: "Function1"
},
"#Test.Catalog.OtherCatalog.function1": {
target: "Test.Catalog.OtherCatalog.function1/item(0)",
title: "Function1 in other catalog"
},
"#action3": [
{
target: "action3/item(0)",
title: "Unkown action overload1"
},
{
target: "http://otherUri/action3/item(0)",
title: "Unkown action overload2"
}
]
};
expected = {
__metadata: {
type: null,
actions: [
{
metadata: "http://someUri/action1",
target: "http://someUri/action1/item(0)",
title: "Action1"
},
{
metadata: "http://someUri/action2",
target: "http://someUri/action2/item(0)",
title: "Action2"
},
{
metadata: "http://someUri/action3",
target: "http://someUri/action3/item(0)",
title: "Unkown action overload1"
},
{
metadata: "http://someUri/action3",
target: "http://otherUri/action3/item(0)",
title: "Unkown action overload2"
}
],
functions: [
{
metadata: "http://someUri/function2",
target: "http://someUri/function2/item(0)",
title: "Function2 overload1"
},
{
metadata: "http://someUri/function2",
target: "http://someUri/function2/item(0)",
title: "Function2 overload2"
},
{
metadata: "http://someUri/function1",
target: "http://someUri/function1/item(0)",
title: "Function1"
},
{
metadata: "http://someUri/Test.Catalog.OtherCatalog.function1",
target: "http://someUri/Test.Catalog.OtherCatalog.function1/item(0)",
title: "Function1 in other catalog"
}
]
}
};
verifyReadJsonLightData(input, expected, "Json light advertised actions and functions were read properly.", testModel);
djstest.done();
});
djstest.addTest(function jsonLightSerializeEntryMetadataTest() {
var data = {
__metadata: {
metadata: "http://someUri/$metadata#NS.Container/Set/@Element",
id: "http://someUri/Customers(1)",
etag: "etag-value",
self: "http://someUri/read/Customers(1)",
edit: "http://someUri/read/Customers(1)",
media_src: "http://someUri/Customers(1)/Image",
edit_media: "http://someUri/Customers(1)/$value",
media_etag: "stream-etag-value",
content_type: "image/jpg"
}
};
var expected = {
"odata.etag": "etag-value",
"odata.mediaReadLink": "http://someUri/Customers(1)/Image",
"odata.mediaEditLink": "http://someUri/Customers(1)/$value",
"odata.mediaETag": "stream-etag-value",
"odata.mediaContentType": "image/jpg"
};
verifySerializedJsonLightData(data, expected, " Json light entry metadata was serialized properly.");
});
djstest.addTest(function jsonLightSerializeCustomAnnotationsTest() {
var data = {
__metadata: {
id: "id"
},
"odata.id": "id",
"custom.annotation": "custom annotation value",
"p1@ns1.primitive": "primitive",
"p1@ns2.complex": { a1: 500 },
"p1@ns3.ns4.value": 600,
"p2@ns1.primitive": 400,
"custom.annotation": "custom annotation value"
};
var expected = {
"odata.id": "id",
"custom.annotation": "custom annotation value",
"p1@ns1.primitive": "primitive",
"p1@ns2.complex": { a1: 500 },
"p1@ns3.ns4.value": 600,
"p2@ns1.primitive": 400
};
verifySerializedJsonLightData(data, expected, " Json light custom annotations were serialized properly.");
});
djstest.addTest(function jsonLightSerializeEntryCollectionPropertiesTest() {
var data = {
__metadata: {
id: "id",
properties: {
primitiveColArray: { type: "Collection(Edm.Int16)" },
primitiveColObject: { type: "Collection(Edm.Int32)" }
}
},
primitiveColArray: [1, 2, 3, 4],
primitiveColObject: {
results: [5, 6, 7, 8]
},
complexColArray: [{ p1: 100 }, { p1: 200}],
complexColObject: {
results: [{ p1: 300 }, { p1: 400}]
}
};
var expected = {
"primitiveColArray@odata.type": "Collection(Edm.Int16)",
primitiveColArray: [1, 2, 3, 4],
"primitiveColObject@odata.type": "Collection(Edm.Int32)",
primitiveColObject: [5, 6, 7, 8],
complexColArray: [{ p1: 100 }, { p1: 200}],
complexColObject: [{ p1: 300 }, { p1: 400}]
};
verifySerializedJsonLightData(data, expected, " Json light entry collection properties were serialized properly.");
});
djstest.addTest(function jsonLightSerializeEntryDeferredPropertyTest() {
var data = {
__metadata: {
id: "id",
properties: {
deferred: {
associationLinkUrl: "http://target/$links"
}
}
},
deferred: {
__deferred: { uri: "http://target" }
}
};
var expected = {
"deferred@odata.navigationLinkUrl": "http://target"
};
verifySerializedJsonLightData(data, expected, " Json light entry deferred property were serialized properly.");
});
djstest.addTest(function jsonLightSerializeEntryInlinePropertiesTest() {
var data = {
__metadata: {
id: "id"
},
inlineEntry: {
__metadata: { uri: "", properties: { p1: { type: "Edm.Int64"}} },
p1: "300"
},
inlineBoundEntry: {
__metadata: { uri: "http://entries(1)", properties: { p1: { type: "Edm.Int64"}} },
p1: "400"
},
inlineFeedArray: [
{
__metadata: { uri: "http://entries(2)" }
},
{
__metadata: { uri: "", properties: { p1: { type: "Edm.Int32"}} },
p1: "600"
},
{
__metadata: { uri: "http://entries(3)" }
}
],
inlineFeedObject: {
__count: 50,
__next: "next link",
results: [
{ __metadata: { uri: "" }, p1: "900" }
]
},
inlineEmptyFeedObject: {
results: []
}
};
var expected = {
inlineEntry: {
"p1@odata.type": "Edm.Int64",
p1: "300"
},
"inlineBoundEntry@odata.bind": "http://entries(1)",
inlineFeedArray: [{
"p1@odata.type": "Edm.Int32",
p1: "600"
}],
"inlineFeedArray@odata.bind": [
"http://entries(2)",
"http://entries(3)"
],
inlineFeedObject: [{
p1: "900"
}],
inlineEmptyFeedObject: []
};
verifySerializedJsonLightData(data, expected, " Json light entry inline properties were serialized properly.");
});
djstest.addTest(function jsonLightSerializeEntryComplexPropertyTest() {
var data = {
__metadata: {
id: "id",
properties: {
complexAsDeferredOnMetadata: {
type: "complexAsDeferredOnMetadata.type"
},
complexAsCol: {
type: "complexAsCol.type"
}
}
},
complexAsDeferred: {
__metadata: {
type: "complexAsDeferred.type"
},
__deferred: { uri: "http://uri" }
},
complexAsCol: {
results: [1, 2, 3, 4]
},
complexAsNamedStream: {
__metadata: {
type: "complexAsNamedStream"
},
__mediaresource: {
content_type: "content type",
media_src: "http://source"
}
},
complexAsDeferredOnMetadata: {
__deferred: { uri: "http://uri2" }
}
};
var expected = {
complexAsDeferred: {
"odata.type": "complexAsDeferred.type",
__deferred: { uri: "http://uri" }
},
complexAsCol: {
"odata.type": "complexAsCol.type",
results: [1, 2, 3, 4]
},
complexAsNamedStream: {
"odata.type": "complexAsNamedStream",
__mediaresource: {
content_type: "content type",
media_src: "http://source"
}
},
complexAsDeferredOnMetadata: {
"odata.type": "complexAsDeferredOnMetadata.type",
__deferred: { uri: "http://uri2" }
}
};
verifySerializedJsonLightData(data, expected, " Json light entry complex properties were serialized properly.");
});
djstest.addTest(function jsonLightSerializeEntryComplexPropertyMetadataTest() {
var data = {
__metadata: {
id: "id",
properties: {
complex: {
type: "this should be overriden",
properties: {
nested1: {
type: "types.complex.nested1",
properties: {
nested2: {
type: "types.complex.nested1.nested2"
}
}
},
c1: {
type: "Edm.Int64"
}
}
}
}
},
complex: {
__metadata: {
type: "types.complex"
},
c1: "500",
c2: "b",
nested1: {
nested2: {
}
}
}
};
var expected = {
complex: {
"odata.type": "types.complex",
"c1@odata.type": "Edm.Int64",
c1: "500",
c2: "b",
nested1: {
"odata.type": "types.complex.nested1",
nested2: {
"odata.type": "types.complex.nested1.nested2"
}
}
}
};
verifySerializedJsonLightData(data, expected, " Json light entry complex property was serialized properly.");
});
djstest.addTest(function jsonLightSerializeLinksDocumentTest() {
var tests = {
"Empty uri string": {
i: { uri: "" },
e: { url: "" }
},
"Null uri string": {
i: { uri: null },
e: { url: null }
},
"Undefined uri string": {
i: { uri: undefined },
e: {}
},
"Uri": {
i: { uri: "http://somUri/EntitySet(1)" },
e: { url: "http://somUri/EntitySet(1)" }
}
};
for (var name in tests) {
verifySerializedJsonLightData(tests[name].i, tests[name].e, name + " - Json light links documents whas serialized properly.", "http://someUri/set(3)/$links/navprop");
}
});
djstest.addTest(function jsonLightComputeLinksWithSingleKey() {
var model = getSampleModel();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
Id: "MyId",
P1: 42
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
"id": "http://someUri/EntityTypes('MyId')",
"edit": "http://someUri/EntityTypes('MyId')",
"uri": "http://someUri/EntityTypes('MyId')",
"self": "http://someUri/EntityTypes('MyId')"
},
"Id": "MyId",
"P1": 42
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightComputeLinksWithMultipleKeys() {
var model = getSampleModelWithTwoKeys();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
Id: "MyId",
P1: 42
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
"id": "http://someUri/EntityTypes(Id='MyId',P1=42)",
"edit": "http://someUri/EntityTypes(Id='MyId',P1=42)",
"uri": "http://someUri/EntityTypes(Id='MyId',P1=42)",
"self": "http://someUri/EntityTypes(Id='MyId',P1=42)"
},
"Id": "MyId",
"P1": 42
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightComputeLinksWithNonComputedEditLink() {
var model = getSampleModel();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
"odata.editLink": "EntityTypes('notcomputed')",
Id: "MyId",
P1: 42
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
"id": "http://someUri/EntityTypes('notcomputed')",
"edit": "http://someUri/EntityTypes('notcomputed')",
"uri": "http://someUri/EntityTypes('notcomputed')",
"self": "http://someUri/EntityTypes('notcomputed')"
},
"Id": "MyId",
"P1": 42
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightComputeLinksWithSingleConcurrencyProperty() {
var model = getSampleModelWithOneConcurrencyProperty();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
Id: "MyId",
P1: 42
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
"id": "http://someUri/EntityTypes('MyId')",
"edit": "http://someUri/EntityTypes('MyId')",
"uri": "http://someUri/EntityTypes('MyId')",
"self": "http://someUri/EntityTypes('MyId')",
"etag": "W/\"'MyId'\""
},
"Id": "MyId",
"P1": 42
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightComputeLinksWithSingleBinaryConcurrencyProperty() {
var model = getSampleModelWithOneBinaryConcurrencyProperty();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
Id: "MyId",
P1: "AAAAAAAAB9E="
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Binary"} },
"id": "http://someUri/EntityTypes('MyId')",
"edit": "http://someUri/EntityTypes('MyId')",
"uri": "http://someUri/EntityTypes('MyId')",
"self": "http://someUri/EntityTypes('MyId')",
"etag": "W/\"X'00000000000007D1'\""
},
"Id": "MyId",
"P1": "AAAAAAAAB9E="
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightComputeLinkWithMutipleConcurrencyProperty() {
var model = getSampleModelWithMultipleConcurrencyProperties();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
Id: "MyId",
P1: 42
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
"id": "http://someUri/EntityTypes('MyId')",
"edit": "http://someUri/EntityTypes('MyId')",
"uri": "http://someUri/EntityTypes('MyId')",
"self": "http://someUri/EntityTypes('MyId')",
"etag": "W/\"'MyId',42\""
},
"Id": "MyId",
"P1": 42
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightComputeLinkWithNullConcurrencyProperty() {
var model = getSampleModelWithMultipleConcurrencyProperties();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
Id: "My Id'",
P1: null
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
"id": "http://someUri/EntityTypes('My%20Id''')",
"edit": "http://someUri/EntityTypes('My%20Id''')",
"uri": "http://someUri/EntityTypes('My%20Id''')",
"self": "http://someUri/EntityTypes('My%20Id''')",
"etag": "W/\"'My%20Id''',null\""
},
"Id": "My Id'",
"P1": null
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightWithDecimalValue() {
var model = getSampleModelWithDecimalProperty();
var input = {
"odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
Id: "5",
P1: "10.5"
};
var expected = {
"__metadata": {
"type": "NS.EntityType",
"properties": {
"Id": {
"type": "Edm.String"
},
"P1": {
"type": "Edm.Decimal"
},
},
"id": "http:\/\/someUri\/EntityTypes('5')",
"uri": "http:\/\/someUri\/EntityTypes('5')",
"edit": "http:\/\/someUri\/EntityTypes('5')",
"self": "http:\/\/someUri\/EntityTypes('5')"
},
"Id": "5",
"P1": "10.5"
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightNavigationPropertyAndAssociationUriShouldBeComputedTest() {
var model = getSampleModelWithNavPropertiesAndInheritedTypes();
var input = {
"odata.metadata": "http://someUri/$metadata#Products/@Element",
ID: 5,
};
var expected = {
"__metadata": {
"type": "ODataDemo.Product",
"properties": {
"ID": {
"type": "Edm.Int32"
},
"Category": {
"type": "ODataDemo.Category",
"associationLinkUrl": "http:\/\/someUri\/Products(5)\/$links\/Category",
}
},
"id": "http:\/\/someUri\/Products(5)",
"uri": "http:\/\/someUri\/Products(5)",
"edit": "http:\/\/someUri\/Products(5)",
"self": "http:\/\/someUri\/Products(5)"
},
"ID": 5,
"Category": {
"__deferred": {
"uri": "http:\/\/someUri\/Products(5)\/Category"
}
}
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightNullNavigationPropertyShouldNotBeComputedTest() {
var model = getSampleModelWithNavPropertiesAndInheritedTypes();
var input = {
"odata.metadata": "http://someUri/$metadata#Products/@Element",
ID: 5,
Category: null
};
var expected = {
"__metadata": {
"type": "ODataDemo.Product",
"properties": {
"ID": {
"type": "Edm.Int32"
},
"Category": {
"type": "ODataDemo.Category",
"associationLinkUrl": "http:\/\/someUri\/Products(5)\/$links\/Category",
"navigationLinkUrl": "http:\/\/someUri\/Products(5)\/Category"
}
},
"id": "http:\/\/someUri\/Products(5)",
"uri": "http:\/\/someUri\/Products(5)",
"edit": "http:\/\/someUri\/Products(5)",
"self": "http:\/\/someUri\/Products(5)"
},
"ID": 5,
"Category": null
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightUrisShouldBeComputedForExpandedEntities() {
var model = getSampleModelWithNavPropertiesAndInheritedTypes();
var input = {
"odata.metadata": "http://someUri/$metadata#Products/@Element",
ID: 5,
Category: {
ID: 1
}
};
var expected = {
"__metadata": {
"type": "ODataDemo.Product",
"properties": {
"ID": {
"type": "Edm.Int32"
},
"Category": {
"type": "ODataDemo.Category",
"navigationLinkUrl": "http:\/\/someUri\/Products(5)\/Category",
"associationLinkUrl": "http:\/\/someUri\/Products(5)\/$links\/Category"
}
},
"id": "http:\/\/someUri\/Products(5)",
"uri": "http:\/\/someUri\/Products(5)",
"edit": "http:\/\/someUri\/Products(5)",
"self": "http:\/\/someUri\/Products(5)"
},
"ID": 5,
"Category": {
"__metadata": {
"type": "ODataDemo.Category",
"properties": {
"ID": {
"type": "Edm.Int32"
},
"Products": {
"type": "ODataDemo.Product",
"associationLinkUrl": "http:\/\/someUri\/Categories(1)\/$links\/Products"
}
},
"id": "http:\/\/someUri\/Categories(1)",
"uri": "http:\/\/someUri\/Categories(1)",
"edit": "http:\/\/someUri\/Categories(1)",
"self": "http:\/\/someUri\/Categories(1)"
},
"ID": 1,
"Products": {
"__deferred": {
"uri": "http:\/\/someUri\/Categories(1)\/Products"
}
}
}
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightUrisShouldBeComputedForInheritedTypes() {
var model = getSampleModelWithNavPropertiesAndInheritedTypes();
var input = {
"odata.metadata": "http:\/myexample.com\/MyService.svc\/$metadata#Products\/@Element",
"odata.type": "ODataDemo.FeaturedProduct",
"ID": 9,
};
var expected = {
"__metadata": {
"type": "ODataDemo.FeaturedProduct",
"properties": {
"ID": {
"type": "Edm.Int32"
},
"Advertisement": {
"type": "ODataDemo.Advertisement",
"associationLinkUrl": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/$links\/Advertisement"
},
"Category": {
"type": null,
"associationLinkUrl": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/$links\/Category"
}
},
"id": "http:\/myexample.com\/MyService.svc\/Products(9)",
"uri": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct",
"edit": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct",
"self": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct"
},
"ID": 9,
"Advertisement": {
"__deferred": {
"uri": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/Advertisement"
}
},
"Category": {
"__deferred": {
"uri": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/Category"
}
}
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
djstest.done();
});
djstest.addTest(function jsonLightUrisShouldBeComputedForExpandedTypesOnFeedWithInheritedTypes() {
var model = getSampleModelWithNavPropertiesAndInheritedTypes();
var input = {
"odata.metadata": "http:\/myexample.com\/MyService.svc\/$metadata#Products",
value:
[
{
"odata.type": "ODataDemo.FeaturedProduct",
"Category": {
"ID": 1,
},
"ID": 9,
}
]
};
var expected = {
"results": [
{
"Advertisement": {
"__deferred": {
"uri": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/Advertisement"
}
},
"Category": {
"ID": 1,
"Products": {
"__deferred": {
"uri": "http:\/myexample.com\/MyService.svc\/Categories(1)\/Products"
}
},
"__metadata": {
"edit": "http:\/myexample.com\/MyService.svc\/Categories(1)",
"id": "http:\/myexample.com\/MyService.svc\/Categories(1)",
"properties": {
"ID": {
"type": "Edm.Int32"
},
"Products": {
"associationLinkUrl": "http:\/myexample.com\/MyService.svc\/Categories(1)\/$links\/Products",
"type": "ODataDemo.Product"
}
},
"self": "http:\/myexample.com\/MyService.svc\/Categories(1)",
"type": "ODataDemo.Category",
"uri": "http:\/myexample.com\/MyService.svc\/Categories(1)"
}
},
"ID": 9,
"__metadata": {
"edit": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct",
"id": "http:\/myexample.com\/MyService.svc\/Products(9)",
"properties": {
"Advertisement": {
"associationLinkUrl": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/$links\/Advertisement",
"type": "ODataDemo.Advertisement"
},
"Category": {
"associationLinkUrl": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/$links\/Category",
"navigationLinkUrl": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct\/Category",
"type": "ODataDemo.Category"
},
"ID": {
"type": "Edm.Int32"
}
},
"self": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct",
"type": "ODataDemo.FeaturedProduct",
"uri": "http:\/myexample.com\/MyService.svc\/Products(9)\/ODataDemo.FeaturedProduct"
}
}
]
};
verifyReadJsonLightWithMinimalMetadata(input, expected, "JsonLight with minimalmetadata uris should be computed for expanded types on feed with inherited types", model);
djstest.done();
});
// DATAJS INTERNAL END
})(this);