/*jslint indent: 2, maxlen: 80, nomen: true */ /*global module, test, stop, start, expect, ok, deepEqual, location, promy, jIO, test_util, dav_storage, btoa */ (function () { "use strict"; var spec = {}; location.href.split('?')[1].split('&').forEach(function (item) { spec[item.split('=')[0]] = decodeURI(item.split('=').slice(1).join('=')). replace(/%3A/ig, ':').replace(/%2F/ig, '/'); }); spec = dav_storage.createDescription( spec.url, spec.auth_type, spec.realm, spec.username, spec.password ); module("Dav Storage Live"); function success(promise) { var deferred = new promy.Deferred(); promise.then( deferred.resolve.bind(deferred), deferred.resolve.bind(deferred), deferred.notify.bind(deferred) ); return deferred.promise; } /** * Tested with local webDav server * * Used header are: * - Header always set Cache-Control "no-cache" # "private", "public", * "<seconds>" or "no-store" ("no-cache") * - Header always set Access-Control-Max-Age "0" * - Header always set Access-Control-Allow-Credentials "true" * - Header always set Access-Control-Allow-Origin "*" * - Header always set Access-Control-Allow-Methods "OPTIONS, GET, HEAD, * POST, PUT, DELETE, PROPFIND" * - Header always set Access-Control-Allow-Headers "Content-Type, * X-Requested-With, X-HTTP-Method-Override, Accept, Authorization, * Depth" */ test("Scenario", 29, function () { ok(!(/^file:/.test(location.href)), "Should not work on file protocol: " + location.href); var shared = {}, jio = jIO.createJIO(spec, { "workspace": {}, "max_retry": 2 }); stop(); function postNewDocument() { return jio.post({"title": "Unique ID"}); } function postNewDocumentTest(answer) { var uuid = answer.id; answer.id = "<uuid>"; deepEqual(answer, { "id": "<uuid>", "method": "post", "result": "success", "status": 201, "statusText": "Created" }, "Post a new document"); ok(test_util.isUuid(uuid), "New document id should look like " + "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx : " + uuid); shared.created_document_id = uuid; } function getCreatedDocument() { return jio.get({"_id": shared.created_document_id}); } function getCreatedDocumentTest(answer) { deepEqual(answer, { "data": { "_id": shared.created_document_id, "title": "Unique ID" }, "id": shared.created_document_id, "method": "get", "result": "success", "status": 200, "statusText": "Ok" }, "Get new document"); } function postSpecificDocument() { return jio.post({"_id": "b", "title": "Bee"}); } function postSpecificDocumentTest(answer) { deepEqual(answer, { "id": "b", "method": "post", "result": "success", "status": 201, "statusText": "Created" }, "Post specific document"); } function listDocuments() { return jio.allDocs(); } function list2DocumentsTest(answer) { if (answer && answer.data && Array.isArray(answer.data.rows)) { answer.data.rows.sort(function (a, b) { return a.id === "b" ? 1 : 0; }); } deepEqual(answer, { "data": { "total_rows": 2, "rows": [{ "id": shared.created_document_id, "value": {} }, { "id": "b", "value": {} }] }, "method": "allDocs", "result": "success", "status": 200, "statusText": "Ok" }, "List 2 documents"); } function removeCreatedDocument() { return jio.remove({"_id": shared.created_document_id}); } function removeCreatedDocumentTest(answer) { deepEqual(answer, { "id": shared.created_document_id, "method": "remove", "result": "success", "status": 204, "statusText": "No Content" }, "Remove first document."); } function removeSpecificDocument() { return jio.remove({"_id": "b"}); } function removeSpecificDocumentTest(answer) { deepEqual(answer, { "id": "b", "method": "remove", "result": "success", "status": 204, "statusText": "No Content" }, "Remove second document."); } function listEmptyStorage() { return jio.allDocs(); } function listEmptyStorageTest(answer) { deepEqual(answer, { "data": { "total_rows": 0, "rows": [] }, "method": "allDocs", "result": "success", "status": 200, "statusText": "Ok" }, "List empty storage"); } function putNewDocument() { return jio.put({"_id": "a", "title": "Hey"}); } function putNewDocumentTest(answer) { deepEqual(answer, { "id": "a", "method": "put", "result": "success", "status": 201, "statusText": "Created" }, "Put new document"); } function getCreatedDocument2() { return jio.get({"_id": "a"}); } function getCreatedDocument2Test(answer) { deepEqual(answer, { "data": { "_id": "a", "title": "Hey" }, "id": "a", "method": "get", "result": "success", "status": 200, "statusText": "Ok" }, "Get new document"); } function postSameDocument() { return success(jio.post({"_id": "a", "title": "Hoo"})); } function postSameDocumentTest(answer) { deepEqual(answer, { "error": "conflict", "id": "a", "message": "DavStorage, cannot overwrite document metadata.", "method": "post", "reason": "Document exists", "result": "error", "status": 409, "statusText": "Conflict" }, "Unable to post the same document (conflict)"); } function createAttachment() { return jio.putAttachment({ "_id": "a", "_attachment": "aa", "_data": "aaa", "_content_type": "text/plain" }); } function createAttachmentTest(answer) { deepEqual(answer, { "attachment": "aa", "id": "a", "method": "putAttachment", "result": "success", "status": 204, "statusText": "No Content" }, "Create new attachment"); } function updateAttachment() { return jio.putAttachment({ "_id": "a", "_attachment": "aa", "_data": "aab", "_content_type": "text/plain" }); } function updateAttachmentTest(answer) { deepEqual(answer, { "attachment": "aa", "id": "a", "method": "putAttachment", "result": "success", "status": 204, "statusText": "No Content" }, "Update last attachment"); } function createAnotherAttachment() { return jio.putAttachment({ "_id": "a", "_attachment": "ab", "_data": "aba", "_content_type": "text/plain" }); } function createAnotherAttachmentTest(answer) { deepEqual(answer, { "attachment": "ab", "id": "a", "method": "putAttachment", "result": "success", "status": 204, "statusText": "No Content" }, "Create another attachment"); } function updateLastDocument() { return jio.put({"_id": "a", "title": "Hoo"}); } function updateLastDocumentTest(answer) { deepEqual(answer, { "id": "a", "method": "put", "result": "success", "status": 204, "statusText": "No Content" }, "Update document metadata"); } function getFirstAttachment() { return jio.getAttachment({"_id": "a", "_attachment": "aa"}); } function getFirstAttachmentTest(answer) { var blob = answer.data; answer.data = "<blob>"; deepEqual(answer, { "attachment": "aa", "data": "<blob>", "digest": "sha256-38760eabb666e8e61ee628a17c4090cc5" + "0728e095ff24218119d51bd22475363", "id": "a", "method": "getAttachment", "result": "success", "status": 200, "statusText": "Ok" }, "Get first attachment"); return jIO.util.readBlobAsText(blob).then(function (e) { deepEqual(e.target.result, "aab", "Check blob text content"); }, function (err) { deepEqual(err, "no error", "Check blob text content"); }); } function getSecondAttachment() { return jio.getAttachment({"_id": "a", "_attachment": "ab"}); } function getSecondAttachmentTest(answer) { var blob = answer.data; answer.data = "<blob>"; deepEqual(answer, { "attachment": "ab", "data": "<blob>", "digest": "sha256-e124adcce1fb2f88e1ea799c3d0820845" + "ed343e6c739e54131fcb3a56e4bc1bd", "id": "a", "method": "getAttachment", "result": "success", "status": 200, "statusText": "Ok" }, "Get first attachment"); return jIO.util.readBlobAsText(blob).then(function (e) { deepEqual(e.target.result, "aba", "Check blob text content"); }, function (err) { deepEqual(err, "no error", "Check blob text content"); }); } function getLastDocument() { return jio.get({"_id": "a"}); } function getLastDocumentTest(answer) { deepEqual(answer, { "data": { "_id": "a", "title": "Hoo", "_attachments": { "aa": { "content_type": "text/plain", "digest": "sha256-38760eabb666e8e61ee628a17c4090cc5" + "0728e095ff24218119d51bd22475363", "length": 3 }, "ab": { "content_type": "text/plain", "digest": "sha256-e124adcce1fb2f88e1ea799c3d0820845" + "ed343e6c739e54131fcb3a56e4bc1bd", "length": 3 } } }, "id": "a", "method": "get", "result": "success", "status": 200, "statusText": "Ok" }, "Get last document metadata"); } function removeSecondAttachment() { return jio.removeAttachment({"_id": "a", "_attachment": "ab"}); } function removeSecondAttachmentTest(answer) { deepEqual(answer, { "attachment": "ab", "id": "a", "method": "removeAttachment", "result": "success", "status": 204, "statusText": "No Content" }, "Remove second document"); } function getInexistentSecondAttachment() { return success(jio.getAttachment({"_id": "a", "_attachment": "ab"})); } function getInexistentSecondAttachmentTest(answer) { deepEqual(answer, { "attachment": "ab", "error": "not_found", "id": "a", "message": "DavStorage, unable to get attachment.", "method": "getAttachment", "reason": "missing attachment", "result": "error", "status": 404, "statusText": "Not Found" }, "Get inexistent second attachment"); } function getOneAttachmentDocument() { return jio.get({"_id": "a"}); } function getOneAttachmentDocumentTest(answer) { deepEqual(answer, { "data": { "_attachments": { "aa": { "content_type": "text/plain", "digest": "sha256-38760eabb666e8e61ee628a17c4090cc5" + "0728e095ff24218119d51bd22475363", "length": 3 } }, "_id": "a", "title": "Hoo" }, "id": "a", "method": "get", "result": "success", "status": 200, "statusText": "Ok" }, "Get document metadata"); } function removeSecondAttachmentAgain() { return success(jio.removeAttachment({"_id": "a", "_attachment": "ab"})); } function removeSecondAttachmentAgainTest(answer) { deepEqual(answer, { "attachment": "ab", "error": "not_found", "id": "a", "message": "DavStorage, document attachment not found.", "method": "removeAttachment", "reason": "missing attachment", "result": "error", "status": 404, "statusText": "Not Found" }, "Remove inexistent attachment"); } function removeDocument() { return jio.remove({"_id": "a"}); } function removeDocumentTest(answer) { deepEqual(answer, { "id": "a", "method": "remove", "result": "success", "status": 204, "statusText": "No Content" }, "Remove document and its attachments"); } function getInexistentFirstAttachment() { return success(jio.getAttachment({"_id": "a", "_attachment": "aa"})); } function getInexistentFirstAttachmentTest(answer) { deepEqual(answer, { "attachment": "aa", "error": "not_found", "id": "a", "message": "DavStorage, unable to get attachment.", "method": "getAttachment", "reason": "missing document", "result": "error", "status": 404, "statusText": "Not Found" }, "Get inexistent first attachment"); } function getInexistentDocument() { return success(jio.get({"_id": "a"})); } function getInexistentDocumentTest(answer) { deepEqual(answer, { "error": "not_found", "id": "a", "message": "DavStorage, unable to get document.", "method": "get", "reason": "Not Found", "result": "error", "status": 404, "statusText": "Not Found" }, "Get inexistent document"); } function removeInexistentDocument() { return success(jio.remove({"_id": "a"})); } function removeInexistentDocumentTest(answer) { deepEqual(answer, { "error": "not_found", "id": "a", "message": "DavStorage, unable to get metadata.", "method": "remove", "reason": "Not Found", "result": "error", "status": 404, "statusText": "Not Found" }, "Remove already removed document"); } function unexpectedError(error) { if (error instanceof Error) { deepEqual([ error.name + ": " + error.message, error ], "UNEXPECTED ERROR", "Unexpected error"); } else { deepEqual(error, "UNEXPECTED ERROR", "Unexpected error"); } } // # Post new documents, list them and remove them // post a 201 postNewDocument().done(postNewDocumentTest). // get 200 then(getCreatedDocument).done(getCreatedDocumentTest). // post b 201 then(postSpecificDocument).done(postSpecificDocumentTest). // allD 200 2 documents then(listDocuments).done(list2DocumentsTest). // remove a 204 then(removeCreatedDocument).done(removeCreatedDocumentTest). // remove b 204 then(removeSpecificDocument).done(removeSpecificDocumentTest). // allD 200 empty storage then(listEmptyStorage).done(listEmptyStorageTest). // # Create and update documents, and some attachment and remove them // put 201 then(putNewDocument).done(putNewDocumentTest). // get 200 then(getCreatedDocument2).done(getCreatedDocument2Test). // post 409 then(postSameDocument).done(postSameDocumentTest). // putA a 204 then(createAttachment).done(createAttachmentTest). // putA a 204 then(updateAttachment).done(updateAttachmentTest). // putA b 204 then(createAnotherAttachment).done(createAnotherAttachmentTest). // put 204 then(updateLastDocument).done(updateLastDocumentTest). // getA a 200 then(getFirstAttachment). then(getFirstAttachmentTest). // getA b 200 then(getSecondAttachment). then(getSecondAttachmentTest). // get 200 then(getLastDocument).done(getLastDocumentTest). // removeA b 204 then(removeSecondAttachment).done(removeSecondAttachmentTest). // getA b 404 then(getInexistentSecondAttachment). done(getInexistentSecondAttachmentTest). // get 200 then(getOneAttachmentDocument).done(getOneAttachmentDocumentTest). // removeA b 404 then(removeSecondAttachmentAgain).done(removeSecondAttachmentAgainTest). // remove 204 then(removeDocument).done(removeDocumentTest). // getA a 404 then(getInexistentFirstAttachment).done(getInexistentFirstAttachmentTest). // get 404 then(getInexistentDocument).done(getInexistentDocumentTest). // remove 404 then(removeInexistentDocument).done(removeInexistentDocumentTest). // check 204 //then(checkDocument).done(checkDocumentTest). //then(checkStorage).done(checkStorageTest). fail(unexpectedError).always(start); }); }());