diff --git a/chrome/content/zotero/xpcom/storage/storageLocal.js b/chrome/content/zotero/xpcom/storage/storageLocal.js index df5272652..eed9aeeea 100644 --- a/chrome/content/zotero/xpcom/storage/storageLocal.js +++ b/chrome/content/zotero/xpcom/storage/storageLocal.js @@ -494,6 +494,12 @@ Zotero.Sync.Storage.Local = { }, + /** + * Mark all stored files for upload checking + * + * This is used when switching between storage modes in the preferences so that all existing files + * are uploaded via the new mode if necessary. + */ resetModeSyncStates: Zotero.Promise.coroutine(function* () { var sql = "SELECT itemID FROM items JOIN itemAttachments USING (itemID) " + "WHERE libraryID=? AND itemTypeID=? AND linkMode IN (?, ?)"; @@ -504,7 +510,7 @@ Zotero.Sync.Storage.Local = { Zotero.Attachments.LINK_MODE_IMPORTED_URL, ]; var itemIDs = yield Zotero.DB.columnQueryAsync(sql, params); - for (let itemID of items) { + for (let itemID of itemIDs) { let item = Zotero.Items.get(itemID); item._attachmentSyncState = this.SYNC_STATE_TO_UPLOAD; } diff --git a/test/tests/storageLocalTest.js b/test/tests/storageLocalTest.js index c4a78f08c..cd1931322 100644 --- a/test/tests/storageLocalTest.js +++ b/test/tests/storageLocalTest.js @@ -102,6 +102,22 @@ describe("Zotero.Sync.Storage.Local", function () { }) }) + describe("#resetModeSyncStates()", function () { + it("should reset attachment sync states to 'to_upload'", function* () { + var attachment = yield importFileAttachment('test.png'); + attachment.attachmentSyncState = 'in_sync'; + yield attachment.saveTx(); + + var local = Zotero.Sync.Storage.Local; + yield local.resetModeSyncStates() + assert.strictEqual(attachment.attachmentSyncState, local.SYNC_STATE_TO_UPLOAD); + var state = yield Zotero.DB.valueQueryAsync( + "SELECT syncState FROM itemAttachments WHERE itemID=?", attachment.id + ); + assert.strictEqual(state, local.SYNC_STATE_TO_UPLOAD); + }); + }); + describe("#processDownload()", function () { var file1Name = 'index.html'; var file1Contents = 'Test';