5180 fichiers 38.5 Mo 0 téléchargements 202 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / hooks / wired-tools / useWiredObjectInspection.test.ts
useWiredObjectInspection.test.ts 3.7 Ko Télécharger le fichier
/* @vitest-environment jsdom */
import { act, renderHook } from '@testing-library/react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';

const sent: Array<{ args: unknown[] }> = [];
let replyHandler: ((event: unknown) => void) | null = null;

vi.mock('@octane/renderer', () => ({
    WiredGetVariablesForObjectComposer: class {
        public args: unknown[];
        constructor(...args: unknown[]) {
            this.args = args;
        }
    },
    WiredVariablesForObjectEvent: class {}
}));

vi.mock('../../api', async () => {
    const actual = await vi.importActual<typeof import('../../api/wired/WiredObjectInspection')>('../../api/wired/WiredObjectInspection');

    return {
        ...actual,
        SendMessageComposer: (composer: { args: unknown[] }) => sent.push(composer)
    };
});

vi.mock('../events', () => ({
    useMessageEvent: (_type: unknown, handler: (event: unknown) => void) => {
        replyHandler = handler;
    }
}));

import { useWiredObjectInspection } from './useWiredObjectInspection';

type Request = { type: number; objectId: number } | null;

const reply = (type: number, id: number, values: Record<string, number>, configuredInWireds: number[] = []) =>
    act(() =>
        replyHandler?.({
            getParser: () => ({
                type,
                objectId: type === 0 ? id : 0,
                userIndex: type === 1 ? id : 0,
                values: new Map(Object.entries(values)),
                configuredInWireds
            })
        })
    );

describe('useWiredObjectInspection', () => {
    beforeEach(() => {
        vi.useFakeTimers();
        sent.length = 0;
        replyHandler = null;
    });

    afterEach(() => {
        vi.useRealTimers();
    });

    it('asks for the object as soon as it is inspected and re-reads it every 500 ms while the tab is open', () => {
        renderHook(() => useWiredObjectInspection({ active: true, request: { type: 0, objectId: 77 } }));

        expect(sent.map((composer) => composer.args)).toEqual([[0, 77]]);

        act(() => vi.advanceTimersByTime(1000));

        expect(sent).toHaveLength(3);
    });

    it('asks nothing while the tab is closed or nothing is inspected', () => {
        const { rerender } = renderHook((props: { active: boolean; request: Request }) => useWiredObjectInspection(props), {
            initialProps: { active: false, request: { type: 0, objectId: 77 } as Request }
        });

        act(() => vi.advanceTimersByTime(1000));
        rerender({ active: true, request: null });
        act(() => vi.advanceTimersByTime(1000));

        expect(sent).toHaveLength(0);
    });

    it('keeps only replies about the inspected object and drops them when another object is inspected', () => {
        const { result, rerender } = renderHook((props: { request: Request }) => useWiredObjectInspection({ active: true, ...props }), {
            initialProps: { request: { type: 0, objectId: 77 } as Request }
        });

        reply(0, 78, { 'furni:1': 4 });
        expect(result.current.data).toBeNull();

        reply(0, 77, { 'furni:1': 5 }, [900]);
        expect(result.current.data?.values.get('furni:1')).toBe(5);
        expect(result.current.data?.configuredInWireds).toEqual([900]);

        rerender({ request: { type: 1, objectId: 77 } });
        expect(result.current.data).toBeNull();
        expect(sent.at(-1)?.args).toEqual([1, 77]);
    });

    it('re-reads on demand after a change was sent', () => {
        const { result } = renderHook(() => useWiredObjectInspection({ active: true, request: { type: -10, objectId: 0 } }));

        act(() => result.current.refresh());

        expect(sent.map((composer) => composer.args)).toEqual([
            [-10, 0],
            [-10, 0]
        ]);
    });
});
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser