11import { render , screen , fireEvent , act } from '@testing-library/react' ;
2- import { describe , it , expect , beforeEach , vi } from 'vitest' ;
2+ import { describe , it , expect , beforeEach , afterEach , vi } from 'vitest' ;
33import App from '../App' ;
44import { DEFAULT_CONFIG } from '../contexts/ConfigContext' ;
55import {
@@ -10,6 +10,11 @@ import {
1010 getLastChannel ,
1111} from '../testUtils/mocks/tauri' ;
1212import { __mockWindow } from '../testUtils/mocks/tauri-window' ;
13+ import { useTips } from '../hooks/useTips' ;
14+
15+ vi . mock ( '../hooks/useTips' , ( ) => ( {
16+ useTips : vi . fn ( ( ) => ( { tip : '' , tipKey : 0 , isVisible : false } ) ) ,
17+ } ) ) ;
1318
1419async function showOverlay ( selectedText : string | null = null ) {
1520 await act ( async ( ) => {
@@ -5349,4 +5354,62 @@ describe('App', () => {
53495354 expect ( screen . queryByText ( "You're all set" ) ) . toBeNull ( ) ;
53505355 } ) ;
53515356 } ) ;
5357+
5358+ describe ( 'tip bar' , ( ) => {
5359+ afterEach ( ( ) => {
5360+ vi . mocked ( useTips ) . mockReturnValue ( {
5361+ tip : '' ,
5362+ tipKey : 0 ,
5363+ isVisible : false ,
5364+ } ) ;
5365+ } ) ;
5366+
5367+ it ( 'renders TipBar when useTips returns isVisible=true' , async ( ) => {
5368+ vi . mocked ( useTips ) . mockReturnValue ( {
5369+ tip : 'Capture a screenshot with /screen' ,
5370+ tipKey : 1 ,
5371+ isVisible : true ,
5372+ } ) ;
5373+ render ( < App /> ) ;
5374+ await showOverlay ( ) ;
5375+ expect ( screen . getByTestId ( 'tip-text' ) ) . toBeInTheDocument ( ) ;
5376+ } ) ;
5377+
5378+ it ( 'does not render TipBar when useTips returns isVisible=false' , async ( ) => {
5379+ render ( < App /> ) ;
5380+ await showOverlay ( ) ;
5381+ expect ( screen . queryByTestId ( 'tip-text' ) ) . not . toBeInTheDocument ( ) ;
5382+ } ) ;
5383+
5384+ it ( 'hides TipBar in chat mode even when isVisible=true' , async ( ) => {
5385+ vi . mocked ( useTips ) . mockReturnValue ( {
5386+ tip : 'Test tip' ,
5387+ tipKey : 1 ,
5388+ isVisible : true ,
5389+ } ) ;
5390+ enableChannelCaptureWithResponses ( {
5391+ get_model_picker_state : {
5392+ active : 'gemma4:e2b' ,
5393+ all : [ 'gemma4:e2b' ] ,
5394+ ollamaReachable : true ,
5395+ } ,
5396+ } ) ;
5397+ render ( < App /> ) ;
5398+ await showOverlay ( ) ;
5399+ const textarea = screen . getByPlaceholderText ( 'Ask Thuki anything...' ) ;
5400+ act ( ( ) => {
5401+ fireEvent . change ( textarea , { target : { value : 'hello' } } ) ;
5402+ } ) ;
5403+ act ( ( ) => {
5404+ fireEvent . keyDown ( textarea , { key : 'Enter' , shiftKey : false } ) ;
5405+ } ) ;
5406+ await act ( async ( ) => { } ) ;
5407+ act ( ( ) => {
5408+ getLastChannel ( ) ?. simulateMessage ( { type : 'Token' , data : 'hi' } ) ;
5409+ getLastChannel ( ) ?. simulateMessage ( { type : 'Done' } ) ;
5410+ } ) ;
5411+ await act ( async ( ) => { } ) ;
5412+ expect ( screen . queryByTestId ( 'tip-text' ) ) . not . toBeInTheDocument ( ) ;
5413+ } ) ;
5414+ } ) ;
53525415} ) ;
0 commit comments