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:
simoleo89
2026-05-26 21:54:31 +02:00
parent 07bbc0c78d
commit f97650d7f6
2 changed files with 37 additions and 2 deletions
+32 -2
View File
@@ -1,8 +1,8 @@
import { act, renderHook } from '@testing-library/react';
import { act, cleanup, renderHook } from '@testing-library/react';
import { DoorbellMessageEvent, FlatAccessDeniedMessageEvent,
GenericErrorEvent, GetGuestRoomResultEvent, RoomDataParser,
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 { clearMockEventDispatcher, mockEventDispatcher } from '../../../nitro-renderer.mock';
import { useDoorState } from './useDoorState';
@@ -19,6 +19,14 @@ describe('useDoorState', () =>
beforeEach(() =>
{
clearMockEventDispatcher();
const { result, unmount } = renderHook(() => useDoorState());
act(() => result.current.reset());
unmount();
});
afterEach(() =>
{
cleanup();
});
it('exposes the initial NONE snapshot', () =>
@@ -136,6 +144,28 @@ describe('useDoorState', () =>
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', () =>
{
const { result } = renderHook(() => useDoorState());
+5
View File
@@ -49,6 +49,11 @@ const useDoorStateStore = () =>
const handleGuestRoom = useCallback((event: GetGuestRoomResultEvent) =>
{
const parser = event.getParser();
if(parser.roomEnter)
{
setSnapshot(INITIAL);
return;
}
if(!parser.roomForward) return;
if(parser.data.ownerName === GetSessionDataManager().userName) return;
if(parser.isGroupMember) return;