Skip to content

Commit 8df5306

Browse files
committed
Fix debugger messages from successive steps running together on one line. #8664 (#10544)
Each poll of the debugger returns its own batch of notices without a trailing newline, so appending them directly ran messages from separate steps together. Start each appended batch on a new line. - Clarify that debugger message batches only usually lack a trailing newline.
1 parent ab63264 commit 8df5306

2 files changed

Lines changed: 58 additions & 1 deletion

File tree

‎web/pgadmin/tools/debugger/static/js/components/DebuggerMessages.jsx‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ export default function DebuggerMessages() {
2525
eventBus.registerListener(DEBUGGER_EVENTS.SET_MESSAGES, (text, append=false)=>{
2626
setMessageText((prev)=>{
2727
if(append) {
28-
return prev+text;
28+
// Each poll returns its own batch of messages, usually without a
29+
// trailing newline, so start every appended batch on a new line.
30+
if(prev && !prev.endsWith('\n')) {
31+
return prev + '\n' + text;
32+
}
33+
return prev + text;
2934
}
3035
return text;
3136
});
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/////////////////////////////////////////////////////////////
2+
//
3+
// pgAdmin 4 - PostgreSQL Tools
4+
//
5+
// Copyright (C) 2013 - 2026, The pgAdmin Development Team
6+
// This software is released under the PostgreSQL Licence
7+
//
8+
//////////////////////////////////////////////////////////////
9+
10+
import { render, act } from '@testing-library/react';
11+
12+
import EventBus from '../../../pgadmin/static/js/helpers/EventBus';
13+
import { DebuggerEventsContext } from '../../../pgadmin/tools/debugger/static/js/components/DebuggerComponent';
14+
import DebuggerMessages from '../../../pgadmin/tools/debugger/static/js/components/DebuggerMessages';
15+
import { DEBUGGER_EVENTS } from '../../../pgadmin/tools/debugger/static/js/DebuggerConstants';
16+
17+
18+
describe('Debugger Messages', () => {
19+
let eventBus;
20+
21+
const renderMessages = () => {
22+
eventBus = new EventBus();
23+
const ctrl = render(
24+
<DebuggerEventsContext.Provider value={eventBus}>
25+
<DebuggerMessages />
26+
</DebuggerEventsContext.Provider>
27+
);
28+
return ctrl.container.querySelector('#debugger-msg');
29+
};
30+
31+
it('puts each appended batch of messages on a new line', async () => {
32+
const msgDiv = renderMessages();
33+
await act(async () => {
34+
eventBus.fireEvent(DEBUGGER_EVENTS.SET_MESSAGES, 'NOTICE: first', true);
35+
eventBus.fireEvent(DEBUGGER_EVENTS.SET_MESSAGES, 'NOTICE: second', true);
36+
eventBus.fireEvent(DEBUGGER_EVENTS.SET_MESSAGES, 'NOTICE: third\n', true);
37+
eventBus.fireEvent(DEBUGGER_EVENTS.SET_MESSAGES, 'NOTICE: fourth', true);
38+
});
39+
expect(msgDiv.textContent).toBe(
40+
'NOTICE: first\nNOTICE: second\nNOTICE: third\nNOTICE: fourth'
41+
);
42+
});
43+
44+
it('replaces the messages when not appending', async () => {
45+
const msgDiv = renderMessages();
46+
await act(async () => {
47+
eventBus.fireEvent(DEBUGGER_EVENTS.SET_MESSAGES, 'NOTICE: old', true);
48+
eventBus.fireEvent(DEBUGGER_EVENTS.SET_MESSAGES, 'NOTICE: new');
49+
});
50+
expect(msgDiv.textContent).toBe('NOTICE: new');
51+
});
52+
});

0 commit comments

Comments
 (0)