mirror of https://github.com/grafana/grafana
parent
d843044841
commit
382a12c0fd
@ -0,0 +1,103 @@ |
|||||||
|
import { PlaylistSrv } from '../playlist_srv'; |
||||||
|
|
||||||
|
const dashboards = [{ uri: 'dash1' }, { uri: 'dash2' }]; |
||||||
|
|
||||||
|
const createPlaylistSrv = (): [PlaylistSrv, { url: jest.MockInstance<any> }] => { |
||||||
|
const mockBackendSrv = { |
||||||
|
get: jest.fn(url => { |
||||||
|
switch (url) { |
||||||
|
case '/api/playlists/1': |
||||||
|
return Promise.resolve({ interval: '1s' }); |
||||||
|
case '/api/playlists/1/dashboards': |
||||||
|
return Promise.resolve(dashboards); |
||||||
|
default: |
||||||
|
throw new Error(`Unexpected url=${url}`); |
||||||
|
} |
||||||
|
}), |
||||||
|
}; |
||||||
|
|
||||||
|
const mockLocation = { |
||||||
|
url: jest.fn(), |
||||||
|
search: () => ({}), |
||||||
|
}; |
||||||
|
|
||||||
|
const mockTimeout = jest.fn(); |
||||||
|
(mockTimeout as any).cancel = jest.fn(); |
||||||
|
|
||||||
|
return [new PlaylistSrv(mockLocation, mockTimeout, mockBackendSrv), mockLocation]; |
||||||
|
}; |
||||||
|
|
||||||
|
const mockWindowLocation = (): [jest.MockInstance<any>, () => void] => { |
||||||
|
const oldLocation = window.location; |
||||||
|
const hrefMock = jest.fn(); |
||||||
|
|
||||||
|
// JSDom defines window in a way that you cannot tamper with location so this seems to be the only way to change it.
|
||||||
|
// https://github.com/facebook/jest/issues/5124#issuecomment-446659510
|
||||||
|
delete window.location; |
||||||
|
window.location = {} as any; |
||||||
|
|
||||||
|
// Only mocking href as that is all this test needs, but otherwise there is lots of things missing, so keep that
|
||||||
|
// in mind if this is reused.
|
||||||
|
Object.defineProperty(window.location, 'href', { |
||||||
|
set: hrefMock, |
||||||
|
get: hrefMock, |
||||||
|
}); |
||||||
|
const unmock = () => { |
||||||
|
window.location = oldLocation; |
||||||
|
}; |
||||||
|
return [hrefMock, unmock]; |
||||||
|
}; |
||||||
|
|
||||||
|
describe('PlaylistSrv', () => { |
||||||
|
let srv: PlaylistSrv; |
||||||
|
let mockLocationService: { url: jest.MockInstance<any> }; |
||||||
|
let hrefMock: jest.MockInstance<any>; |
||||||
|
let unmockLocation: () => void; |
||||||
|
const initialUrl = 'http://localhost/playlist'; |
||||||
|
|
||||||
|
beforeEach(() => { |
||||||
|
[srv, mockLocationService] = createPlaylistSrv(); |
||||||
|
[hrefMock, unmockLocation] = mockWindowLocation(); |
||||||
|
|
||||||
|
// This will be cached in the srv when start() is called
|
||||||
|
hrefMock.mockReturnValue(initialUrl); |
||||||
|
}); |
||||||
|
|
||||||
|
afterEach(() => { |
||||||
|
unmockLocation(); |
||||||
|
}); |
||||||
|
|
||||||
|
it('runs all dashboards in cycle and reloads page after 3 cycles', async () => { |
||||||
|
await srv.start(1); |
||||||
|
|
||||||
|
for (let i = 0; i < 6; i++) { |
||||||
|
expect(mockLocationService.url).toHaveBeenLastCalledWith(`dashboard/${dashboards[i % 2].uri}?`); |
||||||
|
srv.next(); |
||||||
|
} |
||||||
|
|
||||||
|
expect(hrefMock).toHaveBeenCalledTimes(2); |
||||||
|
expect(hrefMock).toHaveBeenLastCalledWith(initialUrl); |
||||||
|
}); |
||||||
|
|
||||||
|
it('keeps the refresh counter value after restarting', async () => { |
||||||
|
await srv.start(1); |
||||||
|
|
||||||
|
// 1 complete loop
|
||||||
|
for (let i = 0; i < 3; i++) { |
||||||
|
expect(mockLocationService.url).toHaveBeenLastCalledWith(`dashboard/${dashboards[i % 2].uri}?`); |
||||||
|
srv.next(); |
||||||
|
} |
||||||
|
|
||||||
|
srv.stop(); |
||||||
|
await srv.start(1); |
||||||
|
|
||||||
|
// Another 2 loops
|
||||||
|
for (let i = 0; i < 4; i++) { |
||||||
|
expect(mockLocationService.url).toHaveBeenLastCalledWith(`dashboard/${dashboards[i % 2].uri}?`); |
||||||
|
srv.next(); |
||||||
|
} |
||||||
|
|
||||||
|
expect(hrefMock).toHaveBeenCalledTimes(3); |
||||||
|
expect(hrefMock).toHaveBeenLastCalledWith(initialUrl); |
||||||
|
}); |
||||||
|
}); |
Loading…
Reference in new issue