diff --git a/packages/schema/src/domains/admin/AdminUserSchemas.test.ts b/packages/schema/src/domains/admin/AdminUserSchemas.test.ts new file mode 100644 index 000000000..1d3ca202b --- /dev/null +++ b/packages/schema/src/domains/admin/AdminUserSchemas.test.ts @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +import {AdminACLs} from '@fluxer/constants/src/AdminACLs'; +import {SetUserAclsRequest} from '@fluxer/schema/src/domains/admin/AdminUserSchemas'; +import {describe, expect, test} from 'vitest'; + +describe('SetUserAclsRequest', () => { + test('accepts every ACL the instance defines', () => { + const acls = Object.values(AdminACLs); + const result = SetUserAclsRequest.safeParse({user_id: '1', acls}); + expect(result.success).toBe(true); + }); + + test('rejects more entries than there are ACLs', () => { + const acls = [...Object.values(AdminACLs), 'overflow:one']; + const result = SetUserAclsRequest.safeParse({user_id: '1', acls}); + expect(result.success).toBe(false); + }); +}); diff --git a/packages/schema/src/domains/admin/AdminUserSchemas.ts b/packages/schema/src/domains/admin/AdminUserSchemas.ts index 9bc13103d..1c0625cf1 100644 --- a/packages/schema/src/domains/admin/AdminUserSchemas.ts +++ b/packages/schema/src/domains/admin/AdminUserSchemas.ts @@ -8,6 +8,7 @@ import { UserFlags, UserFlagsDescriptions, } from '@fluxer/constants/src/UserConstants'; +import {AdminACLs} from '@fluxer/constants/src/AdminACLs'; import {NSFWLevelSchema} from '@fluxer/schema/src/primitives/GuildValidators'; import { createBitflagInt32Type, @@ -21,6 +22,8 @@ import { import {DiscriminatorType, EmailType, UsernameType} from '@fluxer/schema/src/primitives/UserValidators'; import {z} from 'zod'; +const ADMIN_ACL_COUNT = Object.keys(AdminACLs).length; + export const UserAdminResponseSchema = z.object({ id: SnowflakeStringType, username: z.string(), @@ -65,7 +68,7 @@ export const UserAdminResponseSchema = z.object({ pending_bulk_message_deletion_at: z.string().nullable(), deletion_reason_code: Int32Type.nullable(), deletion_public_reason: z.string().nullable(), - acls: z.array(z.string()).max(100), + acls: z.array(z.string()).max(ADMIN_ACL_COUNT), traits: z.array(z.string()).max(100), has_totp: z.boolean(), authenticator_types: z.array(Int32Type).max(10), @@ -353,7 +356,7 @@ export type ScheduleAccountDeletionRequest = z.infer;