From 9524a234cfe0c3addc6ed947ed89ae757964e3a1 Mon Sep 17 00:00:00 2001 From: Zephyr Lykos Date: Sat, 24 Feb 2024 23:01:32 +0800 Subject: [PATCH] cleanup: wip 3.1 mostly misc cleanups --- resources/assets/src/components/Alert.tsx | 2 +- .../assets/src/components/ButtonEdit.tsx | 2 +- .../assets/src/components/EmailSuggestion.tsx | 3 +- resources/assets/src/components/Modal.tsx | 3 +- resources/assets/src/components/ModalBody.tsx | 2 +- .../assets/src/components/ModalContent.tsx | 2 +- .../assets/src/components/ModalFooter.tsx | 2 +- .../assets/src/components/ModalHeader.tsx | 2 +- .../assets/src/components/ModalInput.tsx | 2 +- .../assets/src/components/Pagination.tsx | 2 +- .../assets/src/components/PaginationItem.tsx | 2 +- resources/assets/src/components/Toast.tsx | 3 +- resources/assets/src/components/Viewer.tsx | 3 +- .../assets/src/scripts/cli/configureStdio.ts | 2 - resources/assets/src/scripts/extra.ts | 2 +- resources/assets/src/scripts/homePage.ts | 1 - resources/assets/src/scripts/i18n.ts | 1 - resources/assets/src/scripts/logout.ts | 2 +- resources/assets/src/scripts/notify.ts | 1 - resources/assets/src/scripts/textureUtils.ts | 2 - resources/assets/src/scripts/toast.tsx | 2 +- .../assets/src/views/admin/Customization.ts | 4 +- .../views/admin/PlayersManagement/Card.tsx | 2 +- .../src/views/admin/PlayersManagement/Row.tsx | 2 +- .../views/admin/PlayersManagement/index.tsx | 3 +- .../views/admin/PluginsManagement/InfoBox.tsx | 2 +- .../views/admin/PluginsManagement/index.tsx | 3 +- .../src/views/admin/PluginsMarket/Row.tsx | 2 +- .../admin/ReportsManagement/ImageBox.tsx | 2 +- .../views/admin/ReportsManagement/index.tsx | 3 +- .../src/views/admin/Translations/Row.tsx | 2 +- .../src/views/admin/Translations/index.tsx | 3 +- .../src/views/admin/UsersManagement/Card.tsx | 2 +- .../src/views/admin/UsersManagement/Row.tsx | 2 +- .../src/views/admin/UsersManagement/index.tsx | 3 +- .../assets/src/views/skinlib/Show/index.tsx | 3 +- .../src/views/skinlib/SkinLibrary/Button.tsx | 2 +- .../skinlib/SkinLibrary/FilterSelector.tsx | 2 +- .../src/views/skinlib/SkinLibrary/Item.tsx | 2 +- .../src/views/skinlib/SkinLibrary/index.tsx | 3 +- resources/assets/src/views/skinlib/Upload.tsx | 3 +- .../src/views/user/Closet/ClosetItem.tsx | 2 +- .../assets/src/views/user/Closet/index.tsx | 2 +- resources/assets/src/views/user/OAuth/Row.tsx | 2 +- .../assets/src/views/user/OAuth/index.tsx | 3 +- .../src/views/user/Players/Viewer2d.tsx | 2 +- .../assets/src/views/user/Players/index.tsx | 3 +- .../src/views/widgets/EmailVerification.tsx | 2 +- .../src/views/widgets/NotificationsList.tsx | 2 +- .../assets/tests/components/Captcha.test.tsx | 98 +- .../tests/components/DarkModeButton.test.tsx | 34 +- .../tests/components/EmailSuggestion.test.tsx | 106 +- .../tests/components/FileInput.test.tsx | 60 +- .../assets/tests/components/Modal.test.tsx | 494 +++--- .../tests/components/Pagination.test.tsx | 252 +-- .../assets/tests/components/Viewer.test.tsx | 184 +-- .../tests/scripts/cli/AptCommand.test.ts | 112 +- .../tests/scripts/cli/ClosetCommand.test.ts | 92 +- .../tests/scripts/cli/DnfCommand.test.ts | 112 +- .../tests/scripts/cli/PacmanCommand.test.ts | 104 +- .../tests/scripts/cli/RmCommand.test.ts | 42 +- .../assets/tests/scripts/cli/Spinner.test.ts | 20 +- resources/assets/tests/scripts/cli/stdio.ts | 34 +- resources/assets/tests/scripts/event.test.ts | 38 +- .../assets/tests/scripts/homePage.test.ts | 50 +- resources/assets/tests/scripts/i18n.test.ts | 20 +- resources/assets/tests/scripts/logout.test.ts | 26 +- resources/assets/tests/scripts/modal.test.ts | 22 +- resources/assets/tests/scripts/net.test.ts | 446 +++--- resources/assets/tests/scripts/toast.test.ts | 66 +- .../tests/views/admin/Customization.test.ts | 92 +- .../views/admin/PlayersManagement.test.tsx | 731 +++++---- .../views/admin/PluginsManagement.test.tsx | 646 ++++---- .../tests/views/admin/PluginsMarket.test.tsx | 369 +++-- .../views/admin/ReportsManagement.test.tsx | 372 ++--- .../tests/views/admin/Translations.test.tsx | 227 +-- .../assets/tests/views/admin/Update.test.ts | 40 +- .../views/admin/UsersManagement.test.tsx | 1391 +++++++++-------- .../assets/tests/views/auth/Forgot.test.tsx | 90 +- .../assets/tests/views/auth/Login.test.tsx | 357 ++--- .../tests/views/auth/Registration.test.tsx | 251 +-- .../assets/tests/views/auth/Reset.test.tsx | 112 +- .../assets/tests/views/skinlib/Show.test.tsx | 1148 +++++++------- .../tests/views/skinlib/SkinLibrary.test.tsx | 799 +++++----- .../tests/views/skinlib/Upload.test.tsx | 414 ++--- .../assets/tests/views/user/Closet.test.tsx | 911 ++++++----- .../tests/views/user/Dashboard.test.tsx | 304 ++-- .../assets/tests/views/user/OAuth.test.tsx | 479 +++--- .../assets/tests/views/user/Players.test.tsx | 872 ++++++----- .../views/user/profile/deleteAccount.test.ts | 56 +- .../tests/views/user/profile/email.test.ts | 68 +- .../tests/views/user/profile/nickname.test.ts | 60 +- .../tests/views/user/profile/password.test.ts | 90 +- .../views/user/profile/resetAvatar.test.ts | 32 +- .../views/widgets/EmailVerification.test.tsx | 60 +- .../views/widgets/NotificationsList.test.tsx | 86 +- tools/HtmlWebpackEnhancementPlugin.ts | 71 - tools/generateUrls.ts | 34 +- tsconfig.json | 1 + 99 files changed, 6631 insertions(+), 6055 deletions(-) delete mode 100644 tools/HtmlWebpackEnhancementPlugin.ts diff --git a/resources/assets/src/components/Alert.tsx b/resources/assets/src/components/Alert.tsx index 9df55115..c580b150 100644 --- a/resources/assets/src/components/Alert.tsx +++ b/resources/assets/src/components/Alert.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; type AlertType = 'success' | 'info' | 'warning' | 'danger'; diff --git a/resources/assets/src/components/ButtonEdit.tsx b/resources/assets/src/components/ButtonEdit.tsx index 1df5169d..fe497ae9 100644 --- a/resources/assets/src/components/ButtonEdit.tsx +++ b/resources/assets/src/components/ButtonEdit.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; type Properties = { readonly title?: string; diff --git a/resources/assets/src/components/EmailSuggestion.tsx b/resources/assets/src/components/EmailSuggestion.tsx index e75d2f97..d6d1f1c8 100644 --- a/resources/assets/src/components/EmailSuggestion.tsx +++ b/resources/assets/src/components/EmailSuggestion.tsx @@ -1,5 +1,6 @@ /** @jsxImportSource @emotion/react */ -import React, {useState, useEffect} from 'react'; +import type React from 'react'; +import {useState, useEffect} from 'react'; import Autosuggest from 'react-autosuggest'; import {css} from '@emotion/react'; import {emit} from '@/scripts/event'; diff --git a/resources/assets/src/components/Modal.tsx b/resources/assets/src/components/Modal.tsx index 3cbeccad..36775721 100644 --- a/resources/assets/src/components/Modal.tsx +++ b/resources/assets/src/components/Modal.tsx @@ -94,7 +94,7 @@ const Modal: React.FC = properties => { $(reference.current!).modal('hide'); // The "hidden.bs.modal" event can't be trigged automatically when testing. - /* istanbul ignore next */ + if (process.env.NODE_ENV === 'test') { $(reference.current!).trigger('hidden.bs.modal'); } @@ -104,7 +104,6 @@ const Modal: React.FC = properties => { properties.onDismiss?.(); $(reference.current!).modal('hide'); - /* istanbul ignore next */ if (process.env.NODE_ENV === 'test') { $(reference.current!).trigger('hidden.bs.modal'); } diff --git a/resources/assets/src/components/ModalBody.tsx b/resources/assets/src/components/ModalBody.tsx index 5fff86cc..03aff67d 100644 --- a/resources/assets/src/components/ModalBody.tsx +++ b/resources/assets/src/components/ModalBody.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import ModalContent, {type Props as ContentProperties} from './ModalContent'; import ModalInput, { type diff --git a/resources/assets/src/components/ModalContent.tsx b/resources/assets/src/components/ModalContent.tsx index 71f13b91..87cac9f8 100644 --- a/resources/assets/src/components/ModalContent.tsx +++ b/resources/assets/src/components/ModalContent.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; export type Props = { readonly text?: string; diff --git a/resources/assets/src/components/ModalFooter.tsx b/resources/assets/src/components/ModalFooter.tsx index cb746cbc..118266ba 100644 --- a/resources/assets/src/components/ModalFooter.tsx +++ b/resources/assets/src/components/ModalFooter.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; export type Props = { readonly flexFooter?: boolean; diff --git a/resources/assets/src/components/ModalHeader.tsx b/resources/assets/src/components/ModalHeader.tsx index e2f267f7..69d76618 100644 --- a/resources/assets/src/components/ModalHeader.tsx +++ b/resources/assets/src/components/ModalHeader.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; export type Props = { readonly title?: string; diff --git a/resources/assets/src/components/ModalInput.tsx b/resources/assets/src/components/ModalInput.tsx index 786d19b6..91e4c497 100644 --- a/resources/assets/src/components/ModalInput.tsx +++ b/resources/assets/src/components/ModalInput.tsx @@ -1,4 +1,4 @@ -import React, {type HTMLAttributes} from 'react'; +import type React, {type HTMLAttributes} from 'react'; export type Props = { readonly inputType?: string; diff --git a/resources/assets/src/components/Pagination.tsx b/resources/assets/src/components/Pagination.tsx index bbe482b6..8c8bf951 100644 --- a/resources/assets/src/components/Pagination.tsx +++ b/resources/assets/src/components/Pagination.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import PaginationItem from './PaginationItem'; import {t} from '@/scripts/i18n'; diff --git a/resources/assets/src/components/PaginationItem.tsx b/resources/assets/src/components/PaginationItem.tsx index f914d4f0..905c26d8 100644 --- a/resources/assets/src/components/PaginationItem.tsx +++ b/resources/assets/src/components/PaginationItem.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; type Properties = { readonly disabled?: boolean; diff --git a/resources/assets/src/components/Toast.tsx b/resources/assets/src/components/Toast.tsx index 8aafae48..279ce90f 100644 --- a/resources/assets/src/components/Toast.tsx +++ b/resources/assets/src/components/Toast.tsx @@ -1,5 +1,6 @@ /** @jsxImportSource @emotion/react */ -import React, {useState, useEffect} from 'react'; +import type React from 'react'; +import {useState, useEffect} from 'react'; import {css} from '@emotion/react'; export type ToastType = 'success' | 'info' | 'warning' | 'error'; diff --git a/resources/assets/src/components/Viewer.tsx b/resources/assets/src/components/Viewer.tsx index 65ebbcd7..cc01d19d 100644 --- a/resources/assets/src/components/Viewer.tsx +++ b/resources/assets/src/components/Viewer.tsx @@ -1,5 +1,6 @@ /** @jsxImportSource @emotion/react */ -import React, {useState, useEffect, useRef} from 'react'; +import type React from 'react'; +import {useState, useEffect, useRef} from 'react'; import {useMeasure} from 'react-use'; import {css} from '@emotion/react'; import styled from '@emotion/styled'; diff --git a/resources/assets/src/scripts/cli/configureStdio.ts b/resources/assets/src/scripts/cli/configureStdio.ts index bbf43756..652d6a07 100644 --- a/resources/assets/src/scripts/cli/configureStdio.ts +++ b/resources/assets/src/scripts/cli/configureStdio.ts @@ -1,7 +1,6 @@ import type {Stdio} from 'blessing-skin-shell'; import * as event from '../event'; -/* istanbul ignore next */ export function hackStdin() { if (process.env.NODE_ENV === 'test') { return process.stdin; @@ -24,7 +23,6 @@ export function hackStdin() { } as NodeJS.ReadStream & {_off(): void}; } -/* istanbul ignore next */ export function hackStdout(stdio: Stdio) { return { write(message: string) { diff --git a/resources/assets/src/scripts/extra.ts b/resources/assets/src/scripts/extra.ts index 7c01b028..a375b3f6 100644 --- a/resources/assets/src/scripts/extra.ts +++ b/resources/assets/src/scripts/extra.ts @@ -1,6 +1,6 @@ export function getExtraData(): Record { const jsonElement = document.querySelector('#blessing-extra'); - /* istanbul ignore next */ + if (jsonElement) { return JSON.parse(jsonElement.textContent ?? '{}'); } diff --git a/resources/assets/src/scripts/homePage.ts b/resources/assets/src/scripts/homePage.ts index a55bc4fd..e2475f9b 100644 --- a/resources/assets/src/scripts/homePage.ts +++ b/resources/assets/src/scripts/homePage.ts @@ -14,7 +14,6 @@ export function scrollHander() { } } -/* istanbul ignore next */ if (process.env.NODE_ENV !== 'test') { const {transparent_navbar} = getExtraData() as { transparent_navbar: boolean; diff --git a/resources/assets/src/scripts/i18n.ts b/resources/assets/src/scripts/i18n.ts index 3da3f363..c73f2068 100644 --- a/resources/assets/src/scripts/i18n.ts +++ b/resources/assets/src/scripts/i18n.ts @@ -8,7 +8,6 @@ export function t(key: string, parameters: Record = Object.creat let result = ''; for (const segment of segments) { - /* istanbul ignore next */ const middle = temporary?.[segment]; if (!middle) { return key; diff --git a/resources/assets/src/scripts/logout.ts b/resources/assets/src/scripts/logout.ts index d8169cb6..028d2bc0 100644 --- a/resources/assets/src/scripts/logout.ts +++ b/resources/assets/src/scripts/logout.ts @@ -18,5 +18,5 @@ export async function logout() { } const button = document.querySelector('#logout-button'); -/* istanbul ignore next */ + button?.addEventListener('click', logout); diff --git a/resources/assets/src/scripts/notify.ts b/resources/assets/src/scripts/notify.ts index 90510023..e74f2e0a 100644 --- a/resources/assets/src/scripts/notify.ts +++ b/resources/assets/src/scripts/notify.ts @@ -3,7 +3,6 @@ import {Toast} from './toast'; export const toast = new Toast(); -/* istanbul ignore next */ if (process.env.NODE_ENV === 'test') { afterEach(() => { toast.clear(); diff --git a/resources/assets/src/scripts/textureUtils.ts b/resources/assets/src/scripts/textureUtils.ts index 15c403a5..d3f95594 100644 --- a/resources/assets/src/scripts/textureUtils.ts +++ b/resources/assets/src/scripts/textureUtils.ts @@ -1,6 +1,5 @@ import {loadSkinToCanvas} from 'skinview-utils'; -/* istanbul ignore next */ function checkPixel( context: CanvasRenderingContext2D, x: number, @@ -15,7 +14,6 @@ function checkPixel( ); } -/* istanbul ignore next */ export async function isAlex(texture: string): Promise { return new Promise(resolve => { const image = new Image(); diff --git a/resources/assets/src/scripts/toast.tsx b/resources/assets/src/scripts/toast.tsx index aaa6d158..7bfdee35 100644 --- a/resources/assets/src/scripts/toast.tsx +++ b/resources/assets/src/scripts/toast.tsx @@ -54,7 +54,7 @@ export function ToastContainer() { ))} ); -}; +} export class Toast { private readonly container: HTMLDivElement; diff --git a/resources/assets/src/views/admin/Customization.ts b/resources/assets/src/views/admin/Customization.ts index 4e0c6bf5..beb8a937 100644 --- a/resources/assets/src/views/admin/Customization.ts +++ b/resources/assets/src/views/admin/Customization.ts @@ -38,7 +38,7 @@ export function registerNavbarPicker( const navbar = document.querySelector('.wrapper > nav'); const picker = document.querySelector('#navbar-color-picker'); -/* istanbul ignore next */ + if (navbar && picker) { registerNavbarPicker(navbar, picker, blessing.extra.navbar as string || 'white'); } @@ -73,7 +73,7 @@ const darkPicker = document.querySelector( const lightPicker = document.querySelector( '#sidebar-light-picker', ); -/* istanbul ignore next */ + if (sidebar && darkPicker && lightPicker) { registerSidebarPicker( sidebar, diff --git a/resources/assets/src/views/admin/PlayersManagement/Card.tsx b/resources/assets/src/views/admin/PlayersManagement/Card.tsx index 1bb05793..821142bf 100644 --- a/resources/assets/src/views/admin/PlayersManagement/Card.tsx +++ b/resources/assets/src/views/admin/PlayersManagement/Card.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import clsx from 'clsx'; import {Box} from './styles'; import {t} from '@/scripts/i18n'; diff --git a/resources/assets/src/views/admin/PlayersManagement/Row.tsx b/resources/assets/src/views/admin/PlayersManagement/Row.tsx index d811ff96..236ea374 100644 --- a/resources/assets/src/views/admin/PlayersManagement/Row.tsx +++ b/resources/assets/src/views/admin/PlayersManagement/Row.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import {t} from '@/scripts/i18n'; import type {Player} from '@/scripts/types'; import ButtonEdit from '@/components/ButtonEdit'; diff --git a/resources/assets/src/views/admin/PlayersManagement/index.tsx b/resources/assets/src/views/admin/PlayersManagement/index.tsx index cdaabee3..0f65b900 100644 --- a/resources/assets/src/views/admin/PlayersManagement/index.tsx +++ b/resources/assets/src/views/admin/PlayersManagement/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect, useLayoutEffect} from 'react'; -; import {useImmer} from 'use-immer'; import Header from '../UsersManagement/Header'; import Card from './Card'; @@ -272,6 +271,6 @@ function PlayersManagement() { /> ); -}; +} export default PlayersManagement; diff --git a/resources/assets/src/views/admin/PluginsManagement/InfoBox.tsx b/resources/assets/src/views/admin/PluginsManagement/InfoBox.tsx index 3cb8d926..4db30d7c 100644 --- a/resources/assets/src/views/admin/PluginsManagement/InfoBox.tsx +++ b/resources/assets/src/views/admin/PluginsManagement/InfoBox.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import styled from '@emotion/styled'; import clsx from 'clsx'; import type {Plugin} from './types'; diff --git a/resources/assets/src/views/admin/PluginsManagement/index.tsx b/resources/assets/src/views/admin/PluginsManagement/index.tsx index 36af90e7..d7381773 100644 --- a/resources/assets/src/views/admin/PluginsManagement/index.tsx +++ b/resources/assets/src/views/admin/PluginsManagement/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect} from 'react'; -; import {useImmer} from 'use-immer'; import InfoBox from './InfoBox'; import type {Plugin} from './types'; @@ -243,6 +242,6 @@ function PluginsManagement() { ); -}; +} export default PluginsManagement; diff --git a/resources/assets/src/views/admin/PluginsMarket/Row.tsx b/resources/assets/src/views/admin/PluginsMarket/Row.tsx index c59caddb..6561f4b8 100644 --- a/resources/assets/src/views/admin/PluginsMarket/Row.tsx +++ b/resources/assets/src/views/admin/PluginsMarket/Row.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import type {Plugin} from './types'; import {t} from '@/scripts/i18n'; diff --git a/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx b/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx index 01f018e9..c2b676f1 100644 --- a/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx +++ b/resources/assets/src/views/admin/ReportsManagement/ImageBox.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import styled from '@emotion/styled'; import {type Report, Status} from './types'; import {t} from '@/scripts/i18n'; diff --git a/resources/assets/src/views/admin/ReportsManagement/index.tsx b/resources/assets/src/views/admin/ReportsManagement/index.tsx index 5c82eeeb..5798bfcc 100644 --- a/resources/assets/src/views/admin/ReportsManagement/index.tsx +++ b/resources/assets/src/views/admin/ReportsManagement/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect} from 'react'; -; import {useImmer} from 'use-immer'; import type {Report, Status} from './types'; import ImageBox from './ImageBox'; @@ -150,6 +149,6 @@ function ReportsManagement() { ); -}; +} export default ReportsManagement; diff --git a/resources/assets/src/views/admin/Translations/Row.tsx b/resources/assets/src/views/admin/Translations/Row.tsx index ea52954e..0cd88f04 100644 --- a/resources/assets/src/views/admin/Translations/Row.tsx +++ b/resources/assets/src/views/admin/Translations/Row.tsx @@ -1,5 +1,5 @@ import styled from '@emotion/styled'; -import React from 'react'; +import type React from 'react'; import type {Line} from './types'; import {t} from '@/scripts/i18n'; diff --git a/resources/assets/src/views/admin/Translations/index.tsx b/resources/assets/src/views/admin/Translations/index.tsx index cac564a4..dabda162 100644 --- a/resources/assets/src/views/admin/Translations/index.tsx +++ b/resources/assets/src/views/admin/Translations/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect} from 'react'; -; import {useImmer} from 'use-immer'; import type {Line} from './types'; import Row from './Row'; @@ -116,6 +115,6 @@ function Translations() { ); -}; +} export default Translations; diff --git a/resources/assets/src/views/admin/UsersManagement/Card.tsx b/resources/assets/src/views/admin/UsersManagement/Card.tsx index 7c664e32..1de2b1b9 100644 --- a/resources/assets/src/views/admin/UsersManagement/Card.tsx +++ b/resources/assets/src/views/admin/UsersManagement/Card.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import clsx from 'clsx'; import {Box, Icon, InfoTable} from './styles'; import { diff --git a/resources/assets/src/views/admin/UsersManagement/Row.tsx b/resources/assets/src/views/admin/UsersManagement/Row.tsx index f8a2cdaf..745450c8 100644 --- a/resources/assets/src/views/admin/UsersManagement/Row.tsx +++ b/resources/assets/src/views/admin/UsersManagement/Row.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import { humanizePermission, verificationStatusText, diff --git a/resources/assets/src/views/admin/UsersManagement/index.tsx b/resources/assets/src/views/admin/UsersManagement/index.tsx index 3b2f8bce..93491078 100644 --- a/resources/assets/src/views/admin/UsersManagement/index.tsx +++ b/resources/assets/src/views/admin/UsersManagement/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect, useLayoutEffect} from 'react'; -; import {useImmer} from 'use-immer'; import Header from './Header'; import Card from './Card'; @@ -364,6 +363,6 @@ function UsersManagement() { ); -}; +} export default UsersManagement; diff --git a/resources/assets/src/views/skinlib/Show/index.tsx b/resources/assets/src/views/skinlib/Show/index.tsx index b0c9217b..6acafc74 100644 --- a/resources/assets/src/views/skinlib/Show/index.tsx +++ b/resources/assets/src/views/skinlib/Show/index.tsx @@ -1,6 +1,5 @@ import React, {useState, useEffect} from 'react'; import {createPortal} from 'react-dom'; -; import Skeleton from 'react-loading-skeleton'; import addClosetItem from './addClosetItem'; import useBlessingExtra from '@/scripts/hooks/useBlessingExtra'; @@ -493,6 +492,6 @@ function Show() { /> ); -}; +} export default Show; diff --git a/resources/assets/src/views/skinlib/SkinLibrary/Button.tsx b/resources/assets/src/views/skinlib/SkinLibrary/Button.tsx index 0f267bbe..876d143b 100644 --- a/resources/assets/src/views/skinlib/SkinLibrary/Button.tsx +++ b/resources/assets/src/views/skinlib/SkinLibrary/Button.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; type Properties = { readonly active?: boolean; diff --git a/resources/assets/src/views/skinlib/SkinLibrary/FilterSelector.tsx b/resources/assets/src/views/skinlib/SkinLibrary/FilterSelector.tsx index 628d1608..ef5e2bd5 100644 --- a/resources/assets/src/views/skinlib/SkinLibrary/FilterSelector.tsx +++ b/resources/assets/src/views/skinlib/SkinLibrary/FilterSelector.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import Button from './Button'; import type {Filter} from './types'; import {humanizeType} from './utils'; diff --git a/resources/assets/src/views/skinlib/SkinLibrary/Item.tsx b/resources/assets/src/views/skinlib/SkinLibrary/Item.tsx index 2026787b..579bc5d7 100644 --- a/resources/assets/src/views/skinlib/SkinLibrary/Item.tsx +++ b/resources/assets/src/views/skinlib/SkinLibrary/Item.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import styled from '@emotion/styled'; import type {LibraryItem} from './types'; import {humanizeType} from './utils'; diff --git a/resources/assets/src/views/skinlib/SkinLibrary/index.tsx b/resources/assets/src/views/skinlib/SkinLibrary/index.tsx index f0199615..138b90ff 100644 --- a/resources/assets/src/views/skinlib/SkinLibrary/index.tsx +++ b/resources/assets/src/views/skinlib/SkinLibrary/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect} from 'react'; -; import addClosetItem from '../Show/addClosetItem'; import FilterSelector from './FilterSelector'; import Button from './Button'; @@ -299,6 +298,6 @@ function SkinLibrary() { ); -}; +} export default SkinLibrary; diff --git a/resources/assets/src/views/skinlib/Upload.tsx b/resources/assets/src/views/skinlib/Upload.tsx index 629caad2..0e4bb7fd 100644 --- a/resources/assets/src/views/skinlib/Upload.tsx +++ b/resources/assets/src/views/skinlib/Upload.tsx @@ -1,6 +1,5 @@ import React, {useState} from 'react'; import ReactDOM from 'react-dom'; -; import {t} from '@/scripts/i18n'; import useBlessingExtra from '@/scripts/hooks/useBlessingExtra'; import useEmitMounted from '@/scripts/hooks/useEmitMounted'; @@ -255,6 +254,6 @@ function Upload() { )} ); -}; +} export default Upload; diff --git a/resources/assets/src/views/user/Closet/ClosetItem.tsx b/resources/assets/src/views/user/Closet/ClosetItem.tsx index 5739196e..839aded2 100644 --- a/resources/assets/src/views/user/Closet/ClosetItem.tsx +++ b/resources/assets/src/views/user/Closet/ClosetItem.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import setAsAvatar from './setAsAvatar'; import {Card, DropdownButton} from './styles'; import {t} from '@/scripts/i18n'; diff --git a/resources/assets/src/views/user/Closet/index.tsx b/resources/assets/src/views/user/Closet/index.tsx index 4d3a6622..31e3b072 100644 --- a/resources/assets/src/views/user/Closet/index.tsx +++ b/resources/assets/src/views/user/Closet/index.tsx @@ -49,7 +49,7 @@ function Closet() { useEffect(() => { const element = containerReference.current; - /* istanbul ignore next */ + if (element) { const {width} = element.getBoundingClientRect(); if (width >= 500) { diff --git a/resources/assets/src/views/user/OAuth/Row.tsx b/resources/assets/src/views/user/OAuth/Row.tsx index 37347f53..28962480 100644 --- a/resources/assets/src/views/user/OAuth/Row.tsx +++ b/resources/assets/src/views/user/OAuth/Row.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import type {App} from './types'; import {t} from '@/scripts/i18n'; import ButtonEdit from '@/components/ButtonEdit'; diff --git a/resources/assets/src/views/user/OAuth/index.tsx b/resources/assets/src/views/user/OAuth/index.tsx index 04441f48..c7543850 100644 --- a/resources/assets/src/views/user/OAuth/index.tsx +++ b/resources/assets/src/views/user/OAuth/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect} from 'react'; -; import Row from './Row'; import ModalCreate from './ModalCreate'; import type {App} from './types'; @@ -162,6 +161,6 @@ function OAuth() { /> ); -}; +} export default OAuth; diff --git a/resources/assets/src/views/user/Players/Viewer2d.tsx b/resources/assets/src/views/user/Players/Viewer2d.tsx index b94583fb..6ab6cbf3 100644 --- a/resources/assets/src/views/user/Players/Viewer2d.tsx +++ b/resources/assets/src/views/user/Players/Viewer2d.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import styled from '@emotion/styled'; import {t} from '@/scripts/i18n'; diff --git a/resources/assets/src/views/user/Players/index.tsx b/resources/assets/src/views/user/Players/index.tsx index c099886c..5dd93839 100644 --- a/resources/assets/src/views/user/Players/index.tsx +++ b/resources/assets/src/views/user/Players/index.tsx @@ -1,5 +1,4 @@ import React, {useState, useEffect} from 'react'; -; import Row from './Row'; import LoadingRow from './LoadingRow'; import Previewer from './Previewer'; @@ -251,6 +250,6 @@ function Players() { /> ); -}; +} export default Players; diff --git a/resources/assets/src/views/widgets/EmailVerification.tsx b/resources/assets/src/views/widgets/EmailVerification.tsx index bd58e161..fd1aabca 100644 --- a/resources/assets/src/views/widgets/EmailVerification.tsx +++ b/resources/assets/src/views/widgets/EmailVerification.tsx @@ -40,6 +40,6 @@ function EmailVerification() {

); -}; +} export default EmailVerification; diff --git a/resources/assets/src/views/widgets/NotificationsList.tsx b/resources/assets/src/views/widgets/NotificationsList.tsx index 2d2b7d47..b4e45f07 100644 --- a/resources/assets/src/views/widgets/NotificationsList.tsx +++ b/resources/assets/src/views/widgets/NotificationsList.tsx @@ -79,6 +79,6 @@ function NotificationsList() { ); -}; +} export default NotificationsList; diff --git a/resources/assets/tests/components/Captcha.test.tsx b/resources/assets/tests/components/Captcha.test.tsx index 69ac7691..bd8d519f 100644 --- a/resources/assets/tests/components/Captcha.test.tsx +++ b/resources/assets/tests/components/Captcha.test.tsx @@ -1,66 +1,66 @@ -import { expect, vi, it } from 'vitest'; -import React from 'react' -import { render, fireEvent } from '@testing-library/react' -import Reaptcha from 'reaptcha' -import { t } from '@/scripts/i18n' -import Captcha from '@/components/Captcha' +import {expect, vi, it} from 'vitest'; +import React from 'react'; +import {render, fireEvent} from '@testing-library/react'; +import Reaptcha from 'reaptcha'; +import {t} from '@/scripts/i18n'; +import Captcha from '@/components/Captcha'; describe('picture captcha', () => { - it('retrieve value', async () => { - const ref = React.createRef() - const { getByPlaceholderText } = render() + it('retrieve value', async () => { + const reference = React.createRef(); + const {getByPlaceholderText} = render(); - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'abc' }, - }) - expect(await ref.current?.execute()).toBe('abc') - }) + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'abc'}, + }); + expect(await reference.current?.execute()).toBe('abc'); + }); - it('refresh on click', () => { - const spy = vi.spyOn(Date, 'now') + it('refresh on click', () => { + const spy = vi.spyOn(Date, 'now'); - const ref = React.createRef() - const { getByAltText } = render() + const reference = React.createRef(); + const {getByAltText} = render(); - fireEvent.click(getByAltText(t('auth.captcha'))) - expect(spy).toHaveBeenCalled() - }) + fireEvent.click(getByAltText(t('auth.captcha'))); + expect(spy).toHaveBeenCalled(); + }); - it('refresh programatically', () => { - const spy = vi.spyOn(Date, 'now') + it('refresh programatically', () => { + const spy = vi.spyOn(Date, 'now'); - const ref = React.createRef() - render() + const reference = React.createRef(); + render(); - ref.current?.reset() - expect(spy).toHaveBeenCalled() - }) -}) + reference.current?.reset(); + expect(spy).toHaveBeenCalled(); + }); +}); describe('recaptcha', () => { - beforeEach(() => { - window.blessing.extra = { recaptcha: 'sitekey', invisible: false } - }) + beforeEach(() => { + window.blessing.extra = {recaptcha: 'sitekey', invisible: false}; + }); - it('retrieve value', async () => { - window.blessing.extra.invisible = true - const spy = vi.spyOn(Reaptcha.prototype, 'execute') + it('retrieve value', async () => { + window.blessing.extra.invisible = true; + const spy = vi.spyOn(Reaptcha.prototype, 'execute'); - const ref = React.createRef() - render() + const reference = React.createRef(); + render(); - const value = await ref.current?.execute() - expect(spy).toHaveBeenCalled() - expect(value).toBe('token') - }) + const value = await reference.current?.execute(); + expect(spy).toHaveBeenCalled(); + expect(value).toBe('token'); + }); - it('refresh programatically', () => { - const spy = vi.spyOn(Reaptcha.prototype, 'reset') + it('refresh programatically', () => { + const spy = vi.spyOn(Reaptcha.prototype, 'reset'); - const ref = React.createRef() - render() + const reference = React.createRef(); + render(); - ref.current?.reset() - expect(spy).toHaveBeenCalled() - }) -}) + reference.current?.reset(); + expect(spy).toHaveBeenCalled(); + }); +}); diff --git a/resources/assets/tests/components/DarkModeButton.test.tsx b/resources/assets/tests/components/DarkModeButton.test.tsx index c91d00c5..a83e0d3e 100644 --- a/resources/assets/tests/components/DarkModeButton.test.tsx +++ b/resources/assets/tests/components/DarkModeButton.test.tsx @@ -1,22 +1,26 @@ -import { expect, vi, test } from 'vitest'; -import { render, fireEvent, waitFor } from '@testing-library/react' -import * as fetch from '@/scripts/net' -import DarkModeButton from '@/components/DarkModeButton' +import {expect, vi, test} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import * as fetch from '@/scripts/net'; +import DarkModeButton from '@/components/DarkModeButton'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); test('click to toggle', async () => { - const { getByRole } = render() - const button = getByRole('button') + const {getByRole} = render(); + const button = getByRole('button'); - fireEvent.click(button) - await waitFor(() => expect(fetch.put).toBeCalledWith('/user/dark-mode')) -}) + fireEvent.click(button); + await waitFor(() => { + expect(fetch.put).toBeCalledWith('/user/dark-mode'); + }); +}); test('default is dark', async () => { - const { getByRole } = render() - const button = getByRole('button') + const {getByRole} = render(); + const button = getByRole('button'); - fireEvent.click(button) - await waitFor(() => expect(fetch.put).toBeCalledWith('/user/dark-mode')) -}) + fireEvent.click(button); + await waitFor(() => { + expect(fetch.put).toBeCalledWith('/user/dark-mode'); + }); +}); diff --git a/resources/assets/tests/components/EmailSuggestion.test.tsx b/resources/assets/tests/components/EmailSuggestion.test.tsx index b3fb770c..1a484684 100644 --- a/resources/assets/tests/components/EmailSuggestion.test.tsx +++ b/resources/assets/tests/components/EmailSuggestion.test.tsx @@ -1,75 +1,75 @@ -import { expect, test } from 'vitest' -import React, { useState } from 'react' -import { render, fireEvent } from '@testing-library/react' -import { on } from '@/scripts/event' -import EmailSuggestion from '@/components/EmailSuggestion' +import {expect, test} from 'vitest'; +import React, {useState} from 'react'; +import {render, fireEvent} from '@testing-library/react'; +import {on} from '@/scripts/event'; +import EmailSuggestion from '@/components/EmailSuggestion'; function Wrapper() { - const [email, setEmail] = useState('') + const [email, setEmail] = useState(''); - return + return ; } test('basic typing', () => { - const { getByDisplayValue, queryByText } = render() - const input = getByDisplayValue('') + const {getByDisplayValue, queryByText} = render(); + const input = getByDisplayValue(''); - fireEvent.input(input, { target: { value: 'abc' } }) - fireEvent.focus(input) - expect(queryByText('abc@qq.com')).toBeInTheDocument() - expect(queryByText('abc@163.com')).toBeInTheDocument() - expect(queryByText('abc@gmail.com')).toBeInTheDocument() - expect(queryByText('abc@hotmail.com')).toBeInTheDocument() + fireEvent.input(input, {target: {value: 'abc'}}); + fireEvent.focus(input); + expect(queryByText('abc@qq.com')).toBeInTheDocument(); + expect(queryByText('abc@163.com')).toBeInTheDocument(); + expect(queryByText('abc@gmail.com')).toBeInTheDocument(); + expect(queryByText('abc@hotmail.com')).toBeInTheDocument(); - fireEvent.input(input, { target: { value: '' } }) - expect(queryByText('abc@qq.com')).not.toBeInTheDocument() -}) + fireEvent.input(input, {target: {value: ''}}); + expect(queryByText('abc@qq.com')).not.toBeInTheDocument(); +}); test('apply suggestion', () => { - const { getByDisplayValue, getByText } = render() - const input = getByDisplayValue('') + const {getByDisplayValue, getByText} = render(); + const input = getByDisplayValue(''); - fireEvent.input(input, { target: { value: 'abc' } }) - fireEvent.focus(input) - fireEvent.click(getByText('abc@hotmail.com')) - expect(input).toHaveValue('abc@hotmail.com') -}) + fireEvent.input(input, {target: {value: 'abc'}}); + fireEvent.focus(input); + fireEvent.click(getByText('abc@hotmail.com')); + expect(input).toHaveValue('abc@hotmail.com'); +}); test('do not suggest when `at` is existed', () => { - const { getByDisplayValue, queryByText } = render() - const input = getByDisplayValue('') + const {getByDisplayValue, queryByText} = render(); + const input = getByDisplayValue(''); - fireEvent.input(input, { target: { value: 'abc@outlook.com' } }) - fireEvent.focus(input) - expect(queryByText('abc@outlook.com@qq.com')).not.toBeInTheDocument() - expect(queryByText('abc@outlook.com@163.com')).not.toBeInTheDocument() - expect(queryByText('abc@outlook.com@gmail.com')).not.toBeInTheDocument() - expect(queryByText('abc@outlook.com@hotmail.com')).not.toBeInTheDocument() -}) + fireEvent.input(input, {target: {value: 'abc@outlook.com'}}); + fireEvent.focus(input); + expect(queryByText('abc@outlook.com@qq.com')).not.toBeInTheDocument(); + expect(queryByText('abc@outlook.com@163.com')).not.toBeInTheDocument(); + expect(queryByText('abc@outlook.com@gmail.com')).not.toBeInTheDocument(); + expect(queryByText('abc@outlook.com@hotmail.com')).not.toBeInTheDocument(); +}); test('display suggestions when typing with configured domain names', () => { - const { getByDisplayValue, queryByText } = render() - const input = getByDisplayValue('') + const {getByDisplayValue, queryByText} = render(); + const input = getByDisplayValue(''); - fireEvent.input(input, { target: { value: 'abc@hotmail.com' } }) - fireEvent.focus(input) - expect(queryByText('abc@qq.com')).toBeInTheDocument() - expect(queryByText('abc@163.com')).toBeInTheDocument() - expect(queryByText('abc@gmail.com')).toBeInTheDocument() - expect(queryByText('abc@hotmail.com')).toBeInTheDocument() -}) + fireEvent.input(input, {target: {value: 'abc@hotmail.com'}}); + fireEvent.focus(input); + expect(queryByText('abc@qq.com')).toBeInTheDocument(); + expect(queryByText('abc@163.com')).toBeInTheDocument(); + expect(queryByText('abc@gmail.com')).toBeInTheDocument(); + expect(queryByText('abc@hotmail.com')).toBeInTheDocument(); +}); test('events', () => { - const off = on('emailDomainsSuggestion', (names: Set) => { - names.add('outlook.com') - }) + const off = on('emailDomainsSuggestion', (names: Set) => { + names.add('outlook.com'); + }); - const { getByDisplayValue, queryByText } = render() - const input = getByDisplayValue('') + const {getByDisplayValue, queryByText} = render(); + const input = getByDisplayValue(''); - fireEvent.input(input, { target: { value: 'abc' } }) - fireEvent.focus(input) - expect(queryByText('abc@outlook.com')).toBeInTheDocument() + fireEvent.input(input, {target: {value: 'abc'}}); + fireEvent.focus(input); + expect(queryByText('abc@outlook.com')).toBeInTheDocument(); - off() -}) + off(); +}); diff --git a/resources/assets/tests/components/FileInput.test.tsx b/resources/assets/tests/components/FileInput.test.tsx index d87ae980..5bfae3a1 100644 --- a/resources/assets/tests/components/FileInput.test.tsx +++ b/resources/assets/tests/components/FileInput.test.tsx @@ -1,39 +1,39 @@ -import { expect, test } from 'vitest' -import { render, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import FileInput from '@/components/FileInput' +import {expect, test} from 'vitest'; +import {render, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import FileInput from '@/components/FileInput'; test('click to select file', () => { - const { getAllByText } = render( - { - /* */ - }} - />, - ) + const {getAllByText} = render( + { + /* */ + }} + />, + ); - fireEvent.click(getAllByText(t('skinlib.upload.select-file'))[1]!) -}) + fireEvent.click(getAllByText(t('skinlib.upload.select-file'))[1]); +}); test('display file name', () => { - const file = new File([], 'f.txt') - const { queryByText } = render( - { - /* */ - }} - />, - ) - expect(queryByText('f.txt')).toBeInTheDocument() -}) + const file = new File([], 'f.txt'); + const {queryByText} = render( + { + /* */ + }} + />, + ); + expect(queryByText('f.txt')).toBeInTheDocument(); +}); test('input file', () => { - const mock = vi.fn() + const mock = vi.fn(); - const { getByLabelText } = render() - fireEvent.change(getByLabelText(t('skinlib.upload.select-file'))) + const {getByLabelText} = render(); + fireEvent.change(getByLabelText(t('skinlib.upload.select-file'))); - expect(mock).toBeCalled() -}) + expect(mock).toBeCalled(); +}); diff --git a/resources/assets/tests/components/Modal.test.tsx b/resources/assets/tests/components/Modal.test.tsx index af972df3..b6281bab 100644 --- a/resources/assets/tests/components/Modal.test.tsx +++ b/resources/assets/tests/components/Modal.test.tsx @@ -1,289 +1,291 @@ -import { expect, test, vi, it } from 'vitest' -import { render, fireEvent, act } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import $ from 'jquery' -import Modal from '@/components/Modal' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, fireEvent, act} from '@testing-library/react'; +import $ from 'jquery'; +import {t} from '@/scripts/i18n'; +import Modal from '@/components/Modal'; test('hidden by default', () => { - const { queryByRole } = render() - expect(queryByRole('dialog')).toBeNull() -}) + const {queryByRole} = render(); + expect(queryByRole('dialog')).toBeNull(); +}); test('receive id', () => { - const { getByRole } = render() - expect(getByRole('dialog')).toHaveAttribute('id', 'kumiko') -}) + const {getByRole} = render(); + expect(getByRole('dialog')).toHaveAttribute('id', 'kumiko'); +}); test('centered dialog', () => { - const { getByRole } = render() - expect(getByRole('document')).toHaveClass('modal-dialog-centered') -}) + const {getByRole} = render(); + expect(getByRole('document')).toHaveClass('modal-dialog-centered'); +}); test('background color', () => { - const { container } = render() - expect(container.querySelector('.modal-content')).toHaveClass('bg-primary') -}) + const {container} = render(); + expect(container.querySelector('.modal-content')).toHaveClass('bg-primary'); +}); test('jQuery events', () => { - const { getByText } = render() - act(() => { - vi.runAllTimers() - $('.modal').trigger('hidden.bs.modal') - }) + const {getByText} = render(); + act(() => { + vi.runAllTimers(); + $('.modal').trigger('hidden.bs.modal'); + }); - fireEvent.click(getByText(t('general.cancel'))) - act(() => { - vi.runAllTimers() - $('.modal').trigger('hidden.bs.modal') - }) -}) + fireEvent.click(getByText(t('general.cancel'))); + act(() => { + vi.runAllTimers(); + $('.modal').trigger('hidden.bs.modal'); + }); +}); describe('modal header', () => { - it('modal title', () => { - const { queryByText } = render() - expect(queryByText('Tips')).toBeInTheDocument() - }) + it('modal title', () => { + const {queryByText} = render(); + expect(queryByText('Tips')).toBeInTheDocument(); + }); - it('hide modal header', () => { - const { queryByText } = render( - , - ) - expect(queryByText('Tips')).not.toBeInTheDocument() - }) -}) + it('hide modal header', () => { + const {queryByText} = render( + , + ); + expect(queryByText('Tips')).not.toBeInTheDocument(); + }); +}); describe('modal body', () => { - it('custom children', () => { - const { queryByText } = render(body) - expect(queryByText('body')).toBeInTheDocument() - }) + it('custom children', () => { + const {queryByText} = render(body); + expect(queryByText('body')).toBeInTheDocument(); + }); - it('text with linebreaks', () => { - const { queryByText } = render() - expect(queryByText('L1')).toBeInTheDocument() - expect(queryByText('L2')).toBeInTheDocument() - }) + it('text with linebreaks', () => { + const {queryByText} = render(); + expect(queryByText('L1')).toBeInTheDocument(); + expect(queryByText('L2')).toBeInTheDocument(); + }); - it('dangerous HTML', () => { - const { getByText } = render( - , - ) - expect(getByText('ab')).toHaveClass('h1') - }) + it('dangerous HTML', () => { + const {getByText} = render( + , + ); + expect(getByText('ab')).toHaveClass('h1'); + }); - describe('input control', () => { - it('set default value', () => { - const { queryByDisplayValue } = render( - , - ) - expect(queryByDisplayValue('val')).toBeInTheDocument() - }) + describe('input control', () => { + it('set default value', () => { + const {queryByDisplayValue} = render( + , + ); + expect(queryByDisplayValue('val')).toBeInTheDocument(); + }); - it('placeholder', () => { - const { queryByPlaceholderText } = render( - , - ) - expect(queryByPlaceholderText('hint')).toBeInTheDocument() - }) + it('placeholder', () => { + const {queryByPlaceholderText} = render( + , + ); + expect(queryByPlaceholderText('hint')).toBeInTheDocument(); + }); - it('input control type', () => { - const { getByPlaceholderText } = render( - , - ) - expect(getByPlaceholderText('password')).toHaveAttribute( - 'type', - 'password', - ) - }) - }) -}) + it('input control type', () => { + const {getByPlaceholderText} = render( + , + ); + expect(getByPlaceholderText('password')).toHaveAttribute( + 'type', + 'password', + ); + }); + }); +}); describe('modal footer', () => { - it('custom footer content', () => { - const { queryByText } = render(footer} show />) - expect(queryByText('footer')).toBeInTheDocument() - expect(queryByText(t('general.confirm'))).not.toBeInTheDocument() - }) + it('custom footer content', () => { + const {queryByText} = render(footer}/>); + expect(queryByText('footer')).toBeInTheDocument(); + expect(queryByText(t('general.confirm'))).not.toBeInTheDocument(); + }); - it('flex footer', () => { - const { getByText } = render() - expect(getByText('footer')).toHaveClass('d-flex', 'justify-content-between') - }) + it('flex footer', () => { + const {getByText} = render(); + expect(getByText('footer')).toHaveClass('d-flex', 'justify-content-between'); + }); - it('custom ok button', () => { - const { getByText } = render( - , - ) - expect(getByText('kumiko')).toHaveClass('btn-primary') - }) + it('custom ok button', () => { + const {getByText} = render( + , + ); + expect(getByText('kumiko')).toHaveClass('btn-primary'); + }); - it('custom cancel button', () => { - const { getByText } = render( - , - ) - expect(getByText('reina')).toHaveClass('btn-success') - }) -}) + it('custom cancel button', () => { + const {getByText} = render( + , + ); + expect(getByText('reina')).toHaveClass('btn-success'); + }); +}); describe('"alert" mode', () => { - it('buttons', () => { - const resolve = vi.fn() - const { getByText, queryByText } = render( - , - ) - fireEvent.click(getByText(t('general.confirm'))) - expect(resolve).toBeCalledWith({ value: '' }) - expect(queryByText(t('general.cancel'))).toBeNull() - }) + it('buttons', () => { + const resolve = vi.fn(); + const {getByText, queryByText} = render( + , + ); + fireEvent.click(getByText(t('general.confirm'))); + expect(resolve).toBeCalledWith({value: ''}); + expect(queryByText(t('general.cancel'))).toBeNull(); + }); - it('confirm callback is optional', () => { - const { getByText } = render() - fireEvent.click(getByText(t('general.confirm'))) - }) -}) + it('confirm callback is optional', () => { + const {getByText} = render(); + fireEvent.click(getByText(t('general.confirm'))); + }); +}); describe('"confirm" mode', () => { - it('default mode is "confirm"', () => { - const { queryByText } = render() - expect(queryByText(t('general.confirm'))).toBeInTheDocument() - expect(queryByText(t('general.cancel'))).toBeInTheDocument() - }) + it('default mode is "confirm"', () => { + const {queryByText} = render(); + expect(queryByText(t('general.confirm'))).toBeInTheDocument(); + expect(queryByText(t('general.cancel'))).toBeInTheDocument(); + }); - it('"confirm" button', () => { - const resolve = vi.fn() - const reject = vi.fn() - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('general.confirm'))) - expect(resolve).toBeCalledWith({ value: '' }) - expect(reject).not.toBeCalled() - }) + it('"confirm" button', () => { + const resolve = vi.fn(); + const reject = vi.fn(); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('general.confirm'))); + expect(resolve).toBeCalledWith({value: ''}); + expect(reject).not.toBeCalled(); + }); - it('"cancel" button', () => { - const resolve = vi.fn() - const reject = vi.fn() - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('general.cancel'))) - expect(resolve).not.toBeCalled() - expect(reject).toBeCalled() - }) -}) + it('"cancel" button', () => { + const resolve = vi.fn(); + const reject = vi.fn(); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('general.cancel'))); + expect(resolve).not.toBeCalled(); + expect(reject).toBeCalled(); + }); +}); describe('"prompt" mode', () => { - it('retrieve input value', () => { - const resolve = vi.fn() - const reject = vi.fn() - const { getByPlaceholderText, getByText } = render( - , - ) - fireEvent.change(getByPlaceholderText('hint'), { - target: { value: 'my' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - expect(resolve).toBeCalledWith({ value: 'my' }) - expect(reject).not.toBeCalled() - }) + it('retrieve input value', () => { + const resolve = vi.fn(); + const reject = vi.fn(); + const {getByPlaceholderText, getByText} = render( + , + ); + fireEvent.change(getByPlaceholderText('hint'), { + target: {value: 'my'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + expect(resolve).toBeCalledWith({value: 'my'}); + expect(reject).not.toBeCalled(); + }); - it('cancel dialog', () => { - const resolve = vi.fn() - const reject = vi.fn() - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('general.cancel'))) - expect(resolve).not.toBeCalled() - expect(reject).toBeCalled() - }) + it('cancel dialog', () => { + const resolve = vi.fn(); + const reject = vi.fn(); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('general.cancel'))); + expect(resolve).not.toBeCalled(); + expect(reject).toBeCalled(); + }); - it('radio inputs', () => { - const choices = [ - { text: 'A', value: 'a' }, - { text: 'B', value: 'b' }, - ] - const resolve = vi.fn() - const { getByText, getByLabelText } = render( - , - ) - fireEvent.click(getByLabelText('B')) - fireEvent.click(getByText(t('general.confirm'))) - expect(resolve).toBeCalledWith({ value: 'b' }) - }) + it('radio inputs', () => { + const choices = [ + {text: 'A', value: 'a'}, + {text: 'B', value: 'b'}, + ]; + const resolve = vi.fn(); + const {getByText, getByLabelText} = render( + , + ); + fireEvent.click(getByLabelText('B')); + fireEvent.click(getByText(t('general.confirm'))); + expect(resolve).toBeCalledWith({value: 'b'}); + }); - it('validate input', () => { - const resolve = vi.fn() - const reject = vi.fn() - const validator = vi.fn().mockReturnValue(true) - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('general.confirm'))) - expect(resolve).toBeCalledWith({ value: 'val' }) - expect(reject).not.toBeCalled() - }) + it('validate input', () => { + const resolve = vi.fn(); + const reject = vi.fn(); + const validator = vi.fn().mockReturnValue(true); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('general.confirm'))); + expect(resolve).toBeCalledWith({value: 'val'}); + expect(reject).not.toBeCalled(); + }); - it('report validator message', () => { - const message = 'Invalid input.' - const resolve = vi.fn() - const reject = vi.fn() - const validator = vi.fn().mockReturnValue(message) - const { getByText, queryByText } = render( - , - ) - expect(queryByText(message)).not.toBeInTheDocument() + it('report validator message', () => { + const message = 'Invalid input.'; + const resolve = vi.fn(); + const reject = vi.fn(); + const validator = vi.fn().mockReturnValue(message); + const {getByText, queryByText} = render( + , + ); + expect(queryByText(message)).not.toBeInTheDocument(); - fireEvent.click(getByText(t('general.confirm'))) - expect(queryByText(message)).toBeInTheDocument() - expect(resolve).not.toBeCalled() - expect(reject).not.toBeCalled() - }) -}) + fireEvent.click(getByText(t('general.confirm'))); + expect(queryByText(message)).toBeInTheDocument(); + expect(resolve).not.toBeCalled(); + expect(reject).not.toBeCalled(); + }); +}); describe('"onClose" event', () => { - it('button confirm', () => { - const mock = vi.fn() - const { getByText } = render() - fireEvent.click(getByText(t('general.confirm'))) - expect(mock).toBeCalled() - }) + it('button confirm', () => { + const mock = vi.fn(); + const {getByText} = render(); + fireEvent.click(getByText(t('general.confirm'))); + expect(mock).toBeCalled(); + }); - it('button cancel', () => { - const mock = vi.fn() - const { getByText } = render() - fireEvent.click(getByText(t('general.cancel'))) - expect(mock).toBeCalled() - }) -}) + it('button cancel', () => { + const mock = vi.fn(); + const {getByText} = render(); + fireEvent.click(getByText(t('general.cancel'))); + expect(mock).toBeCalled(); + }); +}); diff --git a/resources/assets/tests/components/Pagination.test.tsx b/resources/assets/tests/components/Pagination.test.tsx index b557d698..66a6d590 100644 --- a/resources/assets/tests/components/Pagination.test.tsx +++ b/resources/assets/tests/components/Pagination.test.tsx @@ -1,153 +1,155 @@ -import { expect, test, it, jest } from 'vitest' -import { render, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import Pagination from '@/components/Pagination' +import { + expect, test, it, jest, +} from 'vitest'; +import {render, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import Pagination from '@/components/Pagination'; test('hide when total pages is invalid', () => { - const { queryByText } = render( - {}} />, - ) - expect(queryByText(t('vendor.datatable.prev'))).not.toBeInTheDocument() - expect(queryByText(t('vendor.datatable.next'))).not.toBeInTheDocument() -}) + const {queryByText} = render( + {}}/>, + ); + expect(queryByText(t('vendor.datatable.prev'))).not.toBeInTheDocument(); + expect(queryByText(t('vendor.datatable.next'))).not.toBeInTheDocument(); +}); describe('previous page', () => { - it('enabled', () => { - const mock = vi.fn(() => {}) - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('vendor.datatable.prev'))) - expect(mock).toBeCalledWith(2) - }) + it('enabled', () => { + const mock = vi.fn(() => {}); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('vendor.datatable.prev'))); + expect(mock).toBeCalledWith(2); + }); - it('disabled', () => { - const mock = vi.fn(() => {}) - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('vendor.datatable.prev'))) - expect(mock).not.toBeCalled() - }) -}) + it('disabled', () => { + const mock = vi.fn(() => {}); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('vendor.datatable.prev'))); + expect(mock).not.toBeCalled(); + }); +}); describe('next page', () => { - it('enabled', () => { - const mock = vi.fn(() => {}) - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('vendor.datatable.next'))) - expect(mock).toBeCalledWith(4) - }) + it('enabled', () => { + const mock = vi.fn(() => {}); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('vendor.datatable.next'))); + expect(mock).toBeCalledWith(4); + }); - it('disabled', () => { - const mock = vi.fn(() => {}) - const { getByText } = render( - , - ) - fireEvent.click(getByText(t('vendor.datatable.next'))) - expect(mock).not.toBeCalled() - }) -}) + it('disabled', () => { + const mock = vi.fn(() => {}); + const {getByText} = render( + , + ); + fireEvent.click(getByText(t('vendor.datatable.next'))); + expect(mock).not.toBeCalled(); + }); +}); describe('middle pages', () => { - it('pages count less than 8', () => { - const mock = vi.fn(() => {}) - const { getByText } = render( - , - ) + it('pages count less than 8', () => { + const mock = vi.fn(() => {}); + const {getByText} = render( + , + ); - fireEvent.click(getByText('1')) - expect(mock).toBeCalledWith(1) + fireEvent.click(getByText('1')); + expect(mock).toBeCalledWith(1); - fireEvent.click(getByText('2')) - expect(mock).toBeCalledWith(2) + fireEvent.click(getByText('2')); + expect(mock).toBeCalledWith(2); - fireEvent.click(getByText('3')) - expect(mock).toBeCalledWith(3) + fireEvent.click(getByText('3')); + expect(mock).toBeCalledWith(3); - fireEvent.click(getByText('4')) - expect(mock).toBeCalledWith(4) + fireEvent.click(getByText('4')); + expect(mock).toBeCalledWith(4); - fireEvent.click(getByText('5')) - expect(mock).toBeCalledWith(5) + fireEvent.click(getByText('5')); + expect(mock).toBeCalledWith(5); - fireEvent.click(getByText('6')) - expect(mock).toBeCalledWith(6) + fireEvent.click(getByText('6')); + expect(mock).toBeCalledWith(6); - fireEvent.click(getByText('7')) - expect(mock).toBeCalledWith(7) - }) + fireEvent.click(getByText('7')); + expect(mock).toBeCalledWith(7); + }); - describe('pages count greater than or equals to 8', () => { - it('left edge', () => { - const mock = vi.fn(() => {}) - const { getByText, queryByText } = render( - , - ) + describe('pages count greater than or equals to 8', () => { + it('left edge', () => { + const mock = vi.fn(() => {}); + const {getByText, queryByText} = render( + , + ); - fireEvent.click(getByText('1')) - expect(mock).toBeCalledWith(1) - expect(queryByText('1')).toBeInTheDocument() - expect(queryByText('2')).toBeInTheDocument() - expect(queryByText('3')).toBeInTheDocument() - expect(queryByText('...')).toBeInTheDocument() - expect(queryByText('10')).toBeInTheDocument() + fireEvent.click(getByText('1')); + expect(mock).toBeCalledWith(1); + expect(queryByText('1')).toBeInTheDocument(); + expect(queryByText('2')).toBeInTheDocument(); + expect(queryByText('3')).toBeInTheDocument(); + expect(queryByText('...')).toBeInTheDocument(); + expect(queryByText('10')).toBeInTheDocument(); - fireEvent.click(getByText('2')) - expect(mock).toBeCalledWith(2) - expect(queryByText('1')).toBeInTheDocument() - expect(queryByText('2')).toBeInTheDocument() - expect(queryByText('3')).toBeInTheDocument() - expect(queryByText('...')).toBeInTheDocument() - expect(queryByText('10')).toBeInTheDocument() - }) + fireEvent.click(getByText('2')); + expect(mock).toBeCalledWith(2); + expect(queryByText('1')).toBeInTheDocument(); + expect(queryByText('2')).toBeInTheDocument(); + expect(queryByText('3')).toBeInTheDocument(); + expect(queryByText('...')).toBeInTheDocument(); + expect(queryByText('10')).toBeInTheDocument(); + }); - it('right edge', () => { - const mock = vi.fn(() => {}) - const { getByText, queryByText } = render( - , - ) + it('right edge', () => { + const mock = vi.fn(() => {}); + const {getByText, queryByText} = render( + , + ); - fireEvent.click(getByText('10')) - expect(mock).toBeCalledWith(10) - expect(queryByText('1')).toBeInTheDocument() - expect(queryByText('...')).toBeInTheDocument() - expect(queryByText('8')).toBeInTheDocument() - expect(queryByText('9')).toBeInTheDocument() - expect(queryByText('10')).toBeInTheDocument() + fireEvent.click(getByText('10')); + expect(mock).toBeCalledWith(10); + expect(queryByText('1')).toBeInTheDocument(); + expect(queryByText('...')).toBeInTheDocument(); + expect(queryByText('8')).toBeInTheDocument(); + expect(queryByText('9')).toBeInTheDocument(); + expect(queryByText('10')).toBeInTheDocument(); - fireEvent.click(getByText('9')) - expect(mock).toBeCalledWith(9) - expect(queryByText('1')).toBeInTheDocument() - expect(queryByText('...')).toBeInTheDocument() - expect(queryByText('8')).toBeInTheDocument() - expect(queryByText('9')).toBeInTheDocument() - expect(queryByText('10')).toBeInTheDocument() - }) + fireEvent.click(getByText('9')); + expect(mock).toBeCalledWith(9); + expect(queryByText('1')).toBeInTheDocument(); + expect(queryByText('...')).toBeInTheDocument(); + expect(queryByText('8')).toBeInTheDocument(); + expect(queryByText('9')).toBeInTheDocument(); + expect(queryByText('10')).toBeInTheDocument(); + }); - it('middle', () => { - const mock = vi.fn(() => {}) - const { getByText, queryByText, queryAllByText } = render( - , - ) + it('middle', () => { + const mock = vi.fn(() => {}); + const {getByText, queryByText, queryAllByText} = render( + , + ); - expect(queryByText('1')).toBeInTheDocument() - expect(queryAllByText('...')).toHaveLength(2) - expect(queryByText('3')).toBeInTheDocument() - expect(queryByText('4')).toBeInTheDocument() - expect(queryByText('5')).toBeInTheDocument() - expect(queryByText('10')).toBeInTheDocument() + expect(queryByText('1')).toBeInTheDocument(); + expect(queryAllByText('...')).toHaveLength(2); + expect(queryByText('3')).toBeInTheDocument(); + expect(queryByText('4')).toBeInTheDocument(); + expect(queryByText('5')).toBeInTheDocument(); + expect(queryByText('10')).toBeInTheDocument(); - fireEvent.click(getByText('5')) - expect(mock).toBeCalledWith(5) + fireEvent.click(getByText('5')); + expect(mock).toBeCalledWith(5); - fireEvent.click(getByText('1')) - expect(mock).toBeCalledWith(1) + fireEvent.click(getByText('1')); + expect(mock).toBeCalledWith(1); - fireEvent.click(getByText('10')) - expect(mock).toBeCalledWith(10) - }) - }) -}) + fireEvent.click(getByText('10')); + expect(mock).toBeCalledWith(10); + }); + }); +}); diff --git a/resources/assets/tests/components/Viewer.test.tsx b/resources/assets/tests/components/Viewer.test.tsx index 8441fbf8..1ade463b 100644 --- a/resources/assets/tests/components/Viewer.test.tsx +++ b/resources/assets/tests/components/Viewer.test.tsx @@ -1,115 +1,115 @@ -import { expect, test, it } from 'vitest' -import { render, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import Viewer, { PICTURES_COUNT } from '@/components/Viewer' +import {expect, test, it} from 'vitest'; +import {render, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import Viewer, {PICTURES_COUNT} from '@/components/Viewer'; test('custom footer', () => { - const { queryByText } = render(footer) - expect(queryByText('footer')).toBeInTheDocument() -}) + const {queryByText} = render(footer); + expect(queryByText('footer')).toBeInTheDocument(); +}); describe('indicator', () => { - it('hidden by default', () => { - const { queryByText } = render() - expect(queryByText(t('general.skin'))).not.toBeInTheDocument() - }) + it('hidden by default', () => { + const {queryByText} = render(); + expect(queryByText(t('general.skin'))).not.toBeInTheDocument(); + }); - it('nothing', () => { - const { queryByText } = render() - expect(queryByText(t('general.skin'))).not.toBeInTheDocument() - expect(queryByText(t('general.cape'))).not.toBeInTheDocument() - }) + it('nothing', () => { + const {queryByText} = render(); + expect(queryByText(t('general.skin'))).not.toBeInTheDocument(); + expect(queryByText(t('general.cape'))).not.toBeInTheDocument(); + }); - it('skin only', () => { - const { queryByText } = render( - , - ) - expect(queryByText(t('general.skin'))).toBeInTheDocument() - expect(queryByText(t('general.cape'))).not.toBeInTheDocument() - }) + it('skin only', () => { + const {queryByText} = render( + , + ); + expect(queryByText(t('general.skin'))).toBeInTheDocument(); + expect(queryByText(t('general.cape'))).not.toBeInTheDocument(); + }); - it('cape only', () => { - const { queryByText } = render( - , - ) - expect(queryByText(t('general.skin'))).not.toBeInTheDocument() - expect(queryByText(t('general.cape'))).toBeInTheDocument() - }) + it('cape only', () => { + const {queryByText} = render( + , + ); + expect(queryByText(t('general.skin'))).not.toBeInTheDocument(); + expect(queryByText(t('general.cape'))).toBeInTheDocument(); + }); - it('skin and cape', () => { - const { queryByText } = render( - , - ) - expect( - queryByText(`${t('general.skin')} & ${t('general.cape')}`), - ).toBeInTheDocument() - expect(queryByText(t('general.skin'))).not.toBeInTheDocument() - expect(queryByText(t('general.cape'))).not.toBeInTheDocument() - }) -}) + it('skin and cape', () => { + const {queryByText} = render( + , + ); + expect( + queryByText(`${t('general.skin')} & ${t('general.cape')}`), + ).toBeInTheDocument(); + expect(queryByText(t('general.skin'))).not.toBeInTheDocument(); + expect(queryByText(t('general.cape'))).not.toBeInTheDocument(); + }); +}); describe('actions', () => { - it('toggle animation', () => { - const component = - const { getByTitle } = render(component) - fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)) // should start running - fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)) // should start flying - fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)) // should be idle - fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)) // should start walking - }) + it('toggle animation', () => { + const component = ; + const {getByTitle} = render(component); + fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)); // Should start running + fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)); // Should start flying + fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)); // Should be idle + fireEvent.click(getByTitle(`${t('general.switchAnimation')}`)); // Should start walking + }); - it('toggle rotation', () => { - const { getByTitle } = render() - fireEvent.click(getByTitle(t('general.rotation'))) // should stop rotation - fireEvent.click(getByTitle(t('general.rotation'))) // should start rotation - }) + it('toggle rotation', () => { + const {getByTitle} = render(); + fireEvent.click(getByTitle(t('general.rotation'))); // Should stop rotation + fireEvent.click(getByTitle(t('general.rotation'))); // Should start rotation + }); - it('toggle pause', () => { - const { getByTitle } = render() - const icon = getByTitle(t('general.pauseAnimation')) - fireEvent.click(icon) - expect(icon).toHaveClass('fa-play') - }) -}) + it('toggle pause', () => { + const {getByTitle} = render(); + const icon = getByTitle(t('general.pauseAnimation')); + fireEvent.click(icon); + expect(icon).toHaveClass('fa-play'); + }); +}); describe('background', () => { - it('white', () => { - const { getByTitle } = render() - fireEvent.click(getByTitle(t('colors.white'))) - }) + it('white', () => { + const {getByTitle} = render(); + fireEvent.click(getByTitle(t('colors.white'))); + }); - it('black', () => { - const { getByTitle } = render() - fireEvent.click(getByTitle(t('colors.black'))) - }) + it('black', () => { + const {getByTitle} = render(); + fireEvent.click(getByTitle(t('colors.black'))); + }); - it('white', () => { - const { getByTitle } = render() - fireEvent.click(getByTitle(t('colors.gray'))) - }) + it('white', () => { + const {getByTitle} = render(); + fireEvent.click(getByTitle(t('colors.gray'))); + }); - it('previous picture', () => { - const { getByTitle } = render() - fireEvent.click(getByTitle(t('colors.prev'))) - fireEvent.click(getByTitle(t('colors.prev'))) - }) + it('previous picture', () => { + const {getByTitle} = render(); + fireEvent.click(getByTitle(t('colors.prev'))); + fireEvent.click(getByTitle(t('colors.prev'))); + }); - it('next picture', () => { - const { getByTitle } = render() + it('next picture', () => { + const {getByTitle} = render(); - fireEvent.click(getByTitle(t('colors.next'))) - fireEvent.click(getByTitle(t('colors.next'))) + fireEvent.click(getByTitle(t('colors.next'))); + fireEvent.click(getByTitle(t('colors.next'))); - Array.from({ length: PICTURES_COUNT - 1 }).forEach(() => { - fireEvent.click(getByTitle(t('colors.next'))) - }) - }) + Array.from({length: PICTURES_COUNT - 1}).forEach(() => { + fireEvent.click(getByTitle(t('colors.next'))); + }); + }); - it('default for dark mode', () => { - document.body.classList.add('dark-mode') + it('default for dark mode', () => { + document.body.classList.add('dark-mode'); - render() + render(); - document.body.classList.remove('dark-mode') - }) -}) + document.body.classList.remove('dark-mode'); + }); +}); diff --git a/resources/assets/tests/scripts/cli/AptCommand.test.ts b/resources/assets/tests/scripts/cli/AptCommand.test.ts index a88f14f0..2b37f122 100644 --- a/resources/assets/tests/scripts/cli/AptCommand.test.ts +++ b/resources/assets/tests/scripts/cli/AptCommand.test.ts @@ -1,70 +1,70 @@ -import * as fetch from '@/scripts/net' -import apt from '@/scripts/cli/AptCommand' -import { Stdio } from './stdio' +import {Stdio} from './stdio'; +import * as fetch from '@/scripts/net'; +import apt from '@/scripts/cli/AptCommand'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); describe('install plugin', () => { - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - await apt(stdio, ['install', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) + await apt(stdio, ['install', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); - it('failed with reasons', async () => { - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { reason: ['unresolved'] }, - }) - const stdio = new Stdio() + it('failed with reasons', async () => { + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {reason: ['unresolved']}, + }); + const stdio = new Stdio(); - await apt(stdio, ['install', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('failed') - expect(stdio.getStdout()).toInclude('- unresolved') - }) + await apt(stdio, ['install', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('failed'); + expect(stdio.getStdout()).toInclude('- unresolved'); + }); - it('use `upgrade` command', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('use `upgrade` command', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - await apt(stdio, ['upgrade', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) -}) + await apt(stdio, ['upgrade', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); +}); describe('remove plugin', () => { - beforeAll(() => vi.useRealTimers()) + beforeAll(() => vi.useRealTimers()); - it('cancelled', async () => { - const stdio = new Stdio() + it('cancelled', async () => { + const stdio = new Stdio(); - setTimeout(() => process.stdin.emit('keypress', 'n', 'n'), 0) - await apt(stdio, ['remove', 'test']) - expect(fetch.post).not.toBeCalled() - }) + setTimeout(() => process.stdin.emit('keypress', 'n', 'n'), 0); + await apt(stdio, ['remove', 'test']); + expect(fetch.post).not.toBeCalled(); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - setTimeout(() => process.stdin.emit('keypress', 'y', 'y'), 0) - await apt(stdio, ['remove', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'delete', - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) -}) + setTimeout(() => process.stdin.emit('keypress', 'y', 'y'), 0); + await apt(stdio, ['remove', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'delete', + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); +}); diff --git a/resources/assets/tests/scripts/cli/ClosetCommand.test.ts b/resources/assets/tests/scripts/cli/ClosetCommand.test.ts index c80f145f..6e157af0 100644 --- a/resources/assets/tests/scripts/cli/ClosetCommand.test.ts +++ b/resources/assets/tests/scripts/cli/ClosetCommand.test.ts @@ -1,61 +1,61 @@ -import * as fetch from '@/scripts/net' -import runCommand from '@/scripts/cli/ClosetCommand' -import { Stdio } from './stdio' +import {Stdio} from './stdio'; +import * as fetch from '@/scripts/net'; +import runCommand from '@/scripts/cli/ClosetCommand'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); describe('add texture', () => { - it('succeeded', async () => { - fetch.post.mockResolvedValue({ - code: 0, - data: { user: { nickname: 'kumiko' }, texture: { name: 'eupho' } }, - }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({ + code: 0, + data: {user: {nickname: 'kumiko'}, texture: {name: 'eupho'}}, + }); - const stdio = new Stdio() - await runCommand(stdio, ['add', '1', '2']) + const stdio = new Stdio(); + await runCommand(stdio, ['add', '1', '2']); - const stdout = stdio.getStdout() - expect(stdout).toInclude('kumiko') - expect(stdout).toInclude('eupho') - expect(fetch.post).toBeCalledWith('/admin/closet/1', { tid: '2' }) - }) + const stdout = stdio.getStdout(); + expect(stdout).toInclude('kumiko'); + expect(stdout).toInclude('eupho'); + expect(fetch.post).toBeCalledWith('/admin/closet/1', {tid: '2'}); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1 }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1}); - const stdio = new Stdio() - await runCommand(stdio, ['add', '1', '2']) + const stdio = new Stdio(); + await runCommand(stdio, ['add', '1', '2']); - const stdout = stdio.getStdout() - expect(stdout).toInclude('Error occurred.') - expect(fetch.post).toBeCalledWith('/admin/closet/1', { tid: '2' }) - }) -}) + const stdout = stdio.getStdout(); + expect(stdout).toInclude('Error occurred.'); + expect(fetch.post).toBeCalledWith('/admin/closet/1', {tid: '2'}); + }); +}); describe('remove texture', () => { - it('succeeded', async () => { - fetch.del.mockResolvedValue({ - code: 0, - data: { user: { nickname: 'kumiko' }, texture: { name: 'eupho' } }, - }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({ + code: 0, + data: {user: {nickname: 'kumiko'}, texture: {name: 'eupho'}}, + }); - const stdio = new Stdio() - await runCommand(stdio, ['remove', '1', '2']) + const stdio = new Stdio(); + await runCommand(stdio, ['remove', '1', '2']); - const stdout = stdio.getStdout() - expect(stdout).toInclude('kumiko') - expect(stdout).toInclude('eupho') - expect(fetch.del).toBeCalledWith('/admin/closet/1', { tid: '2' }) - }) + const stdout = stdio.getStdout(); + expect(stdout).toInclude('kumiko'); + expect(stdout).toInclude('eupho'); + expect(fetch.del).toBeCalledWith('/admin/closet/1', {tid: '2'}); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1 }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1}); - const stdio = new Stdio() - await runCommand(stdio, ['remove', '1', '2']) + const stdio = new Stdio(); + await runCommand(stdio, ['remove', '1', '2']); - const stdout = stdio.getStdout() - expect(stdout).toInclude('Error occurred.') - expect(fetch.del).toBeCalledWith('/admin/closet/1', { tid: '2' }) - }) -}) + const stdout = stdio.getStdout(); + expect(stdout).toInclude('Error occurred.'); + expect(fetch.del).toBeCalledWith('/admin/closet/1', {tid: '2'}); + }); +}); diff --git a/resources/assets/tests/scripts/cli/DnfCommand.test.ts b/resources/assets/tests/scripts/cli/DnfCommand.test.ts index c2d618c2..be2ad9b0 100644 --- a/resources/assets/tests/scripts/cli/DnfCommand.test.ts +++ b/resources/assets/tests/scripts/cli/DnfCommand.test.ts @@ -1,70 +1,70 @@ -import * as fetch from '@/scripts/net' -import dnf from '@/scripts/cli/DnfCommand' -import { Stdio } from './stdio' +import {Stdio} from './stdio'; +import * as fetch from '@/scripts/net'; +import dnf from '@/scripts/cli/DnfCommand'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); describe('install plugin', () => { - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - await dnf(stdio, ['install', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) + await dnf(stdio, ['install', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); - it('failed with reasons', async () => { - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { reason: ['unresolved'] }, - }) - const stdio = new Stdio() + it('failed with reasons', async () => { + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {reason: ['unresolved']}, + }); + const stdio = new Stdio(); - await dnf(stdio, ['install', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('failed') - expect(stdio.getStdout()).toInclude('- unresolved') - }) + await dnf(stdio, ['install', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('failed'); + expect(stdio.getStdout()).toInclude('- unresolved'); + }); - it('use `upgrade` command', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('use `upgrade` command', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - await dnf(stdio, ['upgrade', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) -}) + await dnf(stdio, ['upgrade', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); +}); describe('remove plugin', () => { - beforeAll(() => vi.useRealTimers()) + beforeAll(() => vi.useRealTimers()); - it('cancelled', async () => { - const stdio = new Stdio() + it('cancelled', async () => { + const stdio = new Stdio(); - setTimeout(() => process.stdin.emit('keypress', 'n', 'n'), 0) - await dnf(stdio, ['remove', 'test']) - expect(fetch.post).not.toBeCalled() - }) + setTimeout(() => process.stdin.emit('keypress', 'n', 'n'), 0); + await dnf(stdio, ['remove', 'test']); + expect(fetch.post).not.toBeCalled(); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - setTimeout(() => process.stdin.emit('keypress', 'y', 'y'), 0) - await dnf(stdio, ['remove', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'delete', - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) -}) + setTimeout(() => process.stdin.emit('keypress', 'y', 'y'), 0); + await dnf(stdio, ['remove', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'delete', + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); +}); diff --git a/resources/assets/tests/scripts/cli/PacmanCommand.test.ts b/resources/assets/tests/scripts/cli/PacmanCommand.test.ts index d841b3b8..635e1c05 100644 --- a/resources/assets/tests/scripts/cli/PacmanCommand.test.ts +++ b/resources/assets/tests/scripts/cli/PacmanCommand.test.ts @@ -1,66 +1,66 @@ -import * as fetch from '@/scripts/net' -import pacman from '@/scripts/cli/PacmanCommand' -import { Stdio } from './stdio' +import {Stdio} from './stdio'; +import * as fetch from '@/scripts/net'; +import pacman from '@/scripts/cli/PacmanCommand'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); test('no arguments', async () => { - const stdio = new Stdio() - await pacman(stdio, []) - expect(stdio.getStdout()).toInclude('help') - expect(fetch.post).not.toBeCalled() -}) + const stdio = new Stdio(); + await pacman(stdio, []); + expect(stdio.getStdout()).toInclude('help'); + expect(fetch.post).not.toBeCalled(); +}); describe('install plugin', () => { - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - await pacman(stdio, ['-S', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) + await pacman(stdio, ['-S', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); - it('failed with reasons', async () => { - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { reason: ['unresolved'] }, - }) - const stdio = new Stdio() + it('failed with reasons', async () => { + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {reason: ['unresolved']}, + }); + const stdio = new Stdio(); - await pacman(stdio, ['-S', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: 'test', - }) - expect(stdio.getStdout()).toInclude('failed') - expect(stdio.getStdout()).toInclude('- unresolved') - }) -}) + await pacman(stdio, ['-S', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: 'test', + }); + expect(stdio.getStdout()).toInclude('failed'); + expect(stdio.getStdout()).toInclude('- unresolved'); + }); +}); describe('remove plugin', () => { - beforeAll(() => vi.useRealTimers()) + beforeAll(() => vi.useRealTimers()); - it('cancelled', async () => { - const stdio = new Stdio() + it('cancelled', async () => { + const stdio = new Stdio(); - setTimeout(() => process.stdin.emit('keypress', 'n', 'n'), 0) - await pacman(stdio, ['-R', 'test']) - expect(fetch.post).not.toBeCalled() - }) + setTimeout(() => process.stdin.emit('keypress', 'n', 'n'), 0); + await pacman(stdio, ['-R', 'test']); + expect(fetch.post).not.toBeCalled(); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const stdio = new Stdio() + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const stdio = new Stdio(); - setTimeout(() => process.stdin.emit('keypress', 'y', 'y'), 0) - await pacman(stdio, ['-R', 'test']) - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'delete', - name: 'test', - }) - expect(stdio.getStdout()).toInclude('ok') - }) -}) + setTimeout(() => process.stdin.emit('keypress', 'y', 'y'), 0); + await pacman(stdio, ['-R', 'test']); + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'delete', + name: 'test', + }); + expect(stdio.getStdout()).toInclude('ok'); + }); +}); diff --git a/resources/assets/tests/scripts/cli/RmCommand.test.ts b/resources/assets/tests/scripts/cli/RmCommand.test.ts index 1cd68194..27d68ac1 100644 --- a/resources/assets/tests/scripts/cli/RmCommand.test.ts +++ b/resources/assets/tests/scripts/cli/RmCommand.test.ts @@ -1,30 +1,30 @@ -import * as fetch from '@/scripts/net' -import runCommand from '@/scripts/cli/RmCommand' -import { Stdio } from './stdio' +import {Stdio} from './stdio'; +import * as fetch from '@/scripts/net'; +import runCommand from '@/scripts/cli/RmCommand'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); test('missing operand', async () => { - const stdio = new Stdio() - await runCommand(stdio, []) - expect(stdio.getStdout()).toInclude('missing operand') - expect(fetch.post).not.toBeCalled() -}) + const stdio = new Stdio(); + await runCommand(stdio, []); + expect(stdio.getStdout()).toInclude('missing operand'); + expect(fetch.post).not.toBeCalled(); +}); test('without "rf"', async () => { - const stdio = new Stdio() - await runCommand(stdio, ['/']) - expect(fetch.post).not.toBeCalled() -}) + const stdio = new Stdio(); + await runCommand(stdio, ['/']); + expect(fetch.post).not.toBeCalled(); +}); test('not from root', async () => { - const stdio = new Stdio() - await runCommand(stdio, ['-rf', '.']) - expect(fetch.post).not.toBeCalled() -}) + const stdio = new Stdio(); + await runCommand(stdio, ['-rf', '.']); + expect(fetch.post).not.toBeCalled(); +}); test('send request', async () => { - const stdio = new Stdio() - await runCommand(stdio, ['-rf', '/']) - expect(fetch.post).toBeCalledWith('/admin/resource?clear-cache') -}) + const stdio = new Stdio(); + await runCommand(stdio, ['-rf', '/']); + expect(fetch.post).toBeCalledWith('/admin/resource?clear-cache'); +}); diff --git a/resources/assets/tests/scripts/cli/Spinner.test.ts b/resources/assets/tests/scripts/cli/Spinner.test.ts index 13b35a5c..ecd6f8e3 100644 --- a/resources/assets/tests/scripts/cli/Spinner.test.ts +++ b/resources/assets/tests/scripts/cli/Spinner.test.ts @@ -1,16 +1,16 @@ -import { Spinner } from '@/scripts/cli/Spinner' -import { Stdio } from './stdio' +import {Stdio} from './stdio'; +import {Spinner} from '@/scripts/cli/Spinner'; test('run', async () => { - vi.useRealTimers() + vi.useRealTimers(); - const stdio = new Stdio() - const spinner = new Spinner(stdio) + const stdio = new Stdio(); + const spinner = new Spinner(stdio); - spinner.start() + spinner.start(); - await new Promise((resolve) => setTimeout(resolve, 500)) - expect(stdio.getStdout().length).toBeGreaterThan(0) + await new Promise(resolve => setTimeout(resolve, 500)); + expect(stdio.getStdout().length).toBeGreaterThan(0); - spinner.stop() -}) + spinner.stop(); +}); diff --git a/resources/assets/tests/scripts/cli/stdio.ts b/resources/assets/tests/scripts/cli/stdio.ts index 7431823e..7163dbff 100644 --- a/resources/assets/tests/scripts/cli/stdio.ts +++ b/resources/assets/tests/scripts/cli/stdio.ts @@ -1,24 +1,24 @@ export class Stdio { - private stdout = '' + private stdout = ''; - public print(data: string) { - this.stdout += data - } + public print(data: string) { + this.stdout += data; + } - public println(data: string) { - this.stdout += data - this.stdout += '\r\n' - } + public println(data: string) { + this.stdout += data; + this.stdout += '\r\n'; + } - public reset() { - // - } + public reset() { + // + } - public free() { - // - } + public free() { + // + } - public getStdout() { - return this.stdout - } + public getStdout() { + return this.stdout; + } } diff --git a/resources/assets/tests/scripts/event.test.ts b/resources/assets/tests/scripts/event.test.ts index 35eed617..48a737f1 100644 --- a/resources/assets/tests/scripts/event.test.ts +++ b/resources/assets/tests/scripts/event.test.ts @@ -1,30 +1,30 @@ -import * as emitter from '@/scripts/event' +import * as emitter from '@/scripts/event'; test('add listener and emit event', () => { - const mockA1 = vi.fn() - const mockA2 = vi.fn() - const mockB = vi.fn() + const mockA1 = vi.fn(); + const mockA2 = vi.fn(); + const mockB = vi.fn(); - emitter.on('a', mockA1) - emitter.on('a', mockA2) - emitter.on('b', mockB) + emitter.on('a', mockA1); + emitter.on('a', mockA2); + emitter.on('b', mockB); - emitter.emit('a') + emitter.emit('a'); - expect(mockA1).toBeCalledTimes(1) - expect(mockA2).toBeCalledTimes(1) - expect(mockB).not.toBeCalled() -}) + expect(mockA1).toBeCalledTimes(1); + expect(mockA2).toBeCalledTimes(1); + expect(mockB).not.toBeCalled(); +}); test('not throw for un-existed event', () => { - emitter.emit('c') -}) + emitter.emit('c'); +}); test('unsubscribe event', () => { - const mock = vi.fn() + const mock = vi.fn(); - const off = emitter.on('c', mock) - off() + const off = emitter.on('c', mock); + off(); - expect(mock).not.toBeCalled() -}) + expect(mock).not.toBeCalled(); +}); diff --git a/resources/assets/tests/scripts/homePage.test.ts b/resources/assets/tests/scripts/homePage.test.ts index c22df08f..4c607608 100644 --- a/resources/assets/tests/scripts/homePage.test.ts +++ b/resources/assets/tests/scripts/homePage.test.ts @@ -1,29 +1,29 @@ -import { scrollHander } from '@/scripts/homePage' +import {scrollHander} from '@/scripts/homePage'; describe('scroll handler', () => { - beforeAll(() => { - window.blessing.extra = { - transparent_navbar: false, - } - }) + beforeAll(() => { + window.blessing.extra = { + transparent_navbar: false, + }; + }); - it('should be transparent at top', () => { - Object.assign(window, { innerHeight: 900 }) - document.body.innerHTML = '' - scrollHander() - window.dispatchEvent(new Event('scroll')) - expect( - document.querySelector('nav')!.classList.contains('transparent'), - ).toBeTrue() - }) + it('should be transparent at top', () => { + Object.assign(window, {innerHeight: 900}); + document.body.innerHTML = ''; + scrollHander(); + window.dispatchEvent(new Event('scroll')); + expect( + document.querySelector('nav')!.classList.contains('transparent'), + ).toBeTrue(); + }); - it('should not be transparent at bottom', () => { - Object.assign(window, { innerHeight: 900, scrollY: 800 }) - document.body.innerHTML = '' - scrollHander() - window.dispatchEvent(new Event('scroll')) - expect( - document.querySelector('nav')!.classList.contains('transparent'), - ).toBeFalse() - }) -}) + it('should not be transparent at bottom', () => { + Object.assign(window, {innerHeight: 900, scrollY: 800}); + document.body.innerHTML = ''; + scrollHander(); + window.dispatchEvent(new Event('scroll')); + expect( + document.querySelector('nav')!.classList.contains('transparent'), + ).toBeFalse(); + }); +}); diff --git a/resources/assets/tests/scripts/i18n.test.ts b/resources/assets/tests/scripts/i18n.test.ts index ea8bc305..8a83a014 100644 --- a/resources/assets/tests/scripts/i18n.test.ts +++ b/resources/assets/tests/scripts/i18n.test.ts @@ -1,14 +1,14 @@ -import { t } from '@/scripts/i18n' +import {t} from '@/scripts/i18n'; test('mount to global', () => { - expect(window.trans).toBe(t) -}) + expect(window.trans).toBe(t); +}); test('translate text', () => { - window.blessing.i18n = { a: { b: { c: 'text', d: 'Hi, :name!' } } } - expect(t('a.b.c')).toBe('text') - expect(t('a.b.d')).toBe('Hi, :name!') - expect(t('a.b.d', { name: 'me' })).toBe('Hi, me!') - expect(t('a.b.e')).toBe('a.b.e') - expect(t('d.e')).toBe('d.e') -}) + window.blessing.i18n = {a: {b: {c: 'text', d: 'Hi, :name!'}}}; + expect(t('a.b.c')).toBe('text'); + expect(t('a.b.d')).toBe('Hi, :name!'); + expect(t('a.b.d', {name: 'me'})).toBe('Hi, me!'); + expect(t('a.b.e')).toBe('a.b.e'); + expect(t('d.e')).toBe('d.e'); +}); diff --git a/resources/assets/tests/scripts/logout.test.ts b/resources/assets/tests/scripts/logout.test.ts index 8a971b29..58f99de7 100644 --- a/resources/assets/tests/scripts/logout.test.ts +++ b/resources/assets/tests/scripts/logout.test.ts @@ -1,18 +1,18 @@ -import { logout } from '@/scripts/logout' -import { post } from '@/scripts/net' -import { showModal } from '@/scripts/notify' -import urls from '@/scripts/urls' +import {logout} from '@/scripts/logout'; +import {post} from '@/scripts/net'; +import {showModal} from '@/scripts/notify'; +import urls from '@/scripts/urls'; -vi.mock('@/scripts/net') -vi.mock('@/scripts/notify') +vi.mock('@/scripts/net'); +vi.mock('@/scripts/notify'); test('log out', async () => { - showModal.mockRejectedValueOnce(null).mockResolvedValueOnce({ value: '' }) - post.mockResolvedValue({ message: '' }) + showModal.mockRejectedValueOnce(null).mockResolvedValueOnce({value: ''}); + post.mockResolvedValue({message: ''}); - await logout() - expect(post).not.toBeCalled() + await logout(); + expect(post).not.toBeCalled(); - await logout() - expect(post).toBeCalledWith(urls.auth.logout()) -}) + await logout(); + expect(post).toBeCalledWith(urls.auth.logout()); +}); diff --git a/resources/assets/tests/scripts/modal.test.ts b/resources/assets/tests/scripts/modal.test.ts index cd5c5df3..fedcaeb1 100644 --- a/resources/assets/tests/scripts/modal.test.ts +++ b/resources/assets/tests/scripts/modal.test.ts @@ -1,13 +1,13 @@ -import { t } from '@/scripts/i18n' -import { showModal } from '@/scripts/modal' +import {t} from '@/scripts/i18n'; +import {showModal} from '@/scripts/modal'; test('show modal', async () => { - Promise.resolve().then(() => { - expect(document.querySelector('.modal-title')!.textContent).toBe( - t('general.tip'), - ) - document.querySelector('.btn-primary')!.click() - }) - const { value } = await showModal() - expect(value).toBe('') -}) + Promise.resolve().then(() => { + expect(document.querySelector('.modal-title')!.textContent).toBe( + t('general.tip'), + ); + document.querySelector('.btn-primary')!.click(); + }); + const {value} = await showModal(); + expect(value).toBe(''); +}); diff --git a/resources/assets/tests/scripts/net.test.ts b/resources/assets/tests/scripts/net.test.ts index 98625974..8e27df45 100644 --- a/resources/assets/tests/scripts/net.test.ts +++ b/resources/assets/tests/scripts/net.test.ts @@ -1,262 +1,262 @@ -import * as net from '@/scripts/net' -import { on } from '@/scripts/event' -import { t } from '@/scripts/i18n' -import { showModal } from '@/scripts/notify' +import * as net from '@/scripts/net'; +import {on} from '@/scripts/event'; +import {t} from '@/scripts/i18n'; +import {showModal} from '@/scripts/notify'; -vi.mock('@/scripts/notify') +vi.mock('@/scripts/notify'); test('the GET method', async () => { - const json = vi.fn().mockResolvedValue({}) - window.fetch = vi.fn().mockResolvedValue({ - ok: true, - json, - headers: new Map([['Content-Type', 'application/json']]), - clone: () => ({}), - }) + const json = vi.fn().mockResolvedValue({}); + window.fetch = vi.fn().mockResolvedValue({ + ok: true, + json, + headers: new Map([['Content-Type', 'application/json']]), + clone: () => ({}), + }); - const stub = vi.fn() - on('beforeFetch', stub) + const stub = vi.fn(); + on('beforeFetch', stub); - await net.get('/abc', { a: 'b' }) - expect(stub).toBeCalledWith({ - method: 'GET', - url: '/abc', - data: { a: 'b' }, - }) - expect(window.fetch.mock.calls[0][0].url).toBe('/abc?a=b') - expect(json).toBeCalled() + await net.get('/abc', {a: 'b'}); + expect(stub).toBeCalledWith({ + method: 'GET', + url: '/abc', + data: {a: 'b'}, + }); + expect(window.fetch.mock.calls[0][0].url).toBe('/abc?a=b'); + expect(json).toBeCalled(); - await net.get('/abc') - expect(window.fetch.mock.calls[1][0].url).toBe('/abc?') -}) + await net.get('/abc'); + expect(window.fetch.mock.calls[1][0].url).toBe('/abc?'); +}); test('the POST method', async () => { - window.fetch = vi.fn().mockResolvedValue({ - ok: true, - json: () => Promise.resolve({}), - headers: new Map([['Content-Type', 'application/json']]), - clone: () => ({}), - }) + window.fetch = vi.fn().mockResolvedValue({ + ok: true, + json: async () => ({}), + headers: new Map([['Content-Type', 'application/json']]), + clone: () => ({}), + }); - const meta = document.createElement('meta') - meta.name = 'csrf-token' - meta.content = 'token' - document.head.appendChild(meta) + const meta = document.createElement('meta'); + meta.name = 'csrf-token'; + meta.content = 'token'; + document.head.append(meta); - const stub = vi.fn() - on('beforeFetch', stub) + const stub = vi.fn(); + on('beforeFetch', stub); - const formData = new FormData() - await net.post('/abc', formData) - expect(stub).toBeCalledWith({ - method: 'POST', - url: '/abc', - data: formData, - }) + const formData = new FormData(); + await net.post('/abc', formData); + expect(stub).toBeCalledWith({ + method: 'POST', + url: '/abc', + data: formData, + }); - await net.post('/abc', { a: 'b' }) - expect(stub).toBeCalledWith({ - method: 'POST', - url: '/abc', - data: { a: 'b' }, - }) - // eslint-disable-next-line prefer-destructuring - const request = window.fetch.mock.calls[1][0] - expect(request.url).toBe('/abc') - expect(request.method).toBe('POST') - expect(request.body).toBe(JSON.stringify({ a: 'b' })) - expect(request.headers.get('X-CSRF-TOKEN')).toBe('token') - expect(request.headers.get('Content-Type')).toBe('application/json') + await net.post('/abc', {a: 'b'}); + expect(stub).toBeCalledWith({ + method: 'POST', + url: '/abc', + data: {a: 'b'}, + }); - await net.post('/abc') - expect(window.fetch.mock.calls[2][0].body).toBeUndefined() -}) + const request = window.fetch.mock.calls[1][0]; + expect(request.url).toBe('/abc'); + expect(request.method).toBe('POST'); + expect(request.body).toBe(JSON.stringify({a: 'b'})); + expect(request.headers.get('X-CSRF-TOKEN')).toBe('token'); + expect(request.headers.get('Content-Type')).toBe('application/json'); + + await net.post('/abc'); + expect(window.fetch.mock.calls[2][0].body).toBeUndefined(); +}); test('the PUT method', () => { - const fetch = vi.fn() - window.fetch = fetch + const fetch = vi.fn(); + window.fetch = fetch; - const stub = vi.fn() - on('beforeFetch', stub) + const stub = vi.fn(); + on('beforeFetch', stub); - net.put('/abc') - expect(fetch).toBeCalled() - // eslint-disable-next-line prefer-destructuring - const request = fetch.mock.calls[0][0] - expect(request.method).toBe('PUT') + net.put('/abc'); + expect(fetch).toBeCalled(); - expect(stub).toBeCalledWith({ - method: 'PUT', - url: '/abc', - data: undefined, - }) -}) + const request = fetch.mock.calls[0][0]; + expect(request.method).toBe('PUT'); + + expect(stub).toBeCalledWith({ + method: 'PUT', + url: '/abc', + data: undefined, + }); +}); test('the DELETE method', () => { - const fetch = vi.fn() - window.fetch = fetch + const fetch = vi.fn(); + window.fetch = fetch; - const stub = vi.fn() - on('beforeFetch', stub) + const stub = vi.fn(); + on('beforeFetch', stub); - net.del('/abc') - expect(fetch).toBeCalled() - // eslint-disable-next-line prefer-destructuring - const request = fetch.mock.calls[0][0] - expect(request.method).toBe('DELETE') + net.del('/abc'); + expect(fetch).toBeCalled(); - expect(stub).toBeCalledWith({ - method: 'DELETE', - url: '/abc', - data: undefined, - }) -}) + const request = fetch.mock.calls[0][0]; + expect(request.method).toBe('DELETE'); + + expect(stub).toBeCalledWith({ + method: 'DELETE', + url: '/abc', + data: undefined, + }); +}); test('low level fetch', async () => { - const json = vi.fn().mockResolvedValue({}) - window.fetch = vi.fn() - .mockRejectedValueOnce(new Error('network')) - .mockResolvedValueOnce({ - ok: false, - headers: new Map(), - text: () => Promise.resolve('404'), - clone: () => ({}), - }) - .mockResolvedValueOnce({ - ok: false, - json: () => Promise.resolve({ message: 'error' }), - headers: new Map([['Content-Type', 'application/json']]), - clone: () => ({}), - }) - .mockResolvedValueOnce({ - ok: true, - json, - headers: new Map([['Content-Type', 'application/json']]), - clone: () => ({}), - }) - .mockResolvedValueOnce({ - ok: true, - headers: new Map(), - text: () => Promise.resolve('text'), - clone: () => ({}), - }) + const json = vi.fn().mockResolvedValue({}); + window.fetch = vi.fn() + .mockRejectedValueOnce(new Error('network')) + .mockResolvedValueOnce({ + ok: false, + headers: new Map(), + text: async () => '404', + clone: () => ({}), + }) + .mockResolvedValueOnce({ + ok: false, + json: async () => ({message: 'error'}), + headers: new Map([['Content-Type', 'application/json']]), + clone: () => ({}), + }) + .mockResolvedValueOnce({ + ok: true, + json, + headers: new Map([['Content-Type', 'application/json']]), + clone: () => ({}), + }) + .mockResolvedValueOnce({ + ok: true, + headers: new Map(), + text: async () => 'text', + clone: () => ({}), + }); - const request: RequestInit = { headers: new Headers() } + const request: RequestInit = {headers: new Headers()}; - const stub = vi.fn() - on('fetchError', stub) + const stub = vi.fn(); + on('fetchError', stub); - await net.walkFetch(request as Request) - expect(showModal).toBeCalledWith({ - mode: 'alert', - title: t('general.fatalError'), - dangerousHTML: 'network', - type: 'danger', - okButtonType: 'outline-light', - }) - expect(stub).toBeCalledWith(expect.any(Error)) + await net.walkFetch(request as Request); + expect(showModal).toBeCalledWith({ + mode: 'alert', + title: t('general.fatalError'), + dangerousHTML: 'network', + type: 'danger', + okButtonType: 'outline-light', + }); + expect(stub).toBeCalledWith(expect.any(Error)); - await net.walkFetch(request as Request) - expect(showModal).toBeCalledWith({ - mode: 'alert', - title: t('general.fatalError'), - dangerousHTML: '404', - type: 'danger', - okButtonType: 'outline-light', - }) - expect(stub.mock.calls[1][0]).toHaveProperty('message', '404') - expect(stub.mock.calls[1][0]).toHaveProperty('response') + await net.walkFetch(request as Request); + expect(showModal).toBeCalledWith({ + mode: 'alert', + title: t('general.fatalError'), + dangerousHTML: '404', + type: 'danger', + okButtonType: 'outline-light', + }); + expect(stub.mock.calls[1][0]).toHaveProperty('message', '404'); + expect(stub.mock.calls[1][0]).toHaveProperty('response'); - await net.walkFetch(request as Request) - expect(showModal).toBeCalledWith({ - mode: 'alert', - title: t('general.fatalError'), - dangerousHTML: 'error', - type: 'danger', - okButtonType: 'outline-light', - }) - expect(stub.mock.calls[2][0]).toHaveProperty('message', 'error') - expect(stub.mock.calls[2][0]).toHaveProperty('response') + await net.walkFetch(request as Request); + expect(showModal).toBeCalledWith({ + mode: 'alert', + title: t('general.fatalError'), + dangerousHTML: 'error', + type: 'danger', + okButtonType: 'outline-light', + }); + expect(stub.mock.calls[2][0]).toHaveProperty('message', 'error'); + expect(stub.mock.calls[2][0]).toHaveProperty('response'); - await net.walkFetch(request as Request) - expect(json).toBeCalled() + await net.walkFetch(request as Request); + expect(json).toBeCalled(); - expect(await net.walkFetch(request as Request)).toBe('text') -}) + expect(await net.walkFetch(request as Request)).toBe('text'); +}); test('process backend errors', async () => { - window.fetch = vi.fn() - .mockResolvedValueOnce({ - status: 422, - headers: new Map([['Content-Type', 'application/json']]), - json() { - return Promise.resolve({ - errors: { name: ['required'] }, - }) - }, - clone: () => ({}), - }) - .mockResolvedValueOnce({ - status: 419, - headers: new Map([['Content-Type', 'application/json']]), - json() { - return Promise.resolve({ - message: 'CSRF token mismatched.', - }) - }, - clone: () => ({}), - }) - .mockResolvedValueOnce({ - status: 403, - headers: new Map([['Content-Type', 'application/json']]), - json() { - return Promise.resolve({ message: 'forbidden' }) - }, - clone: () => ({}), - }) - .mockResolvedValueOnce({ - status: 500, - headers: new Map([['Content-Type', 'application/json']]), - json() { - return Promise.resolve({ - message: 'fake exception', - exception: true, - trace: [ - { file: 'k.php', line: 2 }, - { file: 'v.php', line: 3 }, - ], - }) - }, - clone: () => ({}), - }) + window.fetch = vi.fn() + .mockResolvedValueOnce({ + status: 422, + headers: new Map([['Content-Type', 'application/json']]), + async json() { + return { + errors: {name: ['required']}, + }; + }, + clone: () => ({}), + }) + .mockResolvedValueOnce({ + status: 419, + headers: new Map([['Content-Type', 'application/json']]), + async json() { + return { + message: 'CSRF token mismatched.', + }; + }, + clone: () => ({}), + }) + .mockResolvedValueOnce({ + status: 403, + headers: new Map([['Content-Type', 'application/json']]), + async json() { + return {message: 'forbidden'}; + }, + clone: () => ({}), + }) + .mockResolvedValueOnce({ + status: 500, + headers: new Map([['Content-Type', 'application/json']]), + async json() { + return { + message: 'fake exception', + exception: true, + trace: [ + {file: 'k.php', line: 2}, + {file: 'v.php', line: 3}, + ], + }; + }, + clone: () => ({}), + }); - const result: { - code: number - message: string - } = await net.walkFetch({ headers: new Headers() } as Request) - expect(result.code).toBe(1) - expect(result.message).toBe('required') + const result: { + code: number; + message: string; + } = await net.walkFetch({headers: new Headers()} as Request); + expect(result.code).toBe(1); + expect(result.message).toBe('required'); - await net.walkFetch({ headers: new Headers() } as Request) - expect(showModal).toBeCalledWith({ - mode: 'alert', - text: t('general.csrf'), - }) + await net.walkFetch({headers: new Headers()} as Request); + expect(showModal).toBeCalledWith({ + mode: 'alert', + text: t('general.csrf'), + }); - await net.walkFetch({ headers: new Headers() } as Request) - expect(showModal).toBeCalledWith({ - mode: 'alert', - text: 'forbidden', - type: 'warning', - }) + await net.walkFetch({headers: new Headers()} as Request); + expect(showModal).toBeCalledWith({ + mode: 'alert', + text: 'forbidden', + type: 'warning', + }); - await net.walkFetch({ headers: new Headers() } as Request) - expect(showModal).toBeCalledWith({ - mode: 'alert', - title: t('general.fatalError'), - dangerousHTML: + await net.walkFetch({headers: new Headers()} as Request); + expect(showModal).toBeCalledWith({ + mode: 'alert', + title: t('general.fatalError'), + dangerousHTML: 'fake exception
[1] k.php#L2
[2] v.php#L3
', - type: 'danger', - okButtonType: 'outline-light', - }) -}) + type: 'danger', + okButtonType: 'outline-light', + }); +}); diff --git a/resources/assets/tests/scripts/toast.test.ts b/resources/assets/tests/scripts/toast.test.ts index 1da55389..1308f112 100644 --- a/resources/assets/tests/scripts/toast.test.ts +++ b/resources/assets/tests/scripts/toast.test.ts @@ -1,49 +1,49 @@ -import { render, fireEvent, screen } from '@testing-library/react' -import { Toast } from '@/scripts/toast' +import {render, fireEvent, screen} from '@testing-library/react'; +import {Toast} from '@/scripts/toast'; test('"Toast" class', () => { - const toast = new Toast(render) + const toast = new Toast(render); - toast.success('success') - expect(document.querySelector('.alert-success')!.textContent).toContain( - 'success', - ) + toast.success('success'); + expect(document.querySelector('.alert-success')!.textContent).toContain( + 'success', + ); - toast.info('info') - expect(document.querySelector('.alert-info')!.textContent).toContain('info') + toast.info('info'); + expect(document.querySelector('.alert-info')!.textContent).toContain('info'); - toast.warning('warning') - expect(document.querySelector('.alert-warning')!.textContent).toContain( - 'warning', - ) + toast.warning('warning'); + expect(document.querySelector('.alert-warning')!.textContent).toContain( + 'warning', + ); - toast.error('error') - expect(document.querySelector('.alert-danger')!.textContent).toContain( - 'error', - ) + toast.error('error'); + expect(document.querySelector('.alert-danger')!.textContent).toContain( + 'error', + ); - vi.runAllTimers() - toast.dispose() -}) + vi.runAllTimers(); + toast.dispose(); +}); test('clear toasts', () => { - const toast = new Toast(render) + const toast = new Toast(render); - toast.success('success') - toast.info('info') + toast.success('success'); + toast.info('info'); - toast.clear() - expect(document.querySelectorAll('.alert')).toHaveLength(0) + toast.clear(); + expect(document.querySelectorAll('.alert')).toHaveLength(0); - toast.dispose() -}) + toast.dispose(); +}); test('close toast manually', () => { - const toast = new Toast(render) - toast.success('success') + const toast = new Toast(render); + toast.success('success'); - fireEvent.click(screen.getByText('×')) - expect(document.querySelectorAll('.alert')).toHaveLength(0) + fireEvent.click(screen.getByText('×')); + expect(document.querySelectorAll('.alert')).toHaveLength(0); - toast.dispose() -}) + toast.dispose(); +}); diff --git a/resources/assets/tests/views/admin/Customization.test.ts b/resources/assets/tests/views/admin/Customization.test.ts index 7939add1..1aa7bb61 100644 --- a/resources/assets/tests/views/admin/Customization.test.ts +++ b/resources/assets/tests/views/admin/Customization.test.ts @@ -1,57 +1,57 @@ -import { expect, test } from 'vitest' +import {expect, test} from 'vitest'; import { - registerNavbarPicker, - registerSidebarPicker, -} from '@/views/admin/Customization' + registerNavbarPicker, + registerSidebarPicker, +} from '@/views/admin/Customization'; test('preview navbar color', () => { - const nav = document.createElement('nav') - nav.className = 'navbar-primary navbar-dark' - const picker = document.createElement('div') - picker.innerHTML = ` + const nav = document.createElement('nav'); + nav.className = 'navbar-primary navbar-dark'; + const picker = document.createElement('div'); + picker.innerHTML = ` - ` - const cyan = picker.querySelector('[value=cyan]')! - const orange = picker.querySelector('[value=orange]')! + `; + const cyan = picker.querySelector('[value=cyan]')!; + const orange = picker.querySelector('[value=orange]')!; - registerNavbarPicker(nav, picker, 'primary') - cyan.click() - expect(nav.className).toContain('navbar-cyan') - expect(nav.className).toContain('navbar-dark') - expect(nav.className).not.toContain('navbar-light') - orange.click() - expect(nav.className).toContain('navbar-orange') - expect(nav.className).not.toContain('navbar-cyan') - expect(nav.className).toContain('navbar-light') - expect(nav.className).not.toContain('navbar-dark') -}) + registerNavbarPicker(nav, picker, 'primary'); + cyan.click(); + expect(nav.className).toContain('navbar-cyan'); + expect(nav.className).toContain('navbar-dark'); + expect(nav.className).not.toContain('navbar-light'); + orange.click(); + expect(nav.className).toContain('navbar-orange'); + expect(nav.className).not.toContain('navbar-cyan'); + expect(nav.className).toContain('navbar-light'); + expect(nav.className).not.toContain('navbar-dark'); +}); test('preview sidebar color', () => { - const sidebar = document.createElement('aside') - sidebar.className = 'sidebar-dark-primary' + const sidebar = document.createElement('aside'); + sidebar.className = 'sidebar-dark-primary'; - const darkPicker = document.createElement('div') - darkPicker.innerHTML = ` - ` - const darkCyan = darkPicker.querySelector( - '[value="dark-cyan"]', - )! + const darkPicker = document.createElement('div'); + darkPicker.innerHTML = ` + `; + const darkCyan = darkPicker.querySelector( + '[value="dark-cyan"]', + )!; - const lightPicker = document.createElement('div') - lightPicker.innerHTML = ` - ` - const lightCyan = lightPicker.querySelector( - '[value="light-cyan"]', - )! + const lightPicker = document.createElement('div'); + lightPicker.innerHTML = ` + `; + const lightCyan = lightPicker.querySelector( + '[value="light-cyan"]', + )!; - registerSidebarPicker( - sidebar, - { dark: darkPicker, light: lightPicker }, - 'dark-primary', - ) - darkCyan.click() - expect(sidebar.className).toContain('sidebar-dark-cyan') - lightCyan.click() - expect(sidebar.className).toContain('sidebar-light-cyan') -}) + registerSidebarPicker( + sidebar, + {dark: darkPicker, light: lightPicker}, + 'dark-primary', + ); + darkCyan.click(); + expect(sidebar.className).toContain('sidebar-dark-cyan'); + lightCyan.click(); + expect(sidebar.className).toContain('sidebar-light-cyan'); +}); diff --git a/resources/assets/tests/views/admin/PlayersManagement.test.tsx b/resources/assets/tests/views/admin/PlayersManagement.test.tsx index 4011778a..aca5e640 100644 --- a/resources/assets/tests/views/admin/PlayersManagement.test.tsx +++ b/resources/assets/tests/views/admin/PlayersManagement.test.tsx @@ -1,433 +1,484 @@ -import { expect, test, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { createPaginator } from '../../utils' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import type { Player } from '@/scripts/types' -import urls from '@/scripts/urls' -import PlayersManagement from '@/views/admin/PlayersManagement' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {createPaginator} from '../../utils'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import type {Player} from '@/scripts/types'; +import urls from '@/scripts/urls'; +import PlayersManagement from '@/views/admin/PlayersManagement'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixture: Readonly = Object.freeze({ - pid: 1, - name: 'kumiko', - uid: 1, - tid_skin: 1, - tid_cape: 2, - last_modified: new Date().toString(), -}) + pid: 1, + name: 'kumiko', + uid: 1, + tid_skin: 1, + tid_cape: 2, + last_modified: new Date().toString(), +}); beforeAll(() => { - Object.assign(window, { innerWidth: 500 }) -}) + Object.assign(window, {innerWidth: 500}); +}); afterAll(() => { - Object.assign(window, { innerWidth: 1024 }) -}) + Object.assign(window, {innerWidth: 1024}); +}); test('search players', async () => { - fetch.get.mockResolvedValue(createPaginator([])) + fetch.get.mockResolvedValue(createPaginator([])); - const { getByTitle, getByText } = render() - await waitFor(() => - expect(fetch.get).toBeCalledWith(urls.admin.players.list(), { - q: '', - page: 1, - }), - ) + const {getByTitle, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledWith(urls.admin.players.list(), { + q: '', + page: 1, + }); + }, + ); - fireEvent.input(getByTitle(t('vendor.datatable.search')), { - target: { value: 's' }, - }) - fireEvent.click(getByText(t('vendor.datatable.search'))) - await waitFor(() => - expect(fetch.get).toBeCalledWith(urls.admin.players.list(), { - q: 's', - page: 1, - }), - ) -}) + fireEvent.input(getByTitle(t('vendor.datatable.search')), { + target: {value: 's'}, + }); + fireEvent.click(getByText(t('vendor.datatable.search'))); + await waitFor(() => { + expect(fetch.get).toBeCalledWith(urls.admin.players.list(), { + q: 's', + page: 1, + }); + }, + ); +}); test('preview textures', async () => { - fetch.get.mockResolvedValue(createPaginator([fixture])) + fetch.get.mockResolvedValue(createPaginator([fixture])); - const { getByText, queryByAltText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByAltText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('general.player.previews'))) + fireEvent.click(getByText(t('general.player.previews'))); - expect( - queryByAltText(`${fixture.name} - ${t('general.skin')}`), - ).toHaveAttribute( - 'src', - `${blessing.base_url}/preview/${fixture.tid_skin}?png`, - ) - expect( - queryByAltText(`${fixture.name} - ${t('general.cape')}`), - ).toHaveAttribute( - 'src', - `${blessing.base_url}/preview/${fixture.tid_cape}?png`, - ) + expect( + queryByAltText(`${fixture.name} - ${t('general.skin')}`), + ).toHaveAttribute( + 'src', + `${blessing.base_url}/preview/${fixture.tid_skin}?png`, + ); + expect( + queryByAltText(`${fixture.name} - ${t('general.cape')}`), + ).toHaveAttribute( + 'src', + `${blessing.base_url}/preview/${fixture.tid_cape}?png`, + ); - fireEvent.click(getByText(t('general.confirm'))) -}) + fireEvent.click(getByText(t('general.confirm'))); +}); describe('update player name', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('empty value', async () => { - const { getByText, getByDisplayValue, queryByText } = render( - , - ) + it('empty value', async () => { + const {getByText, getByDisplayValue, queryByText} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePlayerName'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePlayerName'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('general.confirm'))); - expect(queryByText(t('admin.emptyPlayerName'))).toBeInTheDocument() - expect(fetch.put).not.toBeCalled() + expect(queryByText(t('admin.emptyPlayerName'))).toBeInTheDocument(); + expect(fetch.put).not.toBeCalled(); - fireEvent.click(getByText(t('general.cancel'))) + fireEvent.click(getByText(t('general.cancel'))); - expect(queryByText(fixture.name)).toBeInTheDocument() - }) + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePlayerName'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: 'reina' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePlayerName'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: 'reina'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.players.name(fixture.pid), { - player_name: 'reina', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText('reina')).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.players.name(fixture.pid), { + player_name: 'reina', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText('reina')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePlayerName'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: 'reina' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePlayerName'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: 'reina'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.players.name(fixture.pid), { - player_name: 'reina', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.name)).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.players.name(fixture.pid), { + player_name: 'reina', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); +}); describe('update owner', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() + it('cancelled', async () => { + const {getByText, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeOwner'))) - fireEvent.click(getByText(t('general.cancel'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeOwner'))); + fireEvent.click(getByText(t('general.cancel'))); - expect(fetch.put).not.toBeCalled() - expect( - queryByText(`${t('general.player.owner')}: ${fixture.uid}`), - ).toBeInTheDocument() - }) + expect(fetch.put).not.toBeCalled(); + expect( + queryByText(`${t('general.player.owner')}: ${fixture.uid}`), + ).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeOwner'))) - fireEvent.input(getByDisplayValue(fixture.uid.toString()), { - target: { value: '2' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeOwner'))); + fireEvent.input(getByDisplayValue(fixture.uid.toString()), { + target: {value: '2'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.players.owner(fixture.pid), { - uid: 2, - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText(`${t('general.player.owner')}: 2`)).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.players.owner(fixture.pid), { + uid: 2, + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText(`${t('general.player.owner')}: 2`)).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeOwner'))) - fireEvent.input(getByDisplayValue(fixture.uid.toString()), { - target: { value: '2' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeOwner'))); + fireEvent.input(getByDisplayValue(fixture.uid.toString()), { + target: {value: '2'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.players.owner(fixture.pid), { - uid: 2, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect( - queryByText(`${t('general.player.owner')}: ${fixture.uid}`), - ).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.players.owner(fixture.pid), { + uid: 2, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect( + queryByText(`${t('general.player.owner')}: ${fixture.uid}`), + ).toBeInTheDocument(); + }); +}); describe('update texture', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('cancelled', async () => { - const { getByText } = render() + it('cancelled', async () => { + const {getByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeTexture'))) - fireEvent.click(getByText(t('general.cancel'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeTexture'))); + fireEvent.click(getByText(t('general.cancel'))); - expect(fetch.put).not.toBeCalled() - }) + expect(fetch.put).not.toBeCalled(); + }); - it('skin', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('skin', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByLabelText, queryByText, queryByRole } = render( - , - ) + const {getByText, getByLabelText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeTexture'))) - fireEvent.input(getByLabelText('TID'), { - target: { value: '2' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeTexture'))); + fireEvent.input(getByLabelText('TID'), { + target: {value: '2'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.players.texture(fixture.pid), - { - type: 'skin', - tid: 2, - }, - ), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.players.texture(fixture.pid), + { + type: 'skin', + tid: 2, + }, + ); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + }); - it('cape', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('cape', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByLabelText, queryByText, queryByRole } = render( - , - ) + const {getByText, getByLabelText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeTexture'))) - fireEvent.click(getByLabelText(t('general.cape'))) - fireEvent.input(getByLabelText('TID'), { - target: { value: '2' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeTexture'))); + fireEvent.click(getByLabelText(t('general.cape'))); + fireEvent.input(getByLabelText('TID'), { + target: {value: '2'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.players.texture(fixture.pid), - { - type: 'cape', - tid: 2, - }, - ), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.players.texture(fixture.pid), + { + type: 'cape', + tid: 2, + }, + ); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByLabelText, queryByText, queryByRole } = render( - , - ) + const {getByText, getByLabelText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeTexture'))) - fireEvent.input(getByLabelText('TID'), { - target: { value: '2' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeTexture'))); + fireEvent.input(getByLabelText('TID'), { + target: {value: '2'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.players.texture(fixture.pid), - { - type: 'skin', - tid: 2, - }, - ), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.players.texture(fixture.pid), + { + type: 'skin', + tid: 2, + }, + ); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + }); +}); describe('delete player', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() + it('cancelled', async () => { + const {getByText, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.deletePlayer'))) - fireEvent.click(getByText(t('general.cancel'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.deletePlayer'))); + fireEvent.click(getByText(t('general.cancel'))); - expect(fetch.del).not.toBeCalled() - expect(queryByText(fixture.name)).toBeInTheDocument() - }) + expect(fetch.del).not.toBeCalled(); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, queryByText, queryByRole } = render( - , - ) + const {getByText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.deletePlayer'))) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.deletePlayer'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.admin.players.delete(fixture.pid)), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText(fixture.name)).not.toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.admin.players.delete(fixture.pid)); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText(fixture.name)).not.toBeInTheDocument(); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, queryByText, queryByRole } = render( - , - ) + const {getByText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.deletePlayer'))) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.deletePlayer'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.admin.players.delete(fixture.pid)), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.name)).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.admin.players.delete(fixture.pid)); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); +}); describe('table mode', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('large screen', async () => { - Object.assign(window, { innerWidth: 1024 }) + it('large screen', async () => { + Object.assign(window, {innerWidth: 1024}); - const { queryByText } = render() + const {queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.operationsTitle'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.operationsTitle'))).toBeInTheDocument(); - Object.assign(window, { innerWidth: 500 }) - }) + Object.assign(window, {innerWidth: 500}); + }); - it('update player name', async () => { - const { getByText, getByTitle, queryByText } = render() + it('update player name', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByTitle(t('admin.changePlayerName'))) - expect(queryByText(t('admin.changePlayerNameNotice'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByTitle(t('admin.changePlayerName'))); + expect(queryByText(t('admin.changePlayerNameNotice'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - }) + fireEvent.click(getByText(t('general.cancel'))); + }); - it('update owner', async () => { - const { getByText, getByTitle, queryByText } = render() + it('update owner', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByTitle(t('admin.changeOwner'))) - expect(queryByText(t('admin.changePlayerOwner'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByTitle(t('admin.changeOwner'))); + expect(queryByText(t('admin.changePlayerOwner'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - }) + fireEvent.click(getByText(t('general.cancel'))); + }); - it('update texture', async () => { - const { getByText, getByTitle, queryByPlaceholderText } = render( - , - ) + it('update texture', async () => { + const {getByText, getByTitle, queryByPlaceholderText} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByText(t('admin.changeTexture'))) - expect(queryByPlaceholderText(t('admin.pidNotice'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByText(t('admin.changeTexture'))); + expect(queryByPlaceholderText(t('admin.pidNotice'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - }) + fireEvent.click(getByText(t('general.cancel'))); + }); - it('delete player', async () => { - const { getByText, getByTitle, queryByText } = render() + it('delete player', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByText(t('admin.deletePlayer'))) - expect(queryByText(t('admin.deletePlayerNotice'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByText(t('admin.deletePlayer'))); + expect(queryByText(t('admin.deletePlayerNotice'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - }) -}) + fireEvent.click(getByText(t('general.cancel'))); + }); +}); diff --git a/resources/assets/tests/views/admin/PluginsManagement.test.tsx b/resources/assets/tests/views/admin/PluginsManagement.test.tsx index 5f4e276b..c78eaced 100644 --- a/resources/assets/tests/views/admin/PluginsManagement.test.tsx +++ b/resources/assets/tests/views/admin/PluginsManagement.test.tsx @@ -1,356 +1,392 @@ -import { expect, test, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import PluginsManagement from '@/views/admin/PluginsManagement' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import PluginsManagement from '@/views/admin/PluginsManagement'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); test('show loading indicator', () => { - fetch.get.mockResolvedValue([]) - const { queryByTitle } = render() - expect(queryByTitle('Loading...')).not.toBeNull() -}) + fetch.get.mockResolvedValue([]); + const {queryByTitle} = render(); + expect(queryByTitle('Loading...')).not.toBeNull(); +}); test('plugin info box', async () => { - fetch.get.mockResolvedValue([ - { - name: 'a', - title: 'My Plugin', - version: '1.0.0', - description: 'desc', - config: true, - readme: true, - icon: {}, - enabled: true, - }, - { - name: 'b', - title: 'Another Plugin', - version: '0.1.0', - description: '', - config: false, - readme: false, - icon: {}, - enabled: false, - }, - ]) + fetch.get.mockResolvedValue([ + { + name: 'a', + title: 'My Plugin', + version: '1.0.0', + description: 'desc', + config: true, + readme: true, + icon: {}, + enabled: true, + }, + { + name: 'b', + title: 'Another Plugin', + version: '0.1.0', + description: '', + config: false, + readme: false, + icon: {}, + enabled: false, + }, + ]); - const { queryByTitle, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {queryByTitle, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(queryByTitle(t('admin.configurePlugin'))).not.toBeNull() - expect(queryByTitle(t('admin.pluginReadme'))).not.toBeNull() - expect(queryByText('My Plugin')).not.toBeNull() - expect(queryByText('v1.0.0')).not.toBeNull() - expect(queryByText('desc')).not.toBeNull() -}) + expect(queryByTitle(t('admin.configurePlugin'))).not.toBeNull(); + expect(queryByTitle(t('admin.pluginReadme'))).not.toBeNull(); + expect(queryByText('My Plugin')).not.toBeNull(); + expect(queryByText('v1.0.0')).not.toBeNull(); + expect(queryByText('desc')).not.toBeNull(); +}); describe('enable plugin', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([ - { - name: 'a', - icon: {}, - enabled: false, - }, - ]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([ + { + name: 'a', + icon: {}, + enabled: false, + }, + ]); + }); - it('succeeded', async () => { - fetch.get.mockResolvedValue([ - { - name: 'a', - icon: {}, - enabled: false, - }, - ]) - fetch.post.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.get.mockResolvedValue([ + { + name: 'a', + icon: {}, + enabled: false, + }, + ]); + fetch.post.mockResolvedValue({code: 0, message: 'success'}); - const { getByTitle, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('admin.enablePlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'enable', - name: 'a', - }), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(getByTitle(t('admin.disablePlugin'))).toBeChecked() - }) + fireEvent.click(getByTitle(t('admin.enablePlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'enable', + name: 'a', + }); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(getByTitle(t('admin.disablePlugin'))).toBeChecked(); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ - code: 1, - message: 'unresolved', - data: { reason: ['abc'] }, - }) + it('failed', async () => { + fetch.post.mockResolvedValue({ + code: 1, + message: 'unresolved', + data: {reason: ['abc']}, + }); - const { getByTitle, getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('admin.enablePlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'enable', - name: 'a', - }), - ) - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'enable', - name: 'a', - }) - expect(queryByText('unresolved')).toBeInTheDocument() - expect(queryByText('abc')).toBeInTheDocument() + fireEvent.click(getByTitle(t('admin.enablePlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'enable', + name: 'a', + }); + }, + ); + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'enable', + name: 'a', + }); + expect(queryByText('unresolved')).toBeInTheDocument(); + expect(queryByText('abc')).toBeInTheDocument(); - fireEvent.click(getByText(t('general.confirm'))) - }) -}) + fireEvent.click(getByText(t('general.confirm'))); + }); +}); describe('disable plugin', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([ - { - name: 'a', - icon: {}, - enabled: true, - }, - ]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([ + { + name: 'a', + icon: {}, + enabled: true, + }, + ]); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'success'}); - const { getByTitle, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('admin.disablePlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'disable', - name: 'a', - }), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(getByTitle(t('admin.enablePlugin'))).not.toBeChecked() - }) + fireEvent.click(getByTitle(t('admin.disablePlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'disable', + name: 'a', + }); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(getByTitle(t('admin.enablePlugin'))).not.toBeChecked(); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByTitle, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('admin.disablePlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'disable', - name: 'a', - }), - ) - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'disable', - name: 'a', - }) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + fireEvent.click(getByTitle(t('admin.disablePlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'disable', + name: 'a', + }); + }, + ); + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'disable', + name: 'a', + }); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); describe('delete plugin', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([ - { - name: 'a', - title: 'My Plugin', - icon: {}, - enabled: false, - }, - ]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([ + { + name: 'a', + title: 'My Plugin', + icon: {}, + enabled: false, + }, + ]); + }); - it('rejected by user', async () => { - const { getByTitle, getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('rejected by user', async () => { + const {getByTitle, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('admin.deletePlugin'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.post).not.toBeCalled()) - }) + fireEvent.click(getByTitle(t('admin.deletePlugin'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.post).not.toBeCalled(); + }); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'success'}); - const { getByTitle, getByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('admin.deletePlugin'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'delete', - name: 'a', - }), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText('My Plugin')).toBeNull() - }) + fireEvent.click(getByTitle(t('admin.deletePlugin'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'delete', + name: 'a', + }); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText('My Plugin')).toBeNull(); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByTitle, getByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('admin.deletePlugin'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'delete', - name: 'a', - }), - ) - expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { - action: 'delete', - name: 'a', - }) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText('My Plugin')).not.toBeNull() - }) -}) + fireEvent.click(getByTitle(t('admin.deletePlugin'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'delete', + name: 'a', + }); + }, + ); + expect(fetch.post).toBeCalledWith('/admin/plugins/manage', { + action: 'delete', + name: 'a', + }); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText('My Plugin')).not.toBeNull(); + }); +}); describe('upload plugin archive', () => { - it('no selected file', async () => { - fetch.get.mockResolvedValue([]) + it('no selected file', async () => { + fetch.get.mockResolvedValue([]); - const { getAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getAllByText(t('general.submit'))[0]!) - expect(fetch.post).not.toBeCalled() - }) + fireEvent.click(getAllByText(t('general.submit'))[0]); + expect(fetch.post).not.toBeCalled(); + }); - it('succeeded', async () => { - fetch.get.mockResolvedValue([]) - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.get.mockResolvedValue([]); + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByTitle, getAllByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getAllByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - const file = new File([], 'plugin.zip') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getAllByText(t('general.submit'))[0]!) - await waitFor(() => { - expect(fetch.get).toBeCalledTimes(2) - expect(fetch.post).toBeCalledWith( - '/admin/plugins/upload', - expect.any(FormData), - ) - }) - const formData = fetch.post.mock.calls[0]![1] as FormData - expect(formData.get('file')).toStrictEqual(file) - expect(queryByText('plugin.zip')).not.toBeInTheDocument() - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + const file = new File([], 'plugin.zip'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getAllByText(t('general.submit'))[0]); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(2); + expect(fetch.post).toBeCalledWith( + '/admin/plugins/upload', + expect.any(FormData), + ); + }); + const formData = fetch.post.mock.calls[0]![1] as FormData; + expect(formData.get('file')).toStrictEqual(file); + expect(queryByText('plugin.zip')).not.toBeInTheDocument(); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.get.mockResolvedValue([]) - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.get.mockResolvedValue([]); + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByTitle, getAllByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getAllByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - const file = new File([], 'plugin.zip') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getAllByText(t('general.submit'))[0]!) - await waitFor(() => { - expect(fetch.get).toBeCalledTimes(1) - expect(fetch.post).toBeCalledWith( - '/admin/plugins/upload', - expect.any(FormData), - ) - }) - expect(queryByText('plugin.zip')).toBeInTheDocument() - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + const file = new File([], 'plugin.zip'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getAllByText(t('general.submit'))[0]); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + expect(fetch.post).toBeCalledWith( + '/admin/plugins/upload', + expect.any(FormData), + ); + }); + expect(queryByText('plugin.zip')).toBeInTheDocument(); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); describe('submit remote URL', () => { - it('succeeded', async () => { - fetch.get.mockResolvedValue([]) - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.get.mockResolvedValue([]); + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { - getByLabelText, - getAllByText, - getByRole, - queryByText, - queryByDisplayValue, - } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const { + getByLabelText, + getAllByText, + getByRole, + queryByText, + queryByDisplayValue, + } = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.input(getByLabelText('URL'), { - target: { value: 'https://example.com/a.zip' }, - }) - fireEvent.click(getAllByText(t('general.submit'))[1]!) - await waitFor(() => { - expect(fetch.get).toBeCalledTimes(2) - expect(fetch.post).toBeCalledWith('/admin/plugins/wget', { - url: 'https://example.com/a.zip', - }) - }) - expect( - queryByDisplayValue('https://example.com/a.zip'), - ).not.toBeInTheDocument() - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.input(getByLabelText('URL'), { + target: {value: 'https://example.com/a.zip'}, + }); + fireEvent.click(getAllByText(t('general.submit'))[1]); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(2); + expect(fetch.post).toBeCalledWith('/admin/plugins/wget', { + url: 'https://example.com/a.zip', + }); + }); + expect( + queryByDisplayValue('https://example.com/a.zip'), + ).not.toBeInTheDocument(); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.get.mockResolvedValue([]) - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.get.mockResolvedValue([]); + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { - getByLabelText, - getAllByText, - getByRole, - queryByText, - queryByDisplayValue, - } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const { + getByLabelText, + getAllByText, + getByRole, + queryByText, + queryByDisplayValue, + } = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.input(getByLabelText('URL'), { - target: { value: 'https://example.com/a.zip' }, - }) - fireEvent.click(getAllByText(t('general.submit'))[1]!) - await waitFor(() => { - expect(fetch.get).toBeCalledTimes(1) - expect(fetch.post).toBeCalledWith('/admin/plugins/wget', { - url: 'https://example.com/a.zip', - }) - }) - expect(queryByDisplayValue('https://example.com/a.zip')).toBeInTheDocument() - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + fireEvent.input(getByLabelText('URL'), { + target: {value: 'https://example.com/a.zip'}, + }); + fireEvent.click(getAllByText(t('general.submit'))[1]); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + expect(fetch.post).toBeCalledWith('/admin/plugins/wget', { + url: 'https://example.com/a.zip', + }); + }); + expect(queryByDisplayValue('https://example.com/a.zip')).toBeInTheDocument(); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); diff --git a/resources/assets/tests/views/admin/PluginsMarket.test.tsx b/resources/assets/tests/views/admin/PluginsMarket.test.tsx index 539efefe..c4c714e6 100644 --- a/resources/assets/tests/views/admin/PluginsMarket.test.tsx +++ b/resources/assets/tests/views/admin/PluginsMarket.test.tsx @@ -1,213 +1,238 @@ -import { expect, test, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import PluginsMarket from '@/views/admin/PluginsMarket' -import type { Plugin } from '@/views/admin/PluginsMarket/types' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import PluginsMarket from '@/views/admin/PluginsMarket'; +import type {Plugin} from '@/views/admin/PluginsMarket/types'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixture: Readonly = Object.freeze>({ - name: 'yggdrasil-api', - title: 'Yggdrasil API', - description: 'Auth System', - version: '1.0.0', - author: 'Blessing Skin', - installed: false, - dependencies: { - all: { - 'blessing-skin-server': '^5.0.0', - }, - unsatisfied: {}, - }, -}) + name: 'yggdrasil-api', + title: 'Yggdrasil API', + description: 'Auth System', + version: '1.0.0', + author: 'Blessing Skin', + installed: false, + dependencies: { + all: { + 'blessing-skin-server': '^5.0.0', + }, + unsatisfied: {}, + }, +}); test('search plugins', async () => { - fetch.get.mockResolvedValue([fixture]) + fetch.get.mockResolvedValue([fixture]); - const { getByPlaceholderText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByPlaceholderText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.input(getByPlaceholderText(t('vendor.datatable.search')), { - target: { value: 'test' }, - }) - expect(queryByText('yggdrasil-api')).not.toBeInTheDocument() -}) + fireEvent.input(getByPlaceholderText(t('vendor.datatable.search')), { + target: {value: 'test'}, + }); + expect(queryByText('yggdrasil-api')).not.toBeInTheDocument(); +}); test('install a plugin after first page', async () => { - const plugins = Array.from({ length: 10 }).map(() => { - return { ...fixture, name: `${fixture.name}_${Math.random()}` } - }) - plugins.push(fixture) - fetch.get.mockResolvedValue(plugins) - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + const plugins = Array.from({length: 10}).map(() => ({...fixture, name: `${fixture.name}_${Math.random()}`})); + plugins.push(fixture); + fetch.get.mockResolvedValue(plugins); + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, queryByText, queryAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByText, queryAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText('2')) - fireEvent.click(getByText(t('admin.installPlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: fixture.name, - }), - ) - expect(queryByText(t('admin.installPlugin'))).toBeDisabled() + fireEvent.click(getByText('2')); + fireEvent.click(getByText(t('admin.installPlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: fixture.name, + }); + }, + ); + expect(queryByText(t('admin.installPlugin'))).toBeDisabled(); - fireEvent.click(getByText('1')) - expect(queryAllByText(t('admin.installPlugin'))[0]).toBeEnabled() -}) + fireEvent.click(getByText('1')); + expect(queryAllByText(t('admin.installPlugin'))[0]).toBeEnabled(); +}); describe('dependencies', () => { - it('no dependencies', async () => { - fetch.get.mockResolvedValue([ - { ...fixture, dependencies: { all: {}, unsatisfied: {} } }, - ]) + it('no dependencies', async () => { + fetch.get.mockResolvedValue([ + {...fixture, dependencies: {all: {}, unsatisfied: {}}}, + ]); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.noDependencies'))).toBeInTheDocument() - }) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.noDependencies'))).toBeInTheDocument(); + }); - it('satisfied dependencies', async () => { - fetch.get.mockResolvedValue([fixture]) + it('satisfied dependencies', async () => { + fetch.get.mockResolvedValue([fixture]); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) - expect( - queryByText( - `blessing-skin-server: ${fixture.dependencies.all['blessing-skin-server']}`, - ), - ).toHaveClass('bg-green') - }) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect( + queryByText( + `blessing-skin-server: ${fixture.dependencies.all['blessing-skin-server']}`, + ), + ).toHaveClass('bg-green'); + }); - it('unsatisfied dependencies', async () => { - fetch.get.mockResolvedValue([ - { - ...fixture, - dependencies: { - all: { 'blessing-skin-server': '^5.0.0' }, - unsatisfied: { 'blessing-skin-server': '4.0.0' }, - }, - }, - ]) + it('unsatisfied dependencies', async () => { + fetch.get.mockResolvedValue([ + { + ...fixture, + dependencies: { + all: {'blessing-skin-server': '^5.0.0'}, + unsatisfied: {'blessing-skin-server': '4.0.0'}, + }, + }, + ]); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) - expect( - queryByText( - `blessing-skin-server: ${fixture.dependencies.all['blessing-skin-server']}`, - ), - ).toHaveClass('bg-red') - }) -}) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect( + queryByText( + `blessing-skin-server: ${fixture.dependencies.all['blessing-skin-server']}`, + ), + ).toHaveClass('bg-red'); + }); +}); describe('install plugin', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([fixture]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([fixture]); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, queryByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('admin.installPlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: fixture.name, - }), - ) - expect(queryByText(t('admin.installPlugin'))).toBeDisabled() - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('admin.installPlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: fixture.name, + }); + }, + ); + expect(queryByText(t('admin.installPlugin'))).toBeDisabled(); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('admin.installPlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: fixture.name, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByText(t('admin.installPlugin'))).toBeEnabled() + fireEvent.click(getByText(t('admin.installPlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: fixture.name, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByText(t('admin.installPlugin'))).toBeEnabled(); - fireEvent.click(getByText(t('general.confirm'))) - }) + fireEvent.click(getByText(t('general.confirm'))); + }); - it('failed with unsatisfied', async () => { - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { reason: ['version is too low'] }, - }) + it('failed with unsatisfied', async () => { + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {reason: ['version is too low']}, + }); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('admin.installPlugin'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: fixture.name, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByText('version is too low')).toBeInTheDocument() - expect(queryByText(t('admin.installPlugin'))).toBeEnabled() + fireEvent.click(getByText(t('admin.installPlugin'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: fixture.name, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByText('version is too low')).toBeInTheDocument(); + expect(queryByText(t('admin.installPlugin'))).toBeEnabled(); - fireEvent.click(getByText(t('general.confirm'))) - }) -}) + fireEvent.click(getByText(t('general.confirm'))); + }); +}); describe('update plugin', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([ - { ...fixture, can_update: true, installed: '0.5.0' }, - ]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([ + {...fixture, can_update: true, installed: '0.5.0'}, + ]); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('cancelled', async () => { + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('admin.updatePlugin'))) - expect( - queryByText( - t('admin.confirmUpdate', { - plugin: fixture.title, - old: '0.5.0', - new: fixture.version, - }), - ), - ).toBeInTheDocument() + fireEvent.click(getByText(t('admin.updatePlugin'))); + expect( + queryByText( + t('admin.confirmUpdate', { + plugin: fixture.title, + old: '0.5.0', + new: fixture.version, + }), + ), + ).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.post).not.toBeCalled() - }) + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.post).not.toBeCalled(); + }); - it('confirm to update', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + it('confirm to update', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('admin.updatePlugin'))) - fireEvent.click(getByText(t('general.confirm'))) + fireEvent.click(getByText(t('admin.updatePlugin'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { - name: fixture.name, - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByText(t('admin.updatePlugin'))).not.toBeInTheDocument() - expect(queryByText(t('admin.installPlugin'))).toBeDisabled() - }) -}) + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/admin/plugins/market/download', { + name: fixture.name, + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByText(t('admin.updatePlugin'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.installPlugin'))).toBeDisabled(); + }); +}); diff --git a/resources/assets/tests/views/admin/ReportsManagement.test.tsx b/resources/assets/tests/views/admin/ReportsManagement.test.tsx index 1b8440e0..3f20af27 100644 --- a/resources/assets/tests/views/admin/ReportsManagement.test.tsx +++ b/resources/assets/tests/views/admin/ReportsManagement.test.tsx @@ -1,205 +1,227 @@ -import { expect, test, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { createPaginator } from '../../utils' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import { type Texture, TextureType, type User, UserPermission } from '@/scripts/types' -import ReportsManagement from '@/views/admin/ReportsManagement' -import { type Report, Status } from '@/views/admin/ReportsManagement/types' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {createPaginator} from '../../utils'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import { + type Texture, TextureType, type User, UserPermission, +} from '@/scripts/types'; +import ReportsManagement from '@/views/admin/ReportsManagement'; +import {type Report, Status} from '@/views/admin/ReportsManagement/types'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixture: Readonly = Object.freeze({ - id: 1, - tid: 1, - texture: null, - uploader: 1, - texture_uploader: Object.freeze>({ - uid: 1, - email: 'a@b.c', - nickname: 'abc', - locale: 'en', - score: 1000, - avatar: 0, - permission: UserPermission.Normal, - ip: '::1', - is_dark_mode: false, - last_sign_at: new Date().toString(), - register_at: new Date().toString(), - verified: true, - }), - reporter: 2, - informer: Object.freeze>({ - uid: 1, - email: 'a@b.c', - nickname: 'abc', - locale: 'en', - score: 1000, - avatar: 0, - permission: UserPermission.Normal, - ip: '::1', - is_dark_mode: false, - last_sign_at: new Date().toString(), - register_at: new Date().toString(), - verified: true, - }), - reason: 'nsfw', - status: Status.Pending, - report_at: new Date().toString(), -}) + id: 1, + tid: 1, + texture: null, + uploader: 1, + texture_uploader: Object.freeze>({ + uid: 1, + email: 'a@b.c', + nickname: 'abc', + locale: 'en', + score: 1000, + avatar: 0, + permission: UserPermission.Normal, + ip: '::1', + is_dark_mode: false, + last_sign_at: new Date().toString(), + register_at: new Date().toString(), + verified: true, + }), + reporter: 2, + informer: Object.freeze>({ + uid: 1, + email: 'a@b.c', + nickname: 'abc', + locale: 'en', + score: 1000, + avatar: 0, + permission: UserPermission.Normal, + ip: '::1', + is_dark_mode: false, + last_sign_at: new Date().toString(), + register_at: new Date().toString(), + verified: true, + }), + reason: 'nsfw', + status: Status.Pending, + report_at: new Date().toString(), +}); test('search reports', async () => { - fetch.get.mockResolvedValue(createPaginator([])) + fetch.get.mockResolvedValue(createPaginator([])); - const { getByTitle, getByText } = render() - await waitFor(() => - expect(fetch.get).toBeCalledWith('/admin/reports/list', { - q: 'status:0 sort:-report_at', - page: 1, - }), - ) + const {getByTitle, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledWith('/admin/reports/list', { + q: 'status:0 sort:-report_at', + page: 1, + }); + }, + ); - fireEvent.input(getByTitle(t('vendor.datatable.search')), { - target: { value: 's' }, - }) - fireEvent.click(getByText(t('vendor.datatable.search'))) - await waitFor(() => - expect(fetch.get).toBeCalledWith('/admin/reports/list', { - q: 's', - page: 1, - }), - ) -}) + fireEvent.input(getByTitle(t('vendor.datatable.search')), { + target: {value: 's'}, + }); + fireEvent.click(getByText(t('vendor.datatable.search'))); + await waitFor(() => { + expect(fetch.get).toBeCalledWith('/admin/reports/list', { + q: 's', + page: 1, + }); + }, + ); +}); test('empty reporter or texture uploader', () => { - const report = { ...fixture, texture_uploader: null, informer: null } - fetch.get.mockResolvedValue(createPaginator([report])) + const report = {...fixture, texture_uploader: null, informer: null}; + fetch.get.mockResolvedValue(createPaginator([report])); - render() -}) + render(); +}); test('preview texture', async () => { - const texture: Texture = { - tid: fixture.tid, - name: 'cape', - type: TextureType.Cape, - hash: 'def', - size: 2, - uploader: fixture.uploader, - public: true, - upload_at: new Date().toString(), - likes: 1, - } - fetch.get.mockResolvedValue(createPaginator([{ ...fixture, texture }])) + const texture: Texture = { + tid: fixture.tid, + name: 'cape', + type: TextureType.Cape, + hash: 'def', + size: 2, + uploader: fixture.uploader, + public: true, + upload_at: new Date().toString(), + likes: 1, + }; + fetch.get.mockResolvedValue(createPaginator([{...fixture, texture}])); - const { getByAltText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByAltText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByAltText(fixture.tid.toString())) -}) + fireEvent.click(getByAltText(fixture.tid.toString())); +}); describe('proceed report', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - describe('ban uploader', () => { - it('succeeded', async () => { - fetch.put.mockResolvedValue({ - code: 0, - message: 'ok', - data: { status: Status.Resolved }, - }) + describe('ban uploader', () => { + it('succeeded', async () => { + fetch.put.mockResolvedValue({ + code: 0, + message: 'ok', + data: {status: Status.Resolved}, + }); - const { getByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('report.ban'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { - action: 'ban', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toBeInTheDocument() - expect(queryByText(t('report.status.1'))).toBeInTheDocument() - }) + fireEvent.click(getByText(t('report.ban'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { + action: 'ban', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toBeInTheDocument(); + expect(queryByText(t('report.status.1'))).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('report.ban'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { - action: 'ban', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toBeInTheDocument() - expect(queryByText(t('report.status.0'))).toBeInTheDocument() - }) - }) + fireEvent.click(getByText(t('report.ban'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { + action: 'ban', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toBeInTheDocument(); + expect(queryByText(t('report.status.0'))).toBeInTheDocument(); + }); + }); - describe('delete texture', () => { - it('cancelled', async () => { - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + describe('delete texture', () => { + it('cancelled', async () => { + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('skinlib.show.delete-texture'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - }) + fireEvent.click(getByText(t('skinlib.show.delete-texture'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ - code: 0, - message: 'ok', - data: { status: Status.Resolved }, - }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({ + code: 0, + message: 'ok', + data: {status: Status.Resolved}, + }); - const { getByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('skinlib.show.delete-texture'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { - action: 'delete', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toBeInTheDocument() - expect(queryByText(t('report.status.1'))).toBeInTheDocument() - }) - }) + fireEvent.click(getByText(t('skinlib.show.delete-texture'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { + action: 'delete', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toBeInTheDocument(); + expect(queryByText(t('report.status.1'))).toBeInTheDocument(); + }); + }); - it('reject report', async () => { - fetch.put.mockResolvedValue({ - code: 0, - message: 'ok', - data: { status: Status.Rejected }, - }) + it('reject report', async () => { + fetch.put.mockResolvedValue({ + code: 0, + message: 'ok', + data: {status: Status.Rejected}, + }); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('report.reject'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { - action: 'reject', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toBeInTheDocument() - expect(queryByText(t('report.status.2'))).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('report.reject'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/admin/reports/${fixture.id}`, { + action: 'reject', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toBeInTheDocument(); + expect(queryByText(t('report.status.2'))).toBeInTheDocument(); + }); +}); diff --git a/resources/assets/tests/views/admin/Translations.test.tsx b/resources/assets/tests/views/admin/Translations.test.tsx index 27c48376..8ed34491 100644 --- a/resources/assets/tests/views/admin/Translations.test.tsx +++ b/resources/assets/tests/views/admin/Translations.test.tsx @@ -1,126 +1,147 @@ -import { expect, test, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { createPaginator } from '../../utils' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import Translations from '@/views/admin/Translations' -import type { Line } from '@/views/admin/Translations/types' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {createPaginator} from '../../utils'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import Translations from '@/views/admin/Translations'; +import type {Line} from '@/views/admin/Translations/types'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixtureLine: Readonly = Object.freeze({ - id: 1, - group: 'general', - key: 'submit', - text: { - en: 'Submit', - }, -}) + id: 1, + group: 'general', + key: 'submit', + text: { + en: 'Submit', + }, +}); test('empty text', async () => { - const line = { ...fixtureLine, text: { en: '' } } - fetch.get.mockResolvedValue(createPaginator([line])) + const line = {...fixtureLine, text: {en: ''}}; + fetch.get.mockResolvedValue(createPaginator([line])); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(queryByText(t('admin.i18n.empty'))).toBeInTheDocument() -}) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(queryByText(t('admin.i18n.empty'))).toBeInTheDocument(); +}); describe('edit line', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixtureLine])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixtureLine])); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByDisplayValue, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByDisplayValue, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('admin.i18n.modify'))) - fireEvent.input(getByDisplayValue(fixtureLine.text.en!), { - target: { value: 'finish' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/admin/i18n/${fixtureLine.id}`, { - text: 'finish', - }), - ) - expect(queryByText('finish')).toBeInTheDocument() - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('admin.i18n.modify'))); + fireEvent.input(getByDisplayValue(fixtureLine.text.en), { + target: {value: 'finish'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/admin/i18n/${fixtureLine.id}`, { + text: 'finish', + }); + }, + ); + expect(queryByText('finish')).toBeInTheDocument(); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByDisplayValue, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('admin.i18n.modify'))) - fireEvent.input(getByDisplayValue(fixtureLine.text.en!), { - target: { value: 'finish' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/admin/i18n/${fixtureLine.id}`, { - text: 'finish', - }), - ) - expect(queryByText(fixtureLine.text.en!)).toBeInTheDocument() - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByText(t('admin.i18n.modify'))); + fireEvent.input(getByDisplayValue(fixtureLine.text.en), { + target: {value: 'finish'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/admin/i18n/${fixtureLine.id}`, { + text: 'finish', + }); + }, + ); + expect(queryByText(fixtureLine.text.en)).toBeInTheDocument(); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('cancelled', async () => { - const { getByText, getByDisplayValue, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, getByDisplayValue, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('admin.i18n.modify'))) - fireEvent.input(getByDisplayValue(fixtureLine.text.en!), { - target: { value: 'finish' }, - }) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText(fixtureLine.text.en!)).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('admin.i18n.modify'))); + fireEvent.input(getByDisplayValue(fixtureLine.text.en), { + target: {value: 'finish'}, + }); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText(fixtureLine.text.en)).toBeInTheDocument(); + }); +}); describe('delete line', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixtureLine])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixtureLine])); + }); - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('admin.i18n.delete'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(`/admin/i18n/${fixtureLine.id}`), - ) - expect(queryByText(fixtureLine.text.en!)).not.toBeInTheDocument() - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('admin.i18n.delete'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(`/admin/i18n/${fixtureLine.id}`); + }, + ); + expect(queryByText(fixtureLine.text.en)).not.toBeInTheDocument(); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('admin.i18n.delete'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.del).not.toBeCalled()) - expect(queryByText(fixtureLine.text.en!)).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('admin.i18n.delete'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.del).not.toBeCalled(); + }); + expect(queryByText(fixtureLine.text.en)).toBeInTheDocument(); + }); +}); diff --git a/resources/assets/tests/views/admin/Update.test.ts b/resources/assets/tests/views/admin/Update.test.ts index 998031d9..0f85bc01 100644 --- a/resources/assets/tests/views/admin/Update.test.ts +++ b/resources/assets/tests/views/admin/Update.test.ts @@ -1,26 +1,26 @@ -import { expect, test, jest } from 'vitest' -import { flushPromises } from '../../utils' -import { showModal } from '@/scripts/notify' -import { post } from '@/scripts/net' -import handler from '@/views/admin/Update' +import {expect, test, jest} from 'vitest'; +import {flushPromises} from '../../utils'; +import {showModal} from '@/scripts/notify'; +import {post} from '@/scripts/net'; +import handler from '@/views/admin/Update'; -vi.mock('@/scripts/notify') -vi.mock('@/scripts/net') +vi.mock('@/scripts/notify'); +vi.mock('@/scripts/net'); test('click button', async () => { - post - .mockResolvedValueOnce({ code: 1, message: 'failed' }) - .mockResolvedValue({ code: 0, message: 'ok' }) + post + .mockResolvedValueOnce({code: 1, message: 'failed'}) + .mockResolvedValue({code: 0, message: 'ok'}); - const button = document.createElement('button') - button.addEventListener('click', handler) + const button = document.createElement('button'); + button.addEventListener('click', handler); - const event = new MouseEvent('click') - button.dispatchEvent(event) - await flushPromises() - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'failed' }) + const event = new MouseEvent('click'); + button.dispatchEvent(event); + await flushPromises(); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'failed'}); - button.dispatchEvent(event) - await flushPromises() - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'ok' }) -}) + button.dispatchEvent(event); + await flushPromises(); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'ok'}); +}); diff --git a/resources/assets/tests/views/admin/UsersManagement.test.tsx b/resources/assets/tests/views/admin/UsersManagement.test.tsx index 24f44b97..82039885 100644 --- a/resources/assets/tests/views/admin/UsersManagement.test.tsx +++ b/resources/assets/tests/views/admin/UsersManagement.test.tsx @@ -1,792 +1,881 @@ -import { expect, test, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { createPaginator } from '../../utils' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import { type User, UserPermission } from '@/scripts/types' -import urls from '@/scripts/urls' -import UsersManagement from '@/views/admin/UsersManagement' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {createPaginator} from '../../utils'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import {type User, UserPermission} from '@/scripts/types'; +import urls from '@/scripts/urls'; +import UsersManagement from '@/views/admin/UsersManagement'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixture: Readonly = Object.freeze({ - uid: 1, - email: 'a@b.c', - nickname: 'abc', - locale: 'en', - score: 1000, - avatar: 0, - permission: UserPermission.Normal, - ip: '::1', - is_dark_mode: false, - last_sign_at: new Date().toString(), - register_at: new Date().toString(), - verified: true, -}) + uid: 1, + email: 'a@b.c', + nickname: 'abc', + locale: 'en', + score: 1000, + avatar: 0, + permission: UserPermission.Normal, + ip: '::1', + is_dark_mode: false, + last_sign_at: new Date().toString(), + register_at: new Date().toString(), + verified: true, +}); beforeAll(() => { - Object.assign(window, { innerWidth: 500 }) -}) + Object.assign(window, {innerWidth: 500}); +}); afterAll(() => { - Object.assign(window, { innerWidth: 1024 }) -}) + Object.assign(window, {innerWidth: 1024}); +}); beforeEach(() => { - window.blessing.extra = { - currentUser: { ...fixture, uid: 2, permission: UserPermission.Admin }, - } -}) + window.blessing.extra = { + currentUser: {...fixture, uid: 2, permission: UserPermission.Admin}, + }; +}); test('search users', async () => { - fetch.get.mockResolvedValue(createPaginator([])) + fetch.get.mockResolvedValue(createPaginator([])); - const { getByTitle, getByText } = render() - await waitFor(() => - expect(fetch.get).toBeCalledWith(urls.admin.users.list(), { - q: '', - page: 1, - }), - ) + const {getByTitle, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledWith(urls.admin.users.list(), { + q: '', + page: 1, + }); + }, + ); - fireEvent.input(getByTitle(t('vendor.datatable.search')), { - target: { value: 's' }, - }) - fireEvent.click(getByText(t('vendor.datatable.search'))) - await waitFor(() => - expect(fetch.get).toBeCalledWith(urls.admin.users.list(), { - q: 's', - page: 1, - }), - ) -}) + fireEvent.input(getByTitle(t('vendor.datatable.search')), { + target: {value: 's'}, + }); + fireEvent.click(getByText(t('vendor.datatable.search'))); + await waitFor(() => { + expect(fetch.get).toBeCalledWith(urls.admin.users.list(), { + q: 's', + page: 1, + }); + }, + ); +}); describe('access control', () => { - describe('current user is super administrator', () => { - beforeEach(() => { - window.blessing.extra = { - currentUser: { - ...fixture, - uid: 2, - permission: UserPermission.SuperAdmin, - }, - } - }) + describe('current user is super administrator', () => { + beforeEach(() => { + window.blessing.extra = { + currentUser: { + ...fixture, + uid: 2, + permission: UserPermission.SuperAdmin, + }, + }; + }); - it('target user is super administrator', async () => { - fetch.get.mockResolvedValue( - createPaginator([ - { ...fixture, permission: UserPermission.SuperAdmin }, - ]), - ) + it('target user is super administrator', async () => { + fetch.get.mockResolvedValue( + createPaginator([ + {...fixture, permission: UserPermission.SuperAdmin}, + ]), + ); - const { getByTitle, getByText, queryByText, queryByTitle } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.changeEmail'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changeNickName'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changePassword'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changeScore'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument() - expect(queryByText(t('admin.toggleVerification'))).not.toBeInTheDocument() - expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument() + const {getByTitle, getByText, queryByText, queryByTitle} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.changeEmail'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changeNickName'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changePassword'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changeScore'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.toggleVerification'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument(); - fireEvent.click(getByTitle('Table Mode')) - expect(queryByTitle(t('admin.changeEmail'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changeNickName'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changeScore'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument() - expect( - queryByTitle(t('admin.toggleVerification')), - ).not.toBeInTheDocument() - expect(getByText(t('admin.changePassword'))).toBeDisabled() - expect(getByText(t('admin.deleteUser'))).toBeDisabled() - }) + fireEvent.click(getByTitle('Table Mode')); + expect(queryByTitle(t('admin.changeEmail'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changeNickName'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changeScore'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument(); + expect( + queryByTitle(t('admin.toggleVerification')), + ).not.toBeInTheDocument(); + expect(getByText(t('admin.changePassword'))).toBeDisabled(); + expect(getByText(t('admin.deleteUser'))).toBeDisabled(); + }); - it('target user is normal administrator', async () => { - fetch.get.mockResolvedValue( - createPaginator([{ ...fixture, permission: UserPermission.Admin }]), - ) + it('target user is normal administrator', async () => { + fetch.get.mockResolvedValue( + createPaginator([{...fixture, permission: UserPermission.Admin}]), + ); - const { getByTitle, getByText, queryByText, queryByTitle } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.changeEmail'))).toBeInTheDocument() - expect(queryByText(t('admin.changeNickName'))).toBeInTheDocument() - expect(queryByText(t('admin.changePassword'))).toBeInTheDocument() - expect(queryByText(t('admin.changeScore'))).toBeInTheDocument() - expect(queryByText(t('admin.changePermission'))).toBeInTheDocument() - expect(queryByText(t('admin.toggleVerification'))).toBeInTheDocument() - expect(queryByText(t('admin.deleteUser'))).toBeInTheDocument() + const {getByTitle, getByText, queryByText, queryByTitle} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.changeEmail'))).toBeInTheDocument(); + expect(queryByText(t('admin.changeNickName'))).toBeInTheDocument(); + expect(queryByText(t('admin.changePassword'))).toBeInTheDocument(); + expect(queryByText(t('admin.changeScore'))).toBeInTheDocument(); + expect(queryByText(t('admin.changePermission'))).toBeInTheDocument(); + expect(queryByText(t('admin.toggleVerification'))).toBeInTheDocument(); + expect(queryByText(t('admin.deleteUser'))).toBeInTheDocument(); - fireEvent.click(getByTitle('Table Mode')) - expect(queryByTitle(t('admin.changeEmail'))).toBeInTheDocument() - expect(queryByTitle(t('admin.changeNickName'))).toBeInTheDocument() - expect(queryByTitle(t('admin.changeScore'))).toBeInTheDocument() - expect(queryByTitle(t('admin.changePermission'))).toBeInTheDocument() - expect(queryByTitle(t('admin.toggleVerification'))).toBeInTheDocument() - expect(getByText(t('admin.changePassword'))).toBeEnabled() - expect(getByText(t('admin.deleteUser'))).toBeEnabled() - }) - }) + fireEvent.click(getByTitle('Table Mode')); + expect(queryByTitle(t('admin.changeEmail'))).toBeInTheDocument(); + expect(queryByTitle(t('admin.changeNickName'))).toBeInTheDocument(); + expect(queryByTitle(t('admin.changeScore'))).toBeInTheDocument(); + expect(queryByTitle(t('admin.changePermission'))).toBeInTheDocument(); + expect(queryByTitle(t('admin.toggleVerification'))).toBeInTheDocument(); + expect(getByText(t('admin.changePassword'))).toBeEnabled(); + expect(getByText(t('admin.deleteUser'))).toBeEnabled(); + }); + }); - describe('current user is normal administrator', () => { - beforeEach(() => { - window.blessing.extra = { - currentUser: { - ...fixture, - uid: 2, - permission: UserPermission.Admin, - }, - } - }) + describe('current user is normal administrator', () => { + beforeEach(() => { + window.blessing.extra = { + currentUser: { + ...fixture, + uid: 2, + permission: UserPermission.Admin, + }, + }; + }); - it('target user is super administrator', async () => { - fetch.get.mockResolvedValue( - createPaginator([ - { ...fixture, permission: UserPermission.SuperAdmin }, - ]), - ) + it('target user is super administrator', async () => { + fetch.get.mockResolvedValue( + createPaginator([ + {...fixture, permission: UserPermission.SuperAdmin}, + ]), + ); - const { getByTitle, getByText, queryByText, queryByTitle } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.changeEmail'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changeNickName'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changePassword'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changeScore'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument() - expect(queryByText(t('admin.toggleVerification'))).not.toBeInTheDocument() - expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument() + const {getByTitle, getByText, queryByText, queryByTitle} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.changeEmail'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changeNickName'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changePassword'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changeScore'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.toggleVerification'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument(); - fireEvent.click(getByTitle('Table Mode')) - expect(queryByTitle(t('admin.changeEmail'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changeNickName'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changeScore'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument() - expect( - queryByTitle(t('admin.toggleVerification')), - ).not.toBeInTheDocument() - expect(getByText(t('admin.changePassword'))).toBeDisabled() - expect(getByText(t('admin.deleteUser'))).toBeDisabled() - }) + fireEvent.click(getByTitle('Table Mode')); + expect(queryByTitle(t('admin.changeEmail'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changeNickName'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changeScore'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument(); + expect( + queryByTitle(t('admin.toggleVerification')), + ).not.toBeInTheDocument(); + expect(getByText(t('admin.changePassword'))).toBeDisabled(); + expect(getByText(t('admin.deleteUser'))).toBeDisabled(); + }); - it('target user is normal administrator', async () => { - fetch.get.mockResolvedValue( - createPaginator([{ ...fixture, permission: UserPermission.Admin }]), - ) + it('target user is normal administrator', async () => { + fetch.get.mockResolvedValue( + createPaginator([{...fixture, permission: UserPermission.Admin}]), + ); - const { getByTitle, getByText, queryByText, queryByTitle } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.changeEmail'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changeNickName'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changePassword'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changeScore'))).not.toBeInTheDocument() - expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument() - expect(queryByText(t('admin.toggleVerification'))).not.toBeInTheDocument() - expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument() + const {getByTitle, getByText, queryByText, queryByTitle} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.changeEmail'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changeNickName'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changePassword'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changeScore'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.toggleVerification'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument(); - fireEvent.click(getByTitle('Table Mode')) - expect(queryByTitle(t('admin.changeEmail'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changeNickName'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changeScore'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument() - expect( - queryByTitle(t('admin.toggleVerification')), - ).not.toBeInTheDocument() - expect(getByText(t('admin.changePassword'))).toBeDisabled() - expect(getByText(t('admin.deleteUser'))).toBeDisabled() - }) - }) + fireEvent.click(getByTitle('Table Mode')); + expect(queryByTitle(t('admin.changeEmail'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changeNickName'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changeScore'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument(); + expect( + queryByTitle(t('admin.toggleVerification')), + ).not.toBeInTheDocument(); + expect(getByText(t('admin.changePassword'))).toBeDisabled(); + expect(getByText(t('admin.deleteUser'))).toBeDisabled(); + }); + }); - it('current user and target user are self', async () => { - const user = { - ...fixture, - permission: UserPermission.Admin, - } - window.blessing.extra = { currentUser: user } - fetch.get.mockResolvedValue(createPaginator([user])) + it('current user and target user are self', async () => { + const user = { + ...fixture, + permission: UserPermission.Admin, + }; + window.blessing.extra = {currentUser: user}; + fetch.get.mockResolvedValue(createPaginator([user])); - const { getByTitle, getByText, queryByText, queryByTitle } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.changeEmail'))).toBeInTheDocument() - expect(queryByText(t('admin.changeNickName'))).toBeInTheDocument() - expect(queryByText(t('admin.changePassword'))).toBeInTheDocument() - expect(queryByText(t('admin.changeScore'))).toBeInTheDocument() - expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument() - expect(queryByText(t('admin.toggleVerification'))).toBeInTheDocument() - expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument() + const {getByTitle, getByText, queryByText, queryByTitle} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.changeEmail'))).toBeInTheDocument(); + expect(queryByText(t('admin.changeNickName'))).toBeInTheDocument(); + expect(queryByText(t('admin.changePassword'))).toBeInTheDocument(); + expect(queryByText(t('admin.changeScore'))).toBeInTheDocument(); + expect(queryByText(t('admin.changePermission'))).not.toBeInTheDocument(); + expect(queryByText(t('admin.toggleVerification'))).toBeInTheDocument(); + expect(queryByText(t('admin.deleteUser'))).not.toBeInTheDocument(); - fireEvent.click(getByTitle('Table Mode')) - expect(queryByTitle(t('admin.changeEmail'))).toBeInTheDocument() - expect(queryByTitle(t('admin.changeNickName'))).toBeInTheDocument() - expect(queryByTitle(t('admin.changeScore'))).toBeInTheDocument() - expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument() - expect(queryByTitle(t('admin.toggleVerification'))).toBeInTheDocument() - expect(getByText(t('admin.changePassword'))).toBeEnabled() - expect(getByText(t('admin.deleteUser'))).toBeDisabled() - }) -}) + fireEvent.click(getByTitle('Table Mode')); + expect(queryByTitle(t('admin.changeEmail'))).toBeInTheDocument(); + expect(queryByTitle(t('admin.changeNickName'))).toBeInTheDocument(); + expect(queryByTitle(t('admin.changeScore'))).toBeInTheDocument(); + expect(queryByTitle(t('admin.changePermission'))).not.toBeInTheDocument(); + expect(queryByTitle(t('admin.toggleVerification'))).toBeInTheDocument(); + expect(getByText(t('admin.changePassword'))).toBeEnabled(); + expect(getByText(t('admin.deleteUser'))).toBeDisabled(); + }); +}); describe('update email', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('empty value', async () => { - const { getByText, getByDisplayValue, queryByText } = render( - , - ) + it('empty value', async () => { + const {getByText, getByDisplayValue, queryByText} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeEmail'))) - fireEvent.input(getByDisplayValue(fixture.email), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - expect(queryByText(t('auth.emptyEmail'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeEmail'))); + fireEvent.input(getByDisplayValue(fixture.email), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('general.confirm'))); + expect(queryByText(t('auth.emptyEmail'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.email)).toBeInTheDocument() - }) + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.email)).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeEmail'))) - fireEvent.input(getByDisplayValue(fixture.email), { - target: { value: 'd@e.f' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeEmail'))); + fireEvent.input(getByDisplayValue(fixture.email), { + target: {value: 'd@e.f'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.email(fixture.uid), { - email: 'd@e.f', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText('d@e.f')).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.email(fixture.uid), { + email: 'd@e.f', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText('d@e.f')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeEmail'))) - fireEvent.input(getByDisplayValue(fixture.email), { - target: { value: 'd@e.f' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeEmail'))); + fireEvent.input(getByDisplayValue(fixture.email), { + target: {value: 'd@e.f'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.email(fixture.uid), { - email: 'd@e.f', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.email)).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.email(fixture.uid), { + email: 'd@e.f', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.email)).toBeInTheDocument(); + }); +}); describe('update nickname', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('empty value', async () => { - const { getByText, getByDisplayValue, queryByText } = render( - , - ) + it('empty value', async () => { + const {getByText, getByDisplayValue, queryByText} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeNickName'))) - fireEvent.input(getByDisplayValue(fixture.nickname), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - expect(queryByText(t('auth.emptyNickname'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeNickName'))); + fireEvent.input(getByDisplayValue(fixture.nickname), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('general.confirm'))); + expect(queryByText(t('auth.emptyNickname'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.nickname)).toBeInTheDocument() - }) + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.nickname)).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeNickName'))) - fireEvent.input(getByDisplayValue(fixture.nickname), { - target: { value: 'kumiko' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeNickName'))); + fireEvent.input(getByDisplayValue(fixture.nickname), { + target: {value: 'kumiko'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.nickname(fixture.uid), { - nickname: 'kumiko', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText('kumiko')).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.nickname(fixture.uid), { + nickname: 'kumiko', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText('kumiko')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeNickName'))) - fireEvent.input(getByDisplayValue(fixture.nickname), { - target: { value: 'kumiko' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeNickName'))); + fireEvent.input(getByDisplayValue(fixture.nickname), { + target: {value: 'kumiko'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.nickname(fixture.uid), { - nickname: 'kumiko', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.nickname)).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.nickname(fixture.uid), { + nickname: 'kumiko', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.nickname)).toBeInTheDocument(); + }); +}); describe('update score', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() + it('cancelled', async () => { + const {getByText, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeScore'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.score.toString())).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeScore'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.score.toString())).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeScore'))) - fireEvent.input(getByDisplayValue(fixture.score.toString()), { - target: { value: '999' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeScore'))); + fireEvent.input(getByDisplayValue(fixture.score.toString()), { + target: {value: '999'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.score(fixture.uid), { - score: 999, - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText('999')).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.score(fixture.uid), { + score: 999, + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText('999')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, queryByText, queryByRole } = render( - , - ) + const {getByText, getByDisplayValue, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changeScore'))) - fireEvent.input(getByDisplayValue(fixture.score.toString()), { - target: { value: '999' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changeScore'))); + fireEvent.input(getByDisplayValue(fixture.score.toString()), { + target: {value: '999'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.score(fixture.uid), { - score: 999, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.score.toString())).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.score(fixture.uid), { + score: 999, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.score.toString())).toBeInTheDocument(); + }); +}); describe('update permission', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() + it('cancelled', async () => { + const {getByText, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePermission'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(t('admin.normal'))).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePermission'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(t('admin.normal'))).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByLabelText, queryByText, queryByRole } = render( - , - ) + const {getByText, getByLabelText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePermission'))) - fireEvent.click(getByLabelText(t('admin.banned'))) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePermission'))); + fireEvent.click(getByLabelText(t('admin.banned'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.users.permission(fixture.uid), - { - permission: UserPermission.Banned, - }, - ), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText(t('admin.banned'))).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.users.permission(fixture.uid), + { + permission: UserPermission.Banned, + }, + ); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText(t('admin.banned'))).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByLabelText, queryByText, queryByRole } = render( - , - ) + const {getByText, getByLabelText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePermission'))) - fireEvent.click(getByLabelText(t('admin.banned'))) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePermission'))); + fireEvent.click(getByLabelText(t('admin.banned'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.users.permission(fixture.uid), - { - permission: UserPermission.Banned, - }, - ), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(t('admin.normal'))).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.users.permission(fixture.uid), + { + permission: UserPermission.Banned, + }, + ); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(t('admin.normal'))).toBeInTheDocument(); + }); - it('set as administrator', async () => { - window.blessing.extra = { - currentUser: { - ...fixture, - uid: 2, - permission: UserPermission.SuperAdmin, - }, - } - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('set as administrator', async () => { + window.blessing.extra = { + currentUser: { + ...fixture, + uid: 2, + permission: UserPermission.SuperAdmin, + }, + }; + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByLabelText, queryByText, queryByRole } = render( - , - ) + const {getByText, getByLabelText, queryByText, queryByRole} = render( + , + ); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePermission'))) - fireEvent.click(getByLabelText(t('admin.admin'))) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePermission'))); + fireEvent.click(getByLabelText(t('admin.admin'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.users.permission(fixture.uid), - { - permission: UserPermission.Admin, - }, - ), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText(t('admin.admin'))).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.users.permission(fixture.uid), + { + permission: UserPermission.Admin, + }, + ); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText(t('admin.admin'))).toBeInTheDocument(); + }); +}); describe('toggle verification', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, queryByText, queryByRole } = render() + const {getByText, queryByText, queryByRole} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.toggleVerification'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.toggleVerification'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.users.verification(fixture.uid), - ), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText(t('admin.unverified'))).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.users.verification(fixture.uid), + ); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText(t('admin.unverified'))).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, queryByText, queryByRole } = render() + const {getByText, queryByText, queryByRole} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.toggleVerification'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.toggleVerification'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.admin.users.verification(fixture.uid), - ), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(t('admin.verified'))).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.admin.users.verification(fixture.uid), + ); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(t('admin.verified'))).toBeInTheDocument(); + }); +}); describe('update password', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() + it('cancelled', async () => { + const {getByText, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePassword'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.score.toString())).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePassword'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.score.toString())).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByPlaceholderText, queryByText, queryByRole } = - render() + const {getByText, getByPlaceholderText, queryByText, queryByRole} + = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePassword'))) - fireEvent.input(getByPlaceholderText(t('admin.changePassword')), { - target: { value: '123' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePassword'))); + fireEvent.input(getByPlaceholderText(t('admin.changePassword')), { + target: {value: '123'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.password(fixture.uid), { - password: '123', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - }) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.password(fixture.uid), { + password: '123', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByPlaceholderText, queryByText, queryByRole } = - render() + const {getByText, getByPlaceholderText, queryByText, queryByRole} + = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.changePassword'))) - fireEvent.input(getByPlaceholderText(t('admin.changePassword')), { - target: { value: '123' }, - }) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.changePassword'))); + fireEvent.input(getByPlaceholderText(t('admin.changePassword')), { + target: {value: '123'}, + }); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.admin.users.password(fixture.uid), { - password: '123', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - }) -}) + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.admin.users.password(fixture.uid), { + password: '123', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + }); +}); describe('delete user', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() + it('cancelled', async () => { + const {getByText, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.deleteUser'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.del).not.toBeCalled() - expect(queryByText(fixture.email)).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.deleteUser'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.del).not.toBeCalled(); + expect(queryByText(fixture.email)).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, queryByText, queryByRole } = render() + const {getByText, queryByText, queryByRole} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.deleteUser'))) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.deleteUser'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.admin.users.delete(fixture.uid)), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText(fixture.email)).not.toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.admin.users.delete(fixture.uid)); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText(fixture.email)).not.toBeInTheDocument(); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, queryByText, queryByRole } = render() + const {getByText, queryByText, queryByRole} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('admin.deleteUser'))) - fireEvent.click(getByText(t('general.confirm'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('admin.deleteUser'))); + fireEvent.click(getByText(t('general.confirm'))); - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.admin.users.delete(fixture.uid)), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.email)).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.admin.users.delete(fixture.uid)); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.email)).toBeInTheDocument(); + }); +}); describe('table mode', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixture])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixture])); + }); - it('large screen', async () => { - Object.assign(window, { innerWidth: 1024 }) + it('large screen', async () => { + Object.assign(window, {innerWidth: 1024}); - const { queryByText } = render() + const {queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(t('admin.operationsTitle'))).toBeInTheDocument() + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(t('admin.operationsTitle'))).toBeInTheDocument(); - Object.assign(window, { innerWidth: 500 }) - }) + Object.assign(window, {innerWidth: 500}); + }); - it('update email', async () => { - const { getByText, getByTitle, queryByText } = render() + it('update email', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByTitle(t('admin.changeEmail'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.email)).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByTitle(t('admin.changeEmail'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.email)).toBeInTheDocument(); + }); - it('update nickname', async () => { - const { getByText, getByTitle, queryByText } = render() + it('update nickname', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByTitle(t('admin.changeNickName'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.nickname)).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByTitle(t('admin.changeNickName'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.nickname)).toBeInTheDocument(); + }); - it('update score', async () => { - const { getByText, getByTitle, queryByText } = render() + it('update score', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByTitle(t('admin.changeScore'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.score.toString())).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByTitle(t('admin.changeScore'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.score.toString())).toBeInTheDocument(); + }); - it('update permission', async () => { - const { getByText, getByTitle, queryByText } = render() + it('update permission', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByTitle(t('admin.changePermission'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(t('admin.normal'))).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByTitle(t('admin.changePermission'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(t('admin.normal'))).toBeInTheDocument(); + }); - it('toggle verification', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('toggle verification', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByTitle, queryByText, queryByRole } = render() + const {getByTitle, queryByText, queryByRole} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByTitle(t('admin.toggleVerification'))) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByTitle(t('admin.toggleVerification'))); - await waitFor(() => expect(fetch.put).toBeCalled()) - expect(queryByText('ok')).toBeInTheDocument() - expect(queryByRole('status')).toHaveClass('alert-success') - expect(queryByText(t('admin.unverified'))).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.put).toBeCalled(); + }); + expect(queryByText('ok')).toBeInTheDocument(); + expect(queryByRole('status')).toHaveClass('alert-success'); + expect(queryByText(t('admin.unverified'))).toBeInTheDocument(); + }); - it('update password', async () => { - const { getByText, getByTitle, queryByText } = render() + it('update password', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByText(t('admin.changePassword'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.put).not.toBeCalled() - expect(queryByText(fixture.score.toString())).toBeInTheDocument() - }) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByText(t('admin.changePassword'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.put).not.toBeCalled(); + expect(queryByText(fixture.score.toString())).toBeInTheDocument(); + }); - it('delete user', async () => { - const { getByText, getByTitle, queryByText } = render() + it('delete user', async () => { + const {getByText, getByTitle, queryByText} = render(); - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle('Table Mode')) - fireEvent.click(getByText(t('admin.deleteUser'))) - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.del).not.toBeCalled() - expect(queryByText(fixture.email)).toBeInTheDocument() - }) -}) + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle('Table Mode')); + fireEvent.click(getByText(t('admin.deleteUser'))); + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.del).not.toBeCalled(); + expect(queryByText(fixture.email)).toBeInTheDocument(); + }); +}); diff --git a/resources/assets/tests/views/auth/Forgot.test.tsx b/resources/assets/tests/views/auth/Forgot.test.tsx index cabf0c92..92914300 100644 --- a/resources/assets/tests/views/auth/Forgot.test.tsx +++ b/resources/assets/tests/views/auth/Forgot.test.tsx @@ -1,52 +1,54 @@ -import { expect, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import urls from '@/scripts/urls' -import Forgot from '@/views/auth/Forgot' +import {expect, vi, it} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import urls from '@/scripts/urls'; +import Forgot from '@/views/auth/Forgot'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); describe('submit', () => { - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByPlaceholderText, getByText, queryByText } = render() + const {getByPlaceholderText, getByText, queryByText} = render(); - fireEvent.input(getByPlaceholderText(t('auth.email')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'abc' }, - }) - fireEvent.click(getByText(t('auth.send'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.forgot(), { - email: 'a@b.c', - captcha: 'abc', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - }) + fireEvent.input(getByPlaceholderText(t('auth.email')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'abc'}, + }); + fireEvent.click(getByText(t('auth.send'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.forgot(), { + email: 'a@b.c', + captcha: 'abc', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByPlaceholderText, getByText, queryByText } = render() + const {getByPlaceholderText, getByText, queryByText} = render(); - fireEvent.input(getByPlaceholderText(t('auth.email')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'abc' }, - }) - fireEvent.click(getByText(t('auth.send'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.forgot(), { - email: 'a@b.c', - captcha: 'abc', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - }) -}) + fireEvent.input(getByPlaceholderText(t('auth.email')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'abc'}, + }); + fireEvent.click(getByText(t('auth.send'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.forgot(), { + email: 'a@b.c', + captcha: 'abc', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + }); +}); diff --git a/resources/assets/tests/views/auth/Login.test.tsx b/resources/assets/tests/views/auth/Login.test.tsx index 036eb3d9..59b3388d 100644 --- a/resources/assets/tests/views/auth/Login.test.tsx +++ b/resources/assets/tests/views/auth/Login.test.tsx @@ -1,194 +1,203 @@ -import { expect, test, vi, it } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import urls from '@/scripts/urls' -import Login from '@/views/auth/Login' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import urls from '@/scripts/urls'; +import Login from '@/views/auth/Login'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); beforeEach(() => { - window.blessing.extra = { tooManyFails: false } -}) + window.blessing.extra = {tooManyFails: false}; +}); test('show captcha if too many login fails', () => { - window.blessing.extra = { tooManyFails: true } - const { queryByAltText } = render() - expect(queryByAltText(t('auth.captcha'))).toBeInTheDocument() -}) + window.blessing.extra = {tooManyFails: true}; + const {queryByAltText} = render(); + expect(queryByAltText(t('auth.captcha'))).toBeInTheDocument(); +}); describe('submit form', () => { - it('succeeded', async () => { - fetch.post.mockResolvedValue({ - code: 0, - message: 'ok', - data: { redirectTo: '/user' }, - }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({ + code: 0, + message: 'ok', + data: {redirectTo: '/user'}, + }); - const { getByPlaceholderText, getByText } = render() - fireEvent.input(getByPlaceholderText(t('auth.identification')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.click(getByText(t('auth.login'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.login(), { - identification: 'a@b.c', - password: 'password', - keep: false, - }), - ) - }) + const {getByPlaceholderText, getByText} = render(); + fireEvent.input(getByPlaceholderText(t('auth.identification')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.click(getByText(t('auth.login'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.login(), { + identification: 'a@b.c', + password: 'password', + keep: false, + }); + }, + ); + }); - it('remember me', async () => { - fetch.post.mockResolvedValue({ - code: 0, - message: 'ok', - data: { redirectTo: '/user' }, - }) + it('remember me', async () => { + fetch.post.mockResolvedValue({ + code: 0, + message: 'ok', + data: {redirectTo: '/user'}, + }); - const { getByPlaceholderText, getByText, getByLabelText } = render( - , - ) - fireEvent.input(getByPlaceholderText(t('auth.identification')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.click(getByLabelText(t('auth.keep'))) - fireEvent.click(getByText(t('auth.login'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.login(), { - identification: 'a@b.c', - password: 'password', - keep: true, - }), - ) - }) + const {getByPlaceholderText, getByText, getByLabelText} = render( + , + ); + fireEvent.input(getByPlaceholderText(t('auth.identification')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.click(getByLabelText(t('auth.keep'))); + fireEvent.click(getByText(t('auth.login'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.login(), { + identification: 'a@b.c', + password: 'password', + keep: true, + }); + }, + ); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { login_fails: 1 }, - }) + it('failed', async () => { + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {login_fails: 1}, + }); - const { getByPlaceholderText, getByText, queryByText } = render() - fireEvent.input(getByPlaceholderText(t('auth.identification')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.click(getByText(t('auth.login'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.login(), { - identification: 'a@b.c', - password: 'password', - keep: false, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - }) + const {getByPlaceholderText, getByText, queryByText} = render(); + fireEvent.input(getByPlaceholderText(t('auth.identification')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.click(getByText(t('auth.login'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.login(), { + identification: 'a@b.c', + password: 'password', + keep: false, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + }); - it('too many fails', async () => { - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { login_fails: 4 }, - }) + it('too many fails', async () => { + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {login_fails: 4}, + }); - const { getByPlaceholderText, getByText, queryByText, queryByAltText } = - render() - fireEvent.input(getByPlaceholderText(t('auth.identification')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.click(getByText(t('auth.login'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.login(), { - identification: 'a@b.c', - password: 'password', - keep: false, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByText(t('auth.tooManyFails.captcha'))).toBeInTheDocument() - expect(queryByAltText(t('auth.captcha'))).toBeInTheDocument() + const {getByPlaceholderText, getByText, queryByText, queryByAltText} + = render(); + fireEvent.input(getByPlaceholderText(t('auth.identification')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.click(getByText(t('auth.login'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.login(), { + identification: 'a@b.c', + password: 'password', + keep: false, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByText(t('auth.tooManyFails.captcha'))).toBeInTheDocument(); + expect(queryByAltText(t('auth.captcha'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.confirm'))) - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'captcha' }, - }) - fireEvent.click(getByText(t('auth.login'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.login(), { - identification: 'a@b.c', - password: 'password', - keep: false, - captcha: 'captcha', - }), - ) - }) + fireEvent.click(getByText(t('general.confirm'))); + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'captcha'}, + }); + fireEvent.click(getByText(t('auth.login'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.login(), { + identification: 'a@b.c', + password: 'password', + keep: false, + captcha: 'captcha', + }); + }, + ); + }); - it('too many fails with normal recaptcha', async () => { - window.blessing.extra.recaptcha = 'sitekey' - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { login_fails: 4 }, - }) + it('too many fails with normal recaptcha', async () => { + window.blessing.extra.recaptcha = 'sitekey'; + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {login_fails: 4}, + }); - const { getByPlaceholderText, getByText, queryByText } = render() - fireEvent.input(getByPlaceholderText(t('auth.identification')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.click(getByText(t('auth.login'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.login(), { - identification: 'a@b.c', - password: 'password', - keep: false, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - }) + const {getByPlaceholderText, getByText, queryByText} = render(); + fireEvent.input(getByPlaceholderText(t('auth.identification')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.click(getByText(t('auth.login'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.login(), { + identification: 'a@b.c', + password: 'password', + keep: false, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + }); - it('too many fails with invisible recaptcha', async () => { - window.blessing.extra.recaptcha = 'sitekey' - window.blessing.extra.invisible = true - fetch.post.mockResolvedValue({ - code: 1, - message: 'failed', - data: { login_fails: 4 }, - }) + it('too many fails with invisible recaptcha', async () => { + window.blessing.extra.recaptcha = 'sitekey'; + window.blessing.extra.invisible = true; + fetch.post.mockResolvedValue({ + code: 1, + message: 'failed', + data: {login_fails: 4}, + }); - const { getByPlaceholderText, getByText, queryByText } = render() - fireEvent.input(getByPlaceholderText(t('auth.identification')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.click(getByText(t('auth.login'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.login(), { - identification: 'a@b.c', - password: 'password', - keep: false, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(queryByText(t('auth.tooManyFails.recaptcha'))).toBeInTheDocument() + const {getByPlaceholderText, getByText, queryByText} = render(); + fireEvent.input(getByPlaceholderText(t('auth.identification')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.click(getByText(t('auth.login'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.login(), { + identification: 'a@b.c', + password: 'password', + keep: false, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(queryByText(t('auth.tooManyFails.recaptcha'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.confirm'))) - }) -}) + fireEvent.click(getByText(t('general.confirm'))); + }); +}); diff --git a/resources/assets/tests/views/auth/Registration.test.tsx b/resources/assets/tests/views/auth/Registration.test.tsx index 0c43cb23..f17a2c30 100644 --- a/resources/assets/tests/views/auth/Registration.test.tsx +++ b/resources/assets/tests/views/auth/Registration.test.tsx @@ -1,140 +1,143 @@ -import { expect, test, jest } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import urls from '@/scripts/urls' -import Registration from '@/views/auth/Registration' +import {expect, test, jest} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import urls from '@/scripts/urls'; +import Registration from '@/views/auth/Registration'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); beforeEach(() => { - window.blessing.extra = { player: false } -}) + window.blessing.extra = {player: false}; +}); test('confirmation is not matched', () => { - const { getByText, getByPlaceholderText, queryByText } = render( - , - ) + const {getByText, getByPlaceholderText, queryByText} = render( + , + ); - fireEvent.input(getByPlaceholderText(t('auth.email')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { - target: { value: 'password1' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.nickname')), { - target: { value: 't' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'a' }, - }) - fireEvent.click(getByText(t('auth.register'))) + fireEvent.input(getByPlaceholderText(t('auth.email')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { + target: {value: 'password1'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.nickname')), { + target: {value: 't'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'a'}, + }); + fireEvent.click(getByText(t('auth.register'))); - expect(queryByText(t('auth.invalidConfirmPwd'))).toBeInTheDocument() - expect(fetch.post).not.toBeCalled() -}) + expect(queryByText(t('auth.invalidConfirmPwd'))).toBeInTheDocument(); + expect(fetch.post).not.toBeCalled(); +}); test('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const { getByText, getByPlaceholderText, getByRole, queryByText } = render( - , - ) + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const {getByText, getByPlaceholderText, getByRole, queryByText} = render( + , + ); - fireEvent.input(getByPlaceholderText(t('auth.email')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.nickname')), { - target: { value: 't' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'a' }, - }) - fireEvent.click(getByText(t('auth.register'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.register(), { - email: 'a@b.c', - password: 'password', - nickname: 't', - captcha: 'a', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - vi.runAllTimers() -}) + fireEvent.input(getByPlaceholderText(t('auth.email')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.nickname')), { + target: {value: 't'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'a'}, + }); + fireEvent.click(getByText(t('auth.register'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.register(), { + email: 'a@b.c', + password: 'password', + nickname: 't', + captcha: 'a', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + vi.runAllTimers(); +}); test('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) - const { getByText, getByPlaceholderText, queryByText } = render( - , - ) + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); + const {getByText, getByPlaceholderText, queryByText} = render( + , + ); - fireEvent.input(getByPlaceholderText(t('auth.email')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.nickname')), { - target: { value: 't' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'a' }, - }) - fireEvent.click(getByText(t('auth.register'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.register(), { - email: 'a@b.c', - password: 'password', - nickname: 't', - captcha: 'a', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() -}) + fireEvent.input(getByPlaceholderText(t('auth.email')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.nickname')), { + target: {value: 't'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'a'}, + }); + fireEvent.click(getByText(t('auth.register'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.register(), { + email: 'a@b.c', + password: 'password', + nickname: 't', + captcha: 'a', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); +}); test('register with new player', async () => { - window.blessing.extra = { player: true } - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const { getByText, getByPlaceholderText, queryByText } = render( - , - ) + window.blessing.extra = {player: true}; + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const {getByText, getByPlaceholderText, queryByText} = render( + , + ); - fireEvent.input(getByPlaceholderText(t('auth.email')), { - target: { value: 'a@b.c' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.player-name')), { - target: { value: 'player' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.captcha')), { - target: { value: 'a' }, - }) - fireEvent.click(getByText(t('auth.register'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.auth.register(), { - email: 'a@b.c', - password: 'password', - player_name: 'player', - captcha: 'a', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() -}) + fireEvent.input(getByPlaceholderText(t('auth.email')), { + target: {value: 'a@b.c'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.player-name')), { + target: {value: 'player'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.captcha')), { + target: {value: 'a'}, + }); + fireEvent.click(getByText(t('auth.register'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.auth.register(), { + email: 'a@b.c', + password: 'password', + player_name: 'player', + captcha: 'a', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); +}); diff --git a/resources/assets/tests/views/auth/Reset.test.tsx b/resources/assets/tests/views/auth/Reset.test.tsx index eb5b52e9..62f64ac3 100644 --- a/resources/assets/tests/views/auth/Reset.test.tsx +++ b/resources/assets/tests/views/auth/Reset.test.tsx @@ -1,66 +1,68 @@ -import { expect, test, jest } from 'vitest' -import { render, waitFor, fireEvent } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import Reset from '@/views/auth/Reset' +import {expect, test, jest} from 'vitest'; +import {render, waitFor, fireEvent} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import Reset from '@/views/auth/Reset'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); test('confirmation is not matched', () => { - const { getByText, getByPlaceholderText, queryByText } = render() + const {getByText, getByPlaceholderText, queryByText} = render(); - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { - target: { value: 'password1' }, - }) - fireEvent.click(getByText(t('auth.reset'))) + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { + target: {value: 'password1'}, + }); + fireEvent.click(getByText(t('auth.reset'))); - expect(queryByText(t('auth.invalidConfirmPwd'))).toBeInTheDocument() - expect(fetch.post).not.toBeCalled() -}) + expect(queryByText(t('auth.invalidConfirmPwd'))).toBeInTheDocument(); + expect(fetch.post).not.toBeCalled(); +}); test('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) - const { getByText, getByPlaceholderText, getByRole, queryByText } = render( - , - ) + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); + const {getByText, getByPlaceholderText, getByRole, queryByText} = render( + , + ); - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { - target: { value: 'password' }, - }) - fireEvent.click(getByText(t('auth.reset'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith( - location.href.replace(blessing.base_url, ''), - { password: 'password' }, - ), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - vi.runAllTimers() -}) + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { + target: {value: 'password'}, + }); + fireEvent.click(getByText(t('auth.reset'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith( + location.href.replace(blessing.base_url, ''), + {password: 'password'}, + ); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + vi.runAllTimers(); +}); test('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) - const { getByText, getByPlaceholderText, queryByText } = render() + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); + const {getByText, getByPlaceholderText, queryByText} = render(); - fireEvent.input(getByPlaceholderText(t('auth.password')), { - target: { value: 'password' }, - }) - fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { - target: { value: 'password' }, - }) - fireEvent.click(getByText(t('auth.reset'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith( - location.href.replace(blessing.base_url, ''), - { password: 'password' }, - ), - ) - expect(queryByText('failed')).toBeInTheDocument() -}) + fireEvent.input(getByPlaceholderText(t('auth.password')), { + target: {value: 'password'}, + }); + fireEvent.input(getByPlaceholderText(t('auth.repeat-pwd')), { + target: {value: 'password'}, + }); + fireEvent.click(getByText(t('auth.reset'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith( + location.href.replace(blessing.base_url, ''), + {password: 'password'}, + ); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); +}); diff --git a/resources/assets/tests/views/skinlib/Show.test.tsx b/resources/assets/tests/views/skinlib/Show.test.tsx index 622b6b0a..c7c1cc80 100644 --- a/resources/assets/tests/views/skinlib/Show.test.tsx +++ b/resources/assets/tests/views/skinlib/Show.test.tsx @@ -1,659 +1,755 @@ -import { expect, test, vi, it } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import { type Texture, TextureType } from '@/scripts/types' -import urls from '@/scripts/urls' -import Show, { type Badge } from '@/views/skinlib/Show' +import { + expect, test, vi, it, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import {type Texture, TextureType} from '@/scripts/types'; +import urls from '@/scripts/urls'; +import Show, {type Badge} from '@/views/skinlib/Show'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixtureSkin: Readonly = Object.freeze({ - tid: 1, - name: 'skin', - type: TextureType.Steve, - hash: 'abc', - size: 2, - uploader: 1, - public: true, - upload_at: new Date().toString(), - likes: 1, -}) + tid: 1, + name: 'skin', + type: TextureType.Steve, + hash: 'abc', + size: 2, + uploader: 1, + public: true, + upload_at: new Date().toString(), + likes: 1, +}); const fixtureCape: Readonly = Object.freeze({ - tid: 2, - name: 'cape', - type: TextureType.Cape, - hash: 'def', - size: 2, - uploader: 1, - public: true, - upload_at: new Date().toString(), - likes: 1, -}) + tid: 2, + name: 'cape', + type: TextureType.Cape, + hash: 'def', + size: 2, + uploader: 1, + public: true, + upload_at: new Date().toString(), + likes: 1, +}); beforeEach(() => { - const container = document.createElement('div') - container.id = 'previewer' - document.body.appendChild(container) + const container = document.createElement('div'); + container.id = 'previewer'; + document.body.append(container); - window.blessing.extra = { - download: true, - currentUid: 0, - admin: false, - uploaderExists: true, - nickname: 'author', - inCloset: false, - report: 0, - badges: [], - } -}) + window.blessing.extra = { + download: true, + currentUid: 0, + admin: false, + uploaderExists: true, + nickname: 'author', + inCloset: false, + report: 0, + badges: [], + }; +}); afterEach(() => { - document.querySelector('#previewer')!.remove() -}) + document.querySelector('#previewer')!.remove(); +}); test('without authenticated', async () => { - fetch.get.mockResolvedValue(fixtureSkin) + fetch.get.mockResolvedValue(fixtureSkin); - const { queryByText, queryByTitle } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {queryByText, queryByTitle} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(queryByText(fixtureSkin.name)).toBeInTheDocument() - expect(queryByText('steve')).toBeInTheDocument() - expect(queryByText(`${fixtureSkin.size} KB`)).toBeInTheDocument() - expect(queryByText(fixtureSkin.hash)).toBeInTheDocument() - expect(queryByText(window.blessing.extra.nickname as string)).toHaveAttribute( - 'href', - `/skinlib?filter=skin&uploader=${fixtureSkin.uploader}`, - ) - expect(queryByTitle(t('skinlib.show.edit'))).not.toBeInTheDocument() - expect(queryByText(t('skinlib.addToCloset'))).toBeDisabled() -}) + expect(queryByText(fixtureSkin.name)).toBeInTheDocument(); + expect(queryByText('steve')).toBeInTheDocument(); + expect(queryByText(`${fixtureSkin.size} KB`)).toBeInTheDocument(); + expect(queryByText(fixtureSkin.hash)).toBeInTheDocument(); + expect(queryByText(window.blessing.extra.nickname as string)).toHaveAttribute( + 'href', + `/skinlib?filter=skin&uploader=${fixtureSkin.uploader}`, + ); + expect(queryByTitle(t('skinlib.show.edit'))).not.toBeInTheDocument(); + expect(queryByText(t('skinlib.addToCloset'))).toBeDisabled(); +}); test('authenticated but not uploader', async () => { - fetch.get.mockResolvedValue(fixtureCape) + fetch.get.mockResolvedValue(fixtureCape); - const { queryByText, queryByTitle } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {queryByText, queryByTitle} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(queryByText(fixtureCape.name)).toBeInTheDocument() - expect(queryByText(t('general.cape'))).toBeInTheDocument() - expect(queryByText(`${fixtureCape.size} KB`)).toBeInTheDocument() - expect(queryByText(fixtureCape.hash)).toBeInTheDocument() - expect(queryByText(window.blessing.extra.nickname as string)).toHaveAttribute( - 'href', - `/skinlib?filter=cape&uploader=${fixtureCape.uploader}`, - ) - expect(queryByTitle(t('skinlib.show.edit'))).not.toBeInTheDocument() - expect(queryByText(t('user.setAsAvatar'))).not.toBeInTheDocument() -}) + expect(queryByText(fixtureCape.name)).toBeInTheDocument(); + expect(queryByText(t('general.cape'))).toBeInTheDocument(); + expect(queryByText(`${fixtureCape.size} KB`)).toBeInTheDocument(); + expect(queryByText(fixtureCape.hash)).toBeInTheDocument(); + expect(queryByText(window.blessing.extra.nickname as string)).toHaveAttribute( + 'href', + `/skinlib?filter=cape&uploader=${fixtureCape.uploader}`, + ); + expect(queryByTitle(t('skinlib.show.edit'))).not.toBeInTheDocument(); + expect(queryByText(t('user.setAsAvatar'))).not.toBeInTheDocument(); +}); test('uploader is not existed', async () => { - window.blessing.extra.nickname = 'not existed' - window.blessing.extra.uploaderExists = false - fetch.get.mockResolvedValue(fixtureSkin) + window.blessing.extra.nickname = 'not existed'; + window.blessing.extra.uploaderExists = false; + fetch.get.mockResolvedValue(fixtureSkin); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(queryByText('not existed')).toBeInTheDocument() -}) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(queryByText('not existed')).toBeInTheDocument(); +}); test('badges', async () => { - window.blessing.extra.badges = [ - { text: 'STAFF', color: 'primary' }, - ] as Badge[] - fetch.get.mockResolvedValue(fixtureSkin) + window.blessing.extra.badges = [ + {text: 'STAFF', color: 'primary'}, + ] as Badge[]; + fetch.get.mockResolvedValue(fixtureSkin); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(queryByText('STAFF')).toBeInTheDocument() -}) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(queryByText('STAFF')).toBeInTheDocument(); +}); test('apply to player', async () => { - window.blessing.extra.currentUid = 2 - window.blessing.extra.inCloset = true - fetch.get.mockResolvedValueOnce(fixtureSkin).mockResolvedValueOnce([]) + window.blessing.extra.currentUid = 2; + window.blessing.extra.inCloset = true; + fetch.get.mockResolvedValueOnce(fixtureSkin).mockResolvedValueOnce([]); - const { getByText, getByLabelText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByLabelText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.apply'))) - fireEvent.click(getByLabelText('Close')) + fireEvent.click(getByText(t('skinlib.apply'))); + fireEvent.click(getByLabelText('Close')); - expect(fetch.get).toBeCalledTimes(2) -}) + expect(fetch.get).toBeCalledTimes(2); +}); test('set as avatar', async () => { - window.blessing.extra.currentUid = fixtureSkin.uploader + 1 - fetch.get.mockResolvedValue(fixtureSkin) - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + window.blessing.extra.currentUid = fixtureSkin.uploader + 1; + fetch.get.mockResolvedValue(fixtureSkin); + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.setAsAvatar'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.post).toBeCalledTimes(1)) + fireEvent.click(getByText(t('user.setAsAvatar'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledTimes(1); + }); - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') -}) + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); +}); describe('download texture', () => { - beforeEach(() => { - window.blessing.extra.currentUid = fixtureSkin.uploader + 1 - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + window.blessing.extra.currentUid = fixtureSkin.uploader + 1; + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('allowed', async () => { - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('allowed', async () => { + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.show.download'))) - }) + fireEvent.click(getByText(t('skinlib.show.download'))); + }); - it('not allowed', async () => { - window.blessing.extra.download = false - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('not allowed', async () => { + window.blessing.extra.download = false; + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(queryByText(t('skinlib.show.download'))).not.toBeInTheDocument() - }) -}) + expect(queryByText(t('skinlib.show.download'))).not.toBeInTheDocument(); + }); +}); describe('operation panel', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('uploader', async () => { - window.blessing.extra.currentUid = fixtureSkin.uploader + it('uploader', async () => { + window.blessing.extra.currentUid = fixtureSkin.uploader; - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(queryByText(t('skinlib.show.manage-notice'))).toBeInTheDocument() - }) + expect(queryByText(t('skinlib.show.manage-notice'))).toBeInTheDocument(); + }); - it('administrator', async () => { - window.blessing.extra.currentUid = fixtureSkin.uploader + 1 - window.blessing.extra.admin = true + it('administrator', async () => { + window.blessing.extra.currentUid = fixtureSkin.uploader + 1; + window.blessing.extra.admin = true; - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(queryByText(t('skinlib.show.manage-notice'))).toBeInTheDocument() - }) -}) + expect(queryByText(t('skinlib.show.manage-notice'))).toBeInTheDocument(); + }); +}); describe('edit texture name', () => { - beforeEach(() => { - window.blessing.extra.currentUid = fixtureSkin.uploader - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + window.blessing.extra.currentUid = fixtureSkin.uploader; + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('cancelled', async () => { - const { getByText, getAllByTitle, getByDisplayValue, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, getAllByTitle, getByDisplayValue, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[0]!) - fireEvent.input(getByDisplayValue(fixtureSkin.name), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - expect(queryByText(t('skinlib.emptyNewTextureName'))).toBeInTheDocument() + fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[0]); + fireEvent.input(getByDisplayValue(fixtureSkin.name), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('general.confirm'))); + expect(queryByText(t('skinlib.emptyNewTextureName'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText(fixtureSkin.name)).toBeInTheDocument() - }) + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText(fixtureSkin.name)).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { - getByText, - getAllByTitle, - getByDisplayValue, - getByRole, - queryByText, - } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const { + getByText, + getAllByTitle, + getByDisplayValue, + getByRole, + queryByText, + } = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[0]!) - fireEvent.input(getByDisplayValue(fixtureSkin.name), { - target: { value: 't' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.name(fixtureSkin.tid), { - name: 't', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText('t')).toBeInTheDocument() - }) + fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[0]); + fireEvent.input(getByDisplayValue(fixtureSkin.name), { + target: {value: 't'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.name(fixtureSkin.tid), { + name: 't', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText('t')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { - getByText, - getAllByTitle, - getByDisplayValue, - getByRole, - queryByText, - } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const { + getByText, + getAllByTitle, + getByDisplayValue, + getByRole, + queryByText, + } = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[0]!) - fireEvent.input(getByDisplayValue(fixtureSkin.name), { - target: { value: 't' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.name(fixtureSkin.tid), { - name: 't', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixtureSkin.name)).toBeInTheDocument() - }) -}) + fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[0]); + fireEvent.input(getByDisplayValue(fixtureSkin.name), { + target: {value: 't'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.name(fixtureSkin.tid), { + name: 't', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixtureSkin.name)).toBeInTheDocument(); + }); +}); describe('edit texture type', () => { - beforeEach(() => { - Object.assign(window.blessing.extra, { currentUid: fixtureSkin.uploader }) - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + Object.assign(window.blessing.extra, {currentUid: fixtureSkin.uploader}); + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('cancelled', async () => { - const { getByText, getAllByTitle, getByLabelText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, getAllByTitle, getByLabelText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[1]!) - fireEvent.click(getByLabelText('Alex')) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText('steve')).toBeInTheDocument() - }) + fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[1]); + fireEvent.click(getByLabelText('Alex')); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText('steve')).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getAllByTitle, getByLabelText, getByRole, queryByText } = - render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getAllByTitle, getByLabelText, getByRole, queryByText} + = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[1]!) - fireEvent.click(getByLabelText('Alex')) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.type(fixtureSkin.tid), { - type: 'alex', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText('alex')).toBeInTheDocument() - }) + fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[1]); + fireEvent.click(getByLabelText('Alex')); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.type(fixtureSkin.tid), { + type: 'alex', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText('alex')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getAllByTitle, getByLabelText, getByRole, queryByText } = - render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getAllByTitle, getByLabelText, getByRole, queryByText} + = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[1]!) - fireEvent.click(getByLabelText('Alex')) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.type(fixtureSkin.tid), { - type: 'alex', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText('steve')).toBeInTheDocument() - }) -}) + fireEvent.click(getAllByTitle(t('skinlib.show.edit'))[1]); + fireEvent.click(getByLabelText('Alex')); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.type(fixtureSkin.tid), { + type: 'alex', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText('steve')).toBeInTheDocument(); + }); +}); describe('add to closet', () => { - beforeEach(() => { - window.blessing.extra.currentUid = fixtureSkin.uploader + 1 - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + window.blessing.extra.currentUid = fixtureSkin.uploader + 1; + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('cancelled', async () => { - const { getByText, getByDisplayValue, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, getByDisplayValue, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.addToCloset'))) - fireEvent.input(getByDisplayValue(fixtureSkin.name), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - expect(queryByText(t('skinlib.emptyItemName'))).toBeInTheDocument() + fireEvent.click(getByText(t('skinlib.addToCloset'))); + fireEvent.input(getByDisplayValue(fixtureSkin.name), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('general.confirm'))); + expect(queryByText(t('skinlib.emptyItemName'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.post).not.toBeCalled()) - }) + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.post).not.toBeCalled(); + }); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByDisplayValue, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByDisplayValue, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.addToCloset'))) - fireEvent.input(getByDisplayValue(fixtureSkin.name), { - target: { value: 't' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.user.closet.add(), { - tid: fixtureSkin.tid, - name: 't', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText('2')).toBeInTheDocument() - }) + fireEvent.click(getByText(t('skinlib.addToCloset'))); + fireEvent.input(getByDisplayValue(fixtureSkin.name), { + target: {value: 't'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.closet.add(), { + tid: fixtureSkin.tid, + name: 't', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText('2')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByDisplayValue, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.addToCloset'))) - fireEvent.input(getByDisplayValue(fixtureSkin.name), { - target: { value: 't' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.user.closet.add(), { - tid: fixtureSkin.tid, - name: 't', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText('1')).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('skinlib.addToCloset'))); + fireEvent.input(getByDisplayValue(fixtureSkin.name), { + target: {value: 't'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.closet.add(), { + tid: fixtureSkin.tid, + name: 't', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText('1')).toBeInTheDocument(); + }); +}); describe('remove from closet', () => { - beforeEach(() => { - window.blessing.extra.currentUid = fixtureSkin.uploader + 1 - window.blessing.extra.inCloset = true - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + window.blessing.extra.currentUid = fixtureSkin.uploader + 1; + window.blessing.extra.inCloset = true; + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.removeFromCloset'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(`/user/closet/${fixtureSkin.tid}`), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText('0')).toBeInTheDocument() - }) + fireEvent.click(getByText(t('skinlib.removeFromCloset'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(`/user/closet/${fixtureSkin.tid}`); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText('0')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.removeFromCloset'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(`/user/closet/${fixtureSkin.tid}`), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText('1')).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('skinlib.removeFromCloset'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(`/user/closet/${fixtureSkin.tid}`); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText('1')).toBeInTheDocument(); + }); +}); describe('report texture', () => { - beforeEach(() => { - window.blessing.extra.currentUid = fixtureSkin.uploader + 1 - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + window.blessing.extra.currentUid = fixtureSkin.uploader + 1; + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('positive score', async () => { - window.blessing.extra.report = 5 + it('positive score', async () => { + window.blessing.extra.report = 5; - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.report.title'))) - expect(queryByText(t('skinlib.report.positive', { score: 5 }))) + fireEvent.click(getByText(t('skinlib.report.title'))); + expect(queryByText(t('skinlib.report.positive', {score: 5}))); - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.post).not.toBeCalled() - }) + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.post).not.toBeCalled(); + }); - it('negative score', async () => { - window.blessing.extra.report = -5 + it('negative score', async () => { + window.blessing.extra.report = -5; - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.report.title'))) - expect(queryByText(t('skinlib.report.negative', { score: 5 }))) + fireEvent.click(getByText(t('skinlib.report.title'))); + expect(queryByText(t('skinlib.report.negative', {score: 5}))); - fireEvent.click(getByText(t('general.cancel'))) - expect(fetch.post).not.toBeCalled() - }) + fireEvent.click(getByText(t('general.cancel'))); + expect(fetch.post).not.toBeCalled(); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByPlaceholderText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByPlaceholderText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.report.title'))) - fireEvent.input(getByPlaceholderText(t('skinlib.report.reason')), { - target: { value: 'illegal' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/skinlib/report', { - tid: fixtureSkin.tid, - reason: 'illegal', - }), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('skinlib.report.title'))); + fireEvent.input(getByPlaceholderText(t('skinlib.report.reason')), { + target: {value: 'illegal'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/skinlib/report', { + tid: fixtureSkin.tid, + reason: 'illegal', + }); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByPlaceholderText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByPlaceholderText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.report.title'))) - fireEvent.input(getByPlaceholderText(t('skinlib.report.reason')), { - target: { value: 'illegal' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/skinlib/report', { - tid: fixtureSkin.tid, - reason: 'illegal', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + fireEvent.click(getByText(t('skinlib.report.title'))); + fireEvent.input(getByPlaceholderText(t('skinlib.report.reason')), { + target: {value: 'illegal'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/skinlib/report', { + tid: fixtureSkin.tid, + reason: 'illegal', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); describe('change privacy', () => { - beforeEach(() => { - window.blessing.extra.currentUid = fixtureSkin.uploader - }) + beforeEach(() => { + window.blessing.extra.currentUid = fixtureSkin.uploader; + }); - it('cancelled', async () => { - fetch.get.mockResolvedValue(fixtureSkin) + it('cancelled', async () => { + fetch.get.mockResolvedValue(fixtureSkin); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.setAsPrivate'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText(t('skinlib.setAsPrivate'))).toBeInTheDocument() - }) + fireEvent.click(getByText(t('skinlib.setAsPrivate'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText(t('skinlib.setAsPrivate'))).toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.get.mockResolvedValue(fixtureSkin) - fetch.put.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.get.mockResolvedValue(fixtureSkin); + fetch.put.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.setAsPrivate'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument() - }) + fireEvent.click(getByText(t('skinlib.setAsPrivate'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.get.mockResolvedValue({ ...fixtureSkin, public: false }) - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.get.mockResolvedValue({...fixtureSkin, public: false}); + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.setAsPublic'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument() - }) + fireEvent.click(getByText(t('skinlib.setAsPublic'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument(); + }); - it('duplicated texture with confirmed', async () => { - fetch.get.mockResolvedValue({ ...fixtureSkin, public: false }) - fetch.put.mockResolvedValue({ - code: 2, - message: 'duplicated', - data: { tid: 2 }, - }) + it('duplicated texture with confirmed', async () => { + fetch.get.mockResolvedValue({...fixtureSkin, public: false}); + fetch.put.mockResolvedValue({ + code: 2, + message: 'duplicated', + data: {tid: 2}, + }); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.setAsPublic'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)), - ) - expect(queryByText('duplicated')).toBeInTheDocument() - expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument() - fireEvent.click(getByText(t('user.viewInSkinlib'))) - }) + fireEvent.click(getByText(t('skinlib.setAsPublic'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)); + }, + ); + expect(queryByText('duplicated')).toBeInTheDocument(); + expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument(); + fireEvent.click(getByText(t('user.viewInSkinlib'))); + }); - it('duplicated texture with cancelled', async () => { - fetch.get.mockResolvedValue({ ...fixtureSkin, public: false }) - fetch.put.mockResolvedValue({ - code: 2, - message: 'duplicated', - data: { tid: 2 }, - }) + it('duplicated texture with cancelled', async () => { + fetch.get.mockResolvedValue({...fixtureSkin, public: false}); + fetch.put.mockResolvedValue({ + code: 2, + message: 'duplicated', + data: {tid: 2}, + }); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.setAsPublic'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)), - ) + fireEvent.click(getByText(t('skinlib.setAsPublic'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.texture.privacy(fixtureSkin.tid)); + }, + ); - expect(queryByText('duplicated')).toBeInTheDocument() - expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument() - fireEvent.click(getByText(t('general.cancel'))) - }) -}) + expect(queryByText('duplicated')).toBeInTheDocument(); + expect(queryByText(t('skinlib.setAsPublic'))).toBeInTheDocument(); + fireEvent.click(getByText(t('general.cancel'))); + }); +}); describe('delete texture', () => { - beforeEach(() => { - window.blessing.extra.currentUid = fixtureSkin.uploader - fetch.get.mockResolvedValue(fixtureSkin) - }) + beforeEach(() => { + window.blessing.extra.currentUid = fixtureSkin.uploader; + fetch.get.mockResolvedValue(fixtureSkin); + }); - it('cancelled', async () => { - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.show.delete-texture'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.del).not.toBeCalled()) - }) + fireEvent.click(getByText(t('skinlib.show.delete-texture'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.del).not.toBeCalled(); + }); + }); - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'ok' }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'ok'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.show.delete-texture'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.texture.delete(fixtureSkin.tid)), - ) - expect(queryByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') + fireEvent.click(getByText(t('skinlib.show.delete-texture'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.texture.delete(fixtureSkin.tid)); + }, + ); + expect(queryByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); - vi.runAllTimers() - }) + vi.runAllTimers(); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('skinlib.show.delete-texture'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.texture.delete(fixtureSkin.tid)), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + fireEvent.click(getByText(t('skinlib.show.delete-texture'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.texture.delete(fixtureSkin.tid)); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); diff --git a/resources/assets/tests/views/skinlib/SkinLibrary.test.tsx b/resources/assets/tests/views/skinlib/SkinLibrary.test.tsx index 3281de7e..ad7eb326 100644 --- a/resources/assets/tests/views/skinlib/SkinLibrary.test.tsx +++ b/resources/assets/tests/views/skinlib/SkinLibrary.test.tsx @@ -1,443 +1,516 @@ -import { expect, test, vi, it, beforeEach } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import { createPaginator } from '../../utils' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import { TextureType } from '@/scripts/types' -import urls from '@/scripts/urls' -import SkinLibrary from '@/views/skinlib/SkinLibrary' -import type { LibraryItem } from '@/views/skinlib/SkinLibrary/types' +import { + expect, test, vi, it, beforeEach, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import {createPaginator} from '../../utils'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import {TextureType} from '@/scripts/types'; +import urls from '@/scripts/urls'; +import SkinLibrary from '@/views/skinlib/SkinLibrary'; +import type {LibraryItem} from '@/views/skinlib/SkinLibrary/types'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixtureItem: Readonly = Object.freeze({ - tid: 1, - name: 'my skin', - type: TextureType.Steve, - uploader: 1, - nickname: 'me', - public: true, - likes: 70, -}) + tid: 1, + name: 'my skin', + type: TextureType.Steve, + uploader: 1, + nickname: 'me', + public: true, + likes: 70, +}); beforeEach(() => { - window.blessing.extra = { currentUid: null } -}) + window.blessing.extra = {currentUid: null}; +}); test('without authenticated', async () => { - fetch.get.mockResolvedValue(createPaginator([])) + fetch.get.mockResolvedValue(createPaginator([])); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - expect(fetch.get).toBeCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('filter')).toBe('skin') - expect(search.get('sort')).toBe('time') - expect(search.get('page')).toBe('1') - return true - }), - ) - expect(fetch.get).not.toBeCalledWith('/user/closet/ids') - expect(queryByText(t('skinlib.seeMyUpload'))).not.toBeInTheDocument() -}) + expect(fetch.get).toBeCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('filter')).toBe('skin'); + expect(search.get('sort')).toBe('time'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + expect(fetch.get).not.toBeCalledWith('/user/closet/ids'); + expect(queryByText(t('skinlib.seeMyUpload'))).not.toBeInTheDocument(); +}); test('search by keyword', async () => { - fetch.get.mockResolvedValue({ ...createPaginator([]), last_page: 10 }) + fetch.get.mockResolvedValue({...createPaginator([]), last_page: 10}); - const { getByText, getByTitle, getByPlaceholderText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByTitle, getByPlaceholderText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - // test for resetting page - fireEvent.click(getByText('2')) + // Test for resetting page + fireEvent.click(getByText('2')); - fireEvent.input(getByPlaceholderText(t('vendor.datatable.search')), { - target: { value: 'k' }, - }) - fireEvent.click(getByTitle(t('vendor.datatable.search'))) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('keyword')).toBe('k') - expect(search.get('page')).toBe('1') - return true - }), - ), - ) -}) + fireEvent.input(getByPlaceholderText(t('vendor.datatable.search')), { + target: {value: 'k'}, + }); + fireEvent.click(getByTitle(t('vendor.datatable.search'))); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('keyword')).toBe('k'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + }, + ); +}); test('select uploaded by self', async () => { - window.blessing.extra.currentUid = 1 - fetch.get.mockResolvedValue({ ...createPaginator([]), last_page: 10 }) + window.blessing.extra.currentUid = 1; + fetch.get.mockResolvedValue({...createPaginator([]), last_page: 10}); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - // test for resetting page - fireEvent.click(getByText('2')) + // Test for resetting page + fireEvent.click(getByText('2')); - fireEvent.click(getByText(t('skinlib.seeMyUpload'))) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('uploader')).toBe('1') - expect(search.get('page')).toBe('1') - return true - }), - ), - ) - expect(queryByText(t('skinlib.filter.uploader', { uid: 1 }))) -}) + fireEvent.click(getByText(t('skinlib.seeMyUpload'))); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('uploader')).toBe('1'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + }, + ); + expect(queryByText(t('skinlib.filter.uploader', {uid: 1}))); +}); test('reset query', async () => { - window.blessing.extra.currentUid = 1 - fetch.get.mockResolvedValue(createPaginator([])) + window.blessing.extra.currentUid = 1; + fetch.get.mockResolvedValue(createPaginator([])); - const { getByText, getByTitle, getByPlaceholderText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByTitle, getByPlaceholderText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText('Steve')) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.input(getByPlaceholderText(t('vendor.datatable.search')), { - target: { value: 'k' }, - }) - fireEvent.click(getByTitle(t('vendor.datatable.search'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('skinlib.seeMyUpload'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('skinlib.sort.likes'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('skinlib.reset'))) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('filter')).toBe('skin') - expect(search.get('keyword')).toBeNull() - expect(search.get('uploader')).toBeNull() - expect(search.get('sort')).toBe('time') - expect(search.get('page')).toBe('1') - return true - }), - ), - ) - expect(queryByText(t('skinlib.filter.uploader', { uid: 1 }))) -}) + fireEvent.click(getByText('Steve')); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.input(getByPlaceholderText(t('vendor.datatable.search')), { + target: {value: 'k'}, + }); + fireEvent.click(getByTitle(t('vendor.datatable.search'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('skinlib.seeMyUpload'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('skinlib.sort.likes'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('skinlib.reset'))); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('filter')).toBe('skin'); + expect(search.get('keyword')).toBeNull(); + expect(search.get('uploader')).toBeNull(); + expect(search.get('sort')).toBe('time'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + }, + ); + expect(queryByText(t('skinlib.filter.uploader', {uid: 1}))); +}); test('browser goes back', async () => { - fetch.get.mockResolvedValue(createPaginator([])) + fetch.get.mockResolvedValue(createPaginator([])); - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText('Steve')) - await waitFor(() => expect(fetch.get).toBeCalled()) + fireEvent.click(getByText('Steve')); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - const state: string = window.history.state - const event = new PopStateEvent('popstate', { - state: state.replace('steve', 'skin'), - }) - window.dispatchEvent(event) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('filter')).toBe('skin') - return true - }), - ), - ) -}) + const {state} = window.history; + const event = new PopStateEvent('popstate', { + state: state.replace('steve', 'skin'), + }); + window.dispatchEvent(event); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('filter')).toBe('skin'); + return true; + }), + ); + }, + ); +}); test('pagination', async () => { - const response = { ...createPaginator([]), last_page: 2 } - fetch.get.mockResolvedValue(response) + const response = {...createPaginator([]), last_page: 2}; + fetch.get.mockResolvedValue(response); - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText('2')) + fireEvent.click(getByText('2')); - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('page')).toBe('2') - return true - }), - ) -}) + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('page')).toBe('2'); + return true; + }), + ); +}); test('library item', async () => { - fetch.get.mockResolvedValue(createPaginator([fixtureItem])) + fetch.get.mockResolvedValue(createPaginator([fixtureItem])); - const { getByText, queryByText, queryAllByText, queryByAltText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, queryByText, queryAllByText, queryByAltText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - expect(queryAllByText('Steve')).toHaveLength(2) - expect(queryByText(fixtureItem.name)).toBeInTheDocument() - expect(queryByAltText(fixtureItem.name)).toHaveAttribute( - 'src', - `/preview/${fixtureItem.tid}?height=150&png`, - ) - expect(queryByText(fixtureItem.nickname)).toBeInTheDocument() + expect(queryAllByText('Steve')).toHaveLength(2); + expect(queryByText(fixtureItem.name)).toBeInTheDocument(); + expect(queryByAltText(fixtureItem.name)).toHaveAttribute( + 'src', + `/preview/${fixtureItem.tid}?height=150&png`, + ); + expect(queryByText(fixtureItem.nickname)).toBeInTheDocument(); - fireEvent.click(getByText(fixtureItem.nickname)) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('uploader')).toBe(fixtureItem.uploader.toString()) - return true - }), - ), - ) - const search = new URLSearchParams(location.search) - expect(search.get('uploader')).toBe(fixtureItem.uploader.toString()) -}) + fireEvent.click(getByText(fixtureItem.nickname)); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('uploader')).toBe(fixtureItem.uploader.toString()); + return true; + }), + ); + }, + ); + const search = new URLSearchParams(location.search); + expect(search.get('uploader')).toBe(fixtureItem.uploader.toString()); +}); test('private texture', async () => { - const item = { ...fixtureItem, public: false } - fetch.get.mockResolvedValue(createPaginator([item])) + const item = {...fixtureItem, public: false}; + fetch.get.mockResolvedValue(createPaginator([item])); - const { queryByTitle } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {queryByTitle} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - expect(queryByTitle(t('skinlib.private'))).toBeInTheDocument() -}) + expect(queryByTitle(t('skinlib.private'))).toBeInTheDocument(); +}); describe('by filter', () => { - beforeEach(() => { - fetch.get.mockResolvedValue({ ...createPaginator([]), last_page: 10 }) - }) + beforeEach(() => { + fetch.get.mockResolvedValue({...createPaginator([]), last_page: 10}); + }); - it('skin', async () => { - const { getByText, queryAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('skin', async () => { + const {getByText, queryAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - // test for resetting page - fireEvent.click(getByText('2')) + // Test for resetting page + fireEvent.click(getByText('2')); - fireEvent.click(getByText('Steve')) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('general.skin'))) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('filter')).toBe('skin') - expect(search.get('page')).toBe('1') - return true - }), - ), - ) - expect(queryAllByText(t('general.skin'))).toHaveLength(2) - const search = new URLSearchParams(location.search) - expect(search.get('filter')).toBe('skin') - }) + fireEvent.click(getByText('Steve')); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('general.skin'))); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('filter')).toBe('skin'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + }, + ); + expect(queryAllByText(t('general.skin'))).toHaveLength(2); + const search = new URLSearchParams(location.search); + expect(search.get('filter')).toBe('skin'); + }); - it('steve', async () => { - const { getByText, queryAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('steve', async () => { + const {getByText, queryAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - // test for resetting page - fireEvent.click(getByText('2')) + // Test for resetting page + fireEvent.click(getByText('2')); - fireEvent.click(getByText('Steve')) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('filter')).toBe('steve') - expect(search.get('page')).toBe('1') - return true - }), - ), - ) - expect(queryAllByText('Steve')).toHaveLength(2) - const search = new URLSearchParams(location.search) - expect(search.get('filter')).toBe('steve') - }) + fireEvent.click(getByText('Steve')); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('filter')).toBe('steve'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + }, + ); + expect(queryAllByText('Steve')).toHaveLength(2); + const search = new URLSearchParams(location.search); + expect(search.get('filter')).toBe('steve'); + }); - it('alex', async () => { - const { getByText, queryAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('alex', async () => { + const {getByText, queryAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - // test for resetting page - fireEvent.click(getByText('2')) + // Test for resetting page + fireEvent.click(getByText('2')); - fireEvent.click(getByText('Alex')) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('filter')).toBe('alex') - expect(search.get('page')).toBe('1') - return true - }), - ), - ) - expect(queryAllByText('Alex')).toHaveLength(2) - const search = new URLSearchParams(location.search) - expect(search.get('filter')).toBe('alex') - }) + fireEvent.click(getByText('Alex')); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('filter')).toBe('alex'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + }, + ); + expect(queryAllByText('Alex')).toHaveLength(2); + const search = new URLSearchParams(location.search); + expect(search.get('filter')).toBe('alex'); + }); - it('cape', async () => { - const { getByText, queryAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('cape', async () => { + const {getByText, queryAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - // test for resetting page - fireEvent.click(getByText('2')) + // Test for resetting page + fireEvent.click(getByText('2')); - fireEvent.click(getByText(t('general.cape'))) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('filter')).toBe('cape') - expect(search.get('page')).toBe('1') - return true - }), - ), - ) - expect(queryAllByText(t('general.cape'))).toHaveLength(2) - const search = new URLSearchParams(location.search) - expect(search.get('filter')).toBe('cape') - }) -}) + fireEvent.click(getByText(t('general.cape'))); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('filter')).toBe('cape'); + expect(search.get('page')).toBe('1'); + return true; + }), + ); + }, + ); + expect(queryAllByText(t('general.cape'))).toHaveLength(2); + const search = new URLSearchParams(location.search); + expect(search.get('filter')).toBe('cape'); + }); +}); describe('sorting', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([])); + }); - it('by time', async () => { - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('by time', async () => { + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('skinlib.sort.likes'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByText(t('skinlib.sort.time'))) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('sort')).toBe('time') - return true - }), - ), - ) - const search = new URLSearchParams(location.search) - expect(search.get('sort')).toBe('time') - }) + fireEvent.click(getByText(t('skinlib.sort.likes'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByText(t('skinlib.sort.time'))); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('sort')).toBe('time'); + return true; + }), + ); + }, + ); + const search = new URLSearchParams(location.search); + expect(search.get('sort')).toBe('time'); + }); - it('by likes', async () => { - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('by likes', async () => { + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('skinlib.sort.likes'))) - await waitFor(() => - expect(fetch.get).toHaveBeenLastCalledWith( - urls.skinlib.list(), - expect.toSatisfy((search: URLSearchParams) => { - expect(search.get('sort')).toBe('likes') - return true - }), - ), - ) - const search = new URLSearchParams(location.search) - expect(search.get('sort')).toBe('likes') - }) -}) + fireEvent.click(getByText(t('skinlib.sort.likes'))); + await waitFor(() => { + expect(fetch.get).toHaveBeenLastCalledWith( + urls.skinlib.list(), + expect.toSatisfy((search: URLSearchParams) => { + expect(search.get('sort')).toBe('likes'); + return true; + }), + ); + }, + ); + const search = new URLSearchParams(location.search); + expect(search.get('sort')).toBe('likes'); + }); +}); describe('add to closet', () => { - beforeEach(() => { - fetch.get.mockImplementation((url: string) => { - if (url === urls.skinlib.list()) { - return Promise.resolve(createPaginator([fixtureItem])) - } else { - return Promise.resolve([]) - } - }) - }) + beforeEach(() => { + fetch.get.mockImplementation(async (url: string) => { + if (url === urls.skinlib.list()) { + return createPaginator([fixtureItem]); + } - it('without authenticated', async () => { - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + return []; + }); + }); - fireEvent.click(getByText(fixtureItem.likes.toString())) - expect(queryByText(t('skinlib.anonymous'))).toBeInTheDocument() - expect(fetch.post).not.toBeCalled() - }) + it('without authenticated', async () => { + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - it('succeeded', async () => { - window.blessing.extra.currentUid = 1 - fetch.post.mockResolvedValue({ code: 0, message: 'ok' }) + fireEvent.click(getByText(fixtureItem.likes.toString())); + expect(queryByText(t('skinlib.anonymous'))).toBeInTheDocument(); + expect(fetch.post).not.toBeCalled(); + }); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('succeeded', async () => { + window.blessing.extra.currentUid = 1; + fetch.post.mockResolvedValue({code: 0, message: 'ok'}); - fireEvent.click(getByText(fixtureItem.likes.toString())) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.post).toBeCalled()) - expect(queryByText((fixtureItem.likes + 1).toString())).toBeInTheDocument() - }) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - it('failed', async () => { - window.blessing.extra.currentUid = 1 - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + fireEvent.click(getByText(fixtureItem.likes.toString())); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalled(); + }); + expect(queryByText((fixtureItem.likes + 1).toString())).toBeInTheDocument(); + }); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('failed', async () => { + window.blessing.extra.currentUid = 1; + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - fireEvent.click(getByText(fixtureItem.likes.toString())) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.post).toBeCalled()) - expect(queryByText(fixtureItem.likes.toString())).toBeInTheDocument() - }) -}) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + + fireEvent.click(getByText(fixtureItem.likes.toString())); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalled(); + }); + expect(queryByText(fixtureItem.likes.toString())).toBeInTheDocument(); + }); +}); describe('remove from closet', () => { - beforeEach(() => { - window.blessing.extra.currentUid = 1 - fetch.get.mockImplementation((url: string) => { - if (url === urls.skinlib.list()) { - return Promise.resolve(createPaginator([fixtureItem])) - } else { - return Promise.resolve([fixtureItem.tid]) - } - }) - }) + beforeEach(() => { + window.blessing.extra.currentUid = 1; + fetch.get.mockImplementation(async (url: string) => { + if (url === urls.skinlib.list()) { + return createPaginator([fixtureItem]); + } - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'ok' }) + return [fixtureItem.tid]; + }); + }); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'ok'}); - fireEvent.click(getByText(fixtureItem.likes.toString())) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.del).toBeCalled()) - expect(queryByText((fixtureItem.likes - 1).toString())).toBeInTheDocument() - }) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + fireEvent.click(getByText(fixtureItem.likes.toString())); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalled(); + }); + expect(queryByText((fixtureItem.likes - 1).toString())).toBeInTheDocument(); + }); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - fireEvent.click(getByText(fixtureItem.likes.toString())) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.del).toBeCalled()) - expect(queryByText(fixtureItem.likes.toString())).toBeInTheDocument() - }) -}) + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + + fireEvent.click(getByText(fixtureItem.likes.toString())); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalled(); + }); + expect(queryByText(fixtureItem.likes.toString())).toBeInTheDocument(); + }); +}); diff --git a/resources/assets/tests/views/skinlib/Upload.test.tsx b/resources/assets/tests/views/skinlib/Upload.test.tsx index 9d9d747d..ce89c716 100644 --- a/resources/assets/tests/views/skinlib/Upload.test.tsx +++ b/resources/assets/tests/views/skinlib/Upload.test.tsx @@ -1,271 +1,279 @@ -import { expect, test, vi, it, beforeEach, afterEach, describe } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import { isAlex } from '@/scripts/textureUtils' -import urls from '@/scripts/urls' -import Upload from '@/views/skinlib/Upload' +import { + expect, test, vi, it, beforeEach, afterEach, describe, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import {isAlex} from '@/scripts/textureUtils'; +import urls from '@/scripts/urls'; +import Upload from '@/views/skinlib/Upload'; -vi.mock('@/scripts/net') -vi.mock('@/scripts/textureUtils') +vi.mock('@/scripts/net'); +vi.mock('@/scripts/textureUtils'); beforeEach(() => { - const container = document.createElement('div') - container.id = 'previewer' - document.body.appendChild(container) + const container = document.createElement('div'); + container.id = 'previewer'; + document.body.append(container); - window.blessing.extra = { - rule: 'rule', - privacyNotice: 'privacy notice', - score: 15, - scorePrivate: 10, - scorePublic: 1, - closetItemCost: 10, - award: 0, - contentPolicy: 'the policy', - } + window.blessing.extra = { + rule: 'rule', + privacyNotice: 'privacy notice', + score: 15, + scorePrivate: 10, + scorePublic: 1, + closetItemCost: 10, + award: 0, + contentPolicy: 'the policy', + }; - URL.createObjectURL = vi.fn().mockReturnValue('') -}) + URL.createObjectURL = vi.fn().mockReturnValue(''); +}); afterEach(() => { - document.querySelector('#previewer')!.remove() -}) + document.querySelector('#previewer')!.remove(); +}); test('display texture name rule', () => { - const { queryByPlaceholderText } = render() - expect(queryByPlaceholderText('rule')).toBeInTheDocument() -}) + const {queryByPlaceholderText} = render(); + expect(queryByPlaceholderText('rule')).toBeInTheDocument(); +}); test('content policy', () => { - const { queryByText } = render() - expect(queryByText('the policy')).toBeInTheDocument() -}) + const {queryByText} = render(); + expect(queryByText('the policy')).toBeInTheDocument(); +}); test('privacy notice', () => { - const { getByLabelText, queryByText } = render() - fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))) - expect(queryByText('privacy notice')).toBeInTheDocument() -}) + const {getByLabelText, queryByText} = render(); + fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))); + expect(queryByText('privacy notice')).toBeInTheDocument(); +}); test('award notice', () => { - Object.assign(window.blessing.extra, { award: 5 }) + Object.assign(window.blessing.extra, {award: 5}); - const { getByLabelText, queryByText } = render() - expect( - queryByText(t('skinlib.upload.award', { score: 5 })), - ).toBeInTheDocument() + const {getByLabelText, queryByText} = render(); + expect( + queryByText(t('skinlib.upload.award', {score: 5})), + ).toBeInTheDocument(); - fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))) - expect( - queryByText(t('skinlib.upload.award', { score: 5 })), - ).not.toBeInTheDocument() -}) + fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))); + expect( + queryByText(t('skinlib.upload.award', {score: 5})), + ).not.toBeInTheDocument(); +}); describe('input file', () => { - it('cancelled', () => { - const { getByTitle } = render() + it('cancelled', () => { + const {getByTitle} = render(); - fireEvent.change(getByTitle(t('skinlib.upload.select-file'))) - }) + fireEvent.change(getByTitle(t('skinlib.upload.select-file'))); + }); - it('add file', () => { - const { getByTitle, queryByDisplayValue, queryByText } = render() + it('add file', () => { + const {getByTitle, queryByDisplayValue, queryByText} = render(); - const file = new File([], 't.png') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) + const file = new File([], 't.png'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); - expect(queryByDisplayValue('t')).toBeInTheDocument() - expect(queryByText('t.png')).toBeInTheDocument() - }) + expect(queryByDisplayValue('t')).toBeInTheDocument(); + expect(queryByText('t.png')).toBeInTheDocument(); + }); - it('do not overwrite existing name', () => { - const { getByTitle, getByLabelText, queryByDisplayValue, queryByText } = - render() + it('do not overwrite existing name', () => { + const {getByTitle, getByLabelText, queryByDisplayValue, queryByText} + = render(); - fireEvent.input(getByLabelText(t('skinlib.upload.texture-name')), { - target: { value: 'my texture' }, - }) + fireEvent.input(getByLabelText(t('skinlib.upload.texture-name')), { + target: {value: 'my texture'}, + }); - const file = new File([], 't.png') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) + const file = new File([], 't.png'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); - expect(queryByDisplayValue('my texture')).toBeInTheDocument() - expect(queryByText('t.png')).toBeInTheDocument() - }) + expect(queryByDisplayValue('my texture')).toBeInTheDocument(); + expect(queryByText('t.png')).toBeInTheDocument(); + }); - it('select skin type automatically', async () => { - isAlex.mockResolvedValue(true) + it('select skin type automatically', async () => { + isAlex.mockResolvedValue(true); - const { getByTitle, findByLabelText } = render() + const {getByTitle, findByLabelText} = render(); - const file = new File([], 't.png') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) + const file = new File([], 't.png'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); - expect(await findByLabelText('Alex')).toBeChecked() - }) + expect(await findByLabelText('Alex')).toBeChecked(); + }); - it('do not overwrite "cape" type', async () => { - const { getByTitle, getByLabelText, findByLabelText } = render() + it('do not overwrite "cape" type', async () => { + const {getByTitle, getByLabelText, findByLabelText} = render(); - fireEvent.click(getByLabelText(t('general.cape'))) - await waitFor(() => { - /* */ - }) + fireEvent.click(getByLabelText(t('general.cape'))); + await waitFor(() => { + /* */ + }); - const file = new File([], 't.png') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) + const file = new File([], 't.png'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); - expect(await findByLabelText(t('general.cape'))).toBeChecked() - }) -}) + expect(await findByLabelText(t('general.cape'))).toBeChecked(); + }); +}); describe('score cost', () => { - it('public texture', () => { - const { getByTitle, queryByText } = render() + it('public texture', () => { + const {getByTitle, queryByText} = render(); - const file = new File(['content'], 't.png') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) + const file = new File(['content'], 't.png'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); - expect( - queryByText(t('skinlib.upload.cost', { score: 11 })), - ).toBeInTheDocument() - }) + expect( + queryByText(t('skinlib.upload.cost', {score: 11})), + ).toBeInTheDocument(); + }); - it('private texture', () => { - const { getByTitle, getByLabelText, queryByText } = render() + it('private texture', () => { + const {getByTitle, getByLabelText, queryByText} = render(); - const file = new File(['content'], 't.png') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))) + const file = new File(['content'], 't.png'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))); - expect( - queryByText(t('skinlib.upload.cost', { score: 20 })), - ).toBeInTheDocument() - }) -}) + expect( + queryByText(t('skinlib.upload.cost', {score: 20})), + ).toBeInTheDocument(); + }); +}); describe('upload texture', () => { - it('no file', () => { - const { getByText, getByRole, queryByText } = render() - fireEvent.click(getByText(t('skinlib.upload.button'))) - expect(queryByText(t('skinlib.emptyUploadFile'))).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + it('no file', () => { + const {getByText, getByRole, queryByText} = render(); + fireEvent.click(getByText(t('skinlib.upload.button'))); + expect(queryByText(t('skinlib.emptyUploadFile'))).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('no name', () => { - const { getByText, getByLabelText, getByTitle, getByRole, queryByText } = - render() + it('no name', () => { + const {getByText, getByLabelText, getByTitle, getByRole, queryByText} + = render(); - const file = new File([], 't.png') - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.input(getByLabelText(t('skinlib.upload.texture-name')), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('skinlib.upload.button'))) + const file = new File([], 't.png'); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.input(getByLabelText(t('skinlib.upload.texture-name')), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('skinlib.upload.button'))); - expect(queryByText(t('skinlib.emptyTextureName'))).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + expect(queryByText(t('skinlib.emptyTextureName'))).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('invalid file type', () => { - const { getByText, getByTitle, getByRole, queryByText } = render() + it('invalid file type', () => { + const {getByText, getByTitle, getByRole, queryByText} = render(); - const file = new File([], 't.png', { type: 'image/jpeg' }) - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getByText(t('skinlib.upload.button'))) + const file = new File([], 't.png', {type: 'image/jpeg'}); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getByText(t('skinlib.upload.button'))); - expect(queryByText(t('skinlib.fileExtError'))).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + expect(queryByText(t('skinlib.fileExtError'))).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('uploading', () => { - fetch.post.mockResolvedValue({ code: 1, message: '' }) + it('uploading', () => { + fetch.post.mockResolvedValue({code: 1, message: ''}); - const { getByText, getByTitle, queryByText } = render() + const {getByText, getByTitle, queryByText} = render(); - const file = new File([], 't.png', { type: 'image/png' }) - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getByText(t('skinlib.upload.button'))) + const file = new File([], 't.png', {type: 'image/png'}); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getByText(t('skinlib.upload.button'))); - expect(queryByText(t('skinlib.uploading'))).toBeInTheDocument() - expect(fetch.post).toBeCalledWith( - urls.texture.upload(), - expect.any(FormData), - ) + expect(queryByText(t('skinlib.uploading'))).toBeInTheDocument(); + expect(fetch.post).toBeCalledWith( + urls.texture.upload(), + expect.any(FormData), + ); - const formData = fetch.post.mock.calls[0]![1] as FormData - expect(formData.get('name')).toBe('t') - expect(formData.get('type')).toBe('steve') - expect(formData.get('file')).toStrictEqual(file) - expect(formData.get('public')).toBe('1') - }) + const formData = fetch.post.mock.calls[0]![1] as FormData; + expect(formData.get('name')).toBe('t'); + expect(formData.get('type')).toBe('steve'); + expect(formData.get('file')).toStrictEqual(file); + expect(formData.get('public')).toBe('1'); + }); - it('uploaded successfully', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'ok', tid: 1 }) + it('uploaded successfully', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'ok', tid: 1}); - const { getByText, getByTitle, getByLabelText } = render() + const {getByText, getByTitle, getByLabelText} = render(); - const file = new File([], 't.png', { type: 'image/png' }) - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))) - fireEvent.click(getByText(t('skinlib.upload.button'))) + const file = new File([], 't.png', {type: 'image/png'}); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getByLabelText(t('skinlib.upload.set-as-private'))); + fireEvent.click(getByText(t('skinlib.upload.button'))); - await waitFor(() => expect(fetch.post).toBeCalled()) - const formData = fetch.post.mock.calls[0]![1] as FormData - expect(formData.get('public')).toBe('0') - }) + await waitFor(() => { + expect(fetch.post).toBeCalled(); + }); + const formData = fetch.post.mock.calls[0]![1] as FormData; + expect(formData.get('public')).toBe('0'); + }); - it('duplicated texture detected', async () => { - fetch.post.mockResolvedValue({ code: 2, message: 'dup', tid: 1 }) + it('duplicated texture detected', async () => { + fetch.post.mockResolvedValue({code: 2, message: 'dup', tid: 1}); - const { getByText, getByTitle, queryByText } = render() + const {getByText, getByTitle, queryByText} = render(); - const file = new File([], 't.png', { type: 'image/png' }) - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getByText(t('skinlib.upload.button'))) + const file = new File([], 't.png', {type: 'image/png'}); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getByText(t('skinlib.upload.button'))); - await waitFor(() => expect(fetch.post).toBeCalled()) - expect(queryByText('dup')).toBeInTheDocument() + await waitFor(() => { + expect(fetch.post).toBeCalled(); + }); + expect(queryByText('dup')).toBeInTheDocument(); - fireEvent.click(getByText(t('user.viewInSkinlib'))) - }) + fireEvent.click(getByText(t('user.viewInSkinlib'))); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByTitle, getByRole, queryByText } = render() + const {getByText, getByTitle, getByRole, queryByText} = render(); - const file = new File([], 't.png', { type: 'image/png' }) - fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { - target: { files: [file] }, - }) - fireEvent.click(getByText(t('skinlib.upload.button'))) + const file = new File([], 't.png', {type: 'image/png'}); + fireEvent.change(getByTitle(t('skinlib.upload.select-file')), { + target: {files: [file]}, + }); + fireEvent.click(getByText(t('skinlib.upload.button'))); - await waitFor(() => expect(fetch.post).toBeCalled()) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + await waitFor(() => { + expect(fetch.post).toBeCalled(); + }); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); diff --git a/resources/assets/tests/views/user/Closet.test.tsx b/resources/assets/tests/views/user/Closet.test.tsx index 2e5bd257..aa28bd32 100644 --- a/resources/assets/tests/views/user/Closet.test.tsx +++ b/resources/assets/tests/views/user/Closet.test.tsx @@ -1,514 +1,593 @@ -import { expect, vi, it, test } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import { createPaginator } from '../../utils' -import $ from 'jquery' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import { type ClosetItem, type Player, TextureType } from '@/scripts/types' -import urls from '@/scripts/urls' -import Closet from '@/views/user/Closet' +import { + expect, vi, it, test, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import $ from 'jquery'; +import {createPaginator} from '../../utils'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import {type ClosetItem, type Player, TextureType} from '@/scripts/types'; +import urls from '@/scripts/urls'; +import Closet from '@/views/user/Closet'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixtureSkin: Readonly = Object.freeze({ - tid: 1, - name: 'skin', - type: TextureType.Steve, - hash: 'abc', - size: 2, - uploader: 1, - public: true, - upload_at: new Date().toString(), - likes: 1, - pivot: { - user_uid: 1, - texture_tid: 1, - item_name: 'closet_skin', - }, -}) + tid: 1, + name: 'skin', + type: TextureType.Steve, + hash: 'abc', + size: 2, + uploader: 1, + public: true, + upload_at: new Date().toString(), + likes: 1, + pivot: { + user_uid: 1, + texture_tid: 1, + item_name: 'closet_skin', + }, +}); const fixtureCape: Readonly = Object.freeze({ - tid: 2, - name: 'cape', - type: TextureType.Cape, - hash: 'def', - size: 2, - uploader: 1, - public: true, - upload_at: new Date().toString(), - likes: 1, - pivot: { - user_uid: 1, - texture_tid: 2, - item_name: 'closet_cape', - }, -}) + tid: 2, + name: 'cape', + type: TextureType.Cape, + hash: 'def', + size: 2, + uploader: 1, + public: true, + upload_at: new Date().toString(), + likes: 1, + pivot: { + user_uid: 1, + texture_tid: 2, + item_name: 'closet_cape', + }, +}); const fixturePlayer: Readonly = Object.freeze({ - pid: 1, - name: 'kumiko', - uid: 1, - tid_skin: 1, - tid_cape: 2, - last_modified: new Date().toString(), -}) + pid: 1, + name: 'kumiko', + uid: 1, + tid_skin: 1, + tid_cape: 2, + last_modified: new Date().toString(), +}); beforeEach(() => { - const container = document.createElement('div') - container.id = 'previewer' - document.body.appendChild(container) -}) + const container = document.createElement('div'); + container.id = 'previewer'; + document.body.append(container); +}); afterEach(() => { - document.querySelector('#previewer')!.remove() -}) + document.querySelector('#previewer')!.remove(); +}); test('empty closet', async () => { - fetch.get.mockResolvedValue(createPaginator([])) + fetch.get.mockResolvedValue(createPaginator([])); - const { queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(queryByText(/skin library/i)).toBeInTheDocument() -}) + const {queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(queryByText(/skin library/i)).toBeInTheDocument(); +}); test('search textures', async () => { - fetch.get - .mockResolvedValueOnce(createPaginator([fixtureSkin])) - .mockResolvedValueOnce(createPaginator([])) + fetch.get + .mockResolvedValueOnce(createPaginator([fixtureSkin])) + .mockResolvedValueOnce(createPaginator([])); - const { getByPlaceholderText, findByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByPlaceholderText, findByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.input(getByPlaceholderText(t('user.typeToSearch')), { - target: { value: 'abc' }, - }) - expect(await findByText(/no result/i)).toBeInTheDocument() -}) + fireEvent.input(getByPlaceholderText(t('user.typeToSearch')), { + target: {value: 'abc'}, + }); + expect(await findByText(/no result/i)).toBeInTheDocument(); +}); test('switch page', async () => { - fetch.get - .mockResolvedValueOnce({ ...createPaginator([]), last_page: 2 }) - .mockResolvedValueOnce({ ...createPaginator([fixtureSkin]), last_page: 2 }) + fetch.get + .mockResolvedValueOnce({...createPaginator([]), last_page: 2}) + .mockResolvedValueOnce({...createPaginator([fixtureSkin]), last_page: 2}); - const { getByText, findByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - fireEvent.click(getByText('2')) - expect(await findByText(fixtureSkin.pivot.item_name)).toBeInTheDocument() -}) + const {getByText, findByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + fireEvent.click(getByText('2')); + expect(await findByText(fixtureSkin.pivot.item_name)).toBeInTheDocument(); +}); describe('switch category', () => { - it('click tab', async () => { - fetch.get - .mockResolvedValueOnce(createPaginator([fixtureSkin])) - .mockResolvedValueOnce(createPaginator([fixtureCape])) - .mockResolvedValueOnce(createPaginator([fixtureSkin])) + it('click tab', async () => { + fetch.get + .mockResolvedValueOnce(createPaginator([fixtureSkin])) + .mockResolvedValueOnce(createPaginator([fixtureCape])) + .mockResolvedValueOnce(createPaginator([fixtureSkin])); - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument() - expect(queryByText(fixtureCape.pivot.item_name)).not.toBeInTheDocument() + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument(); + expect(queryByText(fixtureCape.pivot.item_name)).not.toBeInTheDocument(); - fireEvent.click(getByText(t('general.cape'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(fixtureSkin.pivot.item_name)).not.toBeInTheDocument() - expect(queryByText(fixtureCape.pivot.item_name)).toBeInTheDocument() + fireEvent.click(getByText(t('general.cape'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(fixtureSkin.pivot.item_name)).not.toBeInTheDocument(); + expect(queryByText(fixtureCape.pivot.item_name)).toBeInTheDocument(); - fireEvent.click(getByText(t('general.skin'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument() - expect(queryByText(fixtureCape.pivot.item_name)).not.toBeInTheDocument() - }) + fireEvent.click(getByText(t('general.skin'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument(); + expect(queryByText(fixtureCape.pivot.item_name)).not.toBeInTheDocument(); + }); - it('click current tab should not switch category', async () => { - fetch.get.mockResolvedValue(createPaginator([fixtureSkin])) + it('click current tab should not switch category', async () => { + fetch.get.mockResolvedValue(createPaginator([fixtureSkin])); - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('general.skin'))) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - }) + fireEvent.click(getByText(t('general.skin'))); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + }); - it('reset page', async () => { - fetch.get - .mockResolvedValueOnce( - createPaginator( - Array.from({ length: 30 }).map((_, i) => ({ - ...fixtureSkin, - tid: i + 1, - })), - ), - ) - .mockResolvedValueOnce( - createPaginator( - Array.from({ length: 30 }).map((_, i) => ({ - ...fixtureSkin, - tid: i + 1, - })), - ), - ) - .mockResolvedValueOnce(createPaginator([fixtureCape])) + it('reset page', async () => { + fetch.get + .mockResolvedValueOnce( + createPaginator( + Array.from({length: 30}).map((_, i) => ({ + ...fixtureSkin, + tid: i + 1, + })), + ), + ) + .mockResolvedValueOnce( + createPaginator( + Array.from({length: 30}).map((_, i) => ({ + ...fixtureSkin, + tid: i + 1, + })), + ), + ) + .mockResolvedValueOnce(createPaginator([fixtureCape])); - const { getByText } = render() - await waitFor(() => - expect(fetch.get).toBeCalledWith(urls.user.closet.list(), { - category: 'skin', - q: '', - page: 1, - perPage: 6, - }), - ) + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledWith(urls.user.closet.list(), { + category: 'skin', + q: '', + page: 1, + perPage: 6, + }); + }, + ); - fireEvent.click(getByText('3')) - await waitFor(() => - expect(fetch.get).toBeCalledWith(urls.user.closet.list(), { - category: 'skin', - q: '', - page: 3, - perPage: 6, - }), - ) + fireEvent.click(getByText('3')); + await waitFor(() => { + expect(fetch.get).toBeCalledWith(urls.user.closet.list(), { + category: 'skin', + q: '', + page: 3, + perPage: 6, + }); + }, + ); - fireEvent.click(getByText(t('general.cape'))) - await waitFor(() => - expect(fetch.get).toBeCalledWith(urls.user.closet.list(), { - category: 'cape', - q: '', - page: 1, - perPage: 6, - }), - ) - }) -}) + fireEvent.click(getByText(t('general.cape'))); + await waitFor(() => { + expect(fetch.get).toBeCalledWith(urls.user.closet.list(), { + category: 'cape', + q: '', + page: 1, + perPage: 6, + }); + }, + ); + }); +}); describe('rename item', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixtureSkin])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixtureSkin])); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByDisplayValue, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByDisplayValue, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.renameItem'))) - fireEvent.input(getByDisplayValue(fixtureSkin.pivot.item_name), { - target: { value: 'my skin' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.user.closet.rename(fixtureSkin.tid), - { name: 'my skin' }, - ), - ) - expect(queryByText('my skin')).toBeInTheDocument() - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('user.renameItem'))); + fireEvent.input(getByDisplayValue(fixtureSkin.pivot.item_name), { + target: {value: 'my skin'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.user.closet.rename(fixtureSkin.tid), + {name: 'my skin'}, + ); + }, + ); + expect(queryByText('my skin')).toBeInTheDocument(); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('empty name', async () => { - const { getByText, getByDisplayValue, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('empty name', async () => { + const {getByText, getByDisplayValue, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.renameItem'))) - fireEvent.input(getByDisplayValue(fixtureSkin.pivot.item_name), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText(t('skinlib.emptyNewTextureName'))).toBeInTheDocument() + fireEvent.click(getByText(t('user.renameItem'))); + fireEvent.input(getByDisplayValue(fixtureSkin.pivot.item_name), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText(t('skinlib.emptyNewTextureName'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - }) + fireEvent.click(getByText(t('general.cancel'))); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByDisplayValue, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByDisplayValue, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.renameItem'))) - fireEvent.input(getByDisplayValue(fixtureSkin.pivot.item_name), { - target: { value: 'my skin' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.user.closet.rename(fixtureSkin.tid), - { name: 'my skin' }, - ), - ) - expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument() - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + fireEvent.click(getByText(t('user.renameItem'))); + fireEvent.input(getByDisplayValue(fixtureSkin.pivot.item_name), { + target: {value: 'my skin'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.user.closet.rename(fixtureSkin.tid), + {name: 'my skin'}, + ); + }, + ); + expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument(); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); describe('remove item', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixtureSkin])) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixtureSkin])); + }); - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.removeItem'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith( - urls.user.closet.remove(fixtureSkin.tid), - ), - ) - expect(queryByText(/skin library/i)).toBeInTheDocument() - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('user.removeItem'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith( + urls.user.closet.remove(fixtureSkin.tid), + ); + }, + ); + expect(queryByText(/skin library/i)).toBeInTheDocument(); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.removeItem'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith( - urls.user.closet.remove(fixtureSkin.tid), - ), - ) - expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument() - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByText(t('user.removeItem'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith( + urls.user.closet.remove(fixtureSkin.tid), + ); + }, + ); + expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument(); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.removeItem'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.del).not.toBeCalled()) - expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('user.removeItem'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.del).not.toBeCalled(); + }); + expect(queryByText(fixtureSkin.pivot.item_name)).toBeInTheDocument(); + }); +}); describe('select textures', () => { - beforeEach(() => { - fetch.get - .mockResolvedValueOnce(createPaginator([fixtureSkin])) - .mockResolvedValueOnce(createPaginator([fixtureCape])) - }) + beforeEach(() => { + fetch.get + .mockResolvedValueOnce(createPaginator([fixtureSkin])) + .mockResolvedValueOnce(createPaginator([fixtureCape])); + }); - it('select skin', async () => { - const { getByAltText, queryAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('select skin', async () => { + const {getByAltText, queryAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)) - expect(queryAllByText(t('general.skin'))).toHaveLength(2) - }) + fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)); + expect(queryAllByText(t('general.skin'))).toHaveLength(2); + }); - it('select cape', async () => { - const { getByText, getByAltText, queryAllByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('select cape', async () => { + const {getByText, getByAltText, queryAllByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByText(t('general.cape'))) - await waitFor(() => expect(fetch.get).toBeCalled()) + fireEvent.click(getByText(t('general.cape'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByAltText(fixtureCape.pivot.item_name)) - expect(queryAllByText(t('general.cape'))).toHaveLength(2) - }) + fireEvent.click(getByAltText(fixtureCape.pivot.item_name)); + expect(queryAllByText(t('general.cape'))).toHaveLength(2); + }); - it('reset selected', async () => { - const { getByText, getByAltText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + it('reset selected', async () => { + const {getByText, getByAltText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)) - fireEvent.click(getByText(t('general.cape'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByAltText(fixtureCape.pivot.item_name)) + fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)); + fireEvent.click(getByText(t('general.cape'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByAltText(fixtureCape.pivot.item_name)); - expect( - queryByText(`${t('general.skin')} & ${t('general.cape')}`), - ).toBeInTheDocument() + expect( + queryByText(`${t('general.skin')} & ${t('general.cape')}`), + ).toBeInTheDocument(); - fireEvent.click(getByText(t('user.resetSelected'))) - expect( - queryByText(`${t('general.skin')} & ${t('general.cape')}`), - ).not.toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('user.resetSelected'))); + expect( + queryByText(`${t('general.skin')} & ${t('general.cape')}`), + ).not.toBeInTheDocument(); + }); +}); describe('set avatar', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(createPaginator([fixtureSkin])) + beforeEach(() => { + fetch.get.mockResolvedValue(createPaginator([fixtureSkin])); - const img = document.createElement('img') - img.alt = 'User Image' - document.body.appendChild(img) - }) + const img = document.createElement('img'); + img.alt = 'User Image'; + document.body.append(img); + }); - afterEach(() => { - document.querySelector('[alt="User Image"]')!.remove() - }) + afterEach(() => { + document.querySelector('[alt="User Image"]')!.remove(); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.setAsAvatar'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.user.profile.avatar(), { - tid: fixtureSkin.tid, - }), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(document.querySelector('[alt="User Image"]')).toHaveAttribute( - 'src', - `/avatar/${fixtureSkin.tid}`, - ) - }) + fireEvent.click(getByText(t('user.setAsAvatar'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.profile.avatar(), { + tid: fixtureSkin.tid, + }); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(document.querySelector('[alt="User Image"]')).toHaveAttribute( + 'src', + `/avatar/${fixtureSkin.tid}`, + ); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.setAsAvatar'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.user.profile.avatar(), { - tid: fixtureSkin.tid, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByText(t('user.setAsAvatar'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.profile.avatar(), { + tid: fixtureSkin.tid, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('cancelled', async () => { - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.setAsAvatar'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.post).not.toBeCalled()) - }) -}) + fireEvent.click(getByText(t('user.setAsAvatar'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.post).not.toBeCalled(); + }); + }); +}); describe('apply textures to player', () => { - it('selected nothing', async () => { - fetch.get.mockResolvedValue(createPaginator([])) + it('selected nothing', async () => { + fetch.get.mockResolvedValue(createPaginator([])); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.useAs'))) + fireEvent.click(getByText(t('user.useAs'))); - expect(queryByText(t('user.emptySelectedTexture'))).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-info') - }) + expect(queryByText(t('user.emptySelectedTexture'))).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-info'); + }); - it('search players', async () => { - fetch.get - .mockResolvedValueOnce(createPaginator([fixtureSkin])) - .mockResolvedValueOnce([fixturePlayer]) + it('search players', async () => { + fetch.get + .mockResolvedValueOnce(createPaginator([fixtureSkin])) + .mockResolvedValueOnce([fixturePlayer]); - const { - getByText, - getByAltText, - getAllByPlaceholderText, - queryByText, - findByText, - } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const { + getByText, + getByAltText, + getAllByPlaceholderText, + queryByText, + findByText, + } = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)) - fireEvent.click(getByText(t('user.useAs'))) + fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)); + fireEvent.click(getByText(t('user.useAs'))); - expect(await findByText(fixturePlayer.name)).toBeInTheDocument() + expect(await findByText(fixturePlayer.name)).toBeInTheDocument(); - fireEvent.input(getAllByPlaceholderText(t('user.typeToSearch'))[1]!, { - target: { value: 'reina' }, - }) - expect(queryByText(fixturePlayer.name)).not.toBeInTheDocument() - }) + fireEvent.input(getAllByPlaceholderText(t('user.typeToSearch'))[1], { + target: {value: 'reina'}, + }); + expect(queryByText(fixturePlayer.name)).not.toBeInTheDocument(); + }); - it('succeeded', async () => { - fetch.get - .mockResolvedValueOnce(createPaginator([fixtureSkin])) - .mockResolvedValueOnce([fixturePlayer]) - fetch.put.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.get + .mockResolvedValueOnce(createPaginator([fixtureSkin])) + .mockResolvedValueOnce([fixturePlayer]); + fetch.put.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByAltText, getByTitle, getByRole, queryByText } = - render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByAltText, getByTitle, getByRole, queryByText} + = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)) - fireEvent.click(getByText(t('user.useAs'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle(fixturePlayer.name)) - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.user.player.set(fixturePlayer.pid), - { skin: fixtureSkin.tid }, - ), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)); + fireEvent.click(getByText(t('user.useAs'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle(fixturePlayer.name)); + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.user.player.set(fixturePlayer.pid), + {skin: fixtureSkin.tid}, + ); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.get - .mockResolvedValueOnce(createPaginator([fixtureSkin])) - .mockResolvedValueOnce([fixturePlayer]) - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.get + .mockResolvedValueOnce(createPaginator([fixtureSkin])) + .mockResolvedValueOnce([fixturePlayer]); + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByAltText, getByTitle, getByRole, queryByText } = - render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByAltText, getByTitle, getByRole, queryByText} + = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)) - fireEvent.click(getByText(t('user.useAs'))) - await waitFor(() => expect(fetch.get).toBeCalled()) - fireEvent.click(getByTitle(fixturePlayer.name)) - await waitFor(() => - expect(fetch.put).toBeCalledWith( - urls.user.player.set(fixturePlayer.pid), - { skin: fixtureSkin.tid }, - ), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)); + fireEvent.click(getByText(t('user.useAs'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); + fireEvent.click(getByTitle(fixturePlayer.name)); + await waitFor(() => { + expect(fetch.put).toBeCalledWith( + urls.user.player.set(fixturePlayer.pid), + {skin: fixtureSkin.tid}, + ); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('close dialog', async () => { - fetch.get - .mockResolvedValueOnce(createPaginator([fixtureSkin])) - .mockResolvedValueOnce([fixturePlayer]) + it('close dialog', async () => { + fetch.get + .mockResolvedValueOnce(createPaginator([fixtureSkin])) + .mockResolvedValueOnce([fixturePlayer]); - const { getByText, getByAltText } = render() - await waitFor(() => expect(fetch.get).toBeCalled()) + const {getByText, getByAltText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)) - fireEvent.click(getByText(t('user.useAs'))) - await waitFor(() => expect(fetch.get).toBeCalled()) + fireEvent.click(getByAltText(fixtureSkin.pivot.item_name)); + fireEvent.click(getByText(t('user.useAs'))); + await waitFor(() => { + expect(fetch.get).toBeCalled(); + }); - $('#modal-apply').modal('hide').trigger('hidden.bs.modal') + $('#modal-apply').modal('hide').trigger('hidden.bs.modal'); - expect(fetch.put).not.toBeCalled() - }) -}) + expect(fetch.put).not.toBeCalled(); + }); +}); diff --git a/resources/assets/tests/views/user/Dashboard.test.tsx b/resources/assets/tests/views/user/Dashboard.test.tsx index 1bce52b9..d892f3d6 100644 --- a/resources/assets/tests/views/user/Dashboard.test.tsx +++ b/resources/assets/tests/views/user/Dashboard.test.tsx @@ -1,173 +1,203 @@ -import { expect, vi, it, describe, beforeEach } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import * as fetch from '@/scripts/net' -import { t } from '@/scripts/i18n' -import urls from '@/scripts/urls' -import Dashboard from '@/views/user/Dashboard' +import { + expect, vi, it, describe, beforeEach, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import * as fetch from '@/scripts/net'; +import {t} from '@/scripts/i18n'; +import urls from '@/scripts/urls'; +import Dashboard from '@/views/user/Dashboard'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); function scoreInfo(data = {}, user = {}, usage = {}) { - return { - user: { score: 600, lastSignAt: '2018-08-07 16:06:49', ...user }, - usage: { - players: 3, - storage: 5, - ...usage, - }, - rate: { - players: 10, - storage: 1, - }, - signAfterZero: false, - signGapTime: '24', - ...data, - } + return { + user: {score: 600, lastSignAt: '2018-08-07 16:06:49', ...user}, + usage: { + players: 3, + storage: 5, + ...usage, + }, + rate: { + players: 10, + storage: 1, + }, + signAfterZero: false, + signGapTime: '24', + ...data, + }; } describe('info box', () => { - it('players', async () => { - fetch.get.mockResolvedValue(scoreInfo({}, { score: 40 })) + it('players', async () => { + fetch.get.mockResolvedValue(scoreInfo({}, {score: 40})); - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(getByText('3')).toBeInTheDocument() - expect(getByText(/7/)).toBeInTheDocument() - }) + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(getByText('3')).toBeInTheDocument(); + expect(getByText(/7/)).toBeInTheDocument(); + }); - describe('storage', () => { - it('in KB', async () => { - fetch.get.mockResolvedValue( - scoreInfo({}, { score: 100 }, { storage: 700 }), - ) + describe('storage', () => { + it('in KB', async () => { + fetch.get.mockResolvedValue( + scoreInfo({}, {score: 100}, {storage: 700}), + ); - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(getByText('700')).toBeInTheDocument() - expect(getByText(/800/)).toBeInTheDocument() - expect(getByText(/KB/)).toBeInTheDocument() - }) + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(getByText('700')).toBeInTheDocument(); + expect(getByText(/800/)).toBeInTheDocument(); + expect(getByText(/KB/)).toBeInTheDocument(); + }); - it('in MB', async () => { - fetch.get.mockResolvedValue( - scoreInfo({}, { score: 3072 }, { storage: 4096 }), - ) + it('in MB', async () => { + fetch.get.mockResolvedValue( + scoreInfo({}, {score: 3072}, {storage: 4096}), + ); - const { getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(getByText('4')).toBeInTheDocument() - expect(getByText(/7/)).toBeInTheDocument() - expect(getByText(/MB/)).toBeInTheDocument() - }) - }) -}) + const {getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(getByText('4')).toBeInTheDocument(); + expect(getByText(/7/)).toBeInTheDocument(); + expect(getByText(/MB/)).toBeInTheDocument(); + }); + }); +}); describe('sign', () => { - beforeEach(() => { - fetch.get.mockResolvedValue(scoreInfo()) - }) + beforeEach(() => { + fetch.get.mockResolvedValue(scoreInfo()); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ - code: 0, - message: 'ok', - data: { score: 900 }, - }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({ + code: 0, + message: 'ok', + data: {score: 900}, + }); - const { getByRole, getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByRole, getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - const button = getByRole('button') - fireEvent.click(button) - await waitFor(() => expect(fetch.post).toBeCalledWith(urls.user.sign())) - expect(getByText('ok')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(button).toBeDisabled() - expect(queryByText(/905/)).toBeInTheDocument() - }) + const button = getByRole('button'); + fireEvent.click(button); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.sign()); + }); + expect(getByText('ok')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(button).toBeDisabled(); + expect(queryByText(/905/)).toBeInTheDocument(); + }); - it('cannot sign', async () => { - fetch.post.mockResolvedValue({ code: 1, message: '' }) + it('cannot sign', async () => { + fetch.post.mockResolvedValue({code: 1, message: ''}); - const { getByRole, getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByRole, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByRole('button')) - await waitFor(() => expect(fetch.post).toBeCalledWith(urls.user.sign())) + fireEvent.click(getByRole('button')); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.sign()); + }); - expect(getByText(/2[34]\sh/)).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-warning') - }) + expect(getByText(/2[34]\sh/)).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-warning'); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 2, message: 'f' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 2, message: 'f'}); - const { getByRole, getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByRole, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByRole('button')) - await waitFor(() => expect(fetch.post).toBeCalledWith(urls.user.sign())) + fireEvent.click(getByRole('button')); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.sign()); + }); - expect(getByText('f')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + expect(getByText('f')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); describe('sign button', () => { - it('should disabled when loading', () => { - fetch.get.mockResolvedValue(scoreInfo()) - const { getByRole } = render() - expect(getByRole('button')).toBeDisabled() - }) + it('should disabled when loading', () => { + fetch.get.mockResolvedValue(scoreInfo()); + const {getByRole} = render(); + expect(getByRole('button')).toBeDisabled(); + }); - it('sign is allowed', async () => { - fetch.get.mockResolvedValue(scoreInfo()) - const { getByRole } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - const button = getByRole('button') + it('sign is allowed', async () => { + fetch.get.mockResolvedValue(scoreInfo()); + const {getByRole} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + const button = getByRole('button'); - expect(button).toBeEnabled() - expect(button).toHaveTextContent(t('user.sign')) - }) + expect(button).toBeEnabled(); + expect(button).toHaveTextContent(t('user.sign')); + }); - it('sign is allowed if last sign is yesterday', async () => { - fetch.get.mockResolvedValue(scoreInfo({ signAfterZero: true })) - const { getByRole } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(getByRole('button')).toBeEnabled() - }) + it('sign is allowed if last sign is yesterday', async () => { + fetch.get.mockResolvedValue(scoreInfo({signAfterZero: true})); + const {getByRole} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(getByRole('button')).toBeEnabled(); + }); - it('sign is not allowed', async () => { - fetch.get.mockResolvedValue( - scoreInfo({ signAfterZero: true }, { lastSignAt: Date.now() }), - ) - const { getByRole } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - expect(getByRole('button')).toBeDisabled() - }) + it('sign is not allowed', async () => { + fetch.get.mockResolvedValue( + scoreInfo({signAfterZero: true}, {lastSignAt: Date.now()}), + ); + const {getByRole} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + expect(getByRole('button')).toBeDisabled(); + }); - it('remain in hours', async () => { - vi.useRealTimers() - fetch.get.mockResolvedValue(scoreInfo({}, { lastSignAt: Date.now() })) + it('remain in hours', async () => { + vi.useRealTimers(); + fetch.get.mockResolvedValue(scoreInfo({}, {lastSignAt: Date.now()})); - const { getByRole } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - const button = getByRole('button') + const {getByRole} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + const button = getByRole('button'); - expect(button).toBeDisabled() - expect(button).toHaveTextContent('23 h') - }) + expect(button).toBeDisabled(); + expect(button).toHaveTextContent('23 h'); + }); - it('remain in minutes', async () => { - fetch.get.mockResolvedValue( - scoreInfo({}, { lastSignAt: Date.now() - 23.5 * 3600 * 1000 }), - ) + it('remain in minutes', async () => { + fetch.get.mockResolvedValue( + scoreInfo({}, {lastSignAt: Date.now() - 23.5 * 3600 * 1000}), + ); - const { getByRole } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) - const button = getByRole('button') + const {getByRole} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); + const button = getByRole('button'); - expect(button).toBeDisabled() - expect(button).toHaveTextContent(/(29|30)\smin/) - }) -}) + expect(button).toBeDisabled(); + expect(button).toHaveTextContent(/(29|30)\smin/); + }); +}); diff --git a/resources/assets/tests/views/user/OAuth.test.tsx b/resources/assets/tests/views/user/OAuth.test.tsx index a0bd9319..3fbbc625 100644 --- a/resources/assets/tests/views/user/OAuth.test.tsx +++ b/resources/assets/tests/views/user/OAuth.test.tsx @@ -1,259 +1,298 @@ -import { expect, vi, it, test, describe, beforeEach } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import * as fetch from '@/scripts/net' -import { t } from '@/scripts/i18n' -import OAuth from '@/views/user/OAuth' -import type { App } from '@/views/user/OAuth/types' +import { + expect, vi, it, test, describe, beforeEach, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import * as fetch from '@/scripts/net'; +import {t} from '@/scripts/i18n'; +import OAuth from '@/views/user/OAuth'; +import type {App} from '@/views/user/OAuth/types'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixture: Readonly = Object.freeze({ - id: 1, - name: 'My App', - redirect: 'http://url.test/', - secret: 'abc', -}) + id: 1, + name: 'My App', + redirect: 'http://url.test/', + secret: 'abc', +}); test('loading data', () => { - fetch.get.mockResolvedValue([]) - const { queryByTitle } = render() - expect(queryByTitle('Loading...')).toBeInTheDocument() -}) + fetch.get.mockResolvedValue([]); + const {queryByTitle} = render(); + expect(queryByTitle('Loading...')).toBeInTheDocument(); +}); describe('create app', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([]); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue(fixture) - const { getByLabelText, getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('succeeded', async () => { + fetch.post.mockResolvedValue(fixture); + const {getByLabelText, getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.oauth.create'))) - fireEvent.input(getByLabelText(t('user.oauth.name')), { - target: { value: 'My App' }, - }) - fireEvent.input(getByLabelText(t('user.oauth.redirect')), { - target: { value: 'http://url.test/' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/oauth/clients', { - name: 'My App', - redirect: 'http://url.test/', - }), - ) - expect(queryByText(fixture.id.toString())).toBeInTheDocument() - expect(queryByText(fixture.name)).toBeInTheDocument() - expect(queryByText(fixture.redirect)).toBeInTheDocument() - expect(queryByText(fixture.secret)).toBeInTheDocument() - }) + fireEvent.click(getByText(t('user.oauth.create'))); + fireEvent.input(getByLabelText(t('user.oauth.name')), { + target: {value: 'My App'}, + }); + fireEvent.input(getByLabelText(t('user.oauth.redirect')), { + target: {value: 'http://url.test/'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/oauth/clients', { + name: 'My App', + redirect: 'http://url.test/', + }); + }, + ); + expect(queryByText(fixture.id.toString())).toBeInTheDocument(); + expect(queryByText(fixture.name)).toBeInTheDocument(); + expect(queryByText(fixture.redirect)).toBeInTheDocument(); + expect(queryByText(fixture.secret)).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ message: 'exception' }) - const { getByLabelText, getByText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('failed', async () => { + fetch.post.mockResolvedValue({message: 'exception'}); + const {getByLabelText, getByText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.oauth.create'))) - fireEvent.input(getByLabelText(t('user.oauth.name')), { - target: { value: 'My App' }, - }) - fireEvent.input(getByLabelText(t('user.oauth.redirect')), { - target: { value: 'http://url.test/' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/oauth/clients', { - name: 'My App', - redirect: 'http://url.test/', - }), - ) - expect(queryByText(fixture.name)).not.toBeInTheDocument() - expect(queryByText(fixture.redirect)).not.toBeInTheDocument() - expect(queryByText('exception')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByText(t('user.oauth.create'))); + fireEvent.input(getByLabelText(t('user.oauth.name')), { + target: {value: 'My App'}, + }); + fireEvent.input(getByLabelText(t('user.oauth.redirect')), { + target: {value: 'http://url.test/'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/oauth/clients', { + name: 'My App', + redirect: 'http://url.test/', + }); + }, + ); + expect(queryByText(fixture.name)).not.toBeInTheDocument(); + expect(queryByText(fixture.redirect)).not.toBeInTheDocument(); + expect(queryByText('exception')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('cancel dialog', async () => { - const { getByLabelText, getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancel dialog', async () => { + const {getByLabelText, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.oauth.create'))) - fireEvent.input(getByLabelText(t('user.oauth.name')), { - target: { value: 'My App' }, - }) - fireEvent.input(getByLabelText(t('user.oauth.redirect')), { - target: { value: 'http://url.test/' }, - }) - fireEvent.click(getByText(t('general.cancel'))) + fireEvent.click(getByText(t('user.oauth.create'))); + fireEvent.input(getByLabelText(t('user.oauth.name')), { + target: {value: 'My App'}, + }); + fireEvent.input(getByLabelText(t('user.oauth.redirect')), { + target: {value: 'http://url.test/'}, + }); + fireEvent.click(getByText(t('general.cancel'))); - await waitFor(() => expect(fetch.post).not.toBeCalled()) + await waitFor(() => { + expect(fetch.post).not.toBeCalled(); + }); - fireEvent.click(getByText(t('user.oauth.create'))) - expect(getByLabelText(t('user.oauth.name'))).toHaveValue('') - expect(getByLabelText(t('user.oauth.redirect'))).toHaveValue('') - }) -}) + fireEvent.click(getByText(t('user.oauth.create'))); + expect(getByLabelText(t('user.oauth.name'))).toHaveValue(''); + expect(getByLabelText(t('user.oauth.redirect'))).toHaveValue(''); + }); +}); describe('edit app', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([fixture]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([fixture]); + }); - describe('edit name', () => { - it('succeeded', async () => { - fetch.put.mockResolvedValue({ ...fixture, name: 'new name' }) + describe('edit name', () => { + it('succeeded', async () => { + fetch.put.mockResolvedValue({...fixture, name: 'new name'}); - const { getByTitle, getByText, getByDisplayValue, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByText, getByDisplayValue, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.oauth.modifyName'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: 'new name' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { - ...fixture, - name: 'new name', - }), - ) - expect(queryByText('new name')).toBeInTheDocument() - }) + fireEvent.click(getByTitle(t('user.oauth.modifyName'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: 'new name'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { + ...fixture, + name: 'new name', + }); + }, + ); + expect(queryByText('new name')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ message: 'exception' }) + it('failed', async () => { + fetch.put.mockResolvedValue({message: 'exception'}); - const { - getByTitle, - getByText, - getByDisplayValue, - getByRole, - queryByText, - } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const { + getByTitle, + getByText, + getByDisplayValue, + getByRole, + queryByText, + } = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.oauth.modifyName'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: 'new name' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { - ...fixture, - name: 'new name', - }), - ) - expect(queryByText(fixture.name)).toBeInTheDocument() - expect(queryByText('exception')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByTitle(t('user.oauth.modifyName'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: 'new name'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { + ...fixture, + name: 'new name', + }); + }, + ); + expect(queryByText(fixture.name)).toBeInTheDocument(); + expect(queryByText('exception')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('cancel dialog', async () => { - const { getByTitle, getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancel dialog', async () => { + const {getByTitle, getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.oauth.modifyName'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText(fixture.name)).toBeInTheDocument() - }) - }) + fireEvent.click(getByTitle(t('user.oauth.modifyName'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); + }); - describe('edit redirect url', () => { - it('succeeded', async () => { - fetch.put.mockResolvedValue({ ...fixture, redirect: 'http://new.test/' }) + describe('edit redirect url', () => { + it('succeeded', async () => { + fetch.put.mockResolvedValue({...fixture, redirect: 'http://new.test/'}); - const { getByTitle, getByDisplayValue, getByText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByTitle, getByDisplayValue, getByText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.oauth.modifyUrl'))) - fireEvent.input(getByDisplayValue(fixture.redirect), { - target: { value: 'http://new.test/' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { - ...fixture, - redirect: 'http://new.test/', - }), - ) - expect(queryByText('http://new.test/')).toBeInTheDocument() - }) + fireEvent.click(getByTitle(t('user.oauth.modifyUrl'))); + fireEvent.input(getByDisplayValue(fixture.redirect), { + target: {value: 'http://new.test/'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { + ...fixture, + redirect: 'http://new.test/', + }); + }, + ); + expect(queryByText('http://new.test/')).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ message: 'exception' }) + it('failed', async () => { + fetch.put.mockResolvedValue({message: 'exception'}); - const { - getByTitle, - getByDisplayValue, - getByText, - getByRole, - queryByText, - } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const { + getByTitle, + getByDisplayValue, + getByText, + getByRole, + queryByText, + } = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.oauth.modifyUrl'))) - fireEvent.input(getByDisplayValue(fixture.redirect), { - target: { value: 'http://new.test/' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { - ...fixture, - redirect: 'http://new.test/', - }), - ) - expect(queryByText(fixture.redirect)).toBeInTheDocument() - expect(queryByText('exception')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByTitle(t('user.oauth.modifyUrl'))); + fireEvent.input(getByDisplayValue(fixture.redirect), { + target: {value: 'http://new.test/'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(`/oauth/clients/${fixture.id}`, { + ...fixture, + redirect: 'http://new.test/', + }); + }, + ); + expect(queryByText(fixture.redirect)).toBeInTheDocument(); + expect(queryByText('exception')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('cancel dialog', async () => { - const { getByTitle, getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancel dialog', async () => { + const {getByTitle, getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.oauth.modifyUrl'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText(fixture.redirect)).toBeInTheDocument() - }) - }) -}) + fireEvent.click(getByTitle(t('user.oauth.modifyUrl'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText(fixture.redirect)).toBeInTheDocument(); + }); + }); +}); describe('delete app', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([fixture]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([fixture]); + }); - it('succeeded', async () => { - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('succeeded', async () => { + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('report.delete'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(`/oauth/clients/${fixture.id}`), - ) - expect(queryByText(fixture.name)).not.toBeInTheDocument() - expect(queryByText(fixture.redirect)).not.toBeInTheDocument() - }) + fireEvent.click(getByText(t('report.delete'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(`/oauth/clients/${fixture.id}`); + }, + ); + expect(queryByText(fixture.name)).not.toBeInTheDocument(); + expect(queryByText(fixture.redirect)).not.toBeInTheDocument(); + }); - it('cancel dialog', async () => { - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancel dialog', async () => { + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('report.delete'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.del).not.toBeCalled()) - expect(queryByText(fixture.name)).toBeInTheDocument() - expect(queryByText(fixture.redirect)).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('report.delete'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.del).not.toBeCalled(); + }); + expect(queryByText(fixture.name)).toBeInTheDocument(); + expect(queryByText(fixture.redirect)).toBeInTheDocument(); + }); +}); diff --git a/resources/assets/tests/views/user/Players.test.tsx b/resources/assets/tests/views/user/Players.test.tsx index fb9e6ef8..4498d253 100644 --- a/resources/assets/tests/views/user/Players.test.tsx +++ b/resources/assets/tests/views/user/Players.test.tsx @@ -1,490 +1,560 @@ -import { expect, vi, it, test, beforeEach, afterEach, describe } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import { type Player, TextureType } from '@/scripts/types' -import urls from '@/scripts/urls' -import Players from '@/views/user/Players' +import { + expect, vi, it, test, beforeEach, afterEach, describe, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import {type Player, TextureType} from '@/scripts/types'; +import urls from '@/scripts/urls'; +import Players from '@/views/user/Players'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); const fixture: Readonly = Object.freeze({ - pid: 1, - name: 'kumiko', - uid: 1, - tid_skin: 1, - tid_cape: 2, - last_modified: new Date().toString(), -}) + pid: 1, + name: 'kumiko', + uid: 1, + tid_skin: 1, + tid_cape: 2, + last_modified: new Date().toString(), +}); beforeEach(() => { - const container = document.createElement('div') - container.id = 'previewer' - document.body.appendChild(container) + const container = document.createElement('div'); + container.id = 'previewer'; + document.body.append(container); - blessing.extra = { - count: 1, - rule: 'please follow the rule', - length: 'greater than 3', - score: 1000, - cost: 50, - } -}) + blessing.extra = { + count: 1, + rule: 'please follow the rule', + length: 'greater than 3', + score: 1000, + cost: 50, + }; +}); afterEach(() => { - document.querySelector('#previewer')!.remove() -}) + document.querySelector('#previewer')!.remove(); +}); test('search players', async () => { - const fixture2: Player = { - pid: 2, - name: 'reina', - uid: 2, - tid_skin: 3, - tid_cape: 4, - last_modified: new Date().toString(), - } - fetch.get.mockResolvedValue([fixture, fixture2]) + const fixture2: Player = { + pid: 2, + name: 'reina', + uid: 2, + tid_skin: 3, + tid_cape: 4, + last_modified: new Date().toString(), + }; + fetch.get.mockResolvedValue([fixture, fixture2]); - const { getByPlaceholderText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByPlaceholderText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.input(getByPlaceholderText(t('user.typeToSearch')), { - target: { value: 'k' }, - }) + fireEvent.input(getByPlaceholderText(t('user.typeToSearch')), { + target: {value: 'k'}, + }); - expect(queryByText(fixture.name)).toBeInTheDocument() - expect(queryByText(fixture2.name)).not.toBeInTheDocument() -}) + expect(queryByText(fixture.name)).toBeInTheDocument(); + expect(queryByText(fixture2.name)).not.toBeInTheDocument(); +}); describe('select player automatically', () => { - it('only one player', async () => { - fetch.get - .mockResolvedValueOnce([fixture]) - .mockResolvedValueOnce({ hash: '', type: TextureType.Steve }) - .mockResolvedValueOnce({ hash: '', type: TextureType.Cape }) - render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('only one player', async () => { + fetch.get + .mockResolvedValueOnce([fixture]) + .mockResolvedValueOnce({hash: '', type: TextureType.Steve}) + .mockResolvedValueOnce({hash: '', type: TextureType.Cape}); + render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(fetch.get).toBeCalledWith(`/skinlib/info/${fixture.tid_skin}`) - expect(fetch.get).toBeCalledWith(`/skinlib/info/${fixture.tid_cape}`) - }) + expect(fetch.get).toBeCalledWith(`/skinlib/info/${fixture.tid_skin}`); + expect(fetch.get).toBeCalledWith(`/skinlib/info/${fixture.tid_cape}`); + }); - it('more players', async () => { - const fixture2: Player = { - pid: 2, - name: 'reina', - uid: 2, - tid_skin: 3, - tid_cape: 4, - last_modified: new Date().toString(), - } - fetch.get.mockResolvedValue([fixture, fixture2]) - render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('more players', async () => { + const fixture2: Player = { + pid: 2, + name: 'reina', + uid: 2, + tid_skin: 3, + tid_cape: 4, + last_modified: new Date().toString(), + }; + fetch.get.mockResolvedValue([fixture, fixture2]); + render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - expect(fetch.get).not.toBeCalledWith(`/skinlib/info/${fixture.tid_skin}`) - expect(fetch.get).not.toBeCalledWith(`/skinlib/info/${fixture.tid_cape}`) - }) -}) + expect(fetch.get).not.toBeCalledWith(`/skinlib/info/${fixture.tid_skin}`); + expect(fetch.get).not.toBeCalledWith(`/skinlib/info/${fixture.tid_cape}`); + }); +}); describe('2d preview', () => { - it('skin and cape', async () => { - fetch.get - .mockResolvedValueOnce([fixture]) - .mockResolvedValueOnce({ hash: 'a', type: TextureType.Steve }) - .mockResolvedValueOnce({ hash: 'b', type: TextureType.Cape }) + it('skin and cape', async () => { + fetch.get + .mockResolvedValueOnce([fixture]) + .mockResolvedValueOnce({hash: 'a', type: TextureType.Steve}) + .mockResolvedValueOnce({hash: 'b', type: TextureType.Cape}); - const { getByAltText, getByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByAltText, getByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.switch2dPreview'))) + fireEvent.click(getByText(t('user.switch2dPreview'))); - expect(getByAltText(t('general.skin'))).toHaveAttribute( - 'src', - `${blessing.base_url}/textures/a`, - ) - expect(getByAltText(t('general.cape'))).toHaveAttribute( - 'src', - `${blessing.base_url}/textures/b`, - ) - }) + expect(getByAltText(t('general.skin'))).toHaveAttribute( + 'src', + `${blessing.base_url}/textures/a`, + ); + expect(getByAltText(t('general.cape'))).toHaveAttribute( + 'src', + `${blessing.base_url}/textures/b`, + ); + }); - it('skin only', async () => { - fetch.get - .mockResolvedValueOnce([{ ...fixture, tid_cape: 0 }]) - .mockResolvedValueOnce({ hash: 'a', type: TextureType.Steve }) + it('skin only', async () => { + fetch.get + .mockResolvedValueOnce([{...fixture, tid_cape: 0}]) + .mockResolvedValueOnce({hash: 'a', type: TextureType.Steve}); - const { getByAltText, queryByAltText, getByText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByAltText, queryByAltText, getByText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.switch2dPreview'))) + fireEvent.click(getByText(t('user.switch2dPreview'))); - expect(getByAltText(t('general.skin'))).toHaveAttribute( - 'src', - `${blessing.base_url}/textures/a`, - ) - expect(queryByAltText(t('general.cape'))).not.toBeInTheDocument() - expect(queryByText(t('user.player.texture-empty'))).toBeInTheDocument() - }) + expect(getByAltText(t('general.skin'))).toHaveAttribute( + 'src', + `${blessing.base_url}/textures/a`, + ); + expect(queryByAltText(t('general.cape'))).not.toBeInTheDocument(); + expect(queryByText(t('user.player.texture-empty'))).toBeInTheDocument(); + }); - it('cape only', async () => { - fetch.get - .mockResolvedValueOnce([{ ...fixture, tid_skin: 0 }]) - .mockResolvedValueOnce({ hash: 'a', type: TextureType.Cape }) + it('cape only', async () => { + fetch.get + .mockResolvedValueOnce([{...fixture, tid_skin: 0}]) + .mockResolvedValueOnce({hash: 'a', type: TextureType.Cape}); - const { getByAltText, queryByAltText, getByText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByAltText, queryByAltText, getByText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.switch2dPreview'))) + fireEvent.click(getByText(t('user.switch2dPreview'))); - expect(getByAltText(t('general.cape'))).toHaveAttribute( - 'src', - `${blessing.base_url}/textures/a`, - ) - expect(queryByAltText(t('general.skin'))).not.toBeInTheDocument() - expect(queryByText(t('user.player.texture-empty'))).toBeInTheDocument() - }) -}) + expect(getByAltText(t('general.cape'))).toHaveAttribute( + 'src', + `${blessing.base_url}/textures/a`, + ); + expect(queryByAltText(t('general.skin'))).not.toBeInTheDocument(); + expect(queryByText(t('user.player.texture-empty'))).toBeInTheDocument(); + }); +}); describe('create player', () => { - beforeEach(() => { - fetch.get.mockResolvedValue([]) - }) + beforeEach(() => { + fetch.get.mockResolvedValue([]); + }); - it('alert if score is enough', async () => { - const { getByRole, getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('alert if score is enough', async () => { + const {getByRole, getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.add-player'))) + fireEvent.click(getByText(t('user.player.add-player'))); - expect( - queryByText(`${t('user.cur-score')} ${blessing.extra.score}`), - ).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-success') - }) + expect( + queryByText(`${t('user.cur-score')} ${blessing.extra.score}`), + ).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-success'); + }); - it('alert if lack of score', async () => { - blessing.extra.score = 0 - const { getByRole, getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('alert if lack of score', async () => { + blessing.extra.score = 0; + const {getByRole, getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.add-player'))) + fireEvent.click(getByText(t('user.player.add-player'))); - expect( - queryByText(`${t('user.cur-score')} ${blessing.extra.score}`), - ).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + expect( + queryByText(`${t('user.cur-score')} ${blessing.extra.score}`), + ).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'success', data: fixture }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'success', data: fixture}); - const { getByText, getByLabelText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByLabelText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.add-player'))) - fireEvent.input(getByLabelText(t('general.player.player-name')), { - target: { value: fixture.name }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.user.player.add(), { - name: fixture.name, - }), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText(fixture.pid.toString())).toBeInTheDocument() - expect(queryByText(fixture.name)).toBeInTheDocument() - }) + fireEvent.click(getByText(t('user.player.add-player'))); + fireEvent.input(getByLabelText(t('general.player.player-name')), { + target: {value: fixture.name}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.player.add(), { + name: fixture.name, + }); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText(fixture.pid.toString())).toBeInTheDocument(); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByLabelText, getByRole, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByLabelText, getByRole, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.add-player'))) - fireEvent.input(getByLabelText(t('general.player.player-name')), { - target: { value: fixture.name }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith(urls.user.player.add(), { - name: fixture.name, - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.name)).not.toBeInTheDocument() - }) + fireEvent.click(getByText(t('user.player.add-player'))); + fireEvent.input(getByLabelText(t('general.player.player-name')), { + target: {value: fixture.name}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith(urls.user.player.add(), { + name: fixture.name, + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.name)).not.toBeInTheDocument(); + }); - it('cancelled', async () => { - const { getByText, getByLabelText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, getByLabelText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.add-player'))) - fireEvent.input(getByLabelText(t('general.player.player-name')), { - target: { value: fixture.name }, - }) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.post).not.toBeCalled()) - expect(queryByText(fixture.name)).not.toBeInTheDocument() - }) + fireEvent.click(getByText(t('user.player.add-player'))); + fireEvent.input(getByLabelText(t('general.player.player-name')), { + target: {value: fixture.name}, + }); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.post).not.toBeCalled(); + }); + expect(queryByText(fixture.name)).not.toBeInTheDocument(); + }); - it('clear form on close', async () => { - const { getByText, getByLabelText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('clear form on close', async () => { + const {getByText, getByLabelText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.add-player'))) - fireEvent.input(getByLabelText(t('general.player.player-name')), { - target: { value: fixture.name }, - }) - fireEvent.click(getByText(t('general.cancel'))) - fireEvent.click(getByText(t('user.player.add-player'))) + fireEvent.click(getByText(t('user.player.add-player'))); + fireEvent.input(getByLabelText(t('general.player.player-name')), { + target: {value: fixture.name}, + }); + fireEvent.click(getByText(t('general.cancel'))); + fireEvent.click(getByText(t('user.player.add-player'))); - expect(getByLabelText(t('general.player.player-name'))).toHaveValue('') - }) -}) + expect(getByLabelText(t('general.player.player-name'))).toHaveValue(''); + }); +}); describe('edit player name', () => { - beforeEach(() => { - fetch.get - .mockResolvedValueOnce([fixture]) - .mockResolvedValueOnce({ hash: 'a', type: 'skin' }) - .mockResolvedValueOnce({ hash: 'b', type: TextureType.Cape }) - }) + beforeEach(() => { + fetch.get + .mockResolvedValueOnce([fixture]) + .mockResolvedValueOnce({hash: 'a', type: 'skin'}) + .mockResolvedValueOnce({hash: 'b', type: TextureType.Cape}); + }); - it('succeeded', async () => { - fetch.put.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.put.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByTitle, getByDisplayValue, getByRole, queryByText } = - render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByTitle, getByDisplayValue, getByRole, queryByText} + = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.player.edit-pname'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: 'reina' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.user.player.rename(fixture.pid), { - name: 'reina', - }), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText('reina')).toBeInTheDocument() - }) + fireEvent.click(getByTitle(t('user.player.edit-pname'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: 'reina'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.user.player.rename(fixture.pid), { + name: 'reina', + }); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText('reina')).toBeInTheDocument(); + }); - it('empty name', async () => { - const { getByText, getByTitle, getByDisplayValue, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('empty name', async () => { + const {getByText, getByTitle, getByDisplayValue, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.player.edit-pname'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: '' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.put).not.toBeCalled()) - expect(queryByText(t('user.emptyPlayerName'))).toBeInTheDocument() + fireEvent.click(getByTitle(t('user.player.edit-pname'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: ''}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).not.toBeCalled(); + }); + expect(queryByText(t('user.emptyPlayerName'))).toBeInTheDocument(); - fireEvent.click(getByText(t('general.cancel'))) - expect(queryByText(fixture.name)).toBeInTheDocument() - }) + fireEvent.click(getByText(t('general.cancel'))); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); - it('failed', async () => { - fetch.put.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.put.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByTitle, getByDisplayValue, getByRole, queryByText } = - render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByTitle, getByDisplayValue, getByRole, queryByText} + = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByTitle(t('user.player.edit-pname'))) - fireEvent.input(getByDisplayValue(fixture.name), { - target: { value: 'reina' }, - }) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.put).toBeCalledWith(urls.user.player.rename(fixture.pid), { - name: 'reina', - }), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.name)).toBeInTheDocument() - }) -}) + fireEvent.click(getByTitle(t('user.player.edit-pname'))); + fireEvent.input(getByDisplayValue(fixture.name), { + target: {value: 'reina'}, + }); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.put).toBeCalledWith(urls.user.player.rename(fixture.pid), { + name: 'reina', + }); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); +}); describe('reset texture', () => { - beforeEach(() => { - fetch.get - .mockResolvedValueOnce([fixture]) - .mockResolvedValueOnce({ hash: 'a', type: 'skin' }) - .mockResolvedValueOnce({ hash: 'b', type: TextureType.Cape }) - }) + beforeEach(() => { + fetch.get + .mockResolvedValueOnce([fixture]) + .mockResolvedValueOnce({hash: 'a', type: 'skin'}) + .mockResolvedValueOnce({hash: 'b', type: TextureType.Cape}); + }); - it('clear skin and cape', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'success' }) + it('clear skin and cape', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByRole, getByLabelText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, getByLabelText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-texture'))) - fireEvent.click(getByLabelText(t('general.skin'))) - fireEvent.click(getByLabelText(t('general.cape'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith( - `${urls.user.player.clear(fixture.pid)}?skin=true&cape=true`, - ), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('user.player.delete-texture'))); + fireEvent.click(getByLabelText(t('general.skin'))); + fireEvent.click(getByLabelText(t('general.cape'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?skin=true&cape=true`, + ); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('clear skin', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'success' }) + it('clear skin', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByRole, getByLabelText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, getByLabelText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-texture'))) - fireEvent.click(getByLabelText(t('general.skin'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith( - `${urls.user.player.clear(fixture.pid)}?skin=true`, - ), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('user.player.delete-texture'))); + fireEvent.click(getByLabelText(t('general.skin'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?skin=true`, + ); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('clear cape', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'success' }) + it('clear cape', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByRole, getByLabelText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, getByLabelText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-texture'))) - fireEvent.click(getByLabelText(t('general.cape'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith( - `${urls.user.player.clear(fixture.pid)}?cape=true`, - ), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('user.player.delete-texture'))); + fireEvent.click(getByLabelText(t('general.cape'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?cape=true`, + ); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('select nothing', async () => { - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('select nothing', async () => { + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-texture'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => expect(fetch.del).not.toBeCalled()) - expect(queryByText(t('user.noClearChoice'))).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-warning') - }) + fireEvent.click(getByText(t('user.player.delete-texture'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).not.toBeCalled(); + }); + expect(queryByText(t('user.noClearChoice'))).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-warning'); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, getByLabelText, queryByText } = render( - , - ) - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, getByLabelText, queryByText} = render( + , + ); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-texture'))) - fireEvent.click(getByLabelText(t('general.skin'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith( - `${urls.user.player.clear(fixture.pid)}?skin=true`, - ), - ) - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) + fireEvent.click(getByText(t('user.player.delete-texture'))); + fireEvent.click(getByLabelText(t('general.skin'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?skin=true`, + ); + }, + ); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); - it('cancelled', async () => { - const { getByText, getByLabelText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, getByLabelText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-texture'))) - fireEvent.click(getByLabelText(t('general.skin'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.del).not.toBeCalled()) - }) -}) + fireEvent.click(getByText(t('user.player.delete-texture'))); + fireEvent.click(getByLabelText(t('general.skin'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.del).not.toBeCalled(); + }); + }); +}); describe('delete player', () => { - beforeEach(() => { - fetch.get - .mockResolvedValueOnce([fixture]) - .mockResolvedValueOnce({ hash: 'a', type: 'skin' }) - .mockResolvedValueOnce({ hash: 'b', type: TextureType.Cape }) - }) + beforeEach(() => { + fetch.get + .mockResolvedValueOnce([fixture]) + .mockResolvedValueOnce({hash: 'a', type: 'skin'}) + .mockResolvedValueOnce({hash: 'b', type: TextureType.Cape}); + }); - it('succeeded', async () => { - fetch.del.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.del.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-player'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.user.player.delete(fixture.pid)), - ) - expect(getByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - expect(queryByText(fixture.name)).not.toBeInTheDocument() - }) + fireEvent.click(getByText(t('user.player.delete-player'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.user.player.delete(fixture.pid)); + }, + ); + expect(getByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + expect(queryByText(fixture.name)).not.toBeInTheDocument(); + }); - it('failed', async () => { - fetch.del.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.del.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + const {getByText, getByRole, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-player'))) - fireEvent.click(getByText(t('general.confirm'))) - await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.user.player.delete(fixture.pid)), - ) - expect(getByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - expect(queryByText(fixture.name)).toBeInTheDocument() - }) + fireEvent.click(getByText(t('user.player.delete-player'))); + fireEvent.click(getByText(t('general.confirm'))); + await waitFor(() => { + expect(fetch.del).toBeCalledWith(urls.user.player.delete(fixture.pid)); + }, + ); + expect(getByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); - it('cancelled', async () => { - const { getByText, queryByText } = render() - await waitFor(() => expect(fetch.get).toBeCalledTimes(1)) + it('cancelled', async () => { + const {getByText, queryByText} = render(); + await waitFor(() => { + expect(fetch.get).toBeCalledTimes(1); + }); - fireEvent.click(getByText(t('user.player.delete-player'))) - fireEvent.click(getByText(t('general.cancel'))) - await waitFor(() => expect(fetch.del).not.toBeCalled()) - expect(queryByText(fixture.name)).toBeInTheDocument() - }) -}) + fireEvent.click(getByText(t('user.player.delete-player'))); + fireEvent.click(getByText(t('general.cancel'))); + await waitFor(() => { + expect(fetch.del).not.toBeCalled(); + }); + expect(queryByText(fixture.name)).toBeInTheDocument(); + }); +}); diff --git a/resources/assets/tests/views/user/profile/deleteAccount.test.ts b/resources/assets/tests/views/user/profile/deleteAccount.test.ts index c3e9504d..7edc9063 100644 --- a/resources/assets/tests/views/user/profile/deleteAccount.test.ts +++ b/resources/assets/tests/views/user/profile/deleteAccount.test.ts @@ -1,35 +1,35 @@ -import { expect, vi, test } from 'vitest' -import { flushPromises } from '../../../utils' -import { showModal } from '@/scripts/notify' -import { post } from '@/scripts/net' -import handler from '@/views/user/profile/deleteAccount' +import {expect, vi, test} from 'vitest'; +import {flushPromises} from '../../../utils'; +import {showModal} from '@/scripts/notify'; +import {post} from '@/scripts/net'; +import handler from '@/views/user/profile/deleteAccount'; -vi.mock('@/scripts/notify') -vi.mock('@/scripts/net') +vi.mock('@/scripts/notify'); +vi.mock('@/scripts/net'); test('delete account', async () => { - post - .mockResolvedValueOnce({ code: 1, message: 'w' }) - .mockResolvedValue({ code: 0, message: 'o' }) + post + .mockResolvedValueOnce({code: 1, message: 'w'}) + .mockResolvedValue({code: 0, message: 'o'}); - const form = document.createElement('form') - form.addEventListener('submit', handler) + const form = document.createElement('form'); + form.addEventListener('submit', handler); - const password = document.createElement('input') - password.name = 'password' - password.value = 'abc' - form.appendChild(password) - form.password = password + const password = document.createElement('input'); + password.name = 'password'; + password.value = 'abc'; + form.append(password); + form.password = password; - const event = new Event('submit') - form.dispatchEvent(event) - await flushPromises() - expect(post).toBeCalledWith('/user/profile?action=delete', { - password: 'abc', - }) - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'w' }) + const event = new Event('submit'); + form.dispatchEvent(event); + await flushPromises(); + expect(post).toBeCalledWith('/user/profile?action=delete', { + password: 'abc', + }); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'w'}); - form.dispatchEvent(event) - await flushPromises() - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'o' }) -}) + form.dispatchEvent(event); + await flushPromises(); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'o'}); +}); diff --git a/resources/assets/tests/views/user/profile/email.test.ts b/resources/assets/tests/views/user/profile/email.test.ts index 32022fa5..c85415a8 100644 --- a/resources/assets/tests/views/user/profile/email.test.ts +++ b/resources/assets/tests/views/user/profile/email.test.ts @@ -1,42 +1,42 @@ -import { expect, vi, test } from 'vitest' -import { flushPromises } from '../../../utils' -import { showModal } from '@/scripts/notify' -import { post } from '@/scripts/net' -import handler from '@/views/user/profile/email' +import {expect, vi, test} from 'vitest'; +import {flushPromises} from '../../../utils'; +import {showModal} from '@/scripts/notify'; +import {post} from '@/scripts/net'; +import handler from '@/views/user/profile/email'; -vi.mock('@/scripts/notify') -vi.mock('@/scripts/net') +vi.mock('@/scripts/notify'); +vi.mock('@/scripts/net'); test('change email', async () => { - post - .mockResolvedValueOnce({ code: 1, message: 'w' }) - .mockResolvedValue({ code: 0, message: 'o' }) + post + .mockResolvedValueOnce({code: 1, message: 'w'}) + .mockResolvedValue({code: 0, message: 'o'}); - const form = document.createElement('form') - form.addEventListener('submit', handler) + const form = document.createElement('form'); + form.addEventListener('submit', handler); - const email = document.createElement('input') - email.name = 'email' - email.value = 'a@b.c' - form.appendChild(email) - form.email = email + const email = document.createElement('input'); + email.name = 'email'; + email.value = 'a@b.c'; + form.append(email); + form.email = email; - const password = document.createElement('input') - password.name = 'password' - password.value = 'abc' - form.appendChild(password) - form.password = password + const password = document.createElement('input'); + password.name = 'password'; + password.value = 'abc'; + form.append(password); + form.password = password; - const event = new Event('submit') - form.dispatchEvent(event) - await flushPromises() - expect(post).toBeCalledWith('/user/profile?action=email', { - email: 'a@b.c', - password: 'abc', - }) - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'w' }) + const event = new Event('submit'); + form.dispatchEvent(event); + await flushPromises(); + expect(post).toBeCalledWith('/user/profile?action=email', { + email: 'a@b.c', + password: 'abc', + }); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'w'}); - form.dispatchEvent(event) - await flushPromises() - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'o' }) -}) + form.dispatchEvent(event); + await flushPromises(); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'o'}); +}); diff --git a/resources/assets/tests/views/user/profile/nickname.test.ts b/resources/assets/tests/views/user/profile/nickname.test.ts index 628a432a..3c8811fe 100644 --- a/resources/assets/tests/views/user/profile/nickname.test.ts +++ b/resources/assets/tests/views/user/profile/nickname.test.ts @@ -1,37 +1,37 @@ -import { expect, vi, test } from 'vitest' -import { flushPromises } from '../../../utils' -import { showModal } from '@/scripts/notify' -import { post } from '@/scripts/net' -import handler from '@/views/user/profile/nickname' +import {expect, vi, test} from 'vitest'; +import {flushPromises} from '../../../utils'; +import {showModal} from '@/scripts/notify'; +import {post} from '@/scripts/net'; +import handler from '@/views/user/profile/nickname'; -vi.mock('@/scripts/notify') -vi.mock('@/scripts/net') +vi.mock('@/scripts/notify'); +vi.mock('@/scripts/net'); test('change nickname', async () => { - document.body.innerHTML = '' - post - .mockResolvedValueOnce({ code: 1, message: 'w' }) - .mockResolvedValue({ code: 0, message: 'o' }) + document.body.innerHTML = ''; + post + .mockResolvedValueOnce({code: 1, message: 'w'}) + .mockResolvedValue({code: 0, message: 'o'}); - const form = document.createElement('form') - form.addEventListener('submit', handler) + const form = document.createElement('form'); + form.addEventListener('submit', handler); - const nickname = document.createElement('input') - nickname.name = 'nickname' - nickname.value = 'nickname' - form.appendChild(nickname) - form.nickname = nickname + const nickname = document.createElement('input'); + nickname.name = 'nickname'; + nickname.value = 'nickname'; + form.append(nickname); + form.nickname = nickname; - const event = new Event('submit') - form.dispatchEvent(event) - await flushPromises() - expect(post).toBeCalledWith('/user/profile?action=nickname', { - new_nickname: 'nickname', - }) - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'w' }) + const event = new Event('submit'); + form.dispatchEvent(event); + await flushPromises(); + expect(post).toBeCalledWith('/user/profile?action=nickname', { + new_nickname: 'nickname', + }); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'w'}); - form.dispatchEvent(event) - await flushPromises() - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'o' }) - expect(document.querySelector('span')!.textContent).toBe('nickname') -}) + form.dispatchEvent(event); + await flushPromises(); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'o'}); + expect(document.querySelector('span')!.textContent).toBe('nickname'); +}); diff --git a/resources/assets/tests/views/user/profile/password.test.ts b/resources/assets/tests/views/user/profile/password.test.ts index 73007bc7..971cf06d 100644 --- a/resources/assets/tests/views/user/profile/password.test.ts +++ b/resources/assets/tests/views/user/profile/password.test.ts @@ -1,55 +1,55 @@ -import { expect, vi, test } from 'vitest' -import { flushPromises } from '../../../utils' -import { t } from '@/scripts/i18n' -import { showModal, toast } from '@/scripts/notify' -import { post } from '@/scripts/net' -import handler from '@/views/user/profile/password' +import {expect, vi, test} from 'vitest'; +import {flushPromises} from '../../../utils'; +import {t} from '@/scripts/i18n'; +import {showModal, toast} from '@/scripts/notify'; +import {post} from '@/scripts/net'; +import handler from '@/views/user/profile/password'; -vi.mock('@/scripts/notify') -vi.mock('@/scripts/net') +vi.mock('@/scripts/notify'); +vi.mock('@/scripts/net'); test('change password', async () => { - post - .mockResolvedValueOnce({ code: 1, message: 'w' }) - .mockResolvedValue({ code: 0, message: 'o' }) + post + .mockResolvedValueOnce({code: 1, message: 'w'}) + .mockResolvedValue({code: 0, message: 'o'}); - const form = document.createElement('form') - form.addEventListener('submit', handler) + const form = document.createElement('form'); + form.addEventListener('submit', handler); - const oldPassword = document.createElement('input') - oldPassword.name = 'oldPassword' - oldPassword.value = '1' - form.appendChild(oldPassword) - form.oldPassword = oldPassword + const oldPassword = document.createElement('input'); + oldPassword.name = 'oldPassword'; + oldPassword.value = '1'; + form.append(oldPassword); + form.oldPassword = oldPassword; - const newPassword = document.createElement('input') - newPassword.name = 'newPassword' - newPassword.value = '1' - form.appendChild(newPassword) - form.newPassword = newPassword + const newPassword = document.createElement('input'); + newPassword.name = 'newPassword'; + newPassword.value = '1'; + form.append(newPassword); + form.newPassword = newPassword; - const confirm = document.createElement('input') - confirm.name = 'confirm' - confirm.value = '2' - form.appendChild(confirm) - form.confirm = confirm + const confirm = document.createElement('input'); + confirm.name = 'confirm'; + confirm.value = '2'; + form.append(confirm); + form.confirm = confirm; - const event = new Event('submit') - form.dispatchEvent(event) - await flushPromises() - expect(post).not.toBeCalled() - expect(toast.error).toBeCalledWith(t('auth.invalidConfirmPwd')) + const event = new Event('submit'); + form.dispatchEvent(event); + await flushPromises(); + expect(post).not.toBeCalled(); + expect(toast.error).toBeCalledWith(t('auth.invalidConfirmPwd')); - confirm.value = '1' - form.dispatchEvent(event) - await flushPromises() - expect(post).toBeCalledWith('/user/profile?action=password', { - current_password: '1', - new_password: '1', - }) - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'w' }) + confirm.value = '1'; + form.dispatchEvent(event); + await flushPromises(); + expect(post).toBeCalledWith('/user/profile?action=password', { + current_password: '1', + new_password: '1', + }); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'w'}); - form.dispatchEvent(event) - await flushPromises() - expect(showModal).toBeCalledWith({ mode: 'alert', text: 'o' }) -}) + form.dispatchEvent(event); + await flushPromises(); + expect(showModal).toBeCalledWith({mode: 'alert', text: 'o'}); +}); diff --git a/resources/assets/tests/views/user/profile/resetAvatar.test.ts b/resources/assets/tests/views/user/profile/resetAvatar.test.ts index 15f17076..b682871b 100644 --- a/resources/assets/tests/views/user/profile/resetAvatar.test.ts +++ b/resources/assets/tests/views/user/profile/resetAvatar.test.ts @@ -1,21 +1,21 @@ -import { expect, vi, test } from 'vitest' -import { showModal, toast } from '@/scripts/notify' -import { post } from '@/scripts/net' -import resetAvatar from '@/views/user/profile/resetAvatar' +import {expect, vi, test} from 'vitest'; +import {showModal, toast} from '@/scripts/notify'; +import {post} from '@/scripts/net'; +import resetAvatar from '@/views/user/profile/resetAvatar'; -vi.mock('@/scripts/notify') -vi.mock('@/scripts/net') +vi.mock('@/scripts/notify'); +vi.mock('@/scripts/net'); test('reset avatar', async () => { - showModal.mockRejectedValueOnce(null).mockResolvedValue({ value: '' }) - post.mockResolvedValue({ message: 'ok' }) - document.body.innerHTML = 'User Image' + showModal.mockRejectedValueOnce(null).mockResolvedValue({value: ''}); + post.mockResolvedValue({message: 'ok'}); + document.body.innerHTML = 'User Image'; - await resetAvatar() - expect(post).not.toBeCalled() + await resetAvatar(); + expect(post).not.toBeCalled(); - await resetAvatar() - expect(post).toBeCalledWith('/user/profile/avatar', { tid: 0 }) - expect(toast.success).toBeCalledWith('ok') - expect(document.querySelector('img')!.src).toBe('/avatar/0') -}) + await resetAvatar(); + expect(post).toBeCalledWith('/user/profile/avatar', {tid: 0}); + expect(toast.success).toBeCalledWith('ok'); + expect(document.querySelector('img')!.src).toBe('/avatar/0'); +}); diff --git a/resources/assets/tests/views/widgets/EmailVerification.test.tsx b/resources/assets/tests/views/widgets/EmailVerification.test.tsx index 5353f925..e773ca88 100644 --- a/resources/assets/tests/views/widgets/EmailVerification.test.tsx +++ b/resources/assets/tests/views/widgets/EmailVerification.test.tsx @@ -1,36 +1,40 @@ -import { expect, vi, it, describe } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' -import EmailVerification from '@/views/widgets/EmailVerification' +import { + expect, vi, it, describe, +} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; +import EmailVerification from '@/views/widgets/EmailVerification'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); describe('send email', () => { - it('succeeded', async () => { - fetch.post.mockResolvedValue({ code: 0, message: 'success' }) + it('succeeded', async () => { + fetch.post.mockResolvedValue({code: 0, message: 'success'}); - const { getByText, getByRole, queryByText } = render() + const {getByText, getByRole, queryByText} = render(); - fireEvent.click(getByText(t('user.verification.resend'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/user/email-verification'), - ) - expect(queryByText('success')).toBeInTheDocument() - expect(getByRole('status')).toHaveClass('alert-success') - }) + fireEvent.click(getByText(t('user.verification.resend'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/user/email-verification'); + }, + ); + expect(queryByText('success')).toBeInTheDocument(); + expect(getByRole('status')).toHaveClass('alert-success'); + }); - it('failed', async () => { - fetch.post.mockResolvedValue({ code: 1, message: 'failed' }) + it('failed', async () => { + fetch.post.mockResolvedValue({code: 1, message: 'failed'}); - const { getByText, getByRole, queryByText } = render() + const {getByText, getByRole, queryByText} = render(); - fireEvent.click(getByText(t('user.verification.resend'))) - await waitFor(() => - expect(fetch.post).toBeCalledWith('/user/email-verification'), - ) - expect(fetch.post).toBeCalledWith('/user/email-verification') - expect(queryByText('failed')).toBeInTheDocument() - expect(getByRole('alert')).toHaveClass('alert-danger') - }) -}) + fireEvent.click(getByText(t('user.verification.resend'))); + await waitFor(() => { + expect(fetch.post).toBeCalledWith('/user/email-verification'); + }, + ); + expect(fetch.post).toBeCalledWith('/user/email-verification'); + expect(queryByText('failed')).toBeInTheDocument(); + expect(getByRole('alert')).toHaveClass('alert-danger'); + }); +}); diff --git a/resources/assets/tests/views/widgets/NotificationsList.test.tsx b/resources/assets/tests/views/widgets/NotificationsList.test.tsx index 91a21d26..811cdc80 100644 --- a/resources/assets/tests/views/widgets/NotificationsList.test.tsx +++ b/resources/assets/tests/views/widgets/NotificationsList.test.tsx @@ -1,66 +1,68 @@ -import { expect, vi, test } from 'vitest' -import { render, fireEvent, waitFor } from '@testing-library/react' -import { t } from '@/scripts/i18n' -import * as fetch from '@/scripts/net' +import {expect, vi, test} from 'vitest'; +import {render, fireEvent, waitFor} from '@testing-library/react'; +import {t} from '@/scripts/i18n'; +import * as fetch from '@/scripts/net'; import NotificationsList, { - type Notification, -} from '@/views/widgets/NotificationsList' + type Notification, +} from '@/views/widgets/NotificationsList'; -vi.mock('@/scripts/net') +vi.mock('@/scripts/net'); beforeEach(() => { - document.body.innerHTML = '' -}) + document.body.innerHTML = ''; +}); function createContainer(notifications: Notification[]) { - const container = document.createElement('div') - container.dataset.notifications = JSON.stringify(notifications) - container.dataset.t = 'no unread' - document.body.appendChild(container) + const container = document.createElement('div'); + container.dataset.notifications = JSON.stringify(notifications); + container.dataset.t = 'no unread'; + document.body.append(container); } test('should not throw if element does not exist', () => { - render() -}) + render(); +}); test('no unread notifications', () => { - createContainer([]) + createContainer([]); - const { queryByText } = render() + const {queryByText} = render(); - expect(queryByText('no unread')).toBeInTheDocument() -}) + expect(queryByText('no unread')).toBeInTheDocument(); +}); test('with unread notifications', () => { - createContainer([{ id: '1', title: 'hi' }]) + createContainer([{id: '1', title: 'hi'}]); - const { queryByText } = render() + const {queryByText} = render(); - expect(queryByText('1')).toBeInTheDocument() - expect(queryByText('hi')).toBeInTheDocument() -}) + expect(queryByText('1')).toBeInTheDocument(); + expect(queryByText('hi')).toBeInTheDocument(); +}); test('read notification', async () => { - const time = new Date().toLocaleTimeString() - const fixture = { - title: 'hi - title', - content: 'content here', - time, - } + const time = new Date().toLocaleTimeString(); + const fixture = { + title: 'hi - title', + content: 'content here', + time, + }; - createContainer([{ id: '1', title: 'hi' }]) - fetch.post.mockResolvedValue(fixture) + createContainer([{id: '1', title: 'hi'}]); + fetch.post.mockResolvedValue(fixture); - const { getByText, queryByText } = render() + const {getByText, queryByText} = render(); - fireEvent.click(getByText('hi')) - await waitFor(() => expect(fetch.post).toBeCalled()) + fireEvent.click(getByText('hi')); + await waitFor(() => { + expect(fetch.post).toBeCalled(); + }); - expect(queryByText(fixture.title)).toBeInTheDocument() - expect(queryByText(fixture.content)).toBeInTheDocument() - expect(queryByText(fixture.time)).toBeInTheDocument() - expect(queryByText('no unread')).toBeInTheDocument() - expect(queryByText('1')).not.toBeInTheDocument() + expect(queryByText(fixture.title)).toBeInTheDocument(); + expect(queryByText(fixture.content)).toBeInTheDocument(); + expect(queryByText(fixture.time)).toBeInTheDocument(); + expect(queryByText('no unread')).toBeInTheDocument(); + expect(queryByText('1')).not.toBeInTheDocument(); - fireEvent.click(getByText(t('general.confirm'))) -}) + fireEvent.click(getByText(t('general.confirm'))); +}); diff --git a/tools/HtmlWebpackEnhancementPlugin.ts b/tools/HtmlWebpackEnhancementPlugin.ts deleted file mode 100644 index 8563195c..00000000 --- a/tools/HtmlWebpackEnhancementPlugin.ts +++ /dev/null @@ -1,71 +0,0 @@ -import {promises as fs} from 'node:fs'; -import * as path from 'node:path'; -import HtmlWebpackPlugin from 'html-webpack-plugin'; -import type {Compiler} from 'webpack'; - -class HtmlWebpackEnhancementPlugin { - apply(compiler: Compiler) { - compiler.hooks.assetEmitted.tapPromise( - 'HtmlWebpackEnhancementPlugin', - async (name, {source}) => { - if (name.endsWith('.twig')) { - const filePath = path.resolve( - process.cwd(), - 'resources', - 'views', - 'assets', - name, - ); - - await fs.writeFile(filePath, source.source()); - } - }, - ); - - compiler.hooks.compilation.tap( - 'HtmlWebpackEnhancementPlugin', - compilation => { - const hooks = HtmlWebpackPlugin.getHooks(compilation); - - hooks.alterAssetTags.tap('HtmlWebpackEnhancementPlugin', data => { - data.assetTags.scripts = data.assetTags.scripts.map(tag => { - tag.attributes.crossorigin = 'anonymous'; - return tag; - }); - data.assetTags.styles = data.assetTags.styles.map(tag => { - tag.attributes.crossorigin = 'anonymous'; - return tag; - }); - - return data; - }); - - hooks.afterTemplateExecution.tap( - 'HtmlWebpackEnhancementPlugin', - data => { - if ( - compilation.compiler.options.mode === 'production' - && data.headTags.length > 0 - ) { - if ( - data.headTags.some(tag => tag.attributes.rel === 'stylesheet') - ) { - data.bodyTags = data.headTags.filter( - tag => tag.tagName !== 'script', - ); - } else { - data.bodyTags = data.headTags; - } - - data.headTags = []; - } - - return data; - }, - ); - }, - ); - } -} - -export default HtmlWebpackEnhancementPlugin; diff --git a/tools/generateUrls.ts b/tools/generateUrls.ts index 90efe5cd..f99e64da 100644 --- a/tools/generateUrls.ts +++ b/tools/generateUrls.ts @@ -1,7 +1,6 @@ import {spawnSync} from 'node:child_process'; -import * as fs from 'node:fs'; +import fs from 'node:fs'; import ts from 'typescript'; -import prettier from 'prettier'; type Route = {uri: string; name: string | undefined}; const supportedPrefixes = ['auth.', 'user.', 'skinlib.', 'texture.', 'admin.']; @@ -14,14 +13,13 @@ function parseURI(uri: string): ts.ArrowFunction { const matches = /{([a-z]+)}/.exec(uri); if (matches?.[0] && matches?.[1]) { const parameter = matches[1]; - const type - = parameter.endsWith('id') - || parameter === 'texture' - || parameter === 'user' - || parameter === 'player' - || parameter === 'report' - ? ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword) - : ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + const type = parameter.endsWith('id') + || parameter === 'texture' + || parameter === 'user' + || parameter === 'player' + || parameter === 'report' + ? ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword) + : ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); return ts.factory.createArrowFunction( undefined, @@ -91,11 +89,11 @@ function parseTree(tree: Tree): ts.ObjectLiteralExpression { const {stdout} = spawnSync( 'php', ['artisan', 'route:list', '--json', '--columns=uri,name'], - {encoding: 'utf-8'}, + {encoding: 'utf8'}, ); let routes: Route[] = []; try { - routes = JSON.parse(stdout); + routes = JSON.parse(stdout) as Route[]; } catch (error) { console.error(stdout); throw error; @@ -111,6 +109,7 @@ for (const route of routes const path = route.name!.split('.'); const {length} = path; + // eslint-disable-next-line unicorn/no-array-reduce path.reduce((object: TreeObject, p, index) => { if (index === length - 1) { object[p] = route.uri; @@ -138,14 +137,7 @@ const sourceFile = ts.createSourceFile( const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed, }); -const code = await prettier.format( - printer.printNode(ts.EmitHint.Unspecified, ast, sourceFile), - { - parser: 'typescript', - semi: false, - singleQuote: true, - }, -); +const code = printer.printNode(ts.EmitHint.Unspecified, ast, sourceFile); fs.writeFileSync('./resources/assets/src/scripts/urls.ts', code, { - encoding: 'utf-8', + encoding: 'utf8', }); diff --git a/tsconfig.json b/tsconfig.json index 14d563c0..adfc70ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ }, "include": [ "resources/assets/src", + "resources/assets/tests", "tools", "vite.config.ts", "vitest.config.ts"