Files
standardnotes-app-web/packages/snjs/mocha/sync_tests/integrity.test.js
2023-08-06 15:23:31 -05:00

79 lines
2.4 KiB
JavaScript

import { BaseItemCounts } from '../lib/BaseItemCounts.js'
import * as Factory from '../lib/factory.js'
chai.use(chaiAsPromised)
const expect = chai.expect
describe('sync integrity', () => {
let application
let email
let password
let expectedItemCount
beforeEach(async function () {
localStorage.clear()
expectedItemCount = BaseItemCounts.DefaultItemsWithAccount
application = await Factory.createInitAppWithFakeCrypto()
email = UuidGenerator.GenerateUuid()
password = UuidGenerator.GenerateUuid()
await Factory.registerUserToApplication({
application: application,
email: email,
password: password,
})
})
afterEach(async function () {
expect(application.sync.isOutOfSync()).to.equal(false)
const rawPayloads = await application.storage.getAllRawPayloads()
expect(rawPayloads.length).to.equal(expectedItemCount)
await Factory.safeDeinit(application)
localStorage.clear()
application = undefined
})
const awaitSyncEventPromise = (application, targetEvent) => {
return new Promise((resolve) => {
application.sync.addEventObserver((event) => {
if (event === targetEvent) {
resolve()
}
})
})
}
it('should detect when out of sync', async function () {
const item = await application.mutator.emitItemFromPayload(
Factory.createNotePayload(),
PayloadEmitSource.LocalChanged,
)
expectedItemCount++
const didEnterOutOfSync = awaitSyncEventPromise(application, SyncEvent.EnterOutOfSync)
await application.sync.sync({ checkIntegrity: true })
await application.items.removeItemFromMemory(item)
await application.sync.sync({ checkIntegrity: true, awaitAll: true })
await didEnterOutOfSync
})
it('should self heal after out of sync', async function () {
const item = await application.mutator.emitItemFromPayload(
Factory.createNotePayload(),
PayloadEmitSource.LocalChanged,
)
expectedItemCount++
const didEnterOutOfSync = awaitSyncEventPromise(application, SyncEvent.EnterOutOfSync)
const didExitOutOfSync = awaitSyncEventPromise(application, SyncEvent.ExitOutOfSync)
await application.sync.sync({ checkIntegrity: true })
await application.items.removeItemFromMemory(item)
await application.sync.sync({ checkIntegrity: true, awaitAll: true })
await Promise.all([didEnterOutOfSync, didExitOutOfSync])
expect(application.sync.isOutOfSync()).to.equal(false)
})
})