diff options
Diffstat (limited to 'addon-sdk/source/test/addons/places/lib/test-places-host.js')
-rw-r--r-- | addon-sdk/source/test/addons/places/lib/test-places-host.js | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/addon-sdk/source/test/addons/places/lib/test-places-host.js b/addon-sdk/source/test/addons/places/lib/test-places-host.js new file mode 100644 index 000000000..3d0b2b3f4 --- /dev/null +++ b/addon-sdk/source/test/addons/places/lib/test-places-host.js @@ -0,0 +1,301 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +'use strict'; + +module.metadata = { + 'engines': { + 'Firefox': '*' + } +}; + +const { Cc, Ci } = require('chrome'); +const { defer, all } = require('sdk/core/promise'); +const { setTimeout } = require('sdk/timers'); +const { newURI } = require('sdk/url/utils'); +const { send } = require('sdk/addon/events'); +const { set } = require('sdk/preferences/service'); +const { before, after } = require('sdk/test/utils'); + +require('sdk/places/host/host-bookmarks'); +require('sdk/places/host/host-tags'); +require('sdk/places/host/host-query'); +const { + invalidResolve, createTree, + compareWithHost, createBookmark, createBookmarkTree, resetPlaces +} = require('./places-helper'); + +const bmsrv = Cc['@mozilla.org/browser/nav-bookmarks-service;1']. + getService(Ci.nsINavBookmarksService); +const hsrv = Cc['@mozilla.org/browser/nav-history-service;1']. + getService(Ci.nsINavHistoryService); +const tagsrv = Cc['@mozilla.org/browser/tagging-service;1']. + getService(Ci.nsITaggingService); + +exports.testBookmarksCreate = function*(assert) { + let items = [{ + title: 'my title', + url: 'http://test-places-host.com/testBookmarksCreate/', + tags: ['some', 'tags', 'yeah'], + type: 'bookmark' + }, { + title: 'my folder', + type: 'group', + group: bmsrv.bookmarksMenuFolder + }, { + type: 'separator', + group: bmsrv.unfiledBookmarksFolder + }]; + + yield all(items.map((item) => { + return send('sdk-places-bookmarks-create', item).then((data) => { + compareWithHost(assert, data); + }); + })); +}; + +exports.testBookmarksCreateFail = function (assert, done) { + let items = [{ + title: 'my title', + url: 'not-a-url', + type: 'bookmark' + }, { + type: 'group', + group: bmsrv.bookmarksMenuFolder + }, { + group: bmsrv.unfiledBookmarksFolder + }]; + all(items.map(function (item) { + return send('sdk-places-bookmarks-create', item).then(null, function (reason) { + assert.ok(reason, 'bookmark create should fail'); + }); + })).then(done); +}; + +exports.testBookmarkLastUpdated = function (assert, done) { + let timestamp; + let item; + createBookmark({ + url: 'http://test-places-host.com/testBookmarkLastUpdated' + }).then(function (data) { + item = data; + timestamp = item.updated; + return send('sdk-places-bookmarks-last-updated', { id: item.id }); + }).then(function (updated) { + let { resolve, promise } = defer(); + assert.equal(timestamp, updated, 'should return last updated time'); + item.title = 'updated mozilla'; + setTimeout(() => { + resolve(send('sdk-places-bookmarks-save', item)); + }, 100); + return promise; + }).then(function (data) { + assert.ok(data.updated > timestamp, 'time has elapsed and updated the updated property'); + done(); + }); +}; + +exports.testBookmarkRemove = function (assert, done) { + let id; + createBookmark({ + url: 'http://test-places-host.com/testBookmarkRemove/' + }).then(function (data) { + id = data.id; + compareWithHost(assert, data); // ensure bookmark exists + bmsrv.getItemTitle(id); // does not throw an error + return send('sdk-places-bookmarks-remove', data); + }).then(function () { + assert.throws(function () { + bmsrv.getItemTitle(id); + }, 'item should no longer exist'); + done(); + }, assert.fail); +}; + +exports.testBookmarkGet = function (assert, done) { + let bookmark; + createBookmark({ + url: 'http://test-places-host.com/testBookmarkGet/' + }).then(function (data) { + bookmark = data; + return send('sdk-places-bookmarks-get', { id: data.id }); + }).then(function (data) { + 'title url index group updated type tags'.split(' ').map(function (prop) { + if (prop === 'tags') { + for (let tag of bookmark.tags) { + assert.ok(~data.tags.indexOf(tag), + 'correctly fetched tag ' + tag); + } + assert.equal(bookmark.tags.length, data.tags.length, + 'same amount of tags'); + } + else + assert.equal(bookmark[prop], data[prop], 'correctly fetched ' + prop); + }); + done(); + }); +}; + +exports.testTagsTag = function (assert, done) { + let url; + createBookmark({ + url: 'http://test-places-host.com/testTagsTag/', + }).then(function (data) { + url = data.url; + return send('sdk-places-tags-tag', { + url: data.url, tags: ['mozzerella', 'foxfire'] + }); + }).then(function () { + let tags = tagsrv.getTagsForURI(newURI(url)); + assert.ok(~tags.indexOf('mozzerella'), 'first tag found'); + assert.ok(~tags.indexOf('foxfire'), 'second tag found'); + assert.ok(~tags.indexOf('firefox'), 'default tag found'); + assert.equal(tags.length, 3, 'no extra tags'); + done(); + }); +}; + +exports.testTagsUntag = function (assert, done) { + let item; + createBookmark({ + url: 'http://test-places-host.com/testTagsUntag/', + tags: ['tag1', 'tag2', 'tag3'] + }).then(data => { + item = data; + return send('sdk-places-tags-untag', { + url: item.url, + tags: ['tag2', 'firefox'] + }); + }).then(function () { + let tags = tagsrv.getTagsForURI(newURI(item.url)); + assert.ok(~tags.indexOf('tag1'), 'first tag persisted'); + assert.ok(~tags.indexOf('tag3'), 'second tag persisted'); + assert.ok(!~tags.indexOf('firefox'), 'first tag removed'); + assert.ok(!~tags.indexOf('tag2'), 'second tag removed'); + assert.equal(tags.length, 2, 'no extra tags'); + done(); + }); +}; + +exports.testTagsGetURLsByTag = function (assert, done) { + let item; + createBookmark({ + url: 'http://test-places-host.com/testTagsGetURLsByTag/' + }).then(function (data) { + item = data; + return send('sdk-places-tags-get-urls-by-tag', { + tag: 'firefox' + }); + }).then(function(urls) { + assert.equal(item.url, urls[0], 'returned correct url'); + assert.equal(urls.length, 1, 'returned only one url'); + done(); + }); +}; + +exports.testTagsGetTagsByURL = function (assert, done) { + let item; + createBookmark({ + url: 'http://test-places-host.com/testTagsGetURLsByTag/', + tags: ['firefox', 'mozilla', 'metal'] + }).then(function (data) { + item = data; + return send('sdk-places-tags-get-tags-by-url', { + url: data.url, + }); + }).then(function(tags) { + assert.ok(~tags.indexOf('firefox'), 'returned first tag'); + assert.ok(~tags.indexOf('mozilla'), 'returned second tag'); + assert.ok(~tags.indexOf('metal'), 'returned third tag'); + assert.equal(tags.length, 3, 'returned all tags'); + done(); + }); +}; + +exports.testHostQuery = function (assert, done) { + all([ + createBookmark({ + url: 'http://firefox.com/testHostQuery/', + tags: ['firefox', 'mozilla'] + }), + createBookmark({ + url: 'http://mozilla.com/testHostQuery/', + tags: ['mozilla'] + }), + createBookmark({ url: 'http://thunderbird.com/testHostQuery/' }) + ]).then(data => { + return send('sdk-places-query', { + queries: { tags: ['mozilla'] }, + options: { sortingMode: 6, queryType: 1 } // sort by URI ascending, bookmarks only + }); + }).then(results => { + assert.equal(results.length, 2, 'should only return two'); + assert.equal(results[0].url, + 'http://mozilla.com/testHostQuery/', 'is sorted by URI asc'); + return send('sdk-places-query', { + queries: { tags: ['mozilla'] }, + options: { sortingMode: 5, queryType: 1 } // sort by URI descending, bookmarks only + }); + }).then(results => { + assert.equal(results.length, 2, 'should only return two'); + assert.equal(results[0].url, + 'http://firefox.com/testHostQuery/', 'is sorted by URI desc'); + done(); + }); +}; + +exports.testHostMultiQuery = function (assert, done) { + all([ + createBookmark({ + url: 'http://firefox.com/testHostMultiQuery/', + tags: ['firefox', 'mozilla'] + }), + createBookmark({ + url: 'http://mozilla.com/testHostMultiQuery/', + tags: ['mozilla'] + }), + createBookmark({ url: 'http://thunderbird.com/testHostMultiQuery/' }) + ]).then(data => { + return send('sdk-places-query', { + queries: [{ tags: ['firefox'] }, { uri: 'http://thunderbird.com/testHostMultiQuery/' }], + options: { sortingMode: 5, queryType: 1 } // sort by URI descending, bookmarks only + }); + }).then(results => { + assert.equal(results.length, 2, 'should return 2 results ORing queries'); + assert.equal(results[0].url, + 'http://firefox.com/testHostMultiQuery/', 'should match URL or tag'); + assert.equal(results[1].url, + 'http://thunderbird.com/testHostMultiQuery/', 'should match URL or tag'); + return send('sdk-places-query', { + queries: [{ tags: ['firefox'], url: 'http://mozilla.com/testHostMultiQuery/' }], + options: { sortingMode: 5, queryType: 1 } // sort by URI descending, bookmarks only + }); + }).then(results => { + assert.equal(results.length, 0, 'query props should be AND\'d'); + done(); + }); +}; + +exports.testGetAllBookmarks = function (assert, done) { + createBookmarkTree().then(() => { + return send('sdk-places-bookmarks-get-all', {}); + }).then(res => { + assert.equal(res.length, 8, 'all bookmarks returned'); + done(); + }, assert.fail); +}; + +exports.testGetAllChildren = function (assert, done) { + createBookmarkTree().then(results => { + return send('sdk-places-bookmarks-get-children', { + id: results.filter(({title}) => title === 'mozgroup')[0].id + }); + }).then(results => { + assert.equal(results.length, 5, + 'should return all children and folders at a single depth'); + done(); + }); +}; + +before(exports, (name, assert, done) => resetPlaces(done)); +after(exports, (name, assert, done) => resetPlaces(done)); |