summaryrefslogtreecommitdiff
path: root/test/javascript/tests/changes.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/javascript/tests/changes.js')
-rw-r--r--test/javascript/tests/changes.js812
1 files changed, 0 insertions, 812 deletions
diff --git a/test/javascript/tests/changes.js b/test/javascript/tests/changes.js
deleted file mode 100644
index 338c1571c..000000000
--- a/test/javascript/tests/changes.js
+++ /dev/null
@@ -1,812 +0,0 @@
-// 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.elixir = true;
-
-function jsonp(obj) {
- T(jsonp_flag == 0);
- T(obj.results.length == 1 && obj.last_seq == 1, "jsonp");
- jsonp_flag = 1;
-}
-
-couchTests.changes = function(debug) {
- return console.log('done in test/elixir/test/changes_test.exs and changes_async_test.exs');
-
- var db;
- if (debug) debugger;
-
- // poor man's browser detection
- var is_safari = false;
- if (typeof (navigator) == "undefined") {
- is_safari = true; // For CouchHTTP based runners
- } else if (navigator.userAgent.match(/AppleWebKit/)) {
- is_safari = true;
- }
-
- testChanges("live");
- testChanges("continuous");
- function testChanges(feed) {
- var db_name = get_random_db_name();
- // (write-quorums help keep a consistent feed)
- db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
- db.createDb();
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes");
- var resp = JSON.parse(req.responseText);
-
- TEquals(0, resp.results.length, "db must be empty")
- TEquals("0", resp.last_seq.substr(0, 1), "seq must start with 0")
- var docFoo = {_id:"foo", bar:1};
- T(db.save(docFoo).ok);
- T(db.ensureFullCommit().ok);
- T(db.open(docFoo._id)._id == docFoo._id);
-
- retry_part(function(){ // avoid Heisenbugs
- req = CouchDB.request("GET", "/" + db_name + "/_changes");
- var resp = JSON.parse(req.responseText);
- TEquals("1", resp.last_seq.substr(0, 1), "seq must start with 1");
- T(resp.results.length == 1, "one doc db");
- T(resp.results[0].changes[0].rev == docFoo._rev);
- });
-
- // test with callback
-// TODO: either allow jsonp in the default global config or implement a config chg mechanism analogouts 2 sebastianrothbucher:clustertest - or leave out
-// run_on_modified_server(
-// [{section: "httpd",
-// key: "allow_jsonp",
-// value: "true"}],
-// function() {
-// var xhr = CouchDB.request("GET", "/" + db_name + "/_changes?callback=jsonp");
-// T(xhr.status == 200);
-// jsonp_flag = 0;
-// eval(xhr.responseText);
-// T(jsonp_flag == 1);
-// });
-
- // increase timeout to 100 to have enough time 2 assemble (seems like too little timeouts kill
- req = CouchDB.request("GET", "/" + db_name + "/_changes?feed=" + feed + "&timeout=100");
- var lines = req.responseText.split("\n");
- T(JSON.parse(lines[0]).changes[0].rev == docFoo._rev);
- // the sequence is not fully ordered and a complex structure now
- T(JSON.parse(lines[1]).last_seq[0] == 1);
-
- var xhr;
-
- try {
- xhr = CouchDB.newXhr();
- } catch (err) {
- }
-
- // these will NEVER run as we're always in navigator == undefined
- if (!is_safari && xhr) {
- // Only test the continuous stuff if we have a real XHR object
- // with real async support.
-
- // WebKit (last checked on nightly #47686) does fail on processing
- // the async-request properly while javascript is executed.
-
- xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=" + feed + "&timeout=500"), true);
- xhr.send("");
-
- var docBar = {_id:"bar", bar:1};
- db.save(docBar);
-
- var lines, change1, change2;
- waitForSuccess(function() {
- lines = xhr.responseText.split("\n");
- change1 = JSON.parse(lines[0]);
- change2 = JSON.parse(lines[1]);
- if (change2.seq != 2) {
- throw "bad seq, try again";
- }
- return true;
- }, "bar-only");
-
- T(change1.seq == 1);
- T(change1.id == "foo");
-
- T(change2.seq == 2);
- T(change2.id == "bar");
- T(change2.changes[0].rev == docBar._rev);
-
-
- var docBaz = {_id:"baz", baz:1};
- db.save(docBaz);
-
- var change3;
- waitForSuccess(function() {
- lines = xhr.responseText.split("\n");
- change3 = JSON.parse(lines[2]);
- if (change3.seq != 3) {
- throw "bad seq, try again";
- }
- return true;
- });
-
- T(change3.seq == 3);
- T(change3.id == "baz");
- T(change3.changes[0].rev == docBaz._rev);
-
-
- xhr = CouchDB.newXhr();
-
- //verify the heartbeat newlines are sent
- xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=" + feed + "&heartbeat=10&timeout=500"), true);
- xhr.send("");
-
- var str;
- waitForSuccess(function() {
- str = xhr.responseText;
- if (str.charAt(str.length - 1) != "\n" || str.charAt(str.length - 2) != "\n") {
- throw("keep waiting");
- }
- return true;
- }, "heartbeat");
-
- T(str.charAt(str.length - 1) == "\n");
- T(str.charAt(str.length - 2) == "\n");
-
- // otherwise we'll continue to receive heartbeats forever
- xhr.abort();
- }
- db.deleteDb();
- }
-
- // these will NEVER run as we're always in navigator == undefined
- if (!is_safari && xhr) {
- // test Server Sent Event (eventsource)
- if (!!window.EventSource) {
- var source = new EventSource(
- "/" + db_name + "/_changes?feed=eventsource");
- var results = [];
- var sourceListener = function(e) {
- var data = JSON.parse(e.data);
- results.push(data);
- };
-
- source.addEventListener('message', sourceListener , false);
-
- waitForSuccess(function() {
- if (results.length != 3) {
- throw "bad seq, try again";
- }
- return true;
- });
-
- source.removeEventListener('message', sourceListener, false);
-
- T(results[0].seq == 1);
- T(results[0].id == "foo");
-
- T(results[1].seq == 2);
- T(results[1].id == "bar");
- T(results[1].changes[0].rev == docBar._rev);
- }
-
- // test that we receive EventSource heartbeat events
- if (!!window.EventSource) {
- var source = new EventSource(
- "/" + db_name + "/_changes?feed=eventsource&heartbeat=10");
-
- var count_heartbeats = 0;
- source.addEventListener('heartbeat', function () { count_heartbeats = count_heartbeats + 1; } , false);
-
- waitForSuccess(function() {
- if (count_heartbeats < 3) {
- throw "keep waiting";
- }
- return true;
- }, "eventsource-heartbeat");
-
- T(count_heartbeats >= 3);
- source.close();
- }
-
- // test longpolling
- xhr = CouchDB.newXhr();
-
- xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll"), true);
- xhr.send("");
-
- waitForSuccess(function() {
- lines = xhr.responseText.split("\n");
- if (lines[5] != '"last_seq":3}') {
- throw("still waiting");
- }
- return true;
- }, "last_seq");
-
- xhr = CouchDB.newXhr();
-
- xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll&since=3"), true);
- xhr.send("");
-
- var docBarz = {_id:"barz", bar:1};
- db.save(docBarz);
-
- var parse_changes_line = function(line) {
- if (line.charAt(line.length-1) == ",") {
- var linetrimmed = line.substring(0, line.length-1);
- } else {
- var linetrimmed = line;
- }
- return JSON.parse(linetrimmed);
- };
-
- waitForSuccess(function() {
- lines = xhr.responseText.split("\n");
- if (lines[3] != '"last_seq":4}') {
- throw("still waiting");
- }
- return true;
- }, "change_lines");
-
- var change = parse_changes_line(lines[1]);
- T(change.seq == 4);
- T(change.id == "barz");
- T(change.changes[0].rev == docBarz._rev);
- T(lines[3]=='"last_seq":4}');
-
-
- // test since=now
- xhr = CouchDB.newXhr();
-
- xhr.open("GET", "/" + db_name + "/_changes?feed=longpoll&since=now", true);
- xhr.send("");
-
- var docBarz = {_id:"barzzzz", bar:1};
- db.save(docBarz);
-
- var parse_changes_line = function(line) {
- if (line.charAt(line.length-1) == ",") {
- var linetrimmed = line.substring(0, line.length-1);
- } else {
- var linetrimmed = line;
- }
- return JSON.parse(linetrimmed);
- };
-
- waitForSuccess(function() {
- lines = xhr.responseText.split("\n");
- if (lines[3] != '"last_seq":5}') {
- throw("still waiting");
- }
- return true;
- }, "change_lines");
-
- var change = parse_changes_line(lines[1]);
- T(change.seq == 5);
- T(change.id == "barzzzz");
- T(change.changes[0].rev == docBarz._rev);
- T(lines[3]=='"last_seq":5}');
- }
-
- db.deleteDb();
- // test on a new DB
- var db_name = get_random_db_name();
- db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
- db.createDb();
-
- // test the filtered changes
- var ddoc = {
- _id : "_design/changes_filter",
- "filters" : {
- "bop" : "function(doc, req) { return (doc.bop);}",
- "dynamic" : stringFun(function(doc, req) {
- var field = req.query.field;
- return doc[field];
- }),
- "userCtx" : stringFun(function(doc, req) {
- return doc.user && (doc.user == req.userCtx.name);
- }),
- "conflicted" : "function(doc, req) { return (doc._conflicts);}"
- },
- options : {
- local_seq : true
- },
- views : {
- local_seq : {
- map : "function(doc) {emit(doc._local_seq, null)}"
- },
- blah: {
- map : 'function(doc) {' +
- ' if (doc._id == "blah") {' +
- ' emit(null, null);' +
- ' }' +
- '}'
- }
- }
- };
-
- db.save(ddoc);
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/bop");
- var resp = JSON.parse(req.responseText);
- T(resp.results.length == 0);
-
- var docres1 = db.save({"bop" : "foom"});
- T(docres1.ok);
- var docres2 = db.save({"bop" : false});
- T(docres2.ok);
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/bop");
- var resp = JSON.parse(req.responseText);
- var seqold = resp.results[0].seq;
- T(resp.results.length == 1, "filtered/bop");
- T(resp.results[0].changes[0].rev == docres1.rev, "filtered/bop rev");
- // save and reload (substitute for all those parts that never run)
- var chgdoc1 = db.open(docres1.id);
- chgdoc1.newattr = "s/th new";
- docres1 = db.save(chgdoc1);
- T(docres1.ok);
- req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/bop");
- resp = JSON.parse(req.responseText);
- var seqchg = resp.results[0].seq;
- T(resp.results.length == 1, "filtered/bop new");
- T(resp.results[0].changes[0].rev == docres1.rev, "filtered/bop rev new");
- T(seqold != seqchg, "filtered/bop new seq number");
-
- req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/dynamic&field=woox");
- resp = JSON.parse(req.responseText);
- T(resp.results.length == 0);
-
- req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/dynamic&field=bop");
- resp = JSON.parse(req.responseText);
- T(resp.results.length == 1, "changes_filter/dynamic&field=bop");
- T(resp.results[0].changes[0].rev == docres1.rev, "filtered/dynamic&field=bop rev");
-
- // these will NEVER run as we're always in navigator == undefined
- if (!is_safari && xhr) { // full test requires parallel connections
- // filter with longpoll
- // longpoll filters full history when run without a since seq
- xhr = CouchDB.newXhr();
- xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll&filter=changes_filter/bop"), false);
- xhr.send("");
- var resp = JSON.parse(xhr.responseText);
- T(resp.last_seq == 8);
- // longpoll waits until a matching change before returning
- xhr = CouchDB.newXhr();
- xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll&since=7&filter=changes_filter/bop"), true);
- xhr.send("");
- db.save({"_id":"falsy", "bop" : ""}); // empty string is falsy
- db.save({"_id":"bingo","bop" : "bingo"});
-
- waitForSuccess(function() {
- resp = JSON.parse(xhr.responseText);
- return true;
- }, "longpoll-since");
-
- T(resp.last_seq == 10);
- T(resp.results && resp.results.length > 0 && resp.results[0]["id"] == "bingo", "filter the correct update");
- xhr.abort();
-
- var timeout = 500;
- var last_seq = 11;
- while (true) {
-
- // filter with continuous
- xhr = CouchDB.newXhr();
- xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=continuous&filter=changes_filter/bop&timeout="+timeout), true);
- xhr.send("");
-
- db.save({"_id":"rusty", "bop" : "plankton"});
- T(xhr.readyState != 4, "test client too slow");
- var rusty = db.open("rusty", {cache_bust : new Date()});
- T(rusty._id == "rusty");
-
- waitForSuccess(function() { // throws an error after 5 seconds
- if (xhr.readyState != 4) {
- throw("still waiting");
- }
- return true;
- }, "continuous-rusty");
- lines = xhr.responseText.split("\n");
- var good = false;
- try {
- JSON.parse(lines[3]);
- good = true;
- } catch(e) {
- }
- if (good) {
- T(JSON.parse(lines[1]).id == "bingo", lines[1]);
- T(JSON.parse(lines[2]).id == "rusty", lines[2]);
- T(JSON.parse(lines[3]).last_seq == last_seq, lines[3]);
- break;
- } else {
- xhr.abort();
- db.deleteDoc(rusty);
- timeout = timeout * 2;
- last_seq = last_seq + 2;
- }
- }
- }
- // error conditions
-
- // non-existing design doc
- var req = CouchDB.request("GET",
- "/" + db_name + "/_changes?filter=nothingtosee/bop");
- TEquals(404, req.status, "should return 404 for non existant design doc");
-
- // non-existing filter
- var req = CouchDB.request("GET",
- "/" + db_name + "/_changes?filter=changes_filter/movealong");
- TEquals(404, req.status, "should return 404 for non existant filter fun");
-
- // both
- var req = CouchDB.request("GET",
- "/" + db_name + "/_changes?filter=nothingtosee/movealong");
- TEquals(404, req.status,
- "should return 404 for non existant design doc and filter fun");
-
- // changes get all_docs style with deleted docs
- var doc = {a:1};
- db.save(doc);
- db.deleteDoc(doc);
- var req = CouchDB.request("GET",
- "/" + db_name + "/_changes?filter=changes_filter/bop&style=all_docs");
- var resp = JSON.parse(req.responseText);
- var expect = (!is_safari && xhr) ? 3: 1;
- TEquals(expect, resp.results.length, "should return matching rows");
-
- // test filter on view function (map)
- //
- T(db.save({"_id":"blah", "bop" : "plankton"}).ok);
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=_view&view=changes_filter/blah");
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 1);
- T(resp.results[0].id === "blah");
-
-
- // test for userCtx
-// TODO: either make part of global config, or allow 4 config changes - or leave out
-/*
- run_on_modified_server(
- [{section: "httpd",
- key: "authentication_handlers",
- value: "{couch_httpd_auth, special_test_authentication_handler}"},
- {section:"httpd",
- key: "WWW-Authenticate",
- value: "X-Couch-Test-Auth"}],
-
- function() {
- var authOpts = {"headers":{"WWW-Authenticate": "X-Couch-Test-Auth Chris Anderson:mp3"}};
-
- var req = CouchDB.request("GET", "/_session", authOpts);
- var resp = JSON.parse(req.responseText);
-
- T(db.save({"user" : "Noah Slater"}).ok);
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/userCtx", authOpts);
- var resp = JSON.parse(req.responseText);
- T(resp.results.length == 0);
-
- var docResp = db.save({"user" : "Chris Anderson"});
- T(docResp.ok);
- T(db.ensureFullCommit().ok);
- req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/userCtx", authOpts);
- resp = JSON.parse(req.responseText);
- T(resp.results.length == 1, "userCtx");
- T(resp.results[0].id == docResp.id);
- }
- );
-*/
-
- req = CouchDB.request("GET", "/" + db_name + "/_changes?limit=1");
- resp = JSON.parse(req.responseText);
- TEquals(1, resp.results.length);
-
- //filter includes _conflicts
-// TODO: all_or_nothing not yet in place
-// var id = db.save({'food' : 'pizza'}).id;
-// db.bulkSave([{_id: id, 'food' : 'pasta'}], {all_or_nothing:true});
-//
-// req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/conflicted");
-// resp = JSON.parse(req.responseText);
-// T(resp.results.length == 1, "filter=changes_filter/conflicted");
-
- // test with erlang filter function
-// TODO: either make part of global config, or allow 4 config changes - or leave out
-/*
- run_on_modified_server([{
- section: "native_query_servers",
- key: "erlang",
- value: "{couch_native_process, start_link, []}"
- }], function() {
- var erl_ddoc = {
- _id: "_design/erlang",
- language: "erlang",
- filters: {
- foo:
- 'fun({Doc}, Req) -> ' +
- ' case couch_util:get_value(<<"value">>, Doc) of' +
- ' undefined -> false;' +
- ' Value -> (Value rem 2) =:= 0;' +
- ' _ -> false' +
- ' end ' +
- 'end.'
- }
- };
-
- db.deleteDb();
- db.createDb();
- T(db.save(erl_ddoc).ok);
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=erlang/foo");
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 0);
-
- T(db.save({_id: "doc1", value : 1}).ok);
- T(db.save({_id: "doc2", value : 2}).ok);
- T(db.save({_id: "doc3", value : 3}).ok);
- T(db.save({_id: "doc4", value : 4}).ok);
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=erlang/foo");
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 2);
- T(resp.results[0].id === "doc2");
- T(resp.results[1].id === "doc4");
-
- // test filtering on docids
- //
-
- var options = {
- headers: {"Content-Type": "application/json"},
- body: JSON.stringify({"doc_ids": ["something", "anotherthing", "andmore"]})
- };
-
- var req = CouchDB.request("POST", "/" + db_name + "/_changes?filter=_doc_ids", options);
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 0);
-
- T(db.save({"_id":"something", "bop" : "plankton"}).ok);
- var req = CouchDB.request("POST", "/" + db_name + "/_changes?filter=_doc_ids", options);
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 1);
- T(resp.results[0].id === "something");
-
- T(db.save({"_id":"anotherthing", "bop" : "plankton"}).ok);
- var req = CouchDB.request("POST", "/" + db_name + "/_changes?filter=_doc_ids", options);
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 2);
- T(resp.results[0].id === "something");
- T(resp.results[1].id === "anotherthing");
-
- var docids = JSON.stringify(["something", "anotherthing", "andmore"]),
- req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=_doc_ids&doc_ids="+docids, options);
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 2);
- T(resp.results[0].id === "something");
- T(resp.results[1].id === "anotherthing");
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=_design");
- var resp = JSON.parse(req.responseText);
- T(resp.results.length === 1);
- T(resp.results[0].id === "_design/erlang");
-
-
- if (!is_safari && xhr) {
- // filter docids with continuous
- xhr = CouchDB.newXhr();
- xhr.open("POST", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=continuous&timeout=500&since=7&filter=_doc_ids"), true);
- xhr.setRequestHeader("Content-Type", "application/json");
-
- xhr.send(options.body);
-
- T(db.save({"_id":"andmore", "bop" : "plankton"}).ok);
-
- waitForSuccess(function() {
- if (xhr.readyState != 4) {
- throw("still waiting");
- }
- return true;
- }, "andmore-only");
-
- var line = JSON.parse(xhr.responseText.split("\n")[0]);
- T(line.seq == 8);
- T(line.id == "andmore");
- }
- });
-*/
-
- db.deleteDb();
- // COUCHDB-1037 - empty result for ?limit=1&filter=foo/bar in some cases
- // test w/ new temp DB
- db_name = get_random_db_name();
- db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
- T(db.createDb());
-
- ddoc = {
- _id: "_design/testdocs",
- filters: {
- testdocsonly: (function(doc, req) {
- return (typeof doc.integer === "number");
- }).toString()
- }
- };
- T(db.save(ddoc));
-
- ddoc = {
- _id: "_design/foobar",
- foo: "bar"
- };
- T(db.save(ddoc));
-
- db.bulkSave(makeDocs(0, 5));
-
-// for n>1 you can't be sure all docs are there immediately - so either stick w/ -n 1 or implement check-wait-check or use the quorum (for now, the latter seems 2 suffice)
-
- req = CouchDB.request("GET", "/" + db.name + "/_changes");
- resp = JSON.parse(req.responseText);
- // you can't know wether 7 is the last seq as you don't know how many collapse into one number
- //TEquals(7, resp.last_seq);
- TEquals(7, resp.results.length);
-
- req = CouchDB.request(
- "GET", "/"+ db.name + "/_changes?limit=1&filter=testdocs/testdocsonly");
- resp = JSON.parse(req.responseText);
- // (seq as before)
- //TEquals(3, resp.last_seq);
- TEquals(1, resp.results.length);
- // also, we can't guarantee ordering
- T(resp.results[0].id.match("[0-5]"));
-
- req = CouchDB.request(
- "GET", "/" + db.name + "/_changes?limit=2&filter=testdocs/testdocsonly");
- resp = JSON.parse(req.responseText);
- // (seq as before)
- //TEquals(4, resp.last_seq);
- TEquals(2, resp.results.length);
- // also, we can't guarantee ordering
- T(resp.results[0].id.match("[0-5]"));
- T(resp.results[1].id.match("[0-5]"));
-
-// TODO: either use local port for stats (and aggregate when n>1) or leave out
-// TEquals(0, CouchDB.requestStats(['couchdb', 'httpd', 'clients_requesting_changes'], true).value);
-// CouchDB.request("GET", "/" + db.name + "/_changes");
-// TEquals(0, CouchDB.requestStats(['couchdb', 'httpd', 'clients_requesting_changes'], true).value);
-
- db.deleteDb();
- // COUCHDB-1256
- // test w/ new temp DB
- db_name = get_random_db_name();
- db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
- T(db.createDb());
-
- T(db.save({"_id":"foo", "a" : 123}).ok);
- T(db.save({"_id":"bar", "a" : 456}).ok);
-
- options = {
- headers: {"Content-Type": "application/json"},
- body: JSON.stringify({"_rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a", "a":456})
- };
- req = CouchDB.request("PUT", "/" + db.name + "/foo?new_edits=false", options);
-
- req = CouchDB.request("GET", "/" + db.name + "/_changes?style=all_docs");
- resp = JSON.parse(req.responseText);
-
- // (seq as before)
- //TEquals(3, resp.last_seq);
- TEquals(2, resp.results.length);
-
- // we can no longer pass a number into 'since' - but we have the 2nd last above - so we can use it (puh!)
- req = CouchDB.request("GET", "/" + db.name + "/_changes?style=all_docs&since=" + encodeURIComponent(resp.results[0].seq));
- resp = JSON.parse(req.responseText);
-
- // (seq as before)
- //TEquals(3, resp.last_seq);
- TEquals(1, resp.results.length);
- // TEquals(2, resp.results[0].changes.length);
-
- db.deleteDb();
- // COUCHDB-1852
- // test w/ new temp DB
- db_name = get_random_db_name();
- db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
- T(db.createDb());
-
- // create 4 documents... this assumes the update sequnce will start from 0 and then do sth in the cluster
- db.save({"bop" : "foom"});
- db.save({"bop" : "foom"});
- db.save({"bop" : "foom"});
- db.save({"bop" : "foom"});
- // because of clustering, we need the 2nd entry as since value
- req = CouchDB.request("GET", "/" + db_name + "/_changes");
-
- // simulate an EventSource request with a Last-Event-ID header
- // increase timeout to 100 to have enough time 2 assemble (seems like too little timeouts kill
- req = CouchDB.request("GET", "/" + db_name + "/_changes?feed=eventsource&timeout=100&since=0",
- {"headers": {"Accept": "text/event-stream", "Last-Event-ID": JSON.parse(req.responseText).results[1].seq}});
-
- // "parse" the eventsource response and collect only the "id: ..." lines
- var changes = req.responseText.split('\n')
- .map(function (el) {
- return el.split(":").map(function (el) { return el.trim()});
- })
- .filter(function (el) { return (el[0] === "id"); })
-
- // make sure we only got 2 changes, and they are update_seq=3 and update_seq=4
- T(changes.length === 2);
- // seq is different now
- //T(changes[0][1] === "3");
- //T(changes[1][1] === "4");
-
- db.deleteDb();
- // COUCHDB-1923
- // test w/ new temp DB
- db_name = get_random_db_name();
- db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
- T(db.createDb());
-
- var attachmentData = "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ=";
-
- db.bulkSave(makeDocs(20, 30, {
- _attachments:{
- "foo.txt": {
- content_type:"text/plain",
- data: attachmentData
- },
- "bar.txt": {
- content_type:"text/plain",
- data: attachmentData
- }
- }
- }));
-
- var mapFunction = function(doc) {
- var count = 0;
-
- for(var idx in doc._attachments) {
- count = count + 1;
- }
-
- emit(parseInt(doc._id), count);
- };
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?include_docs=true");
- var resp = JSON.parse(req.responseText);
-
- T(resp.results.length == 10);
- T(resp.results[0].doc._attachments['foo.txt'].stub === true);
- T(resp.results[0].doc._attachments['foo.txt'].data === undefined);
- T(resp.results[0].doc._attachments['foo.txt'].encoding === undefined);
- T(resp.results[0].doc._attachments['foo.txt'].encoded_length === undefined);
- T(resp.results[0].doc._attachments['bar.txt'].stub === true);
- T(resp.results[0].doc._attachments['bar.txt'].data === undefined);
- T(resp.results[0].doc._attachments['bar.txt'].encoding === undefined);
- T(resp.results[0].doc._attachments['bar.txt'].encoded_length === undefined);
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?include_docs=true&attachments=true");
- var resp = JSON.parse(req.responseText);
-
- T(resp.results.length == 10);
- T(resp.results[0].doc._attachments['foo.txt'].stub === undefined);
- T(resp.results[0].doc._attachments['foo.txt'].data === attachmentData);
- T(resp.results[0].doc._attachments['foo.txt'].encoding === undefined);
- T(resp.results[0].doc._attachments['foo.txt'].encoded_length === undefined);
- T(resp.results[0].doc._attachments['bar.txt'].stub === undefined);
- T(resp.results[0].doc._attachments['bar.txt'].data == attachmentData);
- T(resp.results[0].doc._attachments['bar.txt'].encoding === undefined);
- T(resp.results[0].doc._attachments['bar.txt'].encoded_length === undefined);
-
- var req = CouchDB.request("GET", "/" + db_name + "/_changes?include_docs=true&att_encoding_info=true");
- var resp = JSON.parse(req.responseText);
-
- T(resp.results.length == 10);
- T(resp.results[0].doc._attachments['foo.txt'].stub === true);
- T(resp.results[0].doc._attachments['foo.txt'].data === undefined);
- T(resp.results[0].doc._attachments['foo.txt'].encoding === "gzip");
- T(resp.results[0].doc._attachments['foo.txt'].encoded_length === 47);
- T(resp.results[0].doc._attachments['bar.txt'].stub === true);
- T(resp.results[0].doc._attachments['bar.txt'].data === undefined);
- T(resp.results[0].doc._attachments['bar.txt'].encoding === "gzip");
- T(resp.results[0].doc._attachments['bar.txt'].encoded_length === 47);
-
- db.deleteDb();
-};