@@ -3,12 +3,20 @@ import { beforeEach, describe, expect, test, vi } from "vitest";
33
44const {
55 getIdentifierMock,
6+ getCaptureSnapshotMock,
7+ listenCaptureDataMock,
8+ listenCaptureLifecycleMock,
9+ listenCaptureStatusMock,
610 runEventHooksMock,
711 setRecordingIndicatorMock,
812 stopCaptureMock,
913 vaultBaseMock,
1014} = vi . hoisted ( ( ) => ( {
1115 getIdentifierMock : vi . fn ( ) ,
16+ getCaptureSnapshotMock : vi . fn ( ) ,
17+ listenCaptureDataMock : vi . fn ( ) ,
18+ listenCaptureLifecycleMock : vi . fn ( ) ,
19+ listenCaptureStatusMock : vi . fn ( ) ,
1220 runEventHooksMock : vi . fn ( ) ,
1321 setRecordingIndicatorMock : vi . fn ( ) ,
1422 stopCaptureMock : vi . fn ( ) ,
@@ -45,6 +53,7 @@ vi.mock("@hypr/plugin-settings", () => ({
4553
4654vi . mock ( "@hypr/plugin-transcription" , ( ) => ( {
4755 commands : {
56+ getCaptureSnapshot : getCaptureSnapshotMock ,
4857 setMicMuted : vi . fn ( ) ,
4958 startCapture : vi . fn ( ) ,
5059 startTranscription : vi . fn ( ) ,
@@ -54,13 +63,13 @@ vi.mock("@hypr/plugin-transcription", () => ({
5463 } ,
5564 events : {
5665 captureDataEvent : {
57- listen : vi . fn ( ) ,
66+ listen : listenCaptureDataMock ,
5867 } ,
5968 captureLifecycleEvent : {
60- listen : vi . fn ( ) ,
69+ listen : listenCaptureLifecycleMock ,
6170 } ,
6271 captureStatusEvent : {
63- listen : vi . fn ( ) ,
72+ listen : listenCaptureStatusMock ,
6473 } ,
6574 } ,
6675} ) ) ;
@@ -79,6 +88,19 @@ describe("General Listener Slice", () => {
7988 store = createListenerStore ( ) ;
8089 vi . clearAllMocks ( ) ;
8190 getIdentifierMock . mockResolvedValue ( "com.hyprnote.stable" ) ;
91+ getCaptureSnapshotMock . mockResolvedValue ( {
92+ status : "ok" ,
93+ data : {
94+ activeSessionId : null ,
95+ finalizingSessionIds : [ ] ,
96+ liveTranscriptionActive : null ,
97+ requestedLiveTranscription : null ,
98+ state : "inactive" ,
99+ } ,
100+ } ) ;
101+ listenCaptureDataMock . mockResolvedValue ( ( ) => { } ) ;
102+ listenCaptureLifecycleMock . mockResolvedValue ( ( ) => { } ) ;
103+ listenCaptureStatusMock . mockResolvedValue ( ( ) => { } ) ;
82104 runEventHooksMock . mockResolvedValue ( { status : "ok" , data : null } ) ;
83105 setRecordingIndicatorMock . mockResolvedValue ( { status : "ok" , data : null } ) ;
84106 stopCaptureMock . mockResolvedValue ( { status : "ok" , data : null } ) ;
@@ -632,6 +654,46 @@ describe("General Listener Slice", () => {
632654 expect ( typeof start ) . toBe ( "function" ) ;
633655 } ) ;
634656
657+ test ( "attachLiveSession hydrates the active native capture for the same session" , async ( ) => {
658+ getCaptureSnapshotMock . mockResolvedValueOnce ( {
659+ status : "ok" ,
660+ data : {
661+ activeSessionId : "session-a" ,
662+ finalizingSessionIds : [ ] ,
663+ liveTranscriptionActive : true ,
664+ requestedLiveTranscription : true ,
665+ state : "active" ,
666+ } ,
667+ } ) ;
668+
669+ await store . getState ( ) . attachLiveSession ( "session-a" ) ;
670+
671+ expect ( store . getState ( ) . getSessionMode ( "session-a" ) ) . toBe ( "active" ) ;
672+ expect ( store . getState ( ) . live . sessionId ) . toBe ( "session-a" ) ;
673+ expect ( store . getState ( ) . live . liveTranscriptionActive ) . toBe ( true ) ;
674+ expect ( listenCaptureLifecycleMock ) . toHaveBeenCalledTimes ( 1 ) ;
675+ expect ( listenCaptureStatusMock ) . toHaveBeenCalledTimes ( 1 ) ;
676+ expect ( listenCaptureDataMock ) . toHaveBeenCalledTimes ( 1 ) ;
677+ } ) ;
678+
679+ test ( "attachLiveSession does not mark a different active native capture as current" , async ( ) => {
680+ getCaptureSnapshotMock . mockResolvedValueOnce ( {
681+ status : "ok" ,
682+ data : {
683+ activeSessionId : "session-b" ,
684+ finalizingSessionIds : [ ] ,
685+ liveTranscriptionActive : true ,
686+ requestedLiveTranscription : true ,
687+ state : "active" ,
688+ } ,
689+ } ) ;
690+
691+ await store . getState ( ) . attachLiveSession ( "session-a" ) ;
692+
693+ expect ( store . getState ( ) . getSessionMode ( "session-a" ) ) . toBe ( "inactive" ) ;
694+ expect ( store . getState ( ) . live . sessionId ) . toBeNull ( ) ;
695+ } ) ;
696+
635697 test ( "start returns false while another session is active" , async ( ) => {
636698 store . setState ( ( state ) =>
637699 mutate ( state , ( draft ) => {
0 commit comments