
























@@ -4,12 +4,10 @@ import path from "node:path";
44import { afterEach, describe, expect, it, vi } from "vitest";
55import { createTrackedTempDirs } from "../test-utils/tracked-temp-dirs.js";
66import {
7-clearApnsRegistration,
87clearApnsRegistrationIfCurrent,
98loadApnsRegistration,
109loadApnsRegistrations,
1110registerApnsRegistration,
12-registerApnsToken,
1311} from "./push-apns.js";
14121513const tempDirs = createTrackedTempDirs();
@@ -18,14 +16,27 @@ async function makeTempDir(): Promise<string> {
1816return await tempDirs.make("openclaw-push-apns-store-test-");
1917}
201819+async function registerDirectApnsRegistration(params: {
20+nodeId: string;
21+token: string;
22+topic: string;
23+environment?: unknown;
24+baseDir?: string;
25+}) {
26+return await registerApnsRegistration({
27+ ...params,
28+transport: "direct",
29+});
30+}
31+2132afterEach(async () => {
2233await tempDirs.cleanup();
2334});
24352536describe("push APNs registration store", () => {
2637it("stores and reloads direct APNs registrations", async () => {
2738const baseDir = await makeTempDir();
28-const saved = await registerApnsToken({
39+const saved = await registerDirectApnsRegistration({
2940nodeId: "ios-node-1",
3041token: "ABCD1234ABCD1234ABCD1234ABCD1234",
3142topic: "ai.openclaw.ios",
@@ -120,7 +131,7 @@ describe("push APNs registration store", () => {
120131121132it("loads multiple APNs registrations from one store snapshot", async () => {
122133const baseDir = await makeTempDir();
123-const first = await registerApnsToken({
134+const first = await registerDirectApnsRegistration({
124135nodeId: "ios-node-1",
125136token: "ABCD1234ABCD1234ABCD1234ABCD1234",
126137topic: "ai.openclaw.ios",
@@ -155,40 +166,38 @@ describe("push APNs registration store", () => {
155166156167await expect(loadApnsRegistration("ios-node-missing", baseDir)).resolves.toBeNull();
157168await expect(loadApnsRegistration(" ", baseDir)).resolves.toBeNull();
158-await expect(clearApnsRegistration(" ", baseDir)).resolves.toBe(false);
159-await expect(clearApnsRegistration("ios-node-missing", baseDir)).resolves.toBe(false);
160169});
161170162171it("rejects invalid direct and relay registration inputs", async () => {
163172const baseDir = await makeTempDir();
164173const oversized = "x".repeat(257);
165174166175await expect(
167-registerApnsToken({
176+registerDirectApnsRegistration({
168177nodeId: "ios-node-1",
169178token: "not-a-token",
170179topic: "ai.openclaw.ios",
171180 baseDir,
172181}),
173182).rejects.toThrow("invalid APNs token");
174183await expect(
175-registerApnsToken({
184+registerDirectApnsRegistration({
176185nodeId: "n".repeat(257),
177186token: "ABCD1234ABCD1234ABCD1234ABCD1234",
178187topic: "ai.openclaw.ios",
179188 baseDir,
180189}),
181190).rejects.toThrow("nodeId required");
182191await expect(
183-registerApnsToken({
192+registerDirectApnsRegistration({
184193nodeId: "ios-node-1",
185194token: "A".repeat(513),
186195topic: "ai.openclaw.ios",
187196 baseDir,
188197}),
189198).rejects.toThrow("invalid APNs token");
190199await expect(
191-registerApnsToken({
200+registerDirectApnsRegistration({
192201nodeId: "ios-node-1",
193202token: "ABCD1234ABCD1234ABCD1234ABCD1234",
194203topic: "a".repeat(256),
@@ -262,9 +271,9 @@ describe("push APNs registration store", () => {
262271).rejects.toThrow("sendGrant too long");
263272});
264273265-it("persists with a trailing newline and clears registrations", async () => {
274+it("persists with a trailing newline and clears current registrations", async () => {
266275const baseDir = await makeTempDir();
267-await registerApnsToken({
276+const registration = await registerDirectApnsRegistration({
268277nodeId: "ios-node-1",
269278token: "ABCD1234ABCD1234ABCD1234ABCD1234",
270279topic: "ai.openclaw.ios",
@@ -273,7 +282,13 @@ describe("push APNs registration store", () => {
273282274283const statePath = path.join(baseDir, "push", "apns-registrations.json");
275284await expect(fs.readFile(statePath, "utf8")).resolves.toMatch(/\n$/);
276-await expect(clearApnsRegistration("ios-node-1", baseDir)).resolves.toBe(true);
285+await expect(
286+clearApnsRegistrationIfCurrent({
287+nodeId: "ios-node-1",
288+ registration,
289+ baseDir,
290+}),
291+).resolves.toBe(true);
277292await expect(loadApnsRegistration("ios-node-1", baseDir)).resolves.toBeNull();
278293});
279294@@ -282,7 +297,7 @@ describe("push APNs registration store", () => {
282297try {
283298const baseDir = await makeTempDir();
284299vi.setSystemTime(new Date("2026-03-11T00:00:00Z"));
285-const stale = await registerApnsToken({
300+const stale = await registerDirectApnsRegistration({
286301nodeId: "ios-node-1",
287302token: "ABCD1234ABCD1234ABCD1234ABCD1234",
288303topic: "ai.openclaw.ios",
@@ -291,7 +306,7 @@ describe("push APNs registration store", () => {
291306});
292307293308vi.setSystemTime(new Date("2026-03-11T00:00:01Z"));
294-const fresh = await registerApnsToken({
309+const fresh = await registerDirectApnsRegistration({
295310nodeId: "ios-node-1",
296311token: "ABCD1234ABCD1234ABCD1234ABCD1234",
297312topic: "ai.openclaw.ios",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。