diff --git a/frontend/src/pages/settings/SubscriptionGeneralTab.tsx b/frontend/src/pages/settings/SubscriptionGeneralTab.tsx index 72f2c138c..a0ce07e31 100644 --- a/frontend/src/pages/settings/SubscriptionGeneralTab.tsx +++ b/frontend/src/pages/settings/SubscriptionGeneralTab.tsx @@ -79,7 +79,7 @@ export default function SubscriptionGeneralTab({ allSetting, updateSetting }: Su - updateSetting({ subUpdates: Number(v) || 0 })} /> diff --git a/frontend/src/schemas/setting.ts b/frontend/src/schemas/setting.ts index e7d39ba86..bc6f81321 100644 --- a/frontend/src/schemas/setting.ts +++ b/frontend/src/schemas/setting.ts @@ -53,7 +53,7 @@ export const AllSettingSchema = z.object({ restartXrayOnClientDisable: z.boolean().optional(), subCertFile: z.string().optional(), subKeyFile: z.string().optional(), - subUpdates: z.number().int().min(1).max(168).optional(), + subUpdates: z.number().int().min(0).max(525600).optional(), subEncrypt: z.boolean().optional(), subURI: z.string().optional(), subJsonURI: z.string().optional(), diff --git a/frontend/src/test/setting-sub-updates.test.ts b/frontend/src/test/setting-sub-updates.test.ts new file mode 100644 index 000000000..56849896b --- /dev/null +++ b/frontend/src/test/setting-sub-updates.test.ts @@ -0,0 +1,17 @@ +import { describe, it, expect } from 'vitest'; +import { AllSettingSchema } from '@/schemas/setting'; + +describe('subUpdates range', () => { + it('accepts values the backend allows (gte=0, lte=525600)', () => { + for (const v of [0, 12, 168, 720, 525600]) { + const r = AllSettingSchema.safeParse({ subUpdates: v }); + expect(r.success, `subUpdates=${v} should be valid`).toBe(true); + } + }); + + it('rejects values outside the backend range', () => { + for (const v of [-1, 525601, 1.5]) { + expect(AllSettingSchema.safeParse({ subUpdates: v }).success, `subUpdates=${v} should be invalid`).toBe(false); + } + }); +});