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