diff options
Diffstat (limited to 'test/javascript/tests/list_views.js')
-rw-r--r-- | test/javascript/tests/list_views.js | 502 |
1 files changed, 0 insertions, 502 deletions
diff --git a/test/javascript/tests/list_views.js b/test/javascript/tests/list_views.js deleted file mode 100644 index 2d74586fe..000000000 --- a/test/javascript/tests/list_views.js +++ /dev/null @@ -1,502 +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; -couchTests.list_views = function(debug) { - - var db_name = get_random_db_name(); - var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"}); - db.createDb(); - if (debug) debugger; - - var designDoc = { - _id:"_design/lists", - language: "javascript", - views : { - basicView : { - map : stringFun(function(doc) { - emit(doc.integer, doc.string); - }) - }, - withReduce : { - map : stringFun(function(doc) { - emit(doc.integer, doc.string); - }), - reduce : stringFun(function(keys, values, rereduce) { - if (rereduce) { - return sum(values); - } else { - return values.length; - } - }) - } - }, - lists: { - basicBasic : stringFun(function(head, req) { - send("head"); - var row; - while(row = getRow()) { - log("row: "+toJSON(row)); - send(row.key); - }; - return "tail"; - }), - basicJSON : stringFun(function(head, req) { - start({"headers":{"Content-Type" : "application/json"}}); - send('{"head":'+toJSON(head)+', '); - send('"req":'+toJSON(req)+', '); - send('"rows":['); - var row, sep = ''; - while (row = getRow()) { - send(sep + toJSON(row)); - sep = ', '; - } - return "]}"; - }), - simpleForm: stringFun(function(head, req) { - log("simpleForm"); - send('<ul>'); - var row, row_number = 0, prevKey, firstKey = null; - while (row = getRow()) { - row_number += 1; - if (!firstKey) firstKey = row.key; - prevKey = row.key; - send('\n<li>Key: '+row.key - +' Value: '+row.value - +' LineNo: '+row_number+'</li>'); - } - return '</ul><p>FirstKey: '+ firstKey + ' LastKey: '+ prevKey+'</p>'; - }), - acceptSwitch: stringFun(function(head, req) { - // respondWith takes care of setting the proper headers - provides("html", function() { - send("HTML <ul>"); - - var row, num = 0; - while (row = getRow()) { - num ++; - send('\n<li>Key: ' - +row.key+' Value: '+row.value - +' LineNo: '+num+'</li>'); - } - - // tail - return '</ul>'; - }); - }), - qsParams: stringFun(function(head, req) { - return toJSON(req.query) + "\n"; - }), - stopIter: stringFun(function(req) { - send("head"); - var row, row_number = 0; - while(row = getRow()) { - if(row_number > 2) break; - send(" " + row_number); - row_number += 1; - }; - return " tail"; - }), - stopIter2: stringFun(function(head, req) { - provides("html", function() { - send("head"); - var row, row_number = 0; - while(row = getRow()) { - if(row_number > 2) break; - send(" " + row_number); - row_number += 1; - }; - return " tail"; - }); - }), - tooManyGetRows : stringFun(function() { - send("head"); - var row; - while(row = getRow()) { - send(row.key); - }; - getRow(); - getRow(); - getRow(); - row = getRow(); - return "after row: "+toJSON(row); - }), - emptyList: stringFun(function() { - return " "; - }), - rowError : stringFun(function(head, req) { - send("head"); - var row = getRow(); - send(fooBarBam); // intentional error - return "tail"; - }), - docReference : stringFun(function(head, req) { - send("head"); - var row = getRow(); - send(row.doc.integer); - return "tail"; - }), - secObj: stringFun(function(head, req) { - return toJSON(req.secObj); - }), - setHeaderAfterGotRow: stringFun(function(head, req) { - getRow(); - start({ - code: 400, - headers: { - "X-My-Header": "MyHeader" - } - }); - send("bad request"); - }), - allDocs: stringFun(function(head, req){ - start({'headers': {'Content-Type': 'application/json'}}); - var resp = head; - var rows = []; - while(row=getRow()){ - rows.push(row); - } - resp.rows = rows; - return toJSON(resp); - }) - } - }; - var viewOnlyDesignDoc = { - _id:"_design/views", - language: "javascript", - views : { - basicView : { - map : stringFun(function(doc) { - emit(-doc.integer, doc.string); - }) - } - } - }; - var erlListDoc = { - _id: "_design/erlang", - language: "erlang", - lists: { - simple: - 'fun(Head, {Req}) -> ' + - ' Send(<<"[">>), ' + - ' Fun = fun({Row}, Sep) -> ' + - ' Val = couch_util:get_value(<<"key">>, Row, 23), ' + - ' Send(list_to_binary(Sep ++ integer_to_list(Val))), ' + - ' {ok, ","} ' + - ' end, ' + - ' {ok, _} = FoldRows(Fun, ""), ' + - ' Send(<<"]">>) ' + - 'end.' - } - }; - - T(db.save(designDoc).ok); - - var docs = makeDocs(0, 10); - db.bulkSave(docs); - - var view = db.view('lists/basicView'); - T(view.total_rows == 10); - - // standard get - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/basicBasic/basicView"); - T(xhr.status == 200, "standard get should be 200"); - T(/head0123456789tail/.test(xhr.responseText)); - - // standard options - works though it does not make lots of sense - var xhr = CouchDB.request("OPTIONS", "/" + db_name + "/_design/lists/_list/basicBasic/basicView"); - T(xhr.status == 200, "standard get should be 200"); - T(/head0123456789tail/.test(xhr.responseText)); - - // TODO: test that etags are available - actually they're not (yet): https://issues.apache.org/jira/browse/COUCHDB-2859 - //var etag = xhr.getResponseHeader("etag"); - //xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/basicBasic/basicView", { - // headers: {"if-none-match": etag} - //}); - //T(xhr.status == 304); - - // confirm ETag changes with different POST bodies - // (not yet - see above) - //xhr = CouchDB.request("POST", "/" + db_name + "/_design/lists/_list/basicBasic/basicView", - // {body: JSON.stringify({keys:[1]})} - //); - //var etag1 = xhr.getResponseHeader("etag"); - //xhr = CouchDB.request("POST", "/" + db_name + "/_design/lists/_list/basicBasic/basicView", - // {body: JSON.stringify({keys:[2]})} - //); - //var etag2 = xhr.getResponseHeader("etag"); - //T(etag1 != etag2, "POST to map _list generates key-depdendent ETags"); - - // test the richness of the arguments - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/basicJSON/basicView?update_seq=true"); - T(xhr.status == 200, "standard get should be 200"); - var resp = JSON.parse(xhr.responseText); - TEquals(10, resp.head.total_rows); - TEquals(0, resp.head.offset); - // we don't have a (meaningful) update seq in a clustered env - //TEquals(11, resp.head.update_seq); - - T(resp.rows.length == 10); - TEquals(resp.rows[0], {"id": "0","key": 0,"value": "0"}); - - TEquals(resp.req.info.db_name, "" + db_name + ""); - TEquals(resp.req.method, "GET"); - TEquals(resp.req.path, [ - "" + db_name + "", - "_design", - "lists", - "_list", - "basicJSON", - "basicView" - ]); - T(resp.req.headers.Accept); - T(resp.req.headers.Host); - T(resp.req.headers["User-Agent"]); - T(resp.req.cookie); - TEquals("/" + db_name + "/_design/lists/_list/basicJSON/basicView?update_seq=true", - resp.req.raw_path, "should include raw path"); - - // get with query params - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/basicView?startkey=3&endkey=8"); - T(xhr.status == 200, "with query params"); - T(!(/Key: 1/.test(xhr.responseText))); - T(/FirstKey: 3/.test(xhr.responseText)); - T(/LastKey: 8/.test(xhr.responseText)); - - // with 0 rows - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/basicView?startkey=30"); - T(xhr.status == 200, "0 rows"); - T(/<\/ul>/.test(xhr.responseText)); - - //too many Get Rows - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/tooManyGetRows/basicView"); - T(xhr.status == 200, "tooManyGetRows"); - T(/9after row: null/.test(xhr.responseText)); - - - // reduce with 0 rows - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?startkey=30"); - T(xhr.status == 200, "reduce 0 rows"); - T(/LastKey: undefined/.test(xhr.responseText)); - - // when there is a reduce present, but not used - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?reduce=false"); - T(xhr.status == 200, "reduce false"); - T(/Key: 1/.test(xhr.responseText)); - - - // when there is a reduce present, and used - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?group=true"); - T(xhr.status == 200, "group reduce"); - T(/Key: 1/.test(xhr.responseText)); - - // there should be etags on reduce as well - // (see above 4 etags) - //var etag = xhr.getResponseHeader("etag"); - //T(etag, "Etags should be served with reduce lists"); - //xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?group=true", { - // headers: {"if-none-match": etag} - //}); - //T(xhr.status == 304); - - // confirm ETag changes with different POST bodies - // (see above) - //xhr = CouchDB.request("POST", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?group=true", - // {body: JSON.stringify({keys:[1]})} - //); - //var etag1 = xhr.getResponseHeader("etag"); - //xhr = CouchDB.request("POST", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?group=true", - // {body: JSON.stringify({keys:[2]})} - //); - //var etag2 = xhr.getResponseHeader("etag"); - //T(etag1 != etag2, "POST to reduce _list generates key-depdendent ETags"); - - // verify the etags expire correctly - var docs = makeDocs(11, 12); - db.bulkSave(docs); - - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?group=true", { - // will always be 200 as etags don't make sense (see above) - //headers: {"if-none-match": etag} - }); - T(xhr.status == 200, "reduce etag"); - - // empty list - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/emptyList/basicView"); - T(xhr.responseText.match(/^ $/)); - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/emptyList/withReduce?group=true"); - T(xhr.responseText.match(/^ $/)); - - // multi-key fetch - var xhr = CouchDB.request("POST", "/" + db_name + "/_design/lists/_list/simpleForm/basicView", { - body: '{"keys":[2,4,5,7]}' - }); - T(xhr.status == 200, "multi key"); - T(!(/Key: 1 /.test(xhr.responseText))); - T(/Key: 2/.test(xhr.responseText)); - T(/FirstKey: 2/.test(xhr.responseText)); - T(/LastKey: 7/.test(xhr.responseText)); - - // multi-key fetch with GET - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/simpleForm/basicView" + - "?keys=[2,4,5,7]"); - - T(xhr.status == 200, "multi key"); - T(!(/Key: 1 /.test(xhr.responseText))); - T(/Key: 2/.test(xhr.responseText)); - T(/FirstKey: 2/.test(xhr.responseText)); - T(/LastKey: 7/.test(xhr.responseText)); - - // no multi-key fetch allowed when group=false - xhr = CouchDB.request("POST", "/" + db_name + "/_design/lists/_list/simpleForm/withReduce?group=false", { - body: '{"keys":[2,4,5,7]}' - }); - T(xhr.status == 400); - T(/query_parse_error/.test(xhr.responseText)); - - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/rowError/basicView"); - T(/ReferenceError/.test(xhr.responseText)); - - - // with include_docs and a reference to the doc. - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/docReference/basicView?include_docs=true"); - T(xhr.responseText.match(/head0tail/)); - - // now with extra qs params - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/qsParams/basicView?foo=blam"); - T(xhr.responseText.match(/blam/)); - - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/stopIter/basicView"); - // T(xhr.getResponseHeader("Content-Type") == "text/plain"); - T(xhr.responseText.match(/^head 0 1 2 tail$/) && "basic stop"); - - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/stopIter2/basicView", { - headers : { - "Accept" : "text/html" - } - }); - T(xhr.responseText.match(/^head 0 1 2 tail$/) && "stop 2"); - - // aborting iteration with reduce - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/stopIter/withReduce?group=true"); - T(xhr.responseText.match(/^head 0 1 2 tail$/) && "reduce stop"); - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/stopIter2/withReduce?group=true", { - headers : { - "Accept" : "text/html" - } - }); - T(xhr.responseText.match(/^head 0 1 2 tail$/) && "reduce stop 2"); - - // with accept headers for HTML - xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/acceptSwitch/basicView", { - headers: { - "Accept": 'text/html' - } - }); - T(xhr.getResponseHeader("Content-Type") == "text/html; charset=utf-8"); - T(xhr.responseText.match(/HTML/)); - T(xhr.responseText.match(/Value/)); - - // Test we can run lists and views from separate docs. - T(db.save(viewOnlyDesignDoc).ok); - var url = "/" + db_name + "/_design/lists/_list/simpleForm/views/basicView" + - "?startkey=-3"; - xhr = CouchDB.request("GET", url); - T(xhr.status == 200, "multiple design docs."); - T(!(/Key: -4/.test(xhr.responseText))); - T(/FirstKey: -3/.test(xhr.responseText)); - T(/LastKey: 0/.test(xhr.responseText)); - - // Test we do multi-key requests on lists and views in separate docs. - var url = "/" + db_name + "/_design/lists/_list/simpleForm/views/basicView"; - xhr = CouchDB.request("POST", url, { - body: '{"keys":[-2,-4,-5,-7]}' - }); - - T(xhr.status == 200, "multi key separate docs"); - T(!(/Key: -3/.test(xhr.responseText))); - T(/Key: -7/.test(xhr.responseText)); - T(/FirstKey: -2/.test(xhr.responseText)); - T(/LastKey: -7/.test(xhr.responseText)); - - // Test if secObj is available - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/secObj/basicView"); - T(xhr.status == 200, "standard get should be 200"); - var resp = JSON.parse(xhr.responseText); - T(typeof(resp) == "object"); - - var erlViewTest = function() { - T(db.save(erlListDoc).ok); - var url = "/" + db_name + "/_design/erlang/_list/simple/views/basicView" + - "?startkey=-3"; - xhr = CouchDB.request("GET", url); - T(xhr.status == 200, "multiple languages in design docs."); - var list = JSON.parse(xhr.responseText); - T(list.length == 4); - for(var i = 0; i < list.length; i++) - { - T(list[i] + 3 == i); - } - }; - - // make _config available 4 tests or leave commented out - //run_on_modified_server([{ - // section: "native_query_servers", - // key: "erlang", - // value: "{couch_native_process, start_link, []}" - //}], erlViewTest); - - // COUCHDB-1113 - var ddoc = { - _id: "_design/test", - views: { - me: { - map: (function(doc) { emit(null,null)}).toString() - } - }, - lists: { - you: (function(head, req) { - var row; - while(row = getRow()) { - send(row); - } - }).toString() - } - }; - db.save(ddoc); - - var resp = CouchDB.request("GET", "/" + db.name + "/_design/test/_list/you/me", { - headers: { - "Content-Type": "application/x-www-form-urlencoded" - } - }); - TEquals(200, resp.status, "should return a 200 response"); - - // TEST HTTP header response set after getRow() called in _list function. - var xhr = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/setHeaderAfterGotRow/basicView"); - T(xhr.status == 400); - T(xhr.getResponseHeader("X-My-Header") == "MyHeader"); - T(xhr.responseText.match(/^bad request$/)); - - // test handling _all_docs by _list functions. the result should be equal - var xhr_lAllDocs = CouchDB.request("GET", "/" + db_name + "/_design/lists/_list/allDocs/_all_docs"); - T(xhr_lAllDocs.status == 200, "standard get should be 200"); - var xhr_allDocs = CouchDB.request("GET", "/" + db_name + "/_all_docs"); - var allDocs = JSON.parse(xhr_allDocs.responseText); - var lAllDocs = JSON.parse(xhr_lAllDocs.responseText); - TEquals(allDocs.total_rows, lAllDocs.total_rows, "total_rows mismatch"); - TEquals(allDocs.offset, lAllDocs.offset, "offset mismatch"); - TEquals(allDocs.rows.length, lAllDocs.rows.length, "amount of rows mismatch"); - TEquals(allDocs.rows, lAllDocs.rows, "rows mismatch"); - - // cleanup - db.deleteDb(); -}; |