diff --git a/public/app/core/history/RichHistoryRemoteStorage.test.ts b/public/app/core/history/RichHistoryRemoteStorage.test.ts index 6ad95e63483..b091d33a621 100644 --- a/public/app/core/history/RichHistoryRemoteStorage.test.ts +++ b/public/app/core/history/RichHistoryRemoteStorage.test.ts @@ -18,10 +18,16 @@ dsMock.init( ); const fetchMock = jest.fn(); +const postMock = jest.fn(); +const deleteMock = jest.fn(); +const patchMock = jest.fn(); jest.mock('@grafana/runtime', () => ({ ...jest.requireActual('@grafana/runtime'), getBackendSrv: () => ({ fetch: fetchMock, + post: postMock, + delete: deleteMock, + patch: patchMock, }), getDataSourceSrv: () => dsMock, })); @@ -41,6 +47,9 @@ describe('RichHistoryRemoteStorage', () => { beforeEach(() => { fetchMock.mockReset(); + postMock.mockReset(); + deleteMock.mockReset(); + patchMock.mockReset(); storage = new RichHistoryRemoteStorage(); }); @@ -173,4 +182,41 @@ describe('RichHistoryRemoteStorage', () => { showSuccessAlert: false, }); }); + + it('stars query history items', async () => { + const { richHistoryQuery, dto } = setup(); + postMock.mockResolvedValue({ + result: dto, + }); + const query = await storage.updateStarred('test', true); + expect(postMock).toBeCalledWith('/api/query-history/star/test'); + expect(query).toMatchObject(richHistoryQuery); + }); + + it('unstars query history items', async () => { + const { richHistoryQuery, dto } = setup(); + deleteMock.mockResolvedValue({ + result: dto, + }); + const query = await storage.updateStarred('test', false); + expect(deleteMock).toBeCalledWith('/api/query-history/star/test'); + expect(query).toMatchObject(richHistoryQuery); + }); + + it('updates query history comments', async () => { + const { richHistoryQuery, dto } = setup(); + patchMock.mockResolvedValue({ + result: dto, + }); + const query = await storage.updateComment('test', 'just a comment'); + expect(patchMock).toBeCalledWith('/api/query-history/test', { + comment: 'just a comment', + }); + expect(query).toMatchObject(richHistoryQuery); + }); + + it('deletes query history items', async () => { + await storage.deleteRichHistory('test'); + expect(deleteMock).toBeCalledWith('/api/query-history/test'); + }); }); diff --git a/public/app/core/history/RichHistoryRemoteStorage.ts b/public/app/core/history/RichHistoryRemoteStorage.ts index 514fe7bfb1f..ce41edd1a9d 100644 --- a/public/app/core/history/RichHistoryRemoteStorage.ts +++ b/public/app/core/history/RichHistoryRemoteStorage.ts @@ -38,6 +38,10 @@ type RichHistoryRemoteStorageResultsPayloadDTO = { }; }; +type RichHistoryRemoteStorageUpdatePayloadDTO = { + result: RichHistoryRemoteStorageDTO; +}; + export default class RichHistoryRemoteStorage implements RichHistoryStorage { private readonly preferenceService: PreferencesService; @@ -62,7 +66,7 @@ export default class RichHistoryRemoteStorage implements RichHistoryStorage { } async deleteRichHistory(id: string): Promise { - throw new Error('not supported yet'); + getBackendSrv().delete(`/api/query-history/${id}`); } async getRichHistory(filters: RichHistorySearchFilters) { @@ -95,7 +99,10 @@ export default class RichHistoryRemoteStorage implements RichHistoryStorage { } async updateComment(id: string, comment: string | undefined): Promise { - throw new Error('not supported yet'); + const dto: RichHistoryRemoteStorageUpdatePayloadDTO = await getBackendSrv().patch(`/api/query-history/${id}`, { + comment: comment, + }); + return fromDTO(dto.result); } updateSettings(settings: RichHistorySettings): Promise { @@ -107,7 +114,13 @@ export default class RichHistoryRemoteStorage implements RichHistoryStorage { } async updateStarred(id: string, starred: boolean): Promise { - throw new Error('not supported yet'); + let dto: RichHistoryRemoteStorageUpdatePayloadDTO; + if (starred) { + dto = await getBackendSrv().post(`/api/query-history/star/${id}`); + } else { + dto = await getBackendSrv().delete(`/api/query-history/star/${id}`); + } + return fromDTO(dto.result); } /**