mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-11-01 22:08:18 +00:00
refactor(syncguard): use published CouchDB catch-up phases
This commit is contained in:
1 parent
acd3b0ade6
commit
101fe958f5
4 files changed
+134
-87
No files matched your search
@@ -12,25 +12,25 @@ describe("SyncGuardState", () => {
|
||||
it("never locks for a small incoming change batch", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 20);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:one", "f:two"]);
|
||||
guard.replicationStatusChanged("COMPLETED");
|
||||
guard.finiteActivityChanged(false, 0, 10);
|
||||
guard.catchUpSucceeded();
|
||||
guard.catchUpActivityChanged(false, 0, 10);
|
||||
expect(guard.presentation.phase).toBe("idle");
|
||||
});
|
||||
|
||||
it("counts distinct Metadata rather than repeated changes and waits for local application", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 3);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:one", "f:one", "f:two"]);
|
||||
expect(guard.presentation.phase).toBe("observing");
|
||||
guard.receivedDocuments(["f:three"]);
|
||||
expect(guard.presentation).toEqual({ phase: "transferring", receivedFiles: 3 });
|
||||
guard.receivedDocuments(["f:four", "f:four"]);
|
||||
expect(guard.presentation.receivedFiles).toBe(4);
|
||||
guard.replicationStatusChanged("COMPLETED");
|
||||
guard.finiteActivityChanged(false, 2, 10);
|
||||
guard.catchUpSucceeded();
|
||||
guard.catchUpActivityChanged(false, 2, 10);
|
||||
expect(guard.presentation.phase).toBe("applying");
|
||||
guard.tick(0, 20);
|
||||
guard.tick(1, 2000);
|
||||
@@ -44,10 +44,9 @@ describe("SyncGuardState", () => {
|
||||
it("keeps the lock with an interrupted transfer until the user bypasses it", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 2);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:one", "f:two"]);
|
||||
guard.replicationStatusChanged("ERRORED");
|
||||
guard.finiteActivityChanged(false, 0, 10);
|
||||
guard.catchUpActivityChanged(false, 0, 10);
|
||||
expect(guard.presentation.phase).toBe("interrupted");
|
||||
guard.bypass();
|
||||
expect(guard.presentation.phase).toBe("idle");
|
||||
@@ -58,30 +57,30 @@ describe("SyncGuardState", () => {
|
||||
it("does not unlock when a new pull starts while applying an earlier completed transfer", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 1);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:first"]);
|
||||
guard.replicationStatusChanged("COMPLETED");
|
||||
guard.finiteActivityChanged(false, 0, 1);
|
||||
guard.catchUpSucceeded();
|
||||
guard.catchUpActivityChanged(false, 0, 1);
|
||||
expect(guard.presentation.phase).toBe("applying");
|
||||
guard.finiteActivityChanged(true, 0, 100);
|
||||
guard.catchUpActivityChanged(true, 0, 100);
|
||||
expect(guard.presentation.phase).toBe("transferring");
|
||||
guard.tick(0, 10_000);
|
||||
expect(guard.presentation.phase).toBe("transferring");
|
||||
guard.finiteActivityChanged(false, 0, 10_001);
|
||||
guard.catchUpActivityChanged(false, 0, 10_001);
|
||||
expect(guard.presentation.phase).toBe("interrupted");
|
||||
});
|
||||
|
||||
it("can recover an interrupted catch-up when a new pull succeeds", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 1);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:first"]);
|
||||
guard.finiteActivityChanged(false, 0, 10);
|
||||
guard.catchUpActivityChanged(false, 0, 10);
|
||||
expect(guard.presentation.phase).toBe("interrupted");
|
||||
guard.finiteActivityChanged(true, 0, 20);
|
||||
guard.catchUpActivityChanged(true, 0, 20);
|
||||
expect(guard.presentation.phase).toBe("transferring");
|
||||
guard.replicationStatusChanged("COMPLETED");
|
||||
guard.finiteActivityChanged(false, 0, 30);
|
||||
guard.catchUpSucceeded();
|
||||
guard.catchUpActivityChanged(false, 0, 30);
|
||||
guard.tick(0, 2030);
|
||||
expect(guard.presentation.phase).toBe("idle");
|
||||
});
|
||||
@@ -89,35 +88,35 @@ describe("SyncGuardState", () => {
|
||||
it("does not declare the Vault ready after a failed received-file reflection", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 1);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:first"]);
|
||||
guard.reflectionFailed();
|
||||
guard.replicationStatusChanged("COMPLETED");
|
||||
guard.finiteActivityChanged(false, 0, 10);
|
||||
guard.catchUpSucceeded();
|
||||
guard.catchUpActivityChanged(false, 0, 10);
|
||||
guard.tick(0, 10_000);
|
||||
expect(guard.presentation.phase).toBe("interrupted");
|
||||
guard.bypass();
|
||||
expect(guard.presentation.phase).toBe("idle");
|
||||
});
|
||||
|
||||
it("does not confuse a stale completed status with this catch-up", () => {
|
||||
it("does not treat a stale completion as success for a new catch-up", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 1);
|
||||
guard.replicationStatusChanged("COMPLETED");
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpSucceeded();
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:one"]);
|
||||
guard.finiteActivityChanged(false, 0, 1);
|
||||
guard.catchUpActivityChanged(false, 0, 1);
|
||||
expect(guard.presentation.phase).toBe("interrupted");
|
||||
});
|
||||
|
||||
it("resets after resume and is opt-in", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(false, 1);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:one"]);
|
||||
expect(guard.presentation.phase).toBe("idle");
|
||||
guard.resume(true, 1);
|
||||
guard.finiteActivityChanged(true, 0, 10);
|
||||
guard.catchUpActivityChanged(true, 0, 10);
|
||||
guard.receivedDocuments(["f:one"]);
|
||||
expect(guard.presentation.phase).toBe("transferring");
|
||||
guard.disable();
|
||||
@@ -127,11 +126,11 @@ describe("SyncGuardState", () => {
|
||||
it("handles NaN and negative thresholds conservatively", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, NaN);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:one"]);
|
||||
expect(guard.presentation.phase).toBe("observing");
|
||||
guard.resume(true, -2);
|
||||
guard.finiteActivityChanged(true, 0, 10);
|
||||
guard.catchUpActivityChanged(true, 0, 10);
|
||||
guard.receivedDocuments(["f:one"]);
|
||||
expect(guard.presentation.phase).toBe("transferring");
|
||||
});
|
||||
@@ -139,7 +138,7 @@ describe("SyncGuardState", () => {
|
||||
it("applies a lowered threshold while observing without unlocking an already protected Vault", () => {
|
||||
const { guard } = setup();
|
||||
guard.resume(true, 20);
|
||||
guard.finiteActivityChanged(true, 0, 0);
|
||||
guard.catchUpActivityChanged(true, 0, 0);
|
||||
guard.receivedDocuments(["f:one", "f:two", "f:three"]);
|
||||
guard.updateThreshold(3);
|
||||
expect(guard.presentation.phase).toBe("transferring");
|
||||
|
||||
Reference in new issue
Block a user