From 36cab968902cea4f0b0473ae279223f3571e4657 Mon Sep 17 00:00:00 2001 From: Clint Talbert Date: Tue, 18 Aug 2009 10:06:11 +0200 Subject: [PATCH] Bug 432723 - Update Places Query API testing set with new tests, r=dietrich --- .../places/tests/queries/head_queries.js | 4 +- .../places/tests/queries/test_415716.js | 151 +++++++++++++++++ .../tests/queries/test_results-as-visit.js | 128 +++++++++++++++ .../tests/queries/test_searchterms-domain.js | 154 ++++++++++++++++++ 4 files changed, 435 insertions(+), 2 deletions(-) create mode 100644 toolkit/components/places/tests/queries/test_415716.js create mode 100644 toolkit/components/places/tests/queries/test_results-as-visit.js create mode 100644 toolkit/components/places/tests/queries/test_searchterms-domain.js diff --git a/toolkit/components/places/tests/queries/head_queries.js b/toolkit/components/places/tests/queries/head_queries.js index 0c1926405e7..8ca121257b8 100644 --- a/toolkit/components/places/tests/queries/head_queries.js +++ b/toolkit/components/places/tests/queries/head_queries.js @@ -440,8 +440,8 @@ function displayResultSet(aRoot) { } for (var i=0; i < aRoot.childCount; ++i) { - LOG("Result Set URI: " + aRoot.getChild(i).uri + " Title: " + - aRoot.getChild(i).title); + LOG("Result Set URI: " + aRoot.getChild(i).uri + " Title: " + + aRoot.getChild(i).title + " Visit Time: " + aRoot.getChild(i).time); } } diff --git a/toolkit/components/places/tests/queries/test_415716.js b/toolkit/components/places/tests/queries/test_415716.js new file mode 100644 index 00000000000..54f504c6c05 --- /dev/null +++ b/toolkit/components/places/tests/queries/test_415716.js @@ -0,0 +1,151 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et: */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Mozilla Corporation + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Clint Talbert + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +try { + var histsvc = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService); +} catch(ex) { + do_throw("Could not get history service\n"); +} + +// Get annotation service +try { + var annosvc= Cc["@mozilla.org/browser/annotation-service;1"].getService(Ci.nsIAnnotationService); +} catch(ex) { + do_throw("Could not get annotation service\n"); +} + +function add_visit(aURI, aDate, aReferrer, aType, isRedirect, aSessionID) { + var placeID = histsvc.addVisit(aURI, + aDate, + aReferrer, + aType, + isRedirect, + aSessionID); + do_check_true(placeID > 0); + return placeID; +} + +function modHistoryTypes(val){ + switch(val % 7) { + case 0: + case 1: + return histsvc.TRANSITION_LINK; + case 2: + return histsvc.TRANSITION_TYPED; + case 3: + return histsvc.TRANSITION_BOOKMARK; + case 4: + return histsvc.TRANSITION_EMBED; + case 5: + return histsvc.TRANSITION_REDIRECT_PERMANENT; + case 6: + return histsvc.TRANSITION_REDIRECT_TEMPORARY; + case 7: + return histsvc.TRANSITION_DOWNLOAD; + } + return histsvc.TRANSITION_TYPED; +} + +/** + * Builds a test database by hand using various times, annotations and + * visit numbers for this test + */ +function buildTestDatabase() { + // This is the set of visits that we will match - our min visit is 2 so that's + // why we add more visits to the same URIs. + var testURI = uri("http://www.foo.com"); + var testAnnoName = "moz-test-places/testing123"; + var testAnnoVal = "test"; + + for (var i=0; i < 12; ++i) + add_visit(testURI, + today, + null, + modHistoryTypes(i), // will work with different values, for ex: histsvc.TRANSITION_TYPED, + false, + 0); + + testURI = uri("http://foo.com/youdontseeme.html"); + annosvc.setPageAnnotation(testURI, testAnnoName, testAnnoVal, 0, 0); + for (var i=0; i < 12; ++i) + add_visit(testURI, + today, + null, + modHistoryTypes(i), // will work with different values, for ex: histsvc.TRANSITION_TYPED, + false, + 0); +} + +/** + * This test will test Queries that use relative Time Range, minVists, maxVisits, + * annotation. + * The Query: + * Annotation == "moz-test-places/testing123" && + * TimeRange == "now() - 2d" && + * minVisits == 2 && + * maxVisits == 10 + */ +function run_test() { + buildTestDatabase(); + var query = histsvc.getNewQuery(); + query.annotation = "moz-test-places/testing123"; + query.beginTime = daybefore * 1000; + query.beginTimeReference = histsvc.TIME_RELATIVE_NOW; + query.endTime = today * 1000; + query.endTimeReference = histsvc.TIME_RELATIVE_NOW; + query.minVisits = 2; + query.maxVisits = 10; + + // Options + var options = histsvc.getNewQueryOptions(); + options.sortingMode = options.SORT_BY_DATE_DESCENDING; + options.resultType = options.RESULTS_AS_VISIT; + + // Results + var result = histsvc.executeQuery(query, options); + var root = result.root; + root.containerOpen = true; + var cc = root.childCount; + dump("----> cc is: " + cc + "\n"); + for(var i=0; i < root.childCount; ++i) { + var resultNode = root.getChild(i); + var accesstime = Date(resultNode.time); + dump("----> result: " + resultNode.uri + " Date: " + accesstime.toLocaleString() + "\n"); + } + do_check_eq(cc,0); +} diff --git a/toolkit/components/places/tests/queries/test_results-as-visit.js b/toolkit/components/places/tests/queries/test_results-as-visit.js new file mode 100644 index 00000000000..4b640ce1cd3 --- /dev/null +++ b/toolkit/components/places/tests/queries/test_results-as-visit.js @@ -0,0 +1,128 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et: */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Places Test code. + * + * The Initial Developer of the Original Code is Mozilla Corporation + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Clint Talbert + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +var testData = []; + +function createTestData() { + function generateVisits(aObj, aNum) { + for(var i=0; i < aNum; i++) + testData.push(aObj); + } + generateVisits({isInQuery: true, isDetails: true, title: "amo", + uri: "http://foo.com/", lastVisit: lastweek, isTag: true, + tagArray: ["moz"]}, 3); + generateVisits({isInQuery: true, isDetails: true, isTag: true, + title: "bMoz", tagArray: ["bugzilla"], uri: "http://moilla.com/", + lastVisit: yesterday}, 5); + generateVisits({isInQuery: true, isDetails: true, title: "C Moz", + uri: "http://foo.mail.com/changeme1.html"}, 7); + generateVisits({isInQuery: false, isVisit: true, isTag: true, tagArray: ["moz"], + uri: "http://foo.change.co/changeme2.html"}, 1); + generateVisits({isInQuery: false, isVisit: true, isDetails: true, + title: "zydeco", uri: "http://foo.com/changeme3.html"}, 5); +} + + /** + * This test will test Queries that use relative search terms and URI options + */ + function run_test() { + createTestData(); + populateDB(testData); + var query = histsvc.getNewQuery(); + query.searchTerms = "moz"; + query.minVisits = 2; + + // Options + var options = histsvc.getNewQueryOptions(); + options.sortingMode = options.SORT_BY_VISITCOUNT_ASCENDING; + options.resultType = options.RESULTS_AS_VISIT; + + // Results + var result = histsvc.executeQuery(query, options); + var root = result.root; + root.containerOpen = true; + + LOG("Number of items in result set: " + root.childCount); + for(var i=0; i < root.childCount; ++i) { + LOG("result: " + root.getChild(i).uri + " Title: " + root.getChild(i).title); + } + + // Check our inital result set + compareArrayToResult(testData, root); + + // If that passes, check liveupdate + // Add to the query set + LOG("Adding item to query") + var tmp = []; + for (var i=0; i < 2; i++) { + tmp.push({isVisit: true, isDetails: true, uri: "http://foo.com/added.html", + title: "ab moz"}); + } + populateDB(tmp); + for (var i=0; i < 2; i++) + do_check_eq(root.getChild(i).title, "ab moz"); + + // Update an existing URI + LOG("Updating Item"); + var change2 = [{isVisit: true, isDetails: true, title: "moz", + uri: "http://foo.change.co/changeme2.html"}]; + populateDB(change2); + do_check_true(isInResult(change2, root)); + + // Update some in batch mode - add one and take one out of query set, + // and simply change one so that it still applies to the query + LOG("Updating Items in batch"); + var updateBatch = { + runBatched: function (aUserData) { + batchchange = [{isDetails: true, uri: "http://foo.mail.com/changeme1.html", + title: "foo"}, + {isTag: true, uri: "http://foo.com/changeme3.html", + tagArray: ["foo", "moz"]}]; + populateDB(batchchange); + } + }; + histsvc.runInBatchMode(updateBatch, null); + do_check_false(isInResult({uri: "http://foo.mail.com/changeme1.html"}, root)); + do_check_true(isInResult({uri: "http://foo.com/changeme3.html"}, root)); + + // And now, delete one + LOG("Delete item outside of batch"); + var change4 = [{isDetails: true, uri: "http://moilla.com/", + title: "mo,z"}]; + populateDB(change4); + do_check_false(isInResult(change4, root)); +} diff --git a/toolkit/components/places/tests/queries/test_searchterms-domain.js b/toolkit/components/places/tests/queries/test_searchterms-domain.js new file mode 100644 index 00000000000..be7f4c0c5c5 --- /dev/null +++ b/toolkit/components/places/tests/queries/test_searchterms-domain.js @@ -0,0 +1,154 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et: */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Places Test Code. + * + * The Initial Developer of the Original Code is Mozilla Corporation + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Clint Talbert + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + // The test data for our database, note that the ordering of the results that + // will be returned by the query (the isInQuery: true objects) is IMPORTANT. + // see compareArrayToResult in head_queries.js for more info. + var testData = [ + // Test ftp protocol - vary the title length, embed search term + {isInQuery: true, isVisit: true, isDetails: true, + uri: "ftp://foo.com/ftp", lastVisit: lastweek, + title: "hugelongconfmozlagurationofwordswithasearchtermsinit whoo-hoo"}, + + // Test flat domain with annotation, search term in sentence + {isInQuery: true, isVisit: true, isDetails: true, isPageAnnotation: true, + uri: "http://foo.com/", annoName: "moz/test", annoVal: "val", + lastVisit: lastweek, title: "you know, moz is cool"}, + + // Test subdomain included with isRedirect=true, different transtype + {isInQuery: true, isVisit: true, isDetails: true, title: "amozzie", + isRedirect: true, uri: "http://mail.foo.com/redirect", lastVisit: old, + referrer: "http://myreferrer.com", transType: histsvc.TRANSITION_LINK}, + + // Test subdomain inclued, search term at end + {isInQuery: true, isVisit: true, isDetails: true, + uri: "http://mail.foo.com/yiihah", title: "blahmoz", lastVisit: daybefore}, + + // Test www. style URI is included, with a tag + {isInQuery: true, isVisit: true, isDetails: true, isTag: true, + uri: "http://www.foo.com/yiihah", tagArray: ["moz"], + lastVisit: yesterday, title: "foo"}, + + // Test https protocol + {isInQuery: true, isVisit: true, isDetails: true, title: "moz", + uri: "https://foo.com/", lastVisit: today}, + + // Begin the invalid queries: wrong search term + {isInQuery: false, isVisit:true, isDetails: true, title: "m o z", + uri: "http://foo.com/tooearly.php", lastVisit: today}, + + // Test bad URI + {isInQuery: false, isVisit:true, isDetails: true, title: "moz", + uri: "http://sffoo.com/justwrong.htm", lastVisit: tomorrow}, + + // Test what we do with escaping in titles + {isInQuery: false, isVisit:true, isDetails: true, title: "m%0o%0z", + uri: "http://foo.com/changeme1.htm", lastVisit: yesterday}, + + // Test another invalid title - for updating later + {isInQuery: false, isVisit:true, isDetails: true, title: "m,oz", + uri: "http://foo.com/changeme2.htm", lastVisit: tomorrow}]; + +/** + * This test will test Queries that use relative search terms and domain options + */ +function run_test() { + populateDB(testData); + var query = histsvc.getNewQuery(); + query.searchTerms = "moz"; + query.domain = "foo.com"; + query.domainIsHost = false; + + // Options + var options = histsvc.getNewQueryOptions(); + options.sortingMode = options.SORT_BY_DATE_ASCENDING; + options.resultType = options.RESULTS_AS_URI; + + // Results + var result = histsvc.executeQuery(query, options); + var root = result.root; + root.containerOpen = true; + + LOG("Number of items in result set: " + root.childCount); + for(var i=0; i < root.childCount; ++i) { + LOG("result: " + root.getChild(i).uri + " Title: " + root.getChild(i).title); + } + + // Check our inital result set + compareArrayToResult(testData, root); + + // If that passes, check liveupdate + // Add to the query set + LOG("Adding item to query") + var change1 = [{isVisit: true, isDetails: true, uri: "http://foo.com/added.htm", + title: "moz", transType: histsvc.TRANSITION_LINK}]; + populateDB(change1); + do_check_true(isInResult(change1, root)); + + // Update an existing URI + LOG("Updating Item"); + var change2 = [{isDetails: true, uri: "http://foo.com/changeme1.htm", + title: "moz" }]; + populateDB(change2); + do_check_true(isInResult(change2, root)); + + // Update some in batch mode - add one and take one out of query set, + // and simply change one so that it still applies to the query + LOG("Updating Items in batch"); + var updateBatch = { + runBatched: function (aUserData) { + batchchange = [{isDetails: true, uri:"http://foo.com/changeme2.htm", + title: "moz"}, + {isDetails: true, uri: "http://mail.foo.com/yiihah", + title: "moz now updated"}, + {isDetails: true, uri: "ftp://foo.com/ftp", title: "gone"}]; + populateDB(batchchange); + } + }; + histsvc.runInBatchMode(updateBatch, null); + do_check_true(isInResult({uri: "http://foo.com/changeme2.htm"}, root)); + do_check_true(isInResult({uri: "http://mail.foo.com/yiihah"}, root)); + do_check_false(isInResult({uri: "ftp://foo.com/ftp"}, root)); + + // And now, delete one + LOG("Delete item outside of batch"); + var change4 = [{isDetails: true, uri: "https://foo.com/", + title: "mo,z"}]; + populateDB(change4); + do_check_false(isInResult(change4, root)); +}