/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
_(
"Make sure the form store follows the Store api and correctly accesses the backend form storage"
);
const { FormEngine } = ChromeUtils.importESModule(
"resource://services-sync/engines/forms.sys.mjs"
);
const { Service } = ChromeUtils.importESModule(
"resource://services-sync/service.sys.mjs"
);
const { SyncedRecordsTelemetry } = ChromeUtils.importESModule(
"resource://services-sync/telemetry.sys.mjs"
);
add_task(async
function run_test() {
let engine =
new FormEngine(Service);
await engine.initialize();
let store = engine._store;
async
function applyEnsureNoFailures(records) {
let countTelemetry =
new SyncedRecordsTelemetry();
Assert.equal(
(await store.applyIncomingBatch(records, countTelemetry)).length,
0
);
}
_(
"Remove any existing entries");
await store.wipe();
if ((await store.getAllIDs()).length) {
do_throw(
"Shouldn't get any ids!");
}
_(
"Add a form entry");
await applyEnsureNoFailures([
{
id: Utils.makeGUID(),
name:
"name!!",
value:
"value??",
},
]);
_(
"Should have 1 entry now");
let id =
"";
for (let _id in await store.getAllIDs()) {
if (id ==
"") {
id = _id;
}
else {
do_throw(
"Should have only gotten one!");
}
}
Assert.ok(store.itemExists(id));
_(
"Should be able to find this entry as a dupe");
Assert.equal(
await engine._findDupe({ name:
"name!!", value:
"value??" }),
id
);
let rec = await store.createRecord(id);
_(
"Got record for id", id, rec);
Assert.equal(rec.name,
"name!!");
Assert.equal(rec.value,
"value??");
_(
"Create a non-existent id for delete");
Assert.ok((await store.createRecord(
"deleted!!")).deleted);
_(
"Try updating.. doesn't do anything yet");
await store.update({});
_(
"Remove all entries");
await store.wipe();
if ((await store.getAllIDs()).length) {
do_throw(
"Shouldn't get any ids!");
}
_(
"Add another entry");
await applyEnsureNoFailures([
{
id: Utils.makeGUID(),
name:
"another",
value:
"entry",
},
]);
id =
"";
for (let _id in await store.getAllIDs()) {
if (id ==
"") {
id = _id;
}
else {
do_throw(
"Should have only gotten one!");
}
}
_(
"Change the id of the new entry to something else");
await store.changeItemID(id,
"newid");
_(
"Make sure it's there");
Assert.ok(store.itemExists(
"newid"));
_(
"Remove the entry");
await store.remove({
id:
"newid",
});
if ((await store.getAllIDs()).length) {
do_throw(
"Shouldn't get any ids!");
}
_(
"Removing the entry again shouldn't matter");
await store.remove({
id:
"newid",
});
if ((await store.getAllIDs()).length) {
do_throw(
"Shouldn't get any ids!");
}
_(
"Add another entry to delete using applyIncomingBatch");
let toDelete = {
id: Utils.makeGUID(),
name:
"todelete",
value:
"entry",
};
await applyEnsureNoFailures([toDelete]);
id =
"";
for (let _id in await store.getAllIDs()) {
if (id ==
"") {
id = _id;
}
else {
do_throw(
"Should have only gotten one!");
}
}
Assert.ok(store.itemExists(id));
// mark entry as deleted
toDelete.id = id;
toDelete.deleted =
true;
await applyEnsureNoFailures([toDelete]);
if ((await store.getAllIDs()).length) {
do_throw(
"Shouldn't get any ids!");
}
_(
"Add an entry to wipe");
await applyEnsureNoFailures([
{
id: Utils.makeGUID(),
name:
"towipe",
value:
"entry",
},
]);
await store.wipe();
if ((await store.getAllIDs()).length) {
do_throw(
"Shouldn't get any ids!");
}
_(
"Ensure we work if formfill is disabled.");
Services.prefs.setBoolPref(
"browser.formfill.enable",
false);
try {
// a search
if ((await store.getAllIDs()).length) {
do_throw(
"Shouldn't get any ids!");
}
// an update.
await applyEnsureNoFailures([
{
id: Utils.makeGUID(),
name:
"some",
value:
"entry",
},
]);
}
finally {
Services.prefs.clearUserPref(
"browser.formfill.enable");
await store.wipe();
}
});