Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
272 lines
7.1 KiB
JavaScript
Executable file
272 lines
7.1 KiB
JavaScript
Executable file
/* global FirstRun */
|
|
'use strict';
|
|
|
|
require('/js/firstrun.js');
|
|
|
|
suite('FirstRun', () => {
|
|
const COLS_PREF = 'grid.cols';
|
|
|
|
function testExpectedResults(results, expected) {
|
|
var string = '';
|
|
var order = 0;
|
|
results.order.forEach(entry => {
|
|
string += entry.id;
|
|
assert.equal(entry.order, order++);
|
|
});
|
|
assert.equal(string, expected);
|
|
}
|
|
|
|
suite('default settings', () => {
|
|
var json;
|
|
|
|
setup(() => {
|
|
window.LazyLoader = {
|
|
getJSON: (file) => {
|
|
assert.equal(file, 'js/init.json');
|
|
return Promise.resolve(json);
|
|
}
|
|
};
|
|
});
|
|
|
|
test('handles null JSON', (done) => {
|
|
json = null;
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
assert.isTrue(Array.isArray(results.order));
|
|
assert.equal(results.order.length, 0);
|
|
assert.equal(results.small, false);
|
|
});
|
|
}, done);
|
|
});
|
|
|
|
test('handles empty JSON', (done) => {
|
|
json = {};
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
assert.isTrue(Array.isArray(results.order));
|
|
assert.equal(results.order.length, 0);
|
|
assert.equal(results.small, false);
|
|
});
|
|
}, done);
|
|
});
|
|
|
|
test('handle null values in the JSON', (done) => {
|
|
json = { grid:
|
|
[[ null,
|
|
{ manifestURL: '1' },
|
|
null,
|
|
null,
|
|
{ manifestURL: '2', entry_point: '3' } ],
|
|
[ { manifestURL: '4' } ]
|
|
]};
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
testExpectedResults(results, '1/2/34/');
|
|
});
|
|
});
|
|
});
|
|
|
|
test('treats columns <= 3 as default columns setting', (done) => {
|
|
json = { preferences: {} };
|
|
|
|
json.preferences[COLS_PREF] = 2;
|
|
FirstRun().then(results1 => {
|
|
json.preferences[COLS_PREF] = 3;
|
|
FirstRun().then(results2 => {
|
|
done(() => {
|
|
assert.equal(results1.small, false);
|
|
assert.equal(results2.small, false);
|
|
});
|
|
}, done);
|
|
}, done);
|
|
});
|
|
|
|
test('treats columns > 3 as small columns setting', (done) => {
|
|
json = { preferences: {} };
|
|
json.preferences[COLS_PREF] = 4;
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
assert.equal(results.small, true);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('transforms grid into compatible format', (done) => {
|
|
json = { grid:
|
|
[[ { manifestURL: '1' },
|
|
{ manifestURL: '2', entry_point: '3' } ],
|
|
[ { manifestURL: '4' } ]
|
|
]};
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
testExpectedResults(results, '1/2/34/');
|
|
});
|
|
});
|
|
});
|
|
|
|
test('omits objects with no manifestURL', (done) => {
|
|
json = { grid:
|
|
[[ { manifestURL: '1' },
|
|
{ manifestURL: '2', entry_point: '3' } ],
|
|
[ { invalidObject: true } ],
|
|
[ { manifestURL: '4' } ]
|
|
]};
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
testExpectedResults(results, '1/2/34/');
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
suite('verticalhome import', () => {
|
|
const VERTICALHOME_ITEMS = 'verticalhome_items_migration';
|
|
|
|
const VERTICALHOME_PREFS = 'vertical_preferences_store';
|
|
|
|
const HOMESCREEN_PREFS = 'homescreen_settings';
|
|
|
|
var realNavigatorDatastores, realConsoleWarn;
|
|
var itemsDatastore, verticalPrefsDatastore, homescreenPrefsDatastore,
|
|
noDatastore;
|
|
|
|
setup(() => {
|
|
realNavigatorDatastores = navigator.getDataStores;
|
|
|
|
noDatastore = false;
|
|
navigator.getDataStores = name => {
|
|
assert.isTrue((name === VERTICALHOME_ITEMS) ||
|
|
(name === VERTICALHOME_PREFS) ||
|
|
(name === HOMESCREEN_PREFS));
|
|
|
|
if (noDatastore) {
|
|
return Promise.resolve([]);
|
|
}
|
|
|
|
switch(name) {
|
|
case VERTICALHOME_ITEMS:
|
|
return Promise.resolve([itemsDatastore]);
|
|
case VERTICALHOME_PREFS:
|
|
return Promise.resolve([verticalPrefsDatastore]);
|
|
case HOMESCREEN_PREFS:
|
|
return Promise.resolve([homescreenPrefsDatastore]);
|
|
}
|
|
};
|
|
|
|
// Initialise the three datastores as fake empty datastores
|
|
itemsDatastore = verticalPrefsDatastore = homescreenPrefsDatastore = {
|
|
getLength: () => { return Promise.resolve(0); },
|
|
get: () => { return Promise.reject(); }
|
|
};
|
|
|
|
// Overload console.warn to disable FirstRun's built-in error fallback
|
|
realConsoleWarn = console.warn;
|
|
console.warn = (message, error) => {
|
|
throw(error);
|
|
};
|
|
});
|
|
|
|
teardown(() => {
|
|
navigator.getDataStores = realNavigatorDatastores;
|
|
console.warn = realConsoleWarn;
|
|
});
|
|
|
|
test('handles inaccessible datastore', done => {
|
|
noDatastore = true;
|
|
FirstRun().then(() => {
|
|
done('should not succeed with inaccessible datastore');
|
|
}, (e) => {
|
|
done(() => {
|
|
assert.equal(e, 'verticalhome datastores inaccessible');
|
|
});
|
|
});
|
|
});
|
|
|
|
test('handles empty datastore', done => {
|
|
FirstRun().then(() => {
|
|
done('should not succeed with empty datastore');
|
|
}, (e) => {
|
|
done(() => {
|
|
assert.equal(e, 'No verticalhome app order to import');
|
|
});
|
|
});
|
|
});
|
|
|
|
function populateItemStore() {
|
|
var items = {
|
|
'2': { index: '2', type: 'app', manifestURL: '2', entryPoint: '3' },
|
|
'1': { index: '1', type: 'app', manifestURL: '1' },
|
|
'4': { index: '4', type: 'divider' },
|
|
'6': { index: '6', type: 'bookmark', id: '4' }
|
|
};
|
|
var keys = Object.getOwnPropertyNames(items);
|
|
var length = keys.length;
|
|
|
|
itemsDatastore = {
|
|
getLength: () => { return Promise.resolve(length); },
|
|
sync: () => {
|
|
var i = 0;
|
|
return {
|
|
next: () => {
|
|
return Promise.resolve((i++ < length) ? {
|
|
operation: 'put',
|
|
id: keys[i - 1],
|
|
data: items[keys[i - 1]]
|
|
} : {
|
|
operation: 'done'
|
|
});
|
|
}
|
|
};
|
|
}
|
|
};
|
|
}
|
|
|
|
test('converts verticalhome format to homescreen format', done => {
|
|
populateItemStore();
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
testExpectedResults(results, '1/2/34');
|
|
});
|
|
}, done);
|
|
});
|
|
|
|
test('reads column preferences', done => {
|
|
populateItemStore();
|
|
verticalPrefsDatastore.get = pref => {
|
|
return (pref === COLS_PREF) ?
|
|
Promise.resolve(4) : Promise.reject();
|
|
};
|
|
|
|
FirstRun().then(results => {
|
|
done(() => {
|
|
testExpectedResults(results, '1/2/34');
|
|
assert.isTrue(results.small);
|
|
});
|
|
}, done);
|
|
});
|
|
|
|
test('stores column preference if cols > 3', done => {
|
|
populateItemStore();
|
|
verticalPrefsDatastore.get = pref => {
|
|
return (pref === COLS_PREF) ?
|
|
Promise.resolve(4) : Promise.reject();
|
|
};
|
|
homescreenPrefsDatastore.put = (pref, id) => {
|
|
done(() => {
|
|
assert.equal(id, COLS_PREF);
|
|
assert.equal(pref, 4);
|
|
});
|
|
return Promise.resolve();
|
|
};
|
|
|
|
FirstRun().catch(done);
|
|
});
|
|
});
|
|
});
|