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 = '
'
+ showModal.mockRejectedValueOnce(null).mockResolvedValue({value: ''});
+ post.mockResolvedValue({message: 'ok'});
+ document.body.innerHTML = '
';
- 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"