@@ -50,6 +50,18 @@ describe('providerService operational failures', () => {
5050 browserScrapeEnabled : true ,
5151 browserLoggedIn : false ,
5252 } ) ;
53+ vi . spyOn ( providerService , 'getAllConfigs' ) . mockReturnValue ( {
54+ providers : {
55+ familysearch : {
56+ provider : 'familysearch' ,
57+ enabled : true ,
58+ rateLimit : { minDelayMs : 1000 , maxDelayMs : 2000 } ,
59+ browserScrapeEnabled : true ,
60+ browserLoggedIn : false ,
61+ } ,
62+ } ,
63+ lastUpdated : '2026-08-30T00:00:00.000Z' ,
64+ } as ReturnType < typeof providerService . getAllConfigs > ) ;
5365 mocks . browserService . isConnected . mockReturnValue ( true ) ;
5466 mocks . browserService . getWorkerPage . mockResolvedValue ( { } ) ;
5567 mocks . scraper . checkLoginStatus . mockResolvedValue ( false ) ;
@@ -111,6 +123,22 @@ describe('providerService operational failures', () => {
111123 ) ;
112124 } ) ;
113125
126+ it ( 'preserves successful statuses and structured failures in aggregate checks' , async ( ) => {
127+ mocks . scraper . checkLoginStatus . mockRejectedValue ( new Error ( 'Login markup changed' ) ) ;
128+
129+ const summary = await providerService . checkAllSessions ( ) ;
130+
131+ expect ( summary . statuses ) . toEqual ( { } ) ;
132+ expect ( summary . failures ) . toEqual ( {
133+ familysearch : {
134+ code : 'PROVIDER_OPERATION_FAILED' ,
135+ provider : 'familysearch' ,
136+ operation : 'check-session' ,
137+ message : 'Login markup changed' ,
138+ } ,
139+ } ) ;
140+ } ) ;
141+
114142 it ( 'keeps a verified empty tree list as a successful negative result' , async ( ) => {
115143 const result = await providerService . discoverTrees ( 'familysearch' ) ;
116144
0 commit comments