summaryrefslogtreecommitdiff
path: root/share/www/script/test/changes.js
diff options
context:
space:
mode:
Diffstat (limited to 'share/www/script/test/changes.js')
-rw-r--r--share/www/script/test/changes.js144
1 files changed, 101 insertions, 43 deletions
diff --git a/share/www/script/test/changes.js b/share/www/script/test/changes.js
index 19e22fd00..d76c19378 100644
--- a/share/www/script/test/changes.js
+++ b/share/www/script/test/changes.js
@@ -30,7 +30,7 @@ couchTests.changes = function(debug) {
T(db.save(docFoo).ok);
T(db.ensureFullCommit().ok);
T(db.open(docFoo._id)._id == docFoo._id);
-
+
req = CouchDB.request("GET", "/test_suite_db/_changes");
var resp = JSON.parse(req.responseText);
@@ -39,7 +39,7 @@ couchTests.changes = function(debug) {
T(resp.results[0].changes[0].rev == docFoo._rev);
// test with callback
-
+
run_on_modified_server(
[{section: "httpd",
key: "allow_jsonp",
@@ -78,12 +78,12 @@ couchTests.changes = function(debug) {
// WebKit (last checked on nightly #47686) does fail on processing
// the async-request properly while javascript is executed.
- xhr.open("GET", "/test_suite_db/_changes?feed=continuous&timeout=500", true);
+ xhr.open("GET", CouchDB.proxyUrl("/test_suite_db/_changes?feed=continuous&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");
@@ -96,12 +96,12 @@ couchTests.changes = function(debug) {
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);
@@ -113,7 +113,7 @@ couchTests.changes = function(debug) {
throw "bad seq, try again";
}
});
-
+
T(change3.seq == 3);
T(change3.id == "baz");
T(change3.changes[0].rev == docBaz._rev);
@@ -122,9 +122,9 @@ couchTests.changes = function(debug) {
xhr = CouchDB.newXhr();
//verify the hearbeat newlines are sent
- xhr.open("GET", "/test_suite_db/_changes?feed=continuous&heartbeat=10&timeout=500", true);
+ xhr.open("GET", CouchDB.proxyUrl("/test_suite_db/_changes?feed=continuous&heartbeat=10&timeout=500"), true);
xhr.send("");
-
+
var str;
waitForSuccess(function() {
str = xhr.responseText;
@@ -139,27 +139,54 @@ couchTests.changes = function(debug) {
// otherwise we'll continue to receive heartbeats forever
xhr.abort();
+ // test Server Sent Event (eventsource)
+ if (!!window.EventSource) {
+ var source = new EventSource(
+ "/test_suite_db/_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";
+ });
+
+ 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 longpolling
xhr = CouchDB.newXhr();
- xhr.open("GET", "/test_suite_db/_changes?feed=longpoll", true);
+ xhr.open("GET", CouchDB.proxyUrl("/test_suite_db/_changes?feed=longpoll"), true);
xhr.send("");
-
+
waitForSuccess(function() {
lines = xhr.responseText.split("\n");
if (lines[5] != '"last_seq":3}') {
throw("still waiting");
}
}, "last_seq");
-
+
xhr = CouchDB.newXhr();
- xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&since=3", true);
+ xhr.open("GET", CouchDB.proxyUrl("/test_suite_db/_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);
@@ -168,14 +195,14 @@ couchTests.changes = function(debug) {
}
return JSON.parse(linetrimmed);
};
-
+
waitForSuccess(function() {
lines = xhr.responseText.split("\n");
if (lines[3] != '"last_seq":4}') {
throw("still waiting");
}
}, "change_lines");
-
+
var change = parse_changes_line(lines[1]);
T(change.seq == 4);
T(change.id == "barz");
@@ -183,8 +210,40 @@ couchTests.changes = function(debug) {
T(lines[3]=='"last_seq":4}');
+ // test since=now
+ xhr = CouchDB.newXhr();
+
+ xhr.open("GET", "/test_suite_db/_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");
+ }
+ }, "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}');
+
+
}
-
+
// test the filtered changes
var ddoc = {
_id : "_design/changes_filter",
@@ -224,15 +283,15 @@ couchTests.changes = function(debug) {
db.save({"bop" : "foom"});
db.save({"bop" : false});
-
+
var req = CouchDB.request("GET", "/test_suite_db/_changes?filter=changes_filter/bop");
var resp = JSON.parse(req.responseText);
T(resp.results.length == 1, "filtered/bop");
-
+
req = CouchDB.request("GET", "/test_suite_db/_changes?filter=changes_filter/dynamic&field=woox");
resp = JSON.parse(req.responseText);
T(resp.results.length == 0);
-
+
req = CouchDB.request("GET", "/test_suite_db/_changes?filter=changes_filter/dynamic&field=bop");
resp = JSON.parse(req.responseText);
T(resp.results.length == 1, "changes_filter/dynamic&field=bop");
@@ -241,32 +300,32 @@ couchTests.changes = function(debug) {
// filter with longpoll
// longpoll filters full history when run without a since seq
xhr = CouchDB.newXhr();
- xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&filter=changes_filter/bop", false);
+ xhr.open("GET", CouchDB.proxyUrl("/test_suite_db/_changes?feed=longpoll&filter=changes_filter/bop"), false);
xhr.send("");
var resp = JSON.parse(xhr.responseText);
- T(resp.last_seq == 7);
+ T(resp.last_seq == 8);
// longpoll waits until a matching change before returning
xhr = CouchDB.newXhr();
- xhr.open("GET", "/test_suite_db/_changes?feed=longpoll&since=7&filter=changes_filter/bop", true);
+ xhr.open("GET", CouchDB.proxyUrl("/test_suite_db/_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);
}, "longpoll-since");
-
- T(resp.last_seq == 9);
+
+ 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 = 10;
+ var last_seq = 11;
while (true) {
// filter with continuous
xhr = CouchDB.newXhr();
- xhr.open("GET", "/test_suite_db/_changes?feed=continuous&filter=changes_filter/bop&timeout="+timeout, true);
+ xhr.open("GET", CouchDB.proxyUrl("/test_suite_db/_changes?feed=continuous&filter=changes_filter/bop&timeout="+timeout), true);
xhr.send("");
db.save({"_id":"rusty", "bop" : "plankton"});
@@ -302,31 +361,31 @@ couchTests.changes = function(debug) {
// error conditions
// non-existing design doc
- var req = CouchDB.request("GET",
+ var req = CouchDB.request("GET",
"/test_suite_db/_changes?filter=nothingtosee/bop");
TEquals(404, req.status, "should return 404 for non existant design doc");
- // non-existing filter
- var req = CouchDB.request("GET",
+ // non-existing filter
+ var req = CouchDB.request("GET",
"/test_suite_db/_changes?filter=changes_filter/movealong");
TEquals(404, req.status, "should return 404 for non existant filter fun");
// both
- var req = CouchDB.request("GET",
+ var req = CouchDB.request("GET",
"/test_suite_db/_changes?filter=nothingtosee/movealong");
- TEquals(404, req.status,
+ 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",
+ var req = CouchDB.request("GET",
"/test_suite_db/_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);
@@ -350,7 +409,7 @@ couchTests.changes = function(debug) {
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", "/test_suite_db/_changes?filter=changes_filter/userCtx", authOpts);
var resp = JSON.parse(req.responseText);
@@ -442,7 +501,7 @@ couchTests.changes = function(debug) {
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", "/test_suite_db/_changes?filter=_doc_ids&doc_ids="+docids, options);
var resp = JSON.parse(req.responseText);
@@ -459,11 +518,11 @@ couchTests.changes = function(debug) {
if (!is_safari && xhr) {
// filter docids with continuous
xhr = CouchDB.newXhr();
- xhr.open("POST", "/test_suite_db/_changes?feed=continuous&timeout=500&since=7&filter=_doc_ids", true);
+ xhr.open("POST", CouchDB.proxyUrl("/test_suite_db/_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() {
@@ -553,4 +612,3 @@ couchTests.changes = function(debug) {
// cleanup
db.deleteDb();
};
-