summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--share/www/script/test/update_documents.js143
1 files changed, 143 insertions, 0 deletions
diff --git a/share/www/script/test/update_documents.js b/share/www/script/test/update_documents.js
new file mode 100644
index 00000000..92e9ae91
--- /dev/null
+++ b/share/www/script/test/update_documents.js
@@ -0,0 +1,143 @@
+// Licensed 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.
+
+
+couchTests.update_documents = function(debug) {
+ var db = new CouchDB("test_suite_db");
+ db.deleteDb();
+ db.createDb();
+ if (debug) debugger;
+
+ var designDoc = {
+ _id:"_design/update",
+ language: "javascript",
+ updates: {
+ "hello" : stringFun(function(doc, req) {
+ if (!doc) {
+ if (req.docId) {
+ return [{
+ _id : req.docId
+ }, "New World"]
+ }
+ return [null, "Empty World"];
+ }
+ doc.world = "hello";
+ doc.edited_by = req.userCtx;
+ return [doc, "hello doc"];
+ }),
+ "in-place" : stringFun(function(doc, req) {
+ var field = req.query.field;
+ var value = req.query.value;
+ var message = "set "+field+" to "+value;
+ doc[field] = value;
+ return [doc, message];
+ }),
+ "bump-counter" : stringFun(function(doc, req) {
+ if (!doc.counter) doc.counter = 0;
+ doc.counter += 1;
+ var message = "<h1>bumped it!</h1>";
+ return [doc, message];
+ }),
+ "error" : stringFun(function(doc, req) {
+ superFail.badCrash;
+ }),
+ "xml" : stringFun(function(doc, req) {
+ var xml = new XML('<xml></xml>');
+ xml.title = doc.title;
+ var posted_xml = new XML(req.body);
+ doc.via_xml = posted_xml.foo.toString();
+ var resp = {
+ "headers" : {
+ "Content-Type" : "application/xml"
+ },
+ "body" : xml
+ };
+
+ return [doc, resp];
+ })
+ }
+ };
+ T(db.save(designDoc).ok);
+
+ var doc = {"word":"plankton", "name":"Rusty"}
+ var resp = db.save(doc);
+ T(resp.ok);
+ var docid = resp.id;
+
+ // update error
+ var xhr = CouchDB.request("POST", "/test_suite_db/_design/update/_update/");
+ T(xhr.status == 404, 'Should be missing');
+ T(JSON.parse(xhr.responseText).reason == "Invalid path.");
+
+ // hello update world
+ xhr = CouchDB.request("PUT", "/test_suite_db/_design/update/_update/hello/"+docid);
+ T(xhr.status == 201);
+ T(xhr.responseText == "hello doc");
+ T(/charset=utf-8/.test(xhr.getResponseHeader("Content-Type")))
+
+ doc = db.open(docid);
+ T(doc.world == "hello");
+
+ // Fix for COUCHDB-379
+ T(equals(xhr.getResponseHeader("Server").substr(0,7), "CouchDB"));
+
+ // hello update world (no docid)
+ xhr = CouchDB.request("POST", "/test_suite_db/_design/update/_update/hello");
+ T(xhr.status == 200);
+ T(xhr.responseText == "Empty World");
+
+ // no GET allowed
+ xhr = CouchDB.request("GET", "/test_suite_db/_design/update/_update/hello");
+ T(xhr.status == 405);
+ T(JSON.parse(xhr.responseText).error == "method_not_allowed");
+
+ // // hello update world (non-existing docid)
+ xhr = CouchDB.request("PUT", "/test_suite_db/_design/update/_update/hello/nonExistingDoc");
+ T(xhr.status == 201);
+ T(xhr.responseText == "New World");
+
+ // in place update
+ xhr = CouchDB.request("PUT", "/test_suite_db/_design/update/_update/in-place/"+docid+'?field=title&value=test');
+ T(xhr.status == 201);
+ T(xhr.responseText == "set title to test");
+ doc = db.open(docid);
+ T(doc.title == "test");
+
+ // bump counter
+ xhr = CouchDB.request("PUT", "/test_suite_db/_design/update/_update/bump-counter/"+docid, {
+ headers : {"X-Couch-Full-Commit":"true"}
+ });
+ T(xhr.status == 201);
+ T(xhr.responseText == "<h1>bumped it!</h1>");
+ doc = db.open(docid);
+ T(doc.counter == 1);
+
+ // _update honors full commit if you need it to
+ xhr = CouchDB.request("PUT", "/test_suite_db/_design/update/_update/bump-counter/"+docid, {
+ headers : {"X-Couch-Full-Commit":"true"}
+ });
+
+ doc = db.open(docid);
+ T(doc.counter == 2);
+
+ // parse xml
+ xhr = CouchDB.request("PUT", "/test_suite_db/_design/update/_update/xml/"+docid, {
+ headers : {"X-Couch-Full-Commit":"true"},
+ "body" : '<xml><foo>bar</foo></xml>'
+ });
+ T(xhr.status == 201);
+ T(xhr.responseText == "<xml>\n <title>test</title>\n</xml>");
+
+ doc = db.open(docid);
+ T(doc.via_xml == "bar");
+
+};