Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
482
gaia/tv_apps/browser/test/unit/sync/db_test.js
Executable file
482
gaia/tv_apps/browser/test/unit/sync/db_test.js
Executable file
|
|
@ -0,0 +1,482 @@
|
|||
'use strict';
|
||||
/* global SyncBrowserDB */
|
||||
/* exported Browser */
|
||||
/* jshint latedef:false */
|
||||
|
||||
requireApp('browser/shared/test/unit/mocks/' +
|
||||
'mock_navigator_moz_set_message_handler.js');
|
||||
|
||||
/* jshint maxlen:false */
|
||||
const DATA_URI =
|
||||
'data:image/x-icon;base64,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';
|
||||
/* jshint maxlen:80 */
|
||||
const DEFAULT_FAVICON = 'style/images/default-fav.svg';
|
||||
|
||||
requireApp('browser/js/sync/db.js');
|
||||
|
||||
var clearBrowserStores = function(done) {
|
||||
SyncBrowserDB.db.open(function() {
|
||||
Promise.all([
|
||||
new Promise(SyncBrowserDB.db.clearPlaces),
|
||||
new Promise(SyncBrowserDB.db.clearVisits),
|
||||
new Promise(SyncBrowserDB.db.clearIcons),
|
||||
new Promise(SyncBrowserDB.db.clearBookmarks)
|
||||
]).then(() => {
|
||||
done();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
var bookmarkGenerator = (amount, done, parentid) => {
|
||||
var list = [];
|
||||
function item(i) {
|
||||
return {
|
||||
id: 'FXSYNCID_00' + i,
|
||||
bmkUri: 'http://mozilla.org/test' + i,
|
||||
title: 'Mozilla',
|
||||
parentid: parentid ? parentid : 'FXS_P_ID_00' + i,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
}
|
||||
|
||||
var i = 0;
|
||||
|
||||
function wrapper() {
|
||||
if (i < amount) {
|
||||
var t = item(i);
|
||||
list.push(t);
|
||||
SyncBrowserDB.db.saveBookmark(t, wrapper);
|
||||
i++;
|
||||
} else {
|
||||
done(list);
|
||||
}
|
||||
}
|
||||
|
||||
wrapper();
|
||||
};
|
||||
|
||||
var historyGenerator = (amount, done, timeOffset) => {
|
||||
var list = [];
|
||||
function item(i) {
|
||||
return {
|
||||
fxsyncId: 'FXSYNCID_00' + i,
|
||||
uri: 'http://mozilla.org/test' + i,
|
||||
title: 'Mozilla',
|
||||
timestamp: timeOffset + i * 10
|
||||
};
|
||||
}
|
||||
|
||||
var i = 0;
|
||||
|
||||
function wrapper() {
|
||||
if (i < amount) {
|
||||
var t = item(i);
|
||||
list.push(t);
|
||||
SyncBrowserDB.db.createRawHistory(t, wrapper);
|
||||
i++;
|
||||
} else {
|
||||
done(list);
|
||||
}
|
||||
}
|
||||
|
||||
wrapper();
|
||||
};
|
||||
|
||||
window.Awesomescreen = {
|
||||
DEFAULT_FAVICON: DEFAULT_FAVICON
|
||||
};
|
||||
|
||||
suite('SyncBrowserDB', function() {
|
||||
suite('SyncBrowserDB.db', function() {
|
||||
setup(function(done) {
|
||||
clearBrowserStores(done);
|
||||
});
|
||||
|
||||
teardown(function(done) {
|
||||
clearBrowserStores(done);
|
||||
});
|
||||
|
||||
test('createPlace & getPlace', function(done) {
|
||||
const URL = 'http://mozilla.org/test1';
|
||||
SyncBrowserDB.db.createPlace(URL, () => {
|
||||
SyncBrowserDB.db.getPlace(URL, place => {
|
||||
assert.equal(place.title, URL);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('createRawHistory & getHistory', function(done) {
|
||||
var example = {
|
||||
fxsyncId: 'FXSYNCID_001',
|
||||
uri: 'http://mozilla.org/test1',
|
||||
title: 'Mozilla',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.db.createRawHistory(example, () => {
|
||||
SyncBrowserDB.db.getHistory(10, places => {
|
||||
assert.equal(places.length, 1);
|
||||
example.iconUri = DEFAULT_FAVICON;
|
||||
assert.deepEqual(places[0], example);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
test('getPlace - not found', function(done) {
|
||||
const NONEXIST_URL = 'http://mozilla.org/doesnotexist';
|
||||
SyncBrowserDB.db.getPlace(NONEXIST_URL, place => {
|
||||
assert.equal(place, undefined);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('saveBookmark && getBookmark', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_001',
|
||||
bmkUri: 'http://mozilla.org/test1',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_001',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.db.saveBookmark(example, () => {
|
||||
SyncBrowserDB.db.getBookmark(example.id, bookmark => {
|
||||
assert.deepEqual(bookmark, example);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('saveBookmark && getBookmarkByUri', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_002',
|
||||
bmkUri: 'http://mozilla.org/test2',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_002',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.db.saveBookmark(example, () => {
|
||||
SyncBrowserDB.db.getBookmarkByUri(example.bmkUri, bookmark => {
|
||||
assert.deepEqual(bookmark, example);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('getBookmarkByParentId', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_001',
|
||||
bmkUri: 'http://mozilla.org/test1',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_001',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.db.saveBookmark(example, () => {
|
||||
SyncBrowserDB.db.getBookmarkByParentId(example.parentid, bookmark => {
|
||||
assert.equal(bookmark.length, 1);
|
||||
assert.deepEqual(bookmark[0], example);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('getBookmarkByUri - not found', function(done) {
|
||||
const NONEXIST_URL = 'http://mozilla.org/doesnotexist';
|
||||
SyncBrowserDB.db.getBookmarkByUri(NONEXIST_URL, bookmark => {
|
||||
assert.equal(bookmark, undefined);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('getAllBookmarks', function(done) {
|
||||
const RECORD_SIZE = 10;
|
||||
bookmarkGenerator(RECORD_SIZE, records => {
|
||||
SyncBrowserDB.db.getAllBookmarks(bookmarks => {
|
||||
assert.equal(bookmarks.length, RECORD_SIZE);
|
||||
// Sort by timestamp, so we did a reversing comparison here.
|
||||
for (var i = 0; i < RECORD_SIZE; i++) {
|
||||
assert.deepEqual(bookmarks[i], records[RECORD_SIZE -1 -i]);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('getAllBookmarkUris', function(done) {
|
||||
const RECORD_SIZE = 10;
|
||||
bookmarkGenerator(RECORD_SIZE, records => {
|
||||
SyncBrowserDB.db.getAllBookmarkUris(bookmarkUris => {
|
||||
assert.equal(bookmarkUris.length, RECORD_SIZE);
|
||||
// Sort by timestamp, so we did a reversing comparison here.
|
||||
for (var i = 0; i < RECORD_SIZE; i++) {
|
||||
assert.deepEqual(bookmarkUris[i],
|
||||
records[RECORD_SIZE -1 -i].bmkUri);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('deleteBookmark', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_003',
|
||||
bmkUri: 'http://mozilla.org/test3',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_003',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.db.saveBookmark(example, () => {
|
||||
SyncBrowserDB.db.deleteBookmark('FXSYNCID_003', () => {
|
||||
SyncBrowserDB.db.getBookmark('FXSYNCID_003', bookmark => {
|
||||
assert.equal(bookmark, undefined);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('updatePlaceScreenshot', function(done) {
|
||||
var uri = 'http://mozilla.org/test4';
|
||||
SyncBrowserDB.db.updatePlaceScreenshot(uri, DATA_URI, () => {
|
||||
SyncBrowserDB.db.getPlace(uri, place => {
|
||||
assert.equal(place.screenshot, DATA_URI);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('saveIcon', function(done) {
|
||||
var blob = new Blob(['hello', ' world'], {type: 'text/plain'});
|
||||
var iconEntry = {
|
||||
uri: 'http://mozilla.org/favicon.ico',
|
||||
data: blob,
|
||||
expiration: Date.now()
|
||||
};
|
||||
SyncBrowserDB.db.saveIcon(iconEntry, () => {
|
||||
SyncBrowserDB.db.getIcon(iconEntry.uri, null, (e) => {
|
||||
assert.deepEqual(e, iconEntry);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
suite('SyncBrowserDB', function() {
|
||||
setup(function(done) {
|
||||
clearBrowserStores(done);
|
||||
});
|
||||
|
||||
teardown(function(done) {
|
||||
clearBrowserStores(done);
|
||||
});
|
||||
|
||||
test('updateRawBookmark & getBookmark by id', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_003',
|
||||
bmkUri: 'http://mozilla.org/test3',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_003',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.updateRawBookmark(example, () => {
|
||||
SyncBrowserDB.getBookmark(example.id, bookmark => {
|
||||
assert.deepEqual(example, bookmark);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('updateRawBookmark & getBookmark by {id}', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_003',
|
||||
bmkUri: 'http://mozilla.org/test3',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_003',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.updateRawBookmark(example, () => {
|
||||
SyncBrowserDB.getBookmark({id: example.id}, bookmark => {
|
||||
assert.deepEqual(example, bookmark);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('updateRawBookmark & getBookmark by {bmkUri}', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_003',
|
||||
bmkUri: 'http://mozilla.org/test3',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_003',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.updateRawBookmark(example, () => {
|
||||
SyncBrowserDB.getBookmark({bmkUri: example.bmkUri}, bookmark => {
|
||||
assert.deepEqual(example, bookmark);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('updateRawBookmark & getBookmark by {parentid}', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_003',
|
||||
bmkUri: 'http://mozilla.org/test3',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_003',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.updateRawBookmark(example, () => {
|
||||
SyncBrowserDB.getBookmark({parentid: example.parentid}, bookmarks => {
|
||||
assert.equal(bookmarks.length, 1);
|
||||
assert.deepEqual(example, bookmarks[0]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('getBookmark by {parentid}, sorted by children array', function(done) {
|
||||
var example = {
|
||||
id: 'FXS_P_ID_001',
|
||||
type: 'folder',
|
||||
title: 'Mozilla',
|
||||
children: ['FXSYNCID_003', 'FXSYNCID_001',
|
||||
'FXSYNCID_000', 'FXSYNCID_002'],
|
||||
parentid: 'FXS_P_ID_000',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.updateRawBookmark(example, () => {
|
||||
bookmarkGenerator(4, rawRecords => {
|
||||
SyncBrowserDB.getBookmark({parentid: example.id}, bookmarks => {
|
||||
assert.deepEqual(bookmarks[0], rawRecords[3]);
|
||||
assert.deepEqual(bookmarks[1], rawRecords[1]);
|
||||
assert.deepEqual(bookmarks[2], rawRecords[0]);
|
||||
assert.deepEqual(bookmarks[3], rawRecords[2]);
|
||||
done();
|
||||
});
|
||||
}, 'FXS_P_ID_001');
|
||||
});
|
||||
});
|
||||
|
||||
test('removeBookmark', function(done) {
|
||||
var example = {
|
||||
id: 'FXSYNCID_003',
|
||||
bmkUri: 'http://mozilla.org/test3',
|
||||
title: 'Mozilla',
|
||||
parentid: 'FXS_P_ID_003',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.updateRawBookmark(example, () => {
|
||||
SyncBrowserDB.removeBookmark(example.id, () => {
|
||||
SyncBrowserDB.getBookmark(example.id, bookmark => {
|
||||
assert.equal(bookmark, undefined);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('clearBookmarks', function(done) {
|
||||
bookmarkGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.clearBookmarks().then(() => {
|
||||
SyncBrowserDB.db.getAllBookmarks(bookmarks => {
|
||||
assert.isArray(bookmarks);
|
||||
assert.equal(bookmarks.length, 0);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('updateRawHistory & removeHistory', function(done) {
|
||||
var example = {
|
||||
fxsyncId: 'FXSYNCID_003',
|
||||
uri: 'http://mozilla.org/test3',
|
||||
title: 'Mozilla',
|
||||
timestamp: Date.now()
|
||||
};
|
||||
SyncBrowserDB.updateRawHistory(example, () => {
|
||||
SyncBrowserDB.removeHistory(example.uri, bookmark => {
|
||||
assert.equal(bookmark, undefined);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('clearHistoryDeep', function(done) {
|
||||
historyGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.clearHistoryDeep().then(() => {
|
||||
SyncBrowserDB.db.getHistory(10000, history => {
|
||||
assert.isArray(history);
|
||||
assert.equal(history.length, 0);
|
||||
done();
|
||||
});
|
||||
});
|
||||
}, 10000);
|
||||
});
|
||||
|
||||
test('getHistoryByTime', function(done) {
|
||||
historyGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.getHistoryByTime(10075, 10085, false, false, history => {
|
||||
assert.equal(history.length, 1);
|
||||
rawRecords[8].iconUri = DEFAULT_FAVICON;
|
||||
assert.deepEqual(history[0], rawRecords[8]);
|
||||
done();
|
||||
});
|
||||
}, 10000);
|
||||
});
|
||||
|
||||
test('getHistoryByTime with timestamp equal=true', function(done) {
|
||||
historyGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.getHistoryByTime(10070, 10080, true, true, history => {
|
||||
assert.equal(history.length, 2);
|
||||
rawRecords[7].iconUri = DEFAULT_FAVICON;
|
||||
rawRecords[8].iconUri = DEFAULT_FAVICON;
|
||||
assert.deepEqual(history[0], rawRecords[8]);
|
||||
assert.deepEqual(history[1], rawRecords[7]);
|
||||
done();
|
||||
});
|
||||
}, 10000);
|
||||
});
|
||||
|
||||
test('getHistoryTimestamp with equal=true / dir=prev', function(done) {
|
||||
historyGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.getHistoryTimestamp(10070, 'prev', true, ts => {
|
||||
assert.equal(ts, 10070);
|
||||
done();
|
||||
});
|
||||
}, 10000);
|
||||
});
|
||||
|
||||
test('getHistoryTimestamp with equal=false / dir=prev', function(done) {
|
||||
historyGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.getHistoryTimestamp(10070, 'prev', false, ts => {
|
||||
assert.equal(ts, 10060);
|
||||
done();
|
||||
});
|
||||
}, 10000);
|
||||
});
|
||||
|
||||
test('getHistoryTimestamp with equal=true / dir=next', function(done) {
|
||||
historyGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.getHistoryTimestamp(10075, 'next', true, ts => {
|
||||
assert.equal(ts, 10080);
|
||||
done();
|
||||
});
|
||||
}, 10000);
|
||||
});
|
||||
|
||||
test('getHistoryTimestamp with equal=false / dir=next', function(done) {
|
||||
historyGenerator(10, (rawRecords) => {
|
||||
SyncBrowserDB.getHistoryTimestamp(10075, 'next', false, ts => {
|
||||
assert.equal(ts, 10080);
|
||||
done();
|
||||
});
|
||||
}, 10000);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
27
gaia/tv_apps/browser/test/unit/sync/fixtures/settings.html
Executable file
27
gaia/tv_apps/browser/test/unit/sync/fixtures/settings.html
Executable file
|
|
@ -0,0 +1,27 @@
|
|||
<div id="fxsync-area">
|
||||
<div id="fxsync-header">
|
||||
<p data-l10n-id="fxsync-firefox-sync">Firefox Sync</p>
|
||||
</div>
|
||||
<div id="fxsync-disabled">
|
||||
<smart-button id="fxsync-sign-in-button" type="simple-text" data-l10n-id="fxsync-create-account-or-sign-in"></smart-button>
|
||||
<p id="fxsync-sign-in-description" data-l10n-id="fxsync-sign-in-to-sync-description"></p>
|
||||
</div>
|
||||
<div id="fxsync-enabled">
|
||||
<span id="fxsync-signed-in-as" data-l10n-id="fxsync-signed-in-as"></span>
|
||||
<smart-button id="fxsync-sync-now-button" type="simple-text" data-l10n-id="fxsync-sync-now"></smart-button>
|
||||
<smart-button id="fxsync-sign-out-button" type="simple-text" data-l10n-id="fxsync-sign-out"></smart-button>
|
||||
<ul class="settings-horizontal-list">
|
||||
<li class="settings-horizontal-list-item">
|
||||
<input type="checkbox" id="fxsync-collection-bookmarks" ></input>
|
||||
<label for="fxsync-collection-bookmarks"></label>
|
||||
<span data-l10n-id="fxsync-collection-bookmarks"></span>
|
||||
</li>
|
||||
<li class="settings-horizontal-list-item">
|
||||
<input type="checkbox" id="fxsync-collection-history" ></input>
|
||||
<label for="fxsync-collection-history"></label>
|
||||
<span data-l10n-id="fxsync-collection-history"></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
1
gaia/tv_apps/browser/test/unit/sync/fixtures/toolbar.html
Executable file
1
gaia/tv_apps/browser/test/unit/sync/fixtures/toolbar.html
Executable file
|
|
@ -0,0 +1 @@
|
|||
<li id="fxsync-block"><a id="fxsync-tab" href="#" data-l10n-id="fxsync-sign-in-to-sync"></a></li>
|
||||
217
gaia/tv_apps/browser/test/unit/sync/manager_bridge_test.js
Executable file
217
gaia/tv_apps/browser/test/unit/sync/manager_bridge_test.js
Executable file
|
|
@ -0,0 +1,217 @@
|
|||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
|
||||
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/* global SyncManagerBridge */
|
||||
|
||||
'use strict';
|
||||
|
||||
requireApp('browser/js/sync/manager_bridge.js');
|
||||
|
||||
suite('SyncManagerBridge >', () => {
|
||||
var subject;
|
||||
var realMozApps;
|
||||
var port;
|
||||
var app;
|
||||
var onmessageData;
|
||||
|
||||
suiteSetup(() => {
|
||||
subject = SyncManagerBridge;
|
||||
|
||||
realMozApps = navigator.mozApps;
|
||||
port = {
|
||||
postMessage: function() {},
|
||||
set onmessage(callback) {
|
||||
setTimeout(() => {
|
||||
callback({ data: onmessageData });
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
app = {
|
||||
connect: function() {
|
||||
return Promise.resolve([port]);
|
||||
}
|
||||
};
|
||||
|
||||
var onsuccess = {
|
||||
set onsuccess(callback) {
|
||||
setTimeout(() => {
|
||||
callback({ target: { result: app } });
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
navigator.mozApps = {
|
||||
getSelf: function() {
|
||||
return onsuccess;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
suiteTeardown(() => {
|
||||
subject = null;
|
||||
navigator.mozApps = realMozApps;
|
||||
});
|
||||
|
||||
suite('Initial state', () => {
|
||||
test('Integrity', () => {
|
||||
assert.ok(subject != null);
|
||||
assert.isNull(subject._port);
|
||||
assert.equal(subject._requests.size, 0);
|
||||
});
|
||||
});
|
||||
|
||||
['enable',
|
||||
'disable',
|
||||
'sync'].forEach(method => {
|
||||
suite(method, () => {
|
||||
var getSelfSpy;
|
||||
var connectSpy;
|
||||
var postMessageSpy;
|
||||
|
||||
setup(() => {
|
||||
getSelfSpy = this.sinon.spy(navigator.mozApps, 'getSelf');
|
||||
connectSpy = this.sinon.spy(app, 'connect');
|
||||
postMessageSpy = this.sinon.spy(port, 'postMessage');
|
||||
});
|
||||
|
||||
teardown(() => {
|
||||
getSelfSpy.restore();
|
||||
connectSpy.restore();
|
||||
postMessageSpy.restore();
|
||||
});
|
||||
|
||||
suiteTeardown(() => {
|
||||
subject._port = null;
|
||||
});
|
||||
|
||||
test(method + ' - no previous connection', done => {
|
||||
subject[method]();
|
||||
setTimeout(() => {
|
||||
this.sinon.assert.calledOnce(getSelfSpy);
|
||||
this.sinon.assert.calledOnce(connectSpy);
|
||||
this.sinon.assert.calledOnce(postMessageSpy);
|
||||
assert.equal(postMessageSpy.getCall(0).args[0].name, method);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test(method + ' - previous connection', done => {
|
||||
subject[method]();
|
||||
setTimeout(() => {
|
||||
this.sinon.assert.notCalled(getSelfSpy);
|
||||
this.sinon.assert.notCalled(connectSpy);
|
||||
this.sinon.assert.calledOnce(postMessageSpy);
|
||||
assert.equal(postMessageSpy.getCall(0).args[0].name, method);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
suite('listeners', () => {
|
||||
suiteTeardown(() => {
|
||||
subject._listeners.clear();
|
||||
});
|
||||
|
||||
test('addListener', () => {
|
||||
assert.equal(subject._listeners.size, 0);
|
||||
this.listener = () => {};
|
||||
subject.addListener(this.listener);
|
||||
assert.equal(subject._listeners.size, 1);
|
||||
assert.ok(subject._listeners.has(this.listener));
|
||||
});
|
||||
|
||||
test('removeListener', () => {
|
||||
assert.equal(subject._listeners.size, 1);
|
||||
assert.ok(subject._listeners.has(this.listener));
|
||||
subject.removeListener(this.listener);
|
||||
assert.equal(subject._listeners.size, 0);
|
||||
});
|
||||
});
|
||||
|
||||
suite('getInfo', () => {
|
||||
var postMessageSpy;
|
||||
var dateNowStub;
|
||||
var now;
|
||||
var listenerCalled;
|
||||
|
||||
setup(() => {
|
||||
postMessageSpy = this.sinon.spy(port, 'postMessage');
|
||||
dateNowStub = this.sinon.stub(Date, 'now', () => {
|
||||
return now;
|
||||
});
|
||||
subject.addListener(() => {
|
||||
listenerCalled = true;
|
||||
});
|
||||
});
|
||||
|
||||
teardown(() => {
|
||||
postMessageSpy.restore();
|
||||
dateNowStub.restore();
|
||||
});
|
||||
|
||||
test('getInfo', done => {
|
||||
now = 'now';
|
||||
var expectedMessage = {
|
||||
data: {
|
||||
id: now,
|
||||
result: 'whatever'
|
||||
}
|
||||
};
|
||||
subject.getInfo().then(message => {
|
||||
assert.equal(message.id, expectedMessage.data.id);
|
||||
assert.equal(message.result, expectedMessage.data.result);
|
||||
assert.ok(!listenerCalled);
|
||||
done();
|
||||
});
|
||||
setTimeout(() => {
|
||||
this.sinon.assert.calledOnce(postMessageSpy);
|
||||
assert.equal(postMessageSpy.getCall(0).args[0].name, 'getInfo');
|
||||
assert.equal(postMessageSpy.getCall(0).args[0].id, now);
|
||||
assert.ok(subject._requests.has(now));
|
||||
subject.onmessage(expectedMessage);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
suite('onsyncchange', () => {
|
||||
var postMessageSpy;
|
||||
var observedMessage;
|
||||
var now;
|
||||
|
||||
setup(() => {
|
||||
postMessageSpy = this.sinon.spy(port, 'postMessage');
|
||||
var listener = (message) => {
|
||||
console.log('mes', JSON.stringify(message));
|
||||
observedMessage = message;
|
||||
};
|
||||
subject.addListener(listener);
|
||||
});
|
||||
|
||||
teardown(() => {
|
||||
postMessageSpy.restore();
|
||||
});
|
||||
|
||||
test('getInfo', done => {
|
||||
var expectedMessage = {
|
||||
data: {
|
||||
name: 'onsyncchange',
|
||||
result: 'whatever'
|
||||
}
|
||||
};
|
||||
|
||||
subject.onmessage(expectedMessage);
|
||||
setTimeout(() => {
|
||||
this.sinon.assert.notCalled(postMessageSpy);
|
||||
assert.ok(!(subject._requests.has(now)));
|
||||
assert.deepEqual(observedMessage, expectedMessage.data);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
36
gaia/tv_apps/browser/test/unit/sync/mocks/mock_manager_bridge.js
Executable file
36
gaia/tv_apps/browser/test/unit/sync/mocks/mock_manager_bridge.js
Executable file
|
|
@ -0,0 +1,36 @@
|
|||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
|
||||
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
'use strict';
|
||||
|
||||
(function(exports) {
|
||||
|
||||
var MockSyncManagerBridge = {
|
||||
_syncInfo: null,
|
||||
|
||||
addListener() {},
|
||||
|
||||
removeListener() {},
|
||||
|
||||
enable() {
|
||||
return Promise.resolve();
|
||||
},
|
||||
|
||||
disable() {
|
||||
return Promise.resolve();
|
||||
},
|
||||
|
||||
sync() {
|
||||
return Promise.resolve();
|
||||
},
|
||||
|
||||
getInfo() {
|
||||
return Promise.resolve(this._syncInfo);
|
||||
}
|
||||
};
|
||||
|
||||
exports.MockSyncManagerBridge = MockSyncManagerBridge;
|
||||
}(window));
|
||||
525
gaia/tv_apps/browser/test/unit/sync/settings_test.js
Executable file
525
gaia/tv_apps/browser/test/unit/sync/settings_test.js
Executable file
|
|
@ -0,0 +1,525 @@
|
|||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
|
||||
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/* global ERROR_DIALOG_CLOSED_BY_USER */
|
||||
/* global ERROR_INVALID_SYNC_ACCOUNT */
|
||||
/* global ERROR_OFFLINE */
|
||||
/* global expect */
|
||||
/* global FirefoxSyncSettings */
|
||||
/* global MocksHelper */
|
||||
/* global MockL10n */
|
||||
/* global NavigatorSettings */
|
||||
/* global Settings */
|
||||
/* global SettingsListener */
|
||||
/* global SyncManagerBridge */
|
||||
|
||||
'use strict';
|
||||
|
||||
require('/shared/test/unit/load_body_html_helper.js');
|
||||
require('/shared/test/unit/mocks/mock_lazy_loader.js');
|
||||
require('/shared/test/unit/mocks/mock_l10n.js');
|
||||
require('/shared/test/unit/mocks/mock_navigator_moz_settings.js');
|
||||
require('/shared/test/unit/mocks/mock_settings_listener.js');
|
||||
require('/shared/js/sync/errors.js');
|
||||
requireApp('browser/test/unit/sync/mocks/mock_manager_bridge.js');
|
||||
requireApp('browser/js/settings.js');
|
||||
requireApp('browser/js/browser_dialog.js');
|
||||
|
||||
var mocksForSettings = new MocksHelper([
|
||||
'LazyLoader',
|
||||
'NavigatorSettings',
|
||||
'SettingsListener',
|
||||
'SyncManagerBridge'
|
||||
]).init();
|
||||
|
||||
suite('Sync settings >', function() {
|
||||
|
||||
const BOOKMARKS_SETTING = 'sync.collections.bookmarks.enabled';
|
||||
const HISTORY_SETTING = 'sync.collections.history.enabled';
|
||||
|
||||
var subject;
|
||||
var realL10n;
|
||||
var realMozSettings;
|
||||
|
||||
var observeStub;
|
||||
var addListenerStub;
|
||||
var addEventListenerStub;
|
||||
var getInfoSpy;
|
||||
var showScreenSpy;
|
||||
|
||||
var observers = {};
|
||||
var onsyncchange;
|
||||
var visibilityListener;
|
||||
|
||||
mocksForSettings.attachTestHelpers();
|
||||
|
||||
suiteSetup(function(done) {
|
||||
realL10n = navigator.mozL10n;
|
||||
navigator.mozL10n = MockL10n;
|
||||
realMozSettings = navigator.mozSettings;
|
||||
navigator.mozSettings = NavigatorSettings;
|
||||
|
||||
loadBodyHTML('sync/fixtures/settings.html');
|
||||
|
||||
getInfoSpy = sinon.spy(SyncManagerBridge, 'getInfo');
|
||||
observeStub = sinon.stub(SettingsListener, 'observe',
|
||||
(setting, unused, observer) => {
|
||||
observers[setting] = observer;
|
||||
});
|
||||
addListenerStub = sinon.stub(SyncManagerBridge, 'addListener',
|
||||
listener => {
|
||||
onsyncchange = listener;
|
||||
});
|
||||
addEventListenerStub = sinon.stub(document, 'addEventListener',
|
||||
(event, listener) => {
|
||||
visibilityListener = listener;
|
||||
});
|
||||
sinon.stub(Settings, 'hide');
|
||||
|
||||
require('/tv_apps/browser/js/sync/settings.js').then(() => {
|
||||
subject = FirefoxSyncSettings;
|
||||
showScreenSpy = sinon.spy(subject, 'showScreen');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
navigator.mozL10n = realL10n;
|
||||
navigator.mozSettings = realMozSettings;
|
||||
observeStub.restore();
|
||||
addListenerStub.restore();
|
||||
addEventListenerStub.restore();
|
||||
getInfoSpy.restore();
|
||||
showScreenSpy.restore();
|
||||
});
|
||||
|
||||
suite('Initial state', function() {
|
||||
test('Integrity', function() {
|
||||
expect(subject).to.be.an('object');
|
||||
});
|
||||
|
||||
test('Initialization', function() {
|
||||
expect(getInfoSpy.calledOnce).to.equal(true);
|
||||
expect(addListenerStub.calledOnce).to.equal(true);
|
||||
expect(addListenerStub.args[0][0]).to.be.a('function');
|
||||
expect(addEventListenerStub.calledOnce).to.equal(true);
|
||||
expect(onsyncchange).to.be.a('function');
|
||||
expect(visibilityListener).to.be.a('function');
|
||||
});
|
||||
|
||||
test('should observe settings', function() {
|
||||
expect(observeStub.calledTwice).to.be.equal(true);
|
||||
expect(observers[HISTORY_SETTING]).to.be.a('function');
|
||||
expect(observers[BOOKMARKS_SETTING]).to.be.a('function');
|
||||
});
|
||||
|
||||
test('DOM initial state', function() {
|
||||
expect(subject.area).to.be.an('object');
|
||||
expect(subject.elements.enabled).to.be.an('object');
|
||||
expect(subject.elements.disabled).to.be.an('object');
|
||||
expect(subject.listeners).to.be.an('object');
|
||||
expect(subject.listeners.size).to.be.equals(8);
|
||||
expect(subject.collections).to.be.an('object');
|
||||
expect(subject.collections.size).to.be.equals(0);
|
||||
expect(subject.screen).to.be.equals('disabled');
|
||||
expect(subject.state).to.be.equals('disabled');
|
||||
});
|
||||
});
|
||||
|
||||
suite('visibilitychange', function() {
|
||||
setup(function() {
|
||||
getInfoSpy.reset();
|
||||
});
|
||||
|
||||
teardown(function() {
|
||||
getInfoSpy.reset();
|
||||
});
|
||||
|
||||
test('should refresh on visibity change', function() {
|
||||
expect(getInfoSpy.called).to.be.equal(false);
|
||||
visibilityListener();
|
||||
expect(getInfoSpy.called).to.be.equal(true);
|
||||
});
|
||||
});
|
||||
|
||||
suite('Disabled', function() {
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: 'disabled'
|
||||
});
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
showScreenSpy.reset();
|
||||
});
|
||||
|
||||
test('should show disabled screen', function() {
|
||||
expect(showScreenSpy.calledOnce).to.be.equal(true);
|
||||
expect(showScreenSpy.args[0][0]).to.equal('disabled');
|
||||
expect(subject.elements.enabled.hidden).to.be.equal(true);
|
||||
expect(subject.elements.disabled.hidden).to.be.equal(false);
|
||||
});
|
||||
|
||||
test('should have signin button', function() {
|
||||
expect(subject.elements.signInButton).to.be.an('object');
|
||||
expect(subject.elements.signInButton.getAttribute('data-l10n-id'))
|
||||
.to.equals('fxsync-sign-in');
|
||||
expect(subject.elements.signInButton.classList.contains('disabled'))
|
||||
.to.equals(false);
|
||||
});
|
||||
});
|
||||
|
||||
suite('Disabled from disabling', function() {
|
||||
var alertStub;
|
||||
var formatValueStub;
|
||||
suiteSetup(function() {
|
||||
formatValueStub = sinon.stub(navigator.mozL10n, 'formatValue', key => {
|
||||
return Promise.resolve(key);
|
||||
});
|
||||
|
||||
alertStub = sinon.stub(window, 'alert');
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
showScreenSpy.reset();
|
||||
formatValueStub.restore();
|
||||
alertStub.restore();
|
||||
});
|
||||
|
||||
teardown(function() {
|
||||
alertStub.reset();
|
||||
});
|
||||
|
||||
['enabled', 'syncing'].forEach(previousState => {
|
||||
test('should show disabled dialog',
|
||||
function(done) {
|
||||
subject.previousState = previousState;
|
||||
subject.state = 'disabling';
|
||||
onsyncchange({
|
||||
state: 'disabled',
|
||||
user: 'pepito'
|
||||
});
|
||||
setTimeout(function() {
|
||||
expect(alertStub.calledOnce).to.equal(true);
|
||||
expect(alertStub.args[0][0]).to.equal('fxsync-disabled');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
suite('Enabled', function() {
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: 'enabled',
|
||||
user: 'pepito'
|
||||
});
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
showScreenSpy.reset();
|
||||
});
|
||||
|
||||
test('should show enabled screen', function() {
|
||||
expect(showScreenSpy.calledOnce).to.be.equal(true);
|
||||
expect(showScreenSpy.args[0][0]).to.equal('enabled');
|
||||
expect(subject.elements.enabled.hidden).to.be.equal(false);
|
||||
expect(subject.elements.disabled.hidden).to.be.equal(true);
|
||||
});
|
||||
|
||||
test('should show user', function() {
|
||||
expect(subject.elements.signedInAs).to.be.an('object');
|
||||
expect(subject.elements.signedInAs.getAttribute('data-l10n-id'))
|
||||
.to.equals('fxsync-signed-in-as');
|
||||
expect(subject.elements.signedInAs.getAttribute('data-l10n-args'))
|
||||
.to.equals('{"email":"pepito"}');
|
||||
});
|
||||
|
||||
test('should show sync now button', function() {
|
||||
expect(subject.elements.syncNowButton).to.be.an('object');
|
||||
expect(subject.elements.syncNowButton.getAttribute('data-l10n-id'))
|
||||
.to.equals('fxsync-sync-now');
|
||||
});
|
||||
|
||||
test('should show signout button', function() {
|
||||
expect(subject.elements.signOutButton).to.be.an('object');
|
||||
expect(subject.elements.signOutButton.getAttribute('data-l10n-id'))
|
||||
.to.equals('fxsync-sign-out');
|
||||
});
|
||||
|
||||
test('should show collection switches', function() {
|
||||
expect(subject.elements.collectionBookmarks).to.be.an('object');
|
||||
expect(subject.elements.collectionHistory).to.be.an('object');
|
||||
});
|
||||
});
|
||||
|
||||
suite('Enabled from enabling', function() {
|
||||
var alertStub;
|
||||
var formatValueStub;
|
||||
suiteSetup(function() {
|
||||
formatValueStub = sinon.stub(navigator.mozL10n, 'formatValue', key => {
|
||||
return Promise.resolve(key);
|
||||
});
|
||||
|
||||
alertStub = sinon.stub(window, 'alert');
|
||||
|
||||
subject.state = 'enabling';
|
||||
onsyncchange({
|
||||
state: 'enabled',
|
||||
user: 'pepito'
|
||||
});
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
showScreenSpy.reset();
|
||||
formatValueStub.restore();
|
||||
alertStub.restore();
|
||||
});
|
||||
|
||||
test('should show enabled dialog', function() {
|
||||
expect(alertStub.calledOnce).to.equal(true);
|
||||
expect(alertStub.args[0][0]).to.equal('fxsync-enabled');
|
||||
});
|
||||
});
|
||||
|
||||
suite('Enabling', function() {
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: 'enabling'
|
||||
});
|
||||
});
|
||||
|
||||
test('should show signing in button', function() {
|
||||
expect(subject.elements.signInButton.dataset.l10nId)
|
||||
.to.equals('fxsync-signing');
|
||||
});
|
||||
|
||||
test('should disable signin button', function() {
|
||||
expect(subject.elements.signInButton.classList.contains('disabled'))
|
||||
.to.equals(true);
|
||||
});
|
||||
});
|
||||
|
||||
suite('Syncing', function() {
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: 'syncing',
|
||||
user: 'pepito'
|
||||
});
|
||||
});
|
||||
|
||||
test('should show syncing button', function() {
|
||||
expect(subject.elements.syncNowButton.dataset.l10nId)
|
||||
.to.equals('fxsync-syncing');
|
||||
});
|
||||
|
||||
test('should show user', function() {
|
||||
expect(subject.elements.signedInAs).to.be.an('object');
|
||||
expect(subject.elements.signedInAs.getAttribute('data-l10n-id'))
|
||||
.to.equals('fxsync-signed-in-as');
|
||||
expect(subject.elements.signedInAs.getAttribute('data-l10n-args'))
|
||||
.to.equals('{"email":"pepito"}');
|
||||
});
|
||||
|
||||
test('should disable sync button and collection switches', function() {
|
||||
expect(subject.elements.syncNowButton.classList.contains('disabled'))
|
||||
.to.equals(true);
|
||||
expect(subject.elements.collectionBookmarks.disabled).to.equal(true);
|
||||
expect(subject.elements.collectionHistory.disabled).to.equal(true);
|
||||
});
|
||||
});
|
||||
|
||||
suite('Errored', function() {
|
||||
var alertStub;
|
||||
var formatValueStub;
|
||||
|
||||
suiteSetup(function() {
|
||||
alertStub = sinon.stub(window, 'alert');
|
||||
formatValueStub = sinon.stub(navigator.mozL10n, 'formatValue', key => {
|
||||
return Promise.resolve(key);
|
||||
});
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
alertStub.restore();
|
||||
formatValueStub.restore();
|
||||
});
|
||||
|
||||
teardown(function() {
|
||||
alertStub.reset();
|
||||
});
|
||||
|
||||
test('should ignore ERROR_DIALOG_CLOSED_BY_USER error', function() {
|
||||
onsyncchange({
|
||||
state: 'errored',
|
||||
error: ERROR_DIALOG_CLOSED_BY_USER
|
||||
});
|
||||
expect(alertStub.calledOnce).to.equal(false);
|
||||
});
|
||||
|
||||
test('should show ERROR_INVALID_SYNC_ACCOUNT error', function(done) {
|
||||
onsyncchange({
|
||||
state: 'errored',
|
||||
error: ERROR_INVALID_SYNC_ACCOUNT
|
||||
});
|
||||
setTimeout(() => {
|
||||
expect(alertStub.calledOnce).to.equal(true);
|
||||
expect(alertStub.args[0][0]).to.equal(ERROR_INVALID_SYNC_ACCOUNT +
|
||||
'\n' +
|
||||
ERROR_INVALID_SYNC_ACCOUNT +
|
||||
'-explanation');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('should show ERROR_OFFLINE error', function(done) {
|
||||
onsyncchange({
|
||||
state: 'errored',
|
||||
error: ERROR_OFFLINE
|
||||
});
|
||||
setTimeout(() => {
|
||||
expect(alertStub.calledOnce).to.equal(true);
|
||||
expect(alertStub.args[0][0]).to.equal(ERROR_OFFLINE +
|
||||
'\n' +
|
||||
ERROR_OFFLINE +
|
||||
'-explanation');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
suite('Collections', function() {
|
||||
var realMozId;
|
||||
var mozIdError = null;
|
||||
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: 'enabled',
|
||||
user: 'pepito'
|
||||
});
|
||||
|
||||
realMozId = navigator.mozId;
|
||||
navigator.mozId = {
|
||||
watch(options) {
|
||||
this._onlogin = options.onlogin;
|
||||
this._onerror = options.onerror;
|
||||
},
|
||||
request() {
|
||||
mozIdError ? this._onerror() : this._onlogin();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
[{
|
||||
test: 'should check bookmarks on setting enabled',
|
||||
collection: 'collectionBookmarks',
|
||||
setting: BOOKMARKS_SETTING,
|
||||
enabled: true
|
||||
}, {
|
||||
test: 'should uncheck bookmarks on setting disabled',
|
||||
collection: 'collectionBookmarks',
|
||||
setting: BOOKMARKS_SETTING,
|
||||
enabled: false
|
||||
}, {
|
||||
test: 'should check history on setting enabled',
|
||||
collection: 'collectionHistory',
|
||||
setting: HISTORY_SETTING,
|
||||
enabled: true
|
||||
}, {
|
||||
test: 'should uncheck history on setting disabled',
|
||||
collection: 'collectionHistory',
|
||||
setting: HISTORY_SETTING,
|
||||
enabled: false
|
||||
}].forEach(config => {
|
||||
test(config.test, function() {
|
||||
expect(subject.elements[config.collection].checked)
|
||||
.to.be.equal(!config.enabled);
|
||||
observers[config.setting](config.enabled);
|
||||
expect(subject.elements[config.collection].checked)
|
||||
.to.be.equal(config.enabled);
|
||||
});
|
||||
});
|
||||
|
||||
[{
|
||||
test: 'bookmark checked',
|
||||
setting: BOOKMARKS_SETTING,
|
||||
checked: true,
|
||||
collection: 'collectionBookmarks',
|
||||
oncheckedFunction: 'onbookmarkschecked'
|
||||
}, {
|
||||
test: 'bookmark unchecked',
|
||||
setting: BOOKMARKS_SETTING,
|
||||
checked: false,
|
||||
collection: 'collectionBookmarks',
|
||||
oncheckedFunction: 'onbookmarkschecked'
|
||||
}, {
|
||||
test: 'history checked',
|
||||
setting: HISTORY_SETTING,
|
||||
checked: true,
|
||||
collection: 'collectionHistory',
|
||||
oncheckedFunction: 'onhistorychecked'
|
||||
}, {
|
||||
test: 'history unchecked',
|
||||
setting: HISTORY_SETTING,
|
||||
checked: false,
|
||||
collection: 'collectionHistory',
|
||||
oncheckedFunction: 'onhistorychecked'
|
||||
}].forEach(config => {
|
||||
test('should enable setting on ' + config.test, function() {
|
||||
expect(subject.collections.has(config.setting))
|
||||
.to.be.equal(!config.checked);
|
||||
subject.elements[config.collection].checked = config.checked;
|
||||
subject[config.oncheckedFunction]();
|
||||
expect(subject.collections.has(config.setting))
|
||||
.to.be.equal(config.checked);
|
||||
});
|
||||
});
|
||||
|
||||
test('should enable/disable Sync Now button on setting enabled/disabled',
|
||||
function() {
|
||||
[{
|
||||
setting: HISTORY_SETTING,
|
||||
enabled: true
|
||||
}, {
|
||||
setting: HISTORY_SETTING,
|
||||
enabled: false
|
||||
}, {
|
||||
setting: BOOKMARKS_SETTING,
|
||||
enabled: true
|
||||
}, {
|
||||
setting: BOOKMARKS_SETTING,
|
||||
enabled: false
|
||||
}].forEach(config => {
|
||||
observers[config.setting](config.enabled);
|
||||
expect(subject.elements.syncNowButton.classList.contains('disabled'))
|
||||
.to.equals(!config.enabled);
|
||||
});
|
||||
});
|
||||
|
||||
test(`should not enable collections checkboxes if refresh auth failed`,
|
||||
function() {
|
||||
[{
|
||||
setting: HISTORY_SETTING,
|
||||
element: 'collectionHistory',
|
||||
onchecked: 'onhistorychecked'
|
||||
}, {
|
||||
setting: BOOKMARKS_SETTING,
|
||||
element: 'collectionBookmarks',
|
||||
onchecked: 'onbookmarkschecked'
|
||||
}].forEach(config => {
|
||||
mozIdError = true;
|
||||
expect(subject.collections.has(config.setting))
|
||||
.to.be.equal(false);
|
||||
subject.elements[config.element].checked = true;
|
||||
subject[config.onchecked]();
|
||||
expect(subject.collections.has(config.setting))
|
||||
.to.be.equal(false);
|
||||
expect(subject.elements[config.element].checked)
|
||||
.to.be.equal(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
167
gaia/tv_apps/browser/test/unit/sync/toolbar_test.js
Executable file
167
gaia/tv_apps/browser/test/unit/sync/toolbar_test.js
Executable file
|
|
@ -0,0 +1,167 @@
|
|||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
|
||||
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/* global expect */
|
||||
/* global FirefoxSyncToolbar */
|
||||
/* global loadBodyHTML */
|
||||
/* global MocksHelper */
|
||||
/* global MockL10n */
|
||||
/* global MockSyncManagerBridge */
|
||||
/* global Settings */
|
||||
/* global SyncManagerBridge */
|
||||
|
||||
'use strict';
|
||||
|
||||
require('/shared/test/unit/load_body_html_helper.js');
|
||||
require('/shared/test/unit/mocks/mock_lazy_loader.js');
|
||||
require('/shared/test/unit/mocks/mock_l10n.js');
|
||||
requireApp('browser/test/unit/mocks/mock_settings.js');
|
||||
requireApp('browser/test/unit/sync/mocks/mock_manager_bridge.js');
|
||||
|
||||
var mocksForToolbar = new MocksHelper([
|
||||
'LazyLoader',
|
||||
'Settings',
|
||||
'SyncManagerBridge'
|
||||
]).init();
|
||||
|
||||
suite('Sync toolbar >', function() {
|
||||
var subject;
|
||||
var realL10n;
|
||||
|
||||
var initialSyncInfo = {
|
||||
state: 'disabled'
|
||||
};
|
||||
|
||||
var getInfoSpy;
|
||||
var settingsShowSpy;
|
||||
var addListenerStub;
|
||||
var addEventListenerStub;
|
||||
|
||||
var onsyncchange;
|
||||
var visibilityListener;
|
||||
|
||||
mocksForToolbar.attachTestHelpers();
|
||||
|
||||
suiteSetup(function(done) {
|
||||
realL10n = navigator.mozL10n;
|
||||
navigator.mozL10n = MockL10n;
|
||||
|
||||
loadBodyHTML('sync/fixtures/toolbar.html');
|
||||
|
||||
getInfoSpy = sinon.spy(SyncManagerBridge, 'getInfo');
|
||||
settingsShowSpy = sinon.spy(Settings, 'show');
|
||||
addListenerStub = sinon.stub(SyncManagerBridge, 'addListener',
|
||||
listener => {
|
||||
onsyncchange = listener;
|
||||
});
|
||||
addEventListenerStub = sinon.stub(document, 'addEventListener',
|
||||
(event, listener) => {
|
||||
visibilityListener = listener;
|
||||
});
|
||||
MockSyncManagerBridge._syncInfo = initialSyncInfo;
|
||||
|
||||
require('/tv_apps/browser/js/sync/toolbar.js').then(() => {
|
||||
subject = FirefoxSyncToolbar;
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
getInfoSpy.restore();
|
||||
settingsShowSpy.restore();
|
||||
addListenerStub.restore();
|
||||
addEventListenerStub.restore();
|
||||
navigator.mozL10n = realL10n;
|
||||
});
|
||||
|
||||
suite('Initial state', function() {
|
||||
test('Integrity', function() {
|
||||
expect(subject).to.be.an('object');
|
||||
});
|
||||
|
||||
test('Initialization', function() {
|
||||
expect(getInfoSpy.calledOnce).to.equal(true);
|
||||
expect(addListenerStub.calledOnce).to.equal(true);
|
||||
expect(addListenerStub.args[0][0]).to.be.a('function');
|
||||
expect(addEventListenerStub.calledOnce).to.equal(true);
|
||||
expect(onsyncchange).to.be.a('function');
|
||||
expect(visibilityListener).to.be.a('function');
|
||||
});
|
||||
|
||||
test('DOM initial state', function() {
|
||||
expect(subject.syncBlock).to.be.an('object');
|
||||
expect(subject.syncTab).to.be.an('object');
|
||||
expect(subject.syncTab.getAttribute('data-l10n-id'))
|
||||
.to.equal('fxsync-sign-in-to-sync');
|
||||
expect(subject.syncTab.getAttribute('data-l10n-args'))
|
||||
.to.equal(null);
|
||||
});
|
||||
});
|
||||
|
||||
suite('visibilitychange', function() {
|
||||
setup(function() {
|
||||
getInfoSpy.reset();
|
||||
});
|
||||
|
||||
teardown(function() {
|
||||
getInfoSpy.reset();
|
||||
});
|
||||
|
||||
test('visibity change to not hidden should refresh', function() {
|
||||
expect(getInfoSpy.called).to.be.equal(false);
|
||||
visibilityListener();
|
||||
expect(getInfoSpy.called).to.be.equal(true);
|
||||
});
|
||||
});
|
||||
|
||||
['enabled',
|
||||
'syncing'].forEach(event => {
|
||||
suite(event, function() {
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: event,
|
||||
user: 'pepito'
|
||||
});
|
||||
});
|
||||
|
||||
test('Tab name should change', function() {
|
||||
expect(subject.syncTab.getAttribute('data-l10n-id'))
|
||||
.to.equal('fxsync-signed-in-as');
|
||||
expect(subject.syncTab.getAttribute('data-l10n-args'))
|
||||
.to.equal('{"email":"pepito"}');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
suite('enabling', function() {
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: 'enabling'
|
||||
});
|
||||
});
|
||||
|
||||
test('Tab name should change', function() {
|
||||
expect(settingsShowSpy.calledOnce).to.equal(true);
|
||||
expect(subject.syncTab.getAttribute('data-l10n-id'))
|
||||
.to.equal('fxsync-signing');
|
||||
});
|
||||
});
|
||||
|
||||
suite('disabled', function() {
|
||||
suiteSetup(function() {
|
||||
onsyncchange({
|
||||
state: 'disabled'
|
||||
});
|
||||
});
|
||||
|
||||
test('Tab name should change', function() {
|
||||
expect(subject.syncTab.getAttribute('data-l10n-id'))
|
||||
.to.equal('fxsync-sign-in-to-sync');
|
||||
expect(subject.syncTab.getAttribute('data-l10n-args'))
|
||||
.to.equal(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
Loading…
Reference in a new issue