diff --git a/packages/scenes/src/behaviors/SceneQueryController.test.ts b/packages/scenes/src/behaviors/SceneQueryController.test.ts index 79d9f6f1e..f34cd8fd1 100644 --- a/packages/scenes/src/behaviors/SceneQueryController.test.ts +++ b/packages/scenes/src/behaviors/SceneQueryController.test.ts @@ -59,6 +59,41 @@ describe('SceneQueryController', () => { expect((window as any).__grafanaRunningQueryCount).toBe(0); }); + it('should NOT mark query as complete on PartialResult, only on Done', async () => { + const { query, streamFuncs } = registerQuery(scene); + let next = jest.fn(); + + query.subscribe({ next }); + + expect((window as any).__grafanaRunningQueryCount).toBe(1); + expect(controller.state.isRunning).toBe(true); + + // PartialResult emissions should not complete the query + streamFuncs.next({ state: LoadingState.PartialResult }); + expect((window as any).__grafanaRunningQueryCount).toBe(1); + expect(controller.state.isRunning).toBe(true); + + streamFuncs.next({ state: LoadingState.PartialResult }); + expect((window as any).__grafanaRunningQueryCount).toBe(1); + expect(controller.state.isRunning).toBe(true); + + // Final Done should complete it + streamFuncs.next({ state: LoadingState.Done }); + expect((window as any).__grafanaRunningQueryCount).toBe(0); + expect(controller.state.isRunning).toBe(false); + }); + + it('should still mark query as complete on Streaming state', async () => { + const { query, streamFuncs } = registerQuery(scene); + + query.subscribe(() => {}); + + expect(controller.state.isRunning).toBe(true); + + streamFuncs.next({ state: LoadingState.Streaming }); + expect(controller.state.isRunning).toBe(false); + }); + it('Last unsubscribe should set running to false', async () => { const { query: query1 } = registerQuery(scene); diff --git a/packages/scenes/src/querying/registerQueryWithController.ts b/packages/scenes/src/querying/registerQueryWithController.ts index 6fb4f3400..29851f9e6 100644 --- a/packages/scenes/src/querying/registerQueryWithController.ts +++ b/packages/scenes/src/querying/registerQueryWithController.ts @@ -69,7 +69,7 @@ export function registerQueryWithController( const sub = queryStream.subscribe({ next: (v) => { - if (!markedAsCompleted && v.state !== LoadingState.Loading) { + if (!markedAsCompleted && v.state !== LoadingState.Loading && v.state !== LoadingState.PartialResult) { markedAsCompleted = true; queryControler.queryCompleted(entry); endQueryCallback?.(performance.now()); // Success case - no error