Skip to content

Commit 9e8c079

Browse files
SteKoeCopilot
andauthored
fix(#5188): implement refreshApplications method and update refreshContext to use it (#5191)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 9053daa commit 9e8c079

3 files changed

Lines changed: 65 additions & 5 deletions

File tree

spring-boot-admin-server-ui/src/main/frontend/services/application.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ class Application {
124124
return this.hasEndpoint('restart');
125125
}
126126

127+
static async refreshApplications() {
128+
return axios.post('applications');
129+
}
130+
127131
static async list() {
128132
return axios.get('applications', {
129133
headers: { Accept: 'application/json', 'X-SBA-REQUEST': true },

spring-boot-admin-server-ui/src/main/frontend/views/applications/applications.spec.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import userEvent from '@testing-library/user-event';
22
import { screen, waitFor } from '@testing-library/vue';
3+
import { HttpResponse, http } from 'msw';
34
import { beforeEach, describe, expect, it, vi } from 'vitest';
45
import { Ref, ref } from 'vue';
56

67
import { useApplicationStore } from '@/composables/useApplicationStore';
8+
import { server } from '@/mocks/server';
79
import Application from '@/services/application';
810
import Instance, { Registration } from '@/services/instance';
911
import { render } from '@/test-utils';
@@ -228,5 +230,57 @@ describe('Applications', () => {
228230
expect(indexRestricted).toBeLessThan(indexUp);
229231
});
230232
});
233+
234+
describe('refresh button', () => {
235+
beforeEach(() => {
236+
server.use(
237+
http.post('/applications', () => {
238+
return HttpResponse.json({});
239+
}),
240+
);
241+
});
242+
243+
it('clicking the refresh button invokes Application.refreshApplications', async () => {
244+
const refreshSpy = vi.spyOn(Application, 'refreshApplications');
245+
246+
const refreshButton = screen.getByTitle('Refresh applications');
247+
// First click - enters confirm mode
248+
await userEvent.click(refreshButton);
249+
250+
// Second click - confirms and executes
251+
const confirmButton = await screen.findByText('Confirm');
252+
await userEvent.click(confirmButton);
253+
254+
await waitFor(() => {
255+
expect(refreshSpy).toHaveBeenCalled();
256+
});
257+
});
258+
259+
it('logs error when refresh fails without throwing', async () => {
260+
server.use(
261+
http.post('/applications', () => {
262+
return HttpResponse.json({}, { status: 500 });
263+
}),
264+
);
265+
266+
const consoleErrorSpy = vi
267+
.spyOn(console, 'error')
268+
.mockImplementation(() => {});
269+
270+
const refreshButton = screen.getByTitle('Refresh applications');
271+
// First click - enters confirm mode
272+
await userEvent.click(refreshButton);
273+
274+
// Second click - confirms and executes
275+
const confirmButton = await screen.findByText('Confirm');
276+
await userEvent.click(confirmButton);
277+
278+
await waitFor(() => {
279+
expect(consoleErrorSpy).toHaveBeenCalled();
280+
});
281+
282+
consoleErrorSpy.mockRestore();
283+
});
284+
});
231285
});
232286
});

spring-boot-admin-server-ui/src/main/frontend/views/applications/index.vue

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<sba-confirm-button
2525
class="mr-1"
2626
:title="$t('applications.actions.refresh_applications')"
27-
@click="refreshContext"
27+
@click="refreshApplications"
2828
>
2929
<font-awesome-icon :icon="'rotate-left'" />
3030
</sba-confirm-button>
@@ -213,7 +213,6 @@ import { useApplicationStore } from '@/composables/useApplicationStore';
213213
import Application from '@/services/application';
214214
import Instance from '@/services/instance';
215215
import NotificationFilter from '@/services/notification-filter';
216-
import axios from '@/utils/axios';
217216
import { anyValueMatches } from '@/utils/collections';
218217
import { Subject, concatMap, mergeWith, timer } from '@/utils/rxjs';
219218
import { useRouterState } from '@/utils/useRouterState';
@@ -348,10 +347,13 @@ const grouped = computed(() => {
348347
return sortBy(list, [(item) => getApplicationStatus(item)]);
349348
});
350349
351-
const refreshContext = () => {
352-
axios.post('/applications').then(() => {
350+
const refreshApplications = async () => {
351+
try {
352+
await Application.refreshApplications();
353353
notificationCenter.success(t('applications.refreshed'));
354-
});
354+
} catch (error) {
355+
console.error(error);
356+
}
355357
};
356358
357359
function getApplicationStatus(item: InstancesListType): string {

0 commit comments

Comments
 (0)