UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

619 lines (477 loc) 17.5 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Martin Wittemann (martinwittemann) * Tristan Koch (tristankoch) ************************************************************************ */ /* ************************************************************************ ************************************************************************ */ /** * * @asset(qx/test/*) * @ignore(qx.data.model, qx.test.O, qx.test.M, qx.test.M1, qx.test.M2) * @require(qx.io.request.Xhr) */ qx.Class.define("qx.test.data.store.Json", { extend : qx.dev.unit.TestCase, include : qx.dev.unit.MMock, members : { __store : null, __data : null, __propertyNames : null, /** * @lint ignoreDeprecated(eval) */ setUp : function() { this.__store = new qx.data.store.Json(); this.__data = eval("({s: 'String', n: 12, b: true})"); this.__propertyNames = ["s", "n", "b"]; this.url = qx.util.ResourceManager.getInstance(). toUri("qx/test/primitive.json"); }, setUpFakeRequest : function() { var req = this.request = new qx.io.request.Xhr(this.url); req.send = req.setParser = function() {}; req.dispose = qx.io.request.Xhr.prototype.dispose; this.stub(qx.io.request, "Xhr").returns(this.stub(req)); }, tearDown : function() { this.getSandbox().restore(); if (this.request) { // Restore manually (is unreachable from sandbox) if (typeof this.request.dispose.restore == "function") { this.request.dispose.restore(); } // Dispose this.request.dispose(); } this.__store.dispose(); // Remove the former created classes qx.data.model = {}; for (var name in qx.Class.$$registry) { if (name.search("qx.data.model") != -1) { delete qx.Class.$$registry[name]; } } }, testConfigureNewTransportConstructor : function() { var store = new qx.data.store.Json(this.url, null, false); store.dispose(); }, testLoadUrl : function() { this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertEquals("String", model.getString(), "The model is not created how it should!"); }, this); }, this); var url = this.url; this.__store.setUrl(url); this.wait(); }, testProgressStates : function() { var url = this.url, states = []; this.__store.addListener("changeState", function(evt) { var state = evt.getData(); states.push(state); if (state == "completed") { this.resume(function() { var expected = ["configured", "sending", "receiving", "completed"]; this.assertArrayEquals(expected, states); }); } }, this); this.__store.setUrl(url); this.wait(); }, testLoadResource : function() { this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertEquals("String", model.getString(), "The model is not created how it should!"); }, this); }, this); var resource = "qx/test/primitive.json"; this.__store.setUrl(resource); this.wait(); }, testParseErrorForResource : function() { this.__store.addListener("parseError", function(ev) { this.resume(function() { this.assertString(ev.getData().response, "Parse error object does not contain response!"); this.assertObject(ev.getData().error, "Parse error object does not contain parser exception!"); }, this); }, this); var resource = "qx/test/failing.json"; this.__store.setUrl(resource); this.wait(); }, testLoadAlias : function() { this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertEquals("String", model.getString(), "The model is not created how it should!"); qx.util.AliasManager.getInstance().remove("testLoadResource"); }, this); }, this); // invoke alias handling qx.util.AliasManager.getInstance().add("testLoadResource", "qx/test"); var alias = "testLoadResource/primitive.json"; this.__store.setUrl(alias); this.wait(); }, testDispose: function() { this.__store.setUrl(this.url); this.__store.dispose(); }, testWholePrimitive: function() { this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertEquals("String", model.getString(), "The model is not created how it should!"); this.assertEquals(12, model.getNumber(), "The model is not created how it should!"); this.assertEquals(true, model.getBoolean(), "The model is not created how it should!"); this.assertNull(model.getNull(), "The model is not created how it should!"); }, this); }, this); var url = this.url; this.__store.setUrl(url); this.wait(); }, testWholeArray: function() { this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertNotNull(model.getArray(), "The model is not created how it should!"); this.assertEquals("qx.data.Array", model.getArray().classname, "Wrong array class."); this.assertEquals("a", model.getArray().getItem(0), "Wrong content of the array."); this.assertEquals("b", model.getArray().getItem(1), "Wrong content of the array."); this.assertEquals("c", model.getArray().getItem(2), "Wrong content of the array."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/array.json"); this.__store.setUrl(url); this.wait(); }, testWholeObject: function() { this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testOwnClassWith: function() { // define a test class qx.Class.define("qx.test.AB", { extend : qx.core.Object, properties : { a : { check : "String", event : "changeA" }, b : { check : "String", event : "changeB" } } }); var delegate = { getModelClass : function(properties) { if (properties == 'a|b' || properties == 'a|b♥') { return qx.Class.getByName("qx.test.AB"); } return null; } }; this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertEquals("qx.test.AB", model.getO().classname, "Not the given class used!"); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testOwnClassWithout: function() { var delegate = { getModelClass : function(properties) { return null; } }; this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testOwnSuperclassWith: function() { // define a test class qx.Class.define("qx.test.O", { extend : qx.core.Object }); var delegate = { getModelSuperClass : function(properties) { return qx.test.O; } }; this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertTrue(qx.Class.isSubClassOf(model.constructor, qx.test.O)); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertTrue(qx.Class.isSubClassOf(model.getO().constructor, qx.test.O)); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testOwnSuperclassWithout: function() { // define a test class qx.Class.define("qx.test.O", { extend : qx.core.Object }); var delegate = { getModelSuperClass : function(properties) { return null; } }; this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testOwnMixinWithout: function() { var delegate = { getModelMixins : function(properties) { return null; } }; this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testOwnMixinWith: function() { // define a test class qx.Mixin.define("qx.test.M", { members : { a: function() { return true; } } }); var delegate = { getModelMixins : function(properties) { return qx.test.M; } }; this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertTrue(model.a(), "Mixin not included."); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertTrue(model.getO().a(), "Mixin not included."); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testOwnMixinWithMultiple: function() { // define a test class qx.Mixin.define("qx.test.M1", { members : { a: function() { return true; } } }); qx.Mixin.define("qx.test.M2", { members : { b: function() { return true; } } }); var delegate = { getModelMixins : function(properties) { return [qx.test.M1, qx.test.M2]; } }; this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); this.assertTrue(model.a(), "Mixin not included."); this.assertTrue(model.b(), "Mixin not included."); this.assertNotNull(model.getO(), "The model is not created how it should!"); this.assertTrue(model.getO().a(), "Mixin not included."); this.assertEquals("a", model.getO().getA(), "Wrong content of the object."); this.assertEquals("b", model.getO().getB(), "Wrong content of the object."); }, this); }, this); var url = qx.util.ResourceManager.getInstance().toUri("qx/test/object.json"); this.__store.setUrl(url); this.wait(); }, testManipulatePrimitive: function() { var delegate = {manipulateData : function(data) { return data; }}; this.spy(delegate, "manipulateData"); this.__store.dispose(); this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { this.assertCalled(delegate.manipulateData); }, this); }, this); var url = this.url; this.__store.setUrl(url); this.wait(); }, testConfigureRequestPrimitive: function() { var delegate, self = this; delegate = {configureRequest : function(request) { self.assertInstance(request, qx.io.request.Xhr); }}; this.spy(delegate, "configureRequest"); this.__store.dispose(); this.__store = new qx.data.store.Json(null, delegate); this.__store.addListener("loaded", function() { this.resume(function() { this.assertCalled(delegate.configureRequest); }, this); }, this); var url = this.url; this.__store.setUrl(url); this.wait(); }, testDisposeOldModel: function(){ this.__store.addListener("loaded", function() { this.resume(function() { var model = this.__store.getModel(); // check if the new model is not the old model this.assertNotEquals(fakeModel, model); // check if the old model has been disposed this.assertTrue(fakeModel.isDisposed()); }, this); }, this); // set a fake model var fakeModel = new qx.core.Object(); this.__store.setModel(fakeModel); var url = this.url; this.__store.setUrl(url); this.wait(); }, testDisposeRequest: function() { this.setUpFakeRequest(); this.__store.setUrl(this.url); this.__store.dispose(); this.assertCalled(this.request.dispose); }, testDisposeRequestDone: function() { this.setUpFakeRequest(); var url = this.url; this.__store.addListener("loaded", function() { this.resume(function() { this.__store.dispose(); this.assertCalled(this.request.dispose); }, this); }, this); this.__store.setUrl(url); }, testErrorEvent : function() { this.__store.addListener("error", function(ev) { this.resume(function() { this.assertNotNull(ev); }, this); }, this); this.__store.setUrl("not-found"); this.wait(); }, "test Internal Server Error" : function() { this.useFakeServer(); var server = this.getServer(); server.respondWith("GET", "/foo", [ 500, {"Content-Type": "application/json"}, "SERVER ERROR" ]); this.__store.addListener("error", function(e) { this.resume(function(){ this.assertTrue(e.getData().getPhase() == "statusError"); }); }, this); qx.event.Timer.once(function() { this.__store.setUrl("/foo"); server.respond(); }, this, 500); this.wait(1000); } } });