@@ -41,98 +41,41 @@ beforeEach(() => {
4141 vi . mocked ( db . games . update ) . mockResolvedValue ( 1 )
4242} )
4343
44- describe ( 'useGameVisibility — initial state' , ( ) => {
45- it ( 'initialises from game record' , ( ) => {
46- const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
47- expect ( result . current . visibility ) . toEqual ( {
48- showQuestion : true ,
49- showAnswers : false ,
50- showMedia : true ,
51- } )
52- } )
53- it ( 'starts with saving=false and error=null' , ( ) => {
54- const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
55- expect ( result . current . saving ) . toBe ( false )
56- expect ( result . current . error ) . toBeNull ( )
57- } )
58- } )
44+ // These tests extend src/test/host/useGameVisibility.test.ts which already covers the
45+ // happy-path and Error-instance rollback. Here we cover the remaining branch:
46+ // the `else` arm of `err instanceof Error` in the catch block (line 51 in the
47+ // coverage report) — thrown value is not an Error object.
5948
60- describe ( 'useGameVisibility — toggle' , ( ) => {
61- it ( 'flips the targeted key' , async ( ) => {
62- const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
63- await act ( async ( ) => {
64- await result . current . toggle ( 'showAnswers' )
65- } )
66- expect ( result . current . visibility . showAnswers ) . toBe ( true )
67- } )
68- it ( 'does not change other keys' , async ( ) => {
69- const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
70- await act ( async ( ) => {
71- await result . current . toggle ( 'showAnswers' )
72- } )
73- expect ( result . current . visibility . showQuestion ) . toBe ( true )
74- expect ( result . current . visibility . showMedia ) . toBe ( true )
75- } )
76- it ( 'persists full state to db.games.update' , async ( ) => {
77- const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
78- await act ( async ( ) => {
79- await result . current . toggle ( 'showAnswers' )
80- } )
81- expect ( db . games . update ) . toHaveBeenCalledWith (
82- 'g1' ,
83- expect . objectContaining ( {
84- showQuestion : true ,
85- showAnswers : true ,
86- showMedia : true ,
87- } )
88- )
89- } )
90- it ( 'emits VISIBILITY event via transportManager' , async ( ) => {
91- const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
92- await act ( async ( ) => {
93- await result . current . toggle ( 'showMedia' )
94- } )
95- expect ( transportManager . send ) . toHaveBeenCalledWith ( {
96- type : 'VISIBILITY' ,
97- showQuestion : true ,
98- showAnswers : false ,
99- showMedia : false ,
100- } )
101- } )
102- it ( 'resets saving to false after success' , async ( ) => {
103- const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
104- await act ( async ( ) => {
105- await result . current . toggle ( 'showAnswers' )
106- } )
107- expect ( result . current . saving ) . toBe ( false )
108- } )
109- } )
110-
111- describe ( 'useGameVisibility — rollback on error' , ( ) => {
49+ describe ( 'useGameVisibility — rollback on non-Error rejection' , ( ) => {
11250 beforeEach ( ( ) => {
113- vi . mocked ( db . games . update ) . mockRejectedValue ( new Error ( 'DB write failed' ) )
51+ // Throw a plain string, not an Error instance — exercises the else branch
52+ vi . mocked ( db . games . update ) . mockRejectedValue ( 'plain string rejection' )
11453 } )
115- it ( 'rolls back optimistic update' , async ( ) => {
54+
55+ it ( 'rolls back optimistic update when rejection is not an Error' , async ( ) => {
11656 const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
11757 await act ( async ( ) => {
11858 await result . current . toggle ( 'showAnswers' )
11959 } )
12060 expect ( result . current . visibility . showAnswers ) . toBe ( false )
12161 } )
122- it ( 'sets error message' , async ( ) => {
62+
63+ it ( 'sets the fallback error message' , async ( ) => {
12364 const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
12465 await act ( async ( ) => {
12566 await result . current . toggle ( 'showAnswers' )
12667 } )
127- expect ( result . current . error ) . toBe ( 'DB write failed ' )
68+ expect ( result . current . error ) . toBe ( 'Failed to save visibility ' )
12869 } )
129- it ( 'does not emit event' , async ( ) => {
70+
71+ it ( 'does not emit a transport event' , async ( ) => {
13072 const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
13173 await act ( async ( ) => {
13274 await result . current . toggle ( 'showAnswers' )
13375 } )
13476 expect ( transportManager . send ) . not . toHaveBeenCalled ( )
13577 } )
78+
13679 it ( 'resets saving to false' , async ( ) => {
13780 const { result } = renderHook ( ( ) => useGameVisibility ( BASE_GAME ) )
13881 await act ( async ( ) => {
0 commit comments