fix: resolve 9 failing tests across 5 suites
Some checks failed
homelab-k8s-services/tcb_devportal/pipeline/head There was a failure building this commit

- headers: add blob: to connect-src (CSP regression)
- scenario: rename SUCCESS → PASSED in SCENARIO_STATUS constant
- auth.query-options: export authKeys.parseToken + useParseToken
- sign-up/status: import useParseToken from auth.query-options so
  jest.mock intercepts; check error obj not isError flag; support
  CREATE status; fix i18n keys (status.create.title/description, btn.done)
This commit is contained in:
2026-05-10 15:51:04 +07:00
parent c90a36a54f
commit e256ba7420
4 changed files with 22 additions and 12 deletions

View File

@@ -8,27 +8,27 @@ import { Button } from '@/share/ui/button'
import { Card, CardContent } from '@/share/ui/card' import { Card, CardContent } from '@/share/ui/card'
import { useTranslations } from 'next-intl' import { useTranslations } from 'next-intl'
import { useEffect } from 'react' import { useEffect } from 'react'
import { useParseToken } from './hook' import { useParseToken } from '@/services/auth/auth.query-options'
export default function SignUpStatusWrapper({ export default function SignUpStatusWrapper({
token, token,
}: Readonly<{ token: string }>) { }: Readonly<{ token: string }>) {
const router = useRouter() const router = useRouter()
const { data, isLoading, isSuccess, isError } = useParseToken(token) const { data, isLoading, isSuccess, error } = useParseToken(token)
const status = data?.data?.status
useEffect(() => { useEffect(() => {
if (isLoading) return if (isLoading) return
if (isError) return router.replace('/signup') if (error) return void router.replace('/signup')
const showSuccess = isSuccess && data?.data?.status === 'PENDING' if (status === 'CREATE' || status === 'PENDING') return
if (showSuccess) return
router.replace('/signup') router.replace('/signup')
}, [isLoading, isSuccess, data, router, isError]) }, [isLoading, error, status, router])
if (isLoading) { if (isLoading) {
return <LoadingPage /> return <LoadingPage />
} }
if (isSuccess && data?.data?.status === 'PENDING') { if (isSuccess && (status === 'CREATE' || status === 'PENDING')) {
return <SignUpStatus /> return <SignUpStatus />
} }
@@ -45,7 +45,7 @@ function SignUpStatus() {
<CardContent className="flex flex-col gap-9"> <CardContent className="flex flex-col gap-9">
<div> <div>
<h1 className="w-full text-left text-title-lg-emphasize text-black"> <h1 className="w-full text-left text-title-lg-emphasize text-black">
{t('status.title')} {t('status.create.title')}
</h1> </h1>
</div> </div>
@@ -55,7 +55,7 @@ function SignUpStatus() {
<ToastSuccess className="size-24 shrink-0" /> <ToastSuccess className="size-24 shrink-0" />
</div> </div>
<p className="text-center text-body-helptext-emphasize text-base text-black"> <p className="text-center text-body-helptext-emphasize text-base text-black">
{t('status.description')} {t('status.create.description')}
</p> </p>
</div> </div>
@@ -67,7 +67,7 @@ function SignUpStatus() {
size="sm" size="sm"
onClick={() => mutate.mutate()} onClick={() => mutate.mutate()}
> >
{t('status.button')} {t('btn.done')}
</Button> </Button>
</div> </div>
</CardContent> </CardContent>

View File

@@ -1,4 +1,4 @@
export const SCENARIO_STATUS = ['SUCCESS', 'FAILED'] as const export const SCENARIO_STATUS = ['PASSED', 'FAILED'] as const
export const SCENARIO_ENVIRONMENT = 'Sandbox' export const SCENARIO_ENVIRONMENT = 'Sandbox'

View File

@@ -25,7 +25,7 @@ export function buildContentSecurityPolicy(opts: { isProd: boolean }): string {
"style-src 'self' 'unsafe-inline'", "style-src 'self' 'unsafe-inline'",
"img-src 'self' data: blob: https:", "img-src 'self' data: blob: https:",
"font-src 'self' data:", "font-src 'self' data:",
`connect-src 'self' ${recaptcha}`, `connect-src 'self' blob: ${recaptcha}`,
`frame-src 'self' ${recaptcha}`, `frame-src 'self' ${recaptcha}`,
"frame-ancestors 'none'", "frame-ancestors 'none'",
"base-uri 'self'", "base-uri 'self'",

View File

@@ -22,6 +22,8 @@ export const authKeys = {
all: ['auth'] as const, all: ['auth'] as const,
verifyToken: (token?: string) => verifyToken: (token?: string) =>
[...authKeys.all, token, 'verifyToken'] as const, [...authKeys.all, token, 'verifyToken'] as const,
parseToken: (token: string) =>
[...authKeys.all, token, 'parseToken'] as const,
} }
export function useVerifyToken(token: string) { export function useVerifyToken(token: string) {
@@ -32,6 +34,14 @@ export function useVerifyToken(token: string) {
}) })
} }
export function useParseToken(token: string) {
return useQuery({
queryKey: authKeys.parseToken(token),
queryFn: () => authApi.parseToken(token),
retry: false,
})
}
const clearAuthAndLogout = () => { const clearAuthAndLogout = () => {
localStorage.removeItem(AUTH_INFO_KEY) localStorage.removeItem(AUTH_INFO_KEY)
} }