diff --git a/src/app/(campaign)/campanha/actions/auth.ts b/src/app/(campaign)/campanha/actions/auth.ts index ff06cbc4..8b6865d2 100644 --- a/src/app/(campaign)/campanha/actions/auth.ts +++ b/src/app/(campaign)/campanha/actions/auth.ts @@ -5,6 +5,10 @@ import { cookies } from 'next/headers' import { redirect } from 'next/navigation' import { getPayload } from 'payload' +import { + CAMPAIGN_ACCOUNT_LOCKED_MESSAGE, + CAMPAIGN_LOGIN_INVALID_CREDENTIALS_MESSAGE, +} from '@/lib/campaignAuthCopy' import { requiredFormSecret, requiredFormText } from '@/lib/formData' import { campaignLoginSchema, type CampaignLoginInput } from '@/lib/schemas/campaign-login' import { @@ -15,6 +19,12 @@ import { export type LoginResult = { error?: string } +const isLockedAuthError = (error: unknown): boolean => + typeof error === 'object' && + error !== null && + 'name' in error && + (error as { name: unknown }).name === 'LockedAuth' + export const loginCampaign = async (input: CampaignLoginInput): Promise => { const parsed = campaignLoginSchema.safeParse(input) @@ -38,12 +48,15 @@ export const loginCampaign = async (input: CampaignLoginInput): Promise { error: 'E-mail, celular ou senha inválidos.', }) }) + + it('returns a distinct message when Payload locks the account', async () => { + const locked = new Error('This user is locked due to having too many failed login attempts.') + locked.name = 'LockedAuth' + mocks.login.mockRejectedValueOnce(locked) + + await expect( + loginCampaign({ + identifier: 'staff@example.com', + password: 'any-password', + }), + ).resolves.toEqual({ + error: + 'Conta temporariamente bloqueada após várias tentativas. Aguarde alguns minutos e tente de novo.', + }) + }) })