Repository: olingo-odata4-js Updated Branches: refs/heads/OLINGO-324 064542b83 -> ab2587ef3
[OLINGO-324] modify context type detection and first tests for this Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/commit/ab2587ef Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/tree/ab2587ef Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/diff/ab2587ef Branch: refs/heads/OLINGO-324 Commit: ab2587ef360bec5d2f7076d46d40bc1cfef5276b Parents: 064542b Author: Sven Kobler <[email protected]> Authored: Mon Jun 23 17:29:13 2014 +0200 Committer: Sven Kobler <[email protected]> Committed: Mon Jun 23 17:29:13 2014 +0200 ---------------------------------------------------------------------- datajs/demo/scripts/.gitignore | 2 +- datajs/demo/tester.html | 65 ++++++++++++- datajs/src/lib/datajs/utils.js | 8 ++ datajs/src/lib/odata/json-light.js | 132 +++++++++++++++++++++++--- datajs/src/lib/odata/json.js | 23 +++-- datajs/src/lib/odata/utils.js | 13 +++ datajs/tests/odata-json-parse-tests.html | 46 +++++++++ datajs/tests/odata-json-parse-tests.js | 99 +++++++++++++++++++ 8 files changed, 360 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/demo/scripts/.gitignore ---------------------------------------------------------------------- diff --git a/datajs/demo/scripts/.gitignore b/datajs/demo/scripts/.gitignore index 7318683..863d40c 100644 --- a/datajs/demo/scripts/.gitignore +++ b/datajs/demo/scripts/.gitignore @@ -1 +1 @@ -demo/scripts/datajs-2* +datajs-2* http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/demo/tester.html ---------------------------------------------------------------------- diff --git a/datajs/demo/tester.html b/datajs/demo/tester.html index 11cc85f..43bca29 100644 --- a/datajs/demo/tester.html +++ b/datajs/demo/tester.html @@ -31,11 +31,13 @@ <button id="startXML">XML</button><br/> <button id="btnJSON_none">pure JSON odata.metadata=none</button><br/> <button id="btnJSON_minimal">pure JSON odata.metadata=minimal</button><br/> + <button id="btnJSON_minimal_to_full">pure JSON odata.metadata=minimal; extendMetadataToLevel=full</button><br/> + <button id="btnJSON_minimal_to_all">pure JSON odata.metadata=minimal; extendMetadataToLevel=all</button><br/> <button id="btnJSON_full">pure JSON odata.metadata=full</button><br/> - <button id="btnJSON_full_date_conversion">JSON odata.metadata=full with date conversion</button><br/> - <button id="btnJSON_all">JSON odata.metadata=full with adding types for string, bool, numbers</button><br/> + <button id="btnJSON_full_date_conversion">JSON odata.metadata=full (with date conversion)</button><br/> + <button id="btnJSON_full_to_all">JSON odata.metadata=full; extendMetadataToLevel=all (with adding types for string, bool, numbers)</button><br/> + <button id="btnJSON_full_to_all_date_conversion">JSON odata.metadata=full; extendMetadataToLevel=all (with adding types for string, bool, numbers) (with date conversion)</button><br/> - <button id="btnMetaData">MetaData</button><br/> <button id="btnJSONwithMetaData">JSON with MetaData</button><br/> <div id='resultsArea' data-type="json"> @@ -62,6 +64,23 @@ $("#resultsArea").text(JSON.stringify(err)); } + function getMetaData(metaDatasuccess) { + var oHeaders = { + 'Accept': 'text/html,application/xhtml+xml,application/xml,application/json;odata.metadata=full', + "Odata-Version": "4.0", + "OData-MaxVersion": "4.0", + "Prefer": "odata.allow-entityreferences" + }; + var metadataRequest = + { + headers: oHeaders, + //requestUri: "http://services.odata.org/OData/OData.svc/$metadata", + requestUri: "http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata", //"http://localhost:6630/PrimitiveKeys.svc/$metadata", + data: null, + }; + OData.read(metadataRequest, metaDatasuccess, errorFunc,OData.metadataHandler); + }; + $('#startXML').on("click", function(){ //var requestUri = 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods'; var requestUri ='http://localhost:4003/sap/bc/ds/odata/v4/ESMixPrimCollComp?$format=xml'; @@ -89,7 +108,16 @@ OData.read(requestUri, success, errorFunc); }); - $('#btnJSON_all').on("click", function(){ + $('#btnJSON_full_to_all').on("click", function(){ + var requestUri = { + requestUri : 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods', + headers : { Accept : 'application/json;odata.metadata=full' }, + extendMetadataToLevel : 'all' , + recognizeDates : false + }; + OData.read(requestUri, success, errorFunc); + }); + $('#btnJSON_full_to_all_date_conversion').on("click", function(){ var requestUri = { requestUri : 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods', headers : { Accept : 'application/json;odata.metadata=full' }, @@ -124,6 +152,35 @@ OData.read(metadataRequest, success, errorFunc,OData.metadataHandler); }); + + + + $('#btnJSON_minimal_to_all').on("click", function(){ + var metaDatasuccess = function(metadata){ + var requestUri = { + requestUri : 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods', + headers : { Accept : 'application/json;odata.metadata=minimal' }, + extendMetadataToLevel : 'all' , + recognizeDates : false + }; + OData.read(requestUri, success, errorFunc, null, null, metadata); + } + getMetaData(metaDatasuccess); + }); + + $('#btnJSON_minimal_to_full').on("click", function(){ + var metaDatasuccess = function(metadata){ + var requestUri = { + requestUri : 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods', + headers : { Accept : 'application/json;odata.metadata=minimal' }, + extendMetadataToLevel : 'full' , + recognizeDates : false + }; + OData.read(requestUri, success, errorFunc, null, null, metadata); + } + getMetaData(metaDatasuccess); + }); + $('#btnJSONwithMetaData').on("click", function(){ var oHeaders = { 'Accept': 'text/html,application/xhtml+xml,application/xml,application/json;odata.metadata=full', http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/src/lib/datajs/utils.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/datajs/utils.js b/datajs/src/lib/datajs/utils.js index bd4f287..639a199 100644 --- a/datajs/src/lib/datajs/utils.js +++ b/datajs/src/lib/datajs/utils.js @@ -523,6 +523,12 @@ var endsWith = function (input, search) { return input.indexOf(search, input.length - search.length) !== -1; }; +var startsWith = function (input, search) { + return input.indexOf(search) == 0; +}; + + + // DATAJS INTERNAL START exports.activeXObject = activeXObject; exports.assigned = assigned; @@ -548,7 +554,9 @@ exports.convertByteArrayToHexString = convertByteArrayToHexString; exports.getJsonValueArraryLength = getJsonValueArraryLength; exports.sliceJsonValueArray = sliceJsonValueArray; exports.concatJsonValueArray = concatJsonValueArray; +exports.startsWith = startsWith; exports.endsWith = endsWith; + // DATAJS INTERNAL END \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/src/lib/odata/json-light.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/odata/json-light.js b/datajs/src/lib/odata/json-light.js index 17c2cba..12c5d84 100644 --- a/datajs/src/lib/odata/json-light.js +++ b/datajs/src/lib/odata/json-light.js @@ -1052,14 +1052,19 @@ var jsonLightMakePayloadInfo = function (kind, type) { return { kind: kind, type: type || null }; }; -/**/ -var parseContextUriFragment = function( fragment ) { +/// <summary>Creates an object containing information for the context</summary> +/// ... +/// <returns type="Object">Object with type information +/// attribute detectedPayloadKind: see constants starting with PAYLOADTYPE_ +/// attribute deltaKind: deltainformation, one of the following valus DELTATYPE_FEED | DELTATYPE_DELETED_ENTRY | DELTATYPE_LINK | DELTATYPE_DELETED_LINK +/// attribute typeName: name of the type +/// attribute type: object containing type information for entity- and complex-types +/// </returns> +var parseContextUriFragment = function( fragment, model ) { var ret = {}; ret.deltaKind = undefined; - if (utils.endsWith(fragment, '/$entity')) { - fragment = fragment.substring(fragment.lenght - 8); - } else if (utils.endsWith(fragment, '/$delta')) { + if (utils.endsWith(fragment, '/$delta')) { ret.deltaKind = DELTATYPE_FEED; fragment = fragment.substring(fragment.lenght - 7); } else if (utils.endsWith(fragment, '/$deletedEntity')) { @@ -1084,7 +1089,7 @@ var parseContextUriFragment = function( fragment ) { } } - if (index == 0) { + if (index === 0) { //TODO throw error } @@ -1092,7 +1097,7 @@ var parseContextUriFragment = function( fragment ) { if (previous !== 'Collection') { // Don't treat Collection(Edm.Type) as SelectExpand segment - var selectExpandStr = fragment.substring(index+2, fragment.lenght - 1); + var selectExpandStr = fragment.substring(index+2, fragment.length - 1); var keyPattern = /^(?:-{0,1}\d+?|\w*'.+?'|[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}|.+?=.+?)$/; var matches = keyPattern.exec(selectExpandStr); if ( matches ) { @@ -1110,29 +1115,129 @@ var parseContextUriFragment = function( fragment ) { if (fragment.length === 0) { // Capter 10.1 ret.detectedPayloadKind = PAYLOADTYPE_SVCDOC; + return ret; } else if (fragment === 'Edm.Null') { // Capter 10.15 ret.detectedPayloadKind = PAYLOADTYPE_PROPERTY; ret.isNullProperty = true; + return ret; } else if (fragment === 'Collection($ref)') { // Capter 10.11 ret.detectedPayloadKind = PAYLOADTYPE_ENTITY_REF_LINKS; + return ret; } else if (fragment === '$ref') { // Capter 10.12 ret.detectedPayloadKind = PAYLOADTYPE_ENTITY_REF_LINK; + return ret; } else { //TODO check for navigation resource } } + ret.lastType = undefined; + ret.lastTypeName = undefined; + ret.detectedPayloadKind = undefined; + // split fragment at '/' //TODO changes var fragmentParts = fragment.split("/"); - if (fragmentParts.length >= 0) { + + + for(var i = 0; i < fragmentParts.length; ++i) { + var fragment = fragmentParts[i]; + if (ret.lastTypeName === undefined) { + //preparation + var startPharen = fragment.indexOf('(') + var inPharenthesis = undefined; + if ( startPharen !== -1 ) { + //remove the projected entity from the fragment; TODO decide if we want to store the projected entity + inPharenthesis = fragment.substring(startPharen+1,fragment.length - 1); + // projection: Capter 10.7, 10.8 and 10.9 + fragment = fragment.substring(0,startPharen); + + if (utils.startsWith(fragment, 'Collection')) { + ret.detectedPayloadKind = PAYLOADTYPE_COLLECTION; + // Capter 10.14 + ret.lastTypeName = inPharenthesis; + + ret.lastType = lookupEntityType( ret.lastTypeName, model); + } else { + ret.projection = inPharenthesis; + } + } + + var container = lookupDefaultEntityContainer(model); + + //check for entity + var entitySet = lookupEntitySet(container.entitySet, fragment); + if ( entitySet !== undefined) { + ret.lastTypeName = entitySet.entityType; + ret.lastType = lookupEntityType( ret.lastTypeName, model); + ret.detectedPayloadKind = PAYLOADTYPE_FEED; + // Capter 10.2 + continue; + } + + //check for singleton + var singleton = lookupSingleton(container.singleton, fragment); + if ( singleton !== undefined) { + ret.lastTypeName = singleton.entityType; + ret.lastType = lookupEntityType( ret.lastTypeName, model); + ret.detectedPayloadKind = PAYLOADTYPE_ENTRY; + // Capter 10.4 + continue; + } + + } else { + //check for $entity + if (utils.endsWith(fragment, '$entity') && (ret.detectedPayloadKind === PAYLOADTYPE_FEED)) { + ret.detectedPayloadKind = PAYLOADTYPE_ENTRY; + // Capter 10.3 and 10.6 + continue; + } + + //check for derived types + if (fragment.indexOf('.') !== -1) { + // Capter 10.6 + ret.lastTypeName = fragment; + var type = lookupEntityType(ret.lastTypeName, model); + if ( entitySet !== undefined) { + ret.lastType = type; + continue; + } + type = lookupComplexType(ret.lastTypeName, model); + if ( entitySet !== undefined) { + ret.lastType = type; + continue; + } + + //ERROR invalid type + } + + //check for property value + if ( ret.detectedPayloadKind === PAYLOADTYPE_FEED || ret.detectedPayloadKind === PAYLOADTYPE_ENTRY) { + var property = lookupProperty(ret.lastType.properties, fragment); + if (property !== undefined) { + ret.lastTypeName = property.type; + if (!jsonLightIsPrimitiveType(ret.lastTypeName)) { + ret.lastType = lookupComplexType(ret.lastTypeName, model); + } else { + ret.lastType = undefined; + } + ret.detectedPayloadKind === PAYLOADTYPE_PROPERTY; + // Capter 10.15 + } + continue; + } + } + } + return ret; + +/* var qualifiedName = fragmentParts[0]; var typeCast = fragmentParts[1]; - if (jsonLightIsPrimitiveType(qualifiedName)) { + if () { ret.detectedPayloadKind = PAYLOADTYPE_VALUE; return ret; } @@ -1186,7 +1291,7 @@ var parseContextUriFragment = function( fragment ) { return jsonLightMakePayloadInfo(PAYLOADTYPE_OBJECT, qualifiedName); } - +*/ }; var jsonLightPayloadInfo = function (data, model) { @@ -1213,7 +1318,7 @@ var jsonLightPayloadInfo = function (data, model) { return jsonLightMakePayloadInfo(PAYLOADTYPE_SVCDOC); } - var d = metadataUri.indexOf("@Element", fragmentStart); + var elementStart = metadataUri.indexOf("@Element", fragmentStart); var fragmentEnd = elementStart - 1; if (fragmentEnd < 0) { @@ -1228,9 +1333,9 @@ var jsonLightPayloadInfo = function (data, model) { return jsonLightMakePayloadInfo(PAYLOADTYPE_LINKS); } - var ret = parseContextUriFragment(fragment); + var ret = parseContextUriFragment(fragment,model); - return; + return ret; }; @@ -1546,6 +1651,7 @@ var formatJsonLightAnnotation = function (qName, target, value, data) { }; // DATAJS INTERNAL START +exports.jsonLightPayloadInfo = jsonLightPayloadInfo; exports.jsonLightReadPayload = jsonLightReadPayload; exports.formatJsonLight = formatJsonLight; exports.formatJsonLightRequestPayload = formatJsonLightRequestPayload; http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/src/lib/odata/json.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/odata/json.js b/datajs/src/lib/odata/json.js index 90758e0..f5293bf 100644 --- a/datajs/src/lib/odata/json.js +++ b/datajs/src/lib/odata/json.js @@ -46,6 +46,7 @@ var handler = oDataUtils.handler; var isComplex = oDataUtils.isComplex; var lookupComplexType = oDataUtils.lookupComplexType; var lookupEntityType = oDataUtils.lookupEntityType; +var lookupSingleton = oDataUtils.lookupSingleton; var MAX_DATA_SERVICE_VERSION = oDataUtils.MAX_DATA_SERVICE_VERSION; var maxVersion = oDataUtils.maxVersion; var parseDateTime = oDataUtils.parseDateTime; @@ -253,7 +254,7 @@ var jsonParser = function (handler, text, context) { var payloadFormat = 1;//minmal try { - payloadFormat = metadataMap[context.contentType.properties["odata.metadata"]]; + payloadFormat = metadataMap[context.contentType.properties["odata.metadata"]];//TODO convert to lower before comparism } catch(err) { payloadFormat = 1; } @@ -261,7 +262,7 @@ var jsonParser = function (handler, text, context) { var demandedFormat = 1;//minmal try { - demandedFormat = metadataMap[context.extendMetadataToLevel]; + demandedFormat = metadataMap[context.extendMetadataToLevel]; //TODO convert to lower before comparism } catch(err) { demandedFormat = 1; } @@ -290,12 +291,12 @@ var jsonParser = function (handler, text, context) { //guess types for nummber as defined in the odata-json-format-v4.0.doc specification return extendMetadataFromPayload(json,context,recognizeDates); } else if (payloadFormat === 1) { //minmal - if (utils.isArray(context.metadata)) { + if (!utils.isArray(model)) { // array was default for model in datajsV3 3.0 //TODO use metadata in context to determine which properties need to be converted // and extend the metadata - return extendMetadataFromContext(json,context,recognizeDates); + return extendMetadataFromContext(json,context,model,recognizeDates); } else { - //error metadata in context required + //error metadata in context required, TODO: throw a to be defined exception } } else { // the payload contains no context url only guessing possible @@ -306,8 +307,8 @@ var jsonParser = function (handler, text, context) { }; -var extendMetadataFromContext = function(json,context,recognizeDates) { - return jsonLightReadPayload(json, model, recognizeDates, inferJsonLightFeedAsObject, context.contentType.properties['odata.metadata']); +var extendMetadataFromContext = function(json,context, model,recognizeDates) { + return jsonLightReadPayload(json, model, recognizeDates, false, context.contentType.properties['odata.metadata']); }; var convertPrimitivetypesGeneric = function(data) { @@ -342,6 +343,7 @@ var convertPrimitivetypesOnMetadataFull = function(data) { } else if ( type === '#DateTime' ) { data[key] = oDataUtils.parseDateTimeOffset(data[key],true); } + //TODO handle more types there } } } @@ -393,6 +395,7 @@ var extendMetadataFromPayload = function(data,context,recognizeDates) { } else if ( type === '#DateTime' ) { data[key] = oDataUtils.parseDateTimeOffset(data[key],true); } + //TODO handle more types there } var typeFromObject = typeof data[key]; if ( typeFromObject === 'string' ) { @@ -400,10 +403,10 @@ var extendMetadataFromPayload = function(data,context,recognizeDates) { } else if (typeFromObject ==='boolean') { addType(data,key,'#Bool'); } else if (typeFromObject ==='number') { - if ( data[key] % 1 === 0 ) { - addType(data,key,'#Integer'); + if ( data[key] % 1 === 0 ) { // has fraction + addType(data,key,'#Integer');// the biggst integer } else { - addType(data,key,'#Decimal'); + addType(data,key,'#Decimal');// the biggst float single,doulbe,decimal } } } http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/src/lib/odata/utils.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/odata/utils.js b/datajs/src/lib/odata/utils.js index 552fb77..e99b2c1 100644 --- a/datajs/src/lib/odata/utils.js +++ b/datajs/src/lib/odata/utils.js @@ -539,6 +539,17 @@ var lookupEntitySet = function (entitySets, name) { }); }; +var lookupSingleton = function (singletons, name) { + /// <summary>Looks up a entity set by name.</summary> + /// <param name="properties" type="Array" mayBeNull="true">Array of entity set objects as per EDM metadata.</param> + /// <param name="name" type="String">Name to look for.</param> + /// <returns type="Object">The entity set object; null if not found.</returns> + + return find(singletons, function (singleton) { + return singleton.name === name; + }); +}; + var lookupComplexType = function (name, metadata) { /// <summary>Looks up a complex type object by name.</summary> /// <param name="name" type="String">Name, possibly null or empty.</param> @@ -557,6 +568,7 @@ var lookupEntityType = function (name, metadata) { return lookupInMetadata(name, metadata, "entityType"); }; + var lookupDefaultEntityContainer = function (metadata) { /// <summary>Looks up an</summary> /// <param name="name" type="String">Name, possibly null or empty.</param> @@ -1126,6 +1138,7 @@ exports.lookupComplexType = lookupComplexType; exports.lookupDefaultEntityContainer = lookupDefaultEntityContainer; exports.lookupEntityContainer = lookupEntityContainer; exports.lookupEntitySet = lookupEntitySet; +exports.lookupSingleton = lookupSingleton; exports.lookupEntityType = lookupEntityType; exports.lookupFunctionImport = lookupFunctionImport; exports.lookupNavigationPropertyType = lookupNavigationPropertyType; http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/tests/odata-json-parse-tests.html ---------------------------------------------------------------------- diff --git a/datajs/tests/odata-json-parse-tests.html b/datajs/tests/odata-json-parse-tests.html new file mode 100644 index 0000000..8aa847b --- /dev/null +++ b/datajs/tests/odata-json-parse-tests.html @@ -0,0 +1,46 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> +<html> +<!-- +Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--> + <head> + <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> + <meta http-equiv="cache-control" content="no-cache" /> + <meta http-equiv="pragma" content="no-cache" /> + <meta http-equiv="expires" content="-1" /> + + <title>OData unit tests</title> + <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" /> + + <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js" ></script> + + <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script> + <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script> + <script type="text/javascript" src="common/TestSynchronizerClient.js"></script> + <script type="text/javascript"> + window.TestSynchronizer.init(QUnit); + </script> + + <script type="text/javascript" src="../build/datajs-2.0.0.js"></script> + <script type="text/javascript" src="common/djstest.js"></script> + <script type="text/javascript" src="odata-json-parse-tests.js"></script> + </head> + <body> + <h1 id="qunit-header">OData Unit Tests</h1> + <h2 id="qunit-banner"></h2> + <h2 id="qunit-userAgent"></h2> + <ol id="qunit-tests"> + </ol> + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/ab2587ef/datajs/tests/odata-json-parse-tests.js ---------------------------------------------------------------------- diff --git a/datajs/tests/odata-json-parse-tests.js b/datajs/tests/odata-json-parse-tests.js new file mode 100644 index 0000000..c2dd33a --- /dev/null +++ b/datajs/tests/odata-json-parse-tests.js @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// odata-tests.js +(function (window, undefined) { + function errorFunc() { + djstest.fail('Errror'); + } + + function runWithMetadata(metaDatasuccess) { + + + var oHeaders = { + 'Accept': 'text/html,application/xhtml+xml,application/xml,application/json;odata.metadata=full', + "Odata-Version": "4.0", + "OData-MaxVersion": "4.0", + "Prefer": "odata.allow-entityreferences" + }; + var metadataRequest = + { + headers: oHeaders, + //requestUri: "http://services.odata.org/OData/OData.svc/$metadata", + requestUri: "http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata", //"http://localhost:6630/PrimitiveKeys.svc/$metadata", + data: null, + }; + OData.read(metadataRequest, metaDatasuccess, errorFunc,OData.metadataHandler); + }; + + djstest.addTest(function test1() { + var checkLastTypeName = function (metadata, input, expected) { + var info = OData.jsonLight.jsonLightPayloadInfo({ "@odata.context" : input}, metadata) + djstest.assertAreEqual(info.lastTypeName,expected, "Test context fragment: "+ input); + + }; + + var checkKind = function (metadata, input, expected) { + var info = OData.jsonLight.jsonLightPayloadInfo({ "@odata.context" : input}, metadata) + djstest.assertAreEqual(info.detectedPayloadKind,expected, "Test context fragment: "+ input); + }; + var success = function(metadata){ + //Chapter 10.1 + checkKind(metadata, '#', 's'); + //Chapter 10.2 + checkKind(metadata, '#Foods', 'f'); + //Chapter 10.3 + checkKind(metadata, '#Foods/$entity', 'e'); + //Chapter 10.4 + //checkKind(metadata, '#Singleton', ''); + //Chapter 10.5 + checkKind(metadata, '#Foods/DataJS.Tests.V4.Food', 'f'); + //Chapter 10.6 + checkKind(metadata, '#Foods/DataJS.Tests.V4.Food/$entity', 'e'); + //Chapter 10.7 + checkKind(metadata, '#Foods(FoodID,Name)', 'f'); + //Chapter 10.8 + checkKind(metadata, '#Foods(FoodID,Name)/$entity', 'e'); + //Chapter 10.9 + checkKind(metadata, '#Foods(FoodID,Name,Category,Category+(CategoryID,Name))', 'f'); + //Chapter 10.10 + checkKind(metadata, '#Foods(FoodID,Name,Category,Category+(CategoryID,Name))/$entity', 'e'); + //Chapter 10.11 + checkKind(metadata, '#Collection($ref)', 'erls'); + //Chapter 10.12 + checkKind(metadata, '#$ref', 'erl'); + //Chapter 10.13 + checkKind(metadata, '#Foods(0)/Packaging', 'p'); + //Chapter 10.14 + checkKind(metadata, '#Collection(Edm.String)', 'c'); + //Chapter 10.15 + checkKind(metadata, '#Edm.String', 'v'); + //TODO add tests for delta tokens + + + + checkLastTypeName(metadata, '#Foods', 'DataJS.Tests.V4.Food'); + djstest.done(); + }; + + runWithMetadata(success); + },'simple'); + + +})(this);
