addon-sdk/source/test/addons/places/tests/test-places-events.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/addon-sdk/source/test/addons/places/tests/test-places-events.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,324 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +'use strict';
     1.8 +
     1.9 +module.metadata = {
    1.10 +  'engines': {
    1.11 +    'Firefox': '*'
    1.12 +  }
    1.13 +};
    1.14 +
    1.15 +const { Cc, Ci } = require('chrome');
    1.16 +const { defer, all } = require('sdk/core/promise');
    1.17 +const { filter } = require('sdk/event/utils');
    1.18 +const { on, off } = require('sdk/event/core');
    1.19 +const { events } = require('sdk/places/events');
    1.20 +const { setTimeout } = require('sdk/timers');
    1.21 +const { before, after } = require('sdk/test/utils');
    1.22 +const bmsrv = Cc['@mozilla.org/browser/nav-bookmarks-service;1'].
    1.23 +                getService(Ci.nsINavBookmarksService);
    1.24 +const { release, platform } = require('node/os');
    1.25 +
    1.26 +const isOSX10_6 = (() => {
    1.27 +  let vString = release();
    1.28 +  return vString && /darwin/.test(platform()) && /10\.6/.test(vString);
    1.29 +})();
    1.30 +
    1.31 +const {
    1.32 +  search
    1.33 +} = require('sdk/places/history');
    1.34 +const {
    1.35 +  invalidResolve, invalidReject, createTree, createBookmark,
    1.36 +  compareWithHost, addVisits, resetPlaces, createBookmarkItem,
    1.37 +  removeVisits
    1.38 +} = require('../places-helper');
    1.39 +const { save, MENU, UNSORTED } = require('sdk/places/bookmarks');
    1.40 +const { promisedEmitter } = require('sdk/places/utils');
    1.41 +
    1.42 +exports['test bookmark-item-added'] = function (assert, done) {
    1.43 +  function handler ({type, data}) {
    1.44 +    if (type !== 'bookmark-item-added') return;
    1.45 +    if (data.title !== 'bookmark-added-title') return;
    1.46 +
    1.47 +    assert.equal(type, 'bookmark-item-added', 'correct type in bookmark-added event');
    1.48 +    assert.equal(data.type, 'bookmark', 'correct data in bookmark-added event');
    1.49 +    assert.ok(data.id != null, 'correct data in bookmark-added event');
    1.50 +    assert.ok(data.parentId != null, 'correct data in bookmark-added event');
    1.51 +    assert.ok(data.index != null, 'correct data in bookmark-added event');
    1.52 +    assert.equal(data.url, 'http://moz.com/', 'correct data in bookmark-added event');
    1.53 +    assert.ok(data.dateAdded != null, 'correct data in bookmark-added event');
    1.54 +    events.off('data', handler);
    1.55 +    done();
    1.56 +  }
    1.57 +  events.on('data', handler);
    1.58 +  createBookmark({ title: 'bookmark-added-title' });
    1.59 +};
    1.60 +
    1.61 +exports['test bookmark-item-changed'] = function (assert, done) {
    1.62 +  let id;
    1.63 +  let complete = makeCompleted(done);
    1.64 +
    1.65 +  // Due to bug 969616 and bug 971964, disabling tests in 10.6 (happens only
    1.66 +  // in debug builds) to prevent intermittent failures
    1.67 +  if (isOSX10_6) {
    1.68 +    assert.ok(true, 'skipping test in OSX 10.6'); 
    1.69 +    return done();
    1.70 +  }
    1.71 +
    1.72 +  function handler ({type, data}) {
    1.73 +    if (type !== 'bookmark-item-changed') return;
    1.74 +    if (data.id !== id) return;
    1.75 +    // Abort if the 'bookmark-item-changed' event isn't for the `title` property,
    1.76 +    // as sometimes the event can be for the `url` property.
    1.77 +    // Intermittent failure, bug 969616
    1.78 +    if (data.property !== 'title') return;
    1.79 +
    1.80 +    assert.equal(type, 'bookmark-item-changed',
    1.81 +      'correct type in bookmark-item-changed event');
    1.82 +    assert.equal(data.type, 'bookmark',
    1.83 +      'correct data in bookmark-item-changed event');
    1.84 +    assert.equal(data.property, 'title',
    1.85 +      'correct property in bookmark-item-changed event');
    1.86 +    assert.equal(data.value, 'bookmark-changed-title-2',
    1.87 +      'correct value in bookmark-item-changed event');
    1.88 +    assert.ok(data.id === id, 'correct id in bookmark-item-changed event');
    1.89 +    assert.ok(data.parentId != null, 'correct data in bookmark-added event');
    1.90 +
    1.91 +    events.off('data', handler);
    1.92 +    complete();
    1.93 +  }
    1.94 +  events.on('data', handler);
    1.95 +
    1.96 +  createBookmarkItem({ title: 'bookmark-changed-title' }).then(item => {
    1.97 +    id = item.id;
    1.98 +    item.title = 'bookmark-changed-title-2';
    1.99 +    return saveP(item);
   1.100 +  }).then(complete);
   1.101 +};
   1.102 +
   1.103 +exports['test bookmark-item-moved'] = function (assert, done) {
   1.104 +  let id;
   1.105 +  let complete = makeCompleted(done);
   1.106 +  let previousIndex, previousParentId;
   1.107 +
   1.108 +  // Due to bug 969616 and bug 971964, disabling tests in 10.6 (happens only
   1.109 +  // in debug builds) to prevent intermittent failures
   1.110 +  if (isOSX10_6) {
   1.111 +    assert.ok(true, 'skipping test in OSX 10.6'); 
   1.112 +    return done();
   1.113 +  }
   1.114 +
   1.115 +  function handler ({type, data}) {
   1.116 +    if (type !== 'bookmark-item-moved') return;
   1.117 +    if (data.id !== id) return;
   1.118 +    assert.equal(type, 'bookmark-item-moved',
   1.119 +      'correct type in bookmark-item-moved event');
   1.120 +    assert.equal(data.type, 'bookmark',
   1.121 +      'correct data in bookmark-item-moved event');
   1.122 +    assert.ok(data.id === id, 'correct id in bookmark-item-moved event');
   1.123 +    assert.equal(data.previousParentId, previousParentId,
   1.124 +      'correct previousParentId');
   1.125 +    assert.equal(data.currentParentId, bmsrv.getFolderIdForItem(id),
   1.126 +      'correct currentParentId');
   1.127 +    assert.equal(data.previousIndex, previousIndex, 'correct previousIndex');
   1.128 +    assert.equal(data.currentIndex, bmsrv.getItemIndex(id), 'correct currentIndex');
   1.129 +
   1.130 +    events.off('data', handler);
   1.131 +    complete();
   1.132 +  }
   1.133 +  events.on('data', handler);
   1.134 +
   1.135 +  createBookmarkItem({
   1.136 +    title: 'bookmark-moved-title',
   1.137 +    group: UNSORTED
   1.138 +  }).then(item => {
   1.139 +    id = item.id;
   1.140 +    previousIndex = bmsrv.getItemIndex(id);
   1.141 +    previousParentId = bmsrv.getFolderIdForItem(id);
   1.142 +    item.group = MENU;
   1.143 +    return saveP(item);
   1.144 +  }).then(complete);
   1.145 +};
   1.146 +
   1.147 +exports['test bookmark-item-removed'] = function (assert, done) {
   1.148 +  let id;
   1.149 +  let complete = makeCompleted(done);
   1.150 +  function handler ({type, data}) {
   1.151 +    if (type !== 'bookmark-item-removed') return;
   1.152 +    if (data.id !== id) return;
   1.153 +    assert.equal(type, 'bookmark-item-removed',
   1.154 +      'correct type in bookmark-item-removed event');
   1.155 +    assert.equal(data.type, 'bookmark',
   1.156 +      'correct data in bookmark-item-removed event');
   1.157 +    assert.ok(data.id === id, 'correct id in bookmark-item-removed event');
   1.158 +    assert.equal(data.parentId, UNSORTED.id,
   1.159 +      'correct parentId in bookmark-item-removed');
   1.160 +    assert.equal(data.url, 'http://moz.com/',
   1.161 +      'correct url in bookmark-item-removed event');
   1.162 +    assert.equal(data.index, 0,
   1.163 +      'correct index in bookmark-item-removed event');
   1.164 +
   1.165 +    events.off('data', handler);
   1.166 +    complete();
   1.167 +  }
   1.168 +  events.on('data', handler);
   1.169 +
   1.170 +  createBookmarkItem({
   1.171 +    title: 'bookmark-item-remove-title',
   1.172 +    group: UNSORTED
   1.173 +  }).then(item => {
   1.174 +    id = item.id;
   1.175 +    item.remove = true;
   1.176 +    return saveP(item);
   1.177 +  }).then(complete);
   1.178 +};
   1.179 +
   1.180 +exports['test bookmark-item-visited'] = function (assert, done) {
   1.181 +  let id;
   1.182 +  let complete = makeCompleted(done);
   1.183 +  function handler ({type, data}) {
   1.184 +    if (type !== 'bookmark-item-visited') return;
   1.185 +    if (data.id !== id) return;
   1.186 +    assert.equal(type, 'bookmark-item-visited',
   1.187 +      'correct type in bookmark-item-visited event');
   1.188 +    assert.ok(data.id === id, 'correct id in bookmark-item-visited event');
   1.189 +    assert.equal(data.parentId, UNSORTED.id,
   1.190 +      'correct parentId in bookmark-item-visited');
   1.191 +    assert.ok(data.transitionType != null,
   1.192 +      'has a transition type in bookmark-item-visited event');
   1.193 +    assert.ok(data.time != null,
   1.194 +      'has a time in bookmark-item-visited event');
   1.195 +    assert.ok(data.visitId != null,
   1.196 +      'has a visitId in bookmark-item-visited event');
   1.197 +    assert.equal(data.url, 'http://bookmark-item-visited.com/',
   1.198 +      'correct url in bookmark-item-visited event');
   1.199 +
   1.200 +    events.off('data', handler);
   1.201 +    complete();
   1.202 +  }
   1.203 +  events.on('data', handler);
   1.204 +
   1.205 +  createBookmarkItem({
   1.206 +    title: 'bookmark-item-visited',
   1.207 +    url: 'http://bookmark-item-visited.com/'
   1.208 +  }).then(item => {
   1.209 +    id = item.id;
   1.210 +    return addVisits('http://bookmark-item-visited.com/');
   1.211 +  }).then(complete);
   1.212 +};
   1.213 +
   1.214 +exports['test history-start-batch, history-end-batch, history-start-clear'] = function (assert, done) {
   1.215 +  let complete = makeCompleted(done, 4);
   1.216 +  let startEvent = filter(events, ({type}) => type === 'history-start-batch');
   1.217 +  let endEvent = filter(events, ({type}) => type === 'history-end-batch');
   1.218 +  let clearEvent = filter(events, ({type}) => type === 'history-start-clear');
   1.219 +  function startHandler ({type, data}) {
   1.220 +    assert.pass('history-start-batch called');
   1.221 +    assert.equal(type, 'history-start-batch',
   1.222 +      'history-start-batch has correct type');
   1.223 +    off(startEvent, 'data', startHandler);
   1.224 +    on(endEvent, 'data', endHandler);
   1.225 +    complete();
   1.226 +  }
   1.227 +  function endHandler ({type, data}) {
   1.228 +    assert.pass('history-end-batch called');
   1.229 +    assert.equal(type, 'history-end-batch',
   1.230 +      'history-end-batch has correct type');
   1.231 +    off(endEvent, 'data', endHandler);
   1.232 +    complete();
   1.233 +  }
   1.234 +  function clearHandler ({type, data}) {
   1.235 +    assert.pass('history-start-clear called');
   1.236 +    assert.equal(type, 'history-start-clear',
   1.237 +      'history-start-clear has correct type');
   1.238 +    off(clearEvent, 'data', clearHandler);
   1.239 +    complete();
   1.240 +  }
   1.241 +
   1.242 +  on(startEvent, 'data', startHandler);
   1.243 +  on(clearEvent, 'data', clearHandler);
   1.244 +
   1.245 +  createBookmark().then(() => {
   1.246 +    resetPlaces(complete);
   1.247 +  })
   1.248 +};
   1.249 +
   1.250 +exports['test history-visit, history-title-changed'] = function (assert, done) {
   1.251 +  let complete = makeCompleted(() => {
   1.252 +    off(titleEvents, 'data', titleHandler);
   1.253 +    off(visitEvents, 'data', visitHandler);
   1.254 +    done();
   1.255 +  }, 6);
   1.256 +  let visitEvents = filter(events, ({type}) => type === 'history-visit');
   1.257 +  let titleEvents = filter(events, ({type}) => type === 'history-title-changed');
   1.258 +
   1.259 +  let urls = ['http://moz.com/', 'http://firefox.com/', 'http://mdn.com/'];
   1.260 +
   1.261 +  function visitHandler ({type, data}) {
   1.262 +    assert.equal(type, 'history-visit', 'correct type in history-visit');
   1.263 +    assert.ok(~urls.indexOf(data.url), 'history-visit has correct url');
   1.264 +    assert.ok(data.visitId != null, 'history-visit has a visitId');
   1.265 +    assert.ok(data.time != null, 'history-visit has a time');
   1.266 +    assert.ok(data.sessionId != null, 'history-visit has a sessionId');
   1.267 +    assert.ok(data.referringId != null, 'history-visit has a referringId');
   1.268 +    assert.ok(data.transitionType != null, 'history-visit has a transitionType');
   1.269 +    complete();
   1.270 +  }
   1.271 +
   1.272 +  function titleHandler ({type, data}) {
   1.273 +    assert.equal(type, 'history-title-changed',
   1.274 +      'correct type in history-title-changed');
   1.275 +    assert.ok(~urls.indexOf(data.url),
   1.276 +      'history-title-changed has correct url');
   1.277 +    assert.ok(data.title, 'history-title-changed has title');
   1.278 +    complete();
   1.279 +  }
   1.280 +
   1.281 +  on(titleEvents, 'data', titleHandler);
   1.282 +  on(visitEvents, 'data', visitHandler);
   1.283 +  addVisits(urls);
   1.284 +}
   1.285 +
   1.286 +exports['test history-delete-url'] = function (assert, done) {
   1.287 +  let complete = makeCompleted(() => {
   1.288 +    events.off('data', handler);
   1.289 +    done();
   1.290 +  }, 3);
   1.291 +  let urls = ['http://moz.com/', 'http://firefox.com/', 'http://mdn.com/'];
   1.292 +  function handler({type, data}) {
   1.293 +    if (type !== 'history-delete-url') return;
   1.294 +    assert.equal(type, 'history-delete-url',
   1.295 +      'history-delete-url has correct type');
   1.296 +    assert.ok(~urls.indexOf(data.url), 'history-delete-url has correct url');
   1.297 +    complete();
   1.298 +  }
   1.299 +
   1.300 +  events.on('data', handler);
   1.301 +  addVisits(urls).then(() => {
   1.302 +    removeVisits(urls);
   1.303 +  });
   1.304 +};
   1.305 +
   1.306 +exports['test history-page-changed'] = function (assert) {
   1.307 +  assert.pass('history-page-changed tested in test-places-favicons');
   1.308 +};
   1.309 +
   1.310 +exports['test history-delete-visits'] = function (assert) {
   1.311 +  assert.pass('TODO test history-delete-visits');
   1.312 +};
   1.313 +
   1.314 +before(exports, (name, assert, done) => resetPlaces(done));
   1.315 +after(exports, (name, assert, done) => resetPlaces(done));
   1.316 +
   1.317 +function saveP () {
   1.318 +  return promisedEmitter(save.apply(null, Array.slice(arguments)));
   1.319 +}
   1.320 +
   1.321 +function makeCompleted (done, countTo) {
   1.322 +  let count = 0;
   1.323 +  countTo = countTo || 2;
   1.324 +  return function () {
   1.325 +    if (++count === countTo) done();
   1.326 +  };
   1.327 +}

mercurial