Prevent stale live snapshots from flickering sorted packages

This commit is contained in:
Sucukdeluxe
2026-09-04 21:26:57 +02:00
parent befb17741e
commit d84673da1d
7 changed files with 232 additions and 89 deletions
+69
View File
@@ -0,0 +1,69 @@
import { describe, expect, it } from "vitest";
import { createPackageOrderState } from "../src/renderer/package-order-state";
describe("pending package order", () => {
it("keeps the chosen order through stale updates until the command and snapshot agree", () => {
const state = createPackageOrderState();
state.accept(["a", "b", "c"]);
const request = state.begin(["c", "b", "a"]);
expect(state.accept(["a", "b", "c"])).toEqual(["c", "b", "a"]);
state.confirm(request);
expect(state.accept(["a", "b", "c"])).toEqual(["c", "b", "a"]);
expect(state.accept(["c", "b", "a"])).toEqual(["c", "b", "a"]);
expect(state.accept(["b", "a", "c"])).toEqual(["b", "a", "c"]);
});
it("does not mistake the old order for confirmation when the user reverses quickly", () => {
const state = createPackageOrderState();
state.accept(["a", "b"]);
const first = state.begin(["b", "a"]);
const second = state.begin(["a", "b"]);
expect(state.accept(["a", "b"])).toEqual(["a", "b"]);
state.confirm(first);
expect(state.accept(["b", "a"])).toEqual(["a", "b"]);
state.confirm(second);
expect(state.accept(["b", "a"])).toEqual(["a", "b"]);
state.accept(["a", "b"]);
expect(state.accept(["b", "a"])).toEqual(["b", "a"]);
});
it("retains newly added packages and never resurrects removed packages", () => {
const state = createPackageOrderState();
state.accept(["a", "b", "c"]);
const request = state.begin(["c", "b", "a"]);
expect(state.accept(["a", "c", "new"])).toEqual(["c", "a", "new"]);
state.confirm(request);
state.accept(["c", "a", "new"]);
expect(state.accept(["new", "a", "c"])).toEqual(["new", "a", "c"]);
});
it("ignores rejected obsolete requests and rolls back the current request to the latest server order", () => {
const state = createPackageOrderState();
state.accept(["a", "b"]);
const first = state.begin(["b", "a"]);
const second = state.begin(["a", "b"]);
expect(state.reject(first)).toBeNull();
state.accept(["b", "a", "new"]);
expect(state.reject(second)).toEqual(["b", "a", "new"]);
expect(state.accept(["new", "b", "a"])).toEqual(["new", "b", "a"]);
});
it("can receive the matching snapshot before the command promise resolves", () => {
const state = createPackageOrderState();
state.accept(["a", "b"]);
const request = state.begin(["b", "a"]);
state.accept(["b", "a"]);
state.confirm(request);
const incoming = ["b", "a"];
expect(state.accept(incoming)).toBe(incoming);
expect(state.accept(["a", "b"])).toEqual(["a", "b"]);
});
it("preserves an empty authoritative queue", () => {
const state = createPackageOrderState();
const request = state.begin(["b", "a"]);
state.confirm(request);
expect(state.accept([])).toEqual([]);
expect(state.accept(["new"])).toEqual(["new"]);
});
});