mirror of
https://github.com/duckietm/Nitro-V3.git
synced 2026-06-20 15:36:18 +00:00
fix(rooms): useDoorState handles roomEnter reset + test-order isolation
Code review of Task 2 (commit 07bbc0c7) found two real issues:
1. The GetGuestRoomResultEvent handler did not handle parser.roomEnter,
so after the consumer migration (Tasks 5-8) a successful room entry
would no longer dismiss the door dialog. Fix: reset to INITIAL when
parser.roomEnter is true, before the roomForward branch.
2. The test suite was order-dependent — the useBetween singleton
persisted state across tests, so 'exposes the initial NONE snapshot'
passed only because it ran first. Fix: beforeEach renders the hook
once, calls reset(), then unmounts; afterEach calls cleanup().
Plus one new test case verifying the roomEnter -> reset behavior.
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
import { act, renderHook } from '@testing-library/react';
|
import { act, cleanup, renderHook } from '@testing-library/react';
|
||||||
import { DoorbellMessageEvent, FlatAccessDeniedMessageEvent,
|
import { DoorbellMessageEvent, FlatAccessDeniedMessageEvent,
|
||||||
GenericErrorEvent, GetGuestRoomResultEvent, RoomDataParser,
|
GenericErrorEvent, GetGuestRoomResultEvent, RoomDataParser,
|
||||||
RoomDoorbellAcceptedEvent } from '@nitrots/nitro-renderer';
|
RoomDoorbellAcceptedEvent } from '@nitrots/nitro-renderer';
|
||||||
import { beforeEach, describe, expect, it } from 'vitest';
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
||||||
import { DoorStateType } from '../../../api';
|
import { DoorStateType } from '../../../api';
|
||||||
import { clearMockEventDispatcher, mockEventDispatcher } from '../../../nitro-renderer.mock';
|
import { clearMockEventDispatcher, mockEventDispatcher } from '../../../nitro-renderer.mock';
|
||||||
import { useDoorState } from './useDoorState';
|
import { useDoorState } from './useDoorState';
|
||||||
@@ -19,6 +19,14 @@ describe('useDoorState', () =>
|
|||||||
beforeEach(() =>
|
beforeEach(() =>
|
||||||
{
|
{
|
||||||
clearMockEventDispatcher();
|
clearMockEventDispatcher();
|
||||||
|
const { result, unmount } = renderHook(() => useDoorState());
|
||||||
|
act(() => result.current.reset());
|
||||||
|
unmount();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() =>
|
||||||
|
{
|
||||||
|
cleanup();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('exposes the initial NONE snapshot', () =>
|
it('exposes the initial NONE snapshot', () =>
|
||||||
@@ -136,6 +144,28 @@ describe('useDoorState', () =>
|
|||||||
expect(result.current.snapshot.state).toBe(before);
|
expect(result.current.snapshot.state).toBe(before);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('GetGuestRoomResultEvent with roomEnter=true resets snapshot to NONE', () =>
|
||||||
|
{
|
||||||
|
const { result } = renderHook(() => useDoorState());
|
||||||
|
// First put the hook into a non-NONE state via doorbell
|
||||||
|
act(() =>
|
||||||
|
{
|
||||||
|
mockEventDispatcher.dispatchEvent(makeParserlessEvent(DoorbellMessageEvent, { userName: '' }));
|
||||||
|
});
|
||||||
|
expect(result.current.snapshot.state).toBe(DoorStateType.STATE_WAITING);
|
||||||
|
// Then roomEnter event should dismiss it
|
||||||
|
act(() =>
|
||||||
|
{
|
||||||
|
mockEventDispatcher.dispatchEvent(makeParserlessEvent(GetGuestRoomResultEvent, {
|
||||||
|
roomEnter: true,
|
||||||
|
roomForward: false,
|
||||||
|
data: {}
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
expect(result.current.snapshot.state).toBe(DoorStateType.NONE);
|
||||||
|
expect(result.current.snapshot.roomInfo).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
it('reset() returns snapshot to NONE', () =>
|
it('reset() returns snapshot to NONE', () =>
|
||||||
{
|
{
|
||||||
const { result } = renderHook(() => useDoorState());
|
const { result } = renderHook(() => useDoorState());
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ const useDoorStateStore = () =>
|
|||||||
const handleGuestRoom = useCallback((event: GetGuestRoomResultEvent) =>
|
const handleGuestRoom = useCallback((event: GetGuestRoomResultEvent) =>
|
||||||
{
|
{
|
||||||
const parser = event.getParser();
|
const parser = event.getParser();
|
||||||
|
if(parser.roomEnter)
|
||||||
|
{
|
||||||
|
setSnapshot(INITIAL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(!parser.roomForward) return;
|
if(!parser.roomForward) return;
|
||||||
if(parser.data.ownerName === GetSessionDataManager().userName) return;
|
if(parser.data.ownerName === GetSessionDataManager().userName) return;
|
||||||
if(parser.isGroupMember) return;
|
if(parser.isGroupMember) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user