wireclient unit test
authorNiklas Cathor <nilclass@riseup.net>
Thu, 11 Jul 2013 15:52:13 +0000 (17:52 +0200)
committerNiklas Cathor <nilclass@riseup.net>
Wed, 17 Jul 2013 12:42:06 +0000 (14:42 +0200)
test/unit/wireclient-suite.js [new file with mode: 0644]

diff --git a/test/unit/wireclient-suite.js b/test/unit/wireclient-suite.js
new file mode 100644 (file)
index 0000000..061049a
--- /dev/null
@@ -0,0 +1,152 @@
+if (typeof define !== 'function') {
+    var define = require('amdefine')(module);
+}
+define(['requirejs'], function(requirejs, undefined) {
+  var suites = [];
+
+  suites.push({
+    name: "WireClient",
+    desc: "Low-level remotestorage client based on XMLHttpRequest",
+    setup: function(env, test) {
+      global.RemoteStorage = function() {};
+      require('./lib/promising');
+      require('./src/eventhandling');
+      require('./src/wireclient');
+
+      test.done();
+    },
+
+    beforeEach: function(env, test) {
+      global.XMLHttpRequest = function() {
+        XMLHttpRequest.instances.push(this);
+        this._headers = {};
+      };
+      XMLHttpRequest.instances = [];
+      XMLHttpRequest.prototype = {
+        open: function() {
+          this._open = Array.prototype.slice.call(arguments);
+        },
+        send: function() {
+          this._send = Array.prototype.slice.call(arguments);
+        },
+        setRequestHeader: function(key, value) {
+          this._headers[key] = value;
+        }
+      };
+      ['load', 'abort', 'error'].forEach(function(cb) {
+        Object.defineProperty(XMLHttpRequest.prototype, 'on' + cb, {
+          configurable: true,
+          set: function(f) {
+            this['_on' + cb] = f;
+          }
+        });
+      });
+
+      env.client = new RemoteStorage.WireClient();
+      env.connectedClient = new RemoteStorage.WireClient();
+      env.baseURI = 'https://example.com/storage/test';
+      env.token = 'foobarbaz';
+      env.connectedClient.configure(
+        undefined, env.baseURI, undefined, env.token
+      );
+
+      test.done();
+    },
+
+    afterEach: function(env, test) {
+      delete global.XMLHttpRequest;
+      delete env.client;
+      test.done();
+    },
+
+    tests: [
+      {
+        desc: "it's initially not connected",
+        run: function(env, test) {
+          test.assert(env.client.connected, false);
+        }
+      },
+
+      {
+        desc: "#get / #put / #delete throw an exception if not connected",
+        run: function(env, test) {
+          try {
+            env.client.get('/foo');
+            test.result(false);
+            return;
+          } catch(e) {}
+
+          try {
+            env.client.put('/foo', 'bla');
+            test.result(false);
+            return;
+          } catch(e) {}
+
+          try {
+            env.client.delete('/foo');
+            test.result(false);
+            return;
+          } catch(e) {}
+          test.done();
+        }
+      },
+
+      {
+        desc: "#configure sets the given parameters",
+        run: function(env, test) {
+          env.client.configure('test@example.com', undefined, 'draft-dejong-remotestorage-00');
+          test.assertAnd(env.client.userAddress, 'test@example.com');
+          test.assertAnd(env.client.storageApi, 'draft-dejong-remotestorage-00');
+          test.done();
+        }
+      },
+
+      {
+        desc: "#configure doesn't overwrite parameters if they are given as 'undefined'",
+        run: function(env, test) {
+          env.client.configure('test@example.com');
+          test.assertAnd(env.client.userAddress, 'test@example.com');
+          env.client.configure(undefined, 'http://foo/bar');
+          test.assertAnd(env.client.userAddress, 'test@example.com');
+          test.assertAnd(env.client.href, 'http://foo/bar');
+          test.done();
+        }
+      },
+
+      {
+        desc: "#configure determines if revisions are supported, based on the storageApi",
+        run: function(env, test) {
+          env.client.configure(undefined, undefined, 'draft-dejong-remotestorage-00');
+          test.assertAnd(env.client.supportsRevs, true);
+          env.client.configure(undefined, undefined, 'https://www.w3.org/community/rww/wiki/read-write-web-00#simple');
+          test.assertAnd(env.client.supportsRevs, false);
+          env.client.configure(undefined, undefined, 'draft-dejong-remotestorage-01');
+          test.assertAnd(env.client.supportsRevs, true);
+          test.done();
+        }
+      },
+
+      {
+        desc: "#configure sets 'connected' to true, once href and token are given",
+        run: function(env, test) {
+          env.client.configure(undefined, 'https://example.com/storage/test', undefined, 'foobarbaz');
+          test.assert(env.client.connected, true);
+        }
+      },
+
+      {
+        desc: "#get opens a CORS request",
+        run: function(env, test) {
+          env.connectedClient.get('/foo/bar');
+          var request = XMLHttpRequest.instances.shift();
+          test.assertTypeAnd(request, 'object');
+          test.assert(request._open,
+                      ['GET', 'https://example.com/storage/test/foo/bar', true]);
+        }
+      }
+    ]
+  });
+
+  return suites;
+});
+