mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 02:23:31 -06:00
* Chore: Remove angular dependency from backendSrv * Refactor: Naive soultion for logging out unauthorized users * Refactor: Restructures to different streams * Refactor: Restructures datasourceRequest * Refactor: Flipped back if statement * Refactor: Extracted getFromFetchStream * Refactor: Extracts toFailureStream operation * Refactor: Fixes issue when options.params contains arrays * Refactor: Fixes broken test (but we need a lot more) * Refactor: Adds explaining comments * Refactor: Adds latest RxJs version so cancellations work * Refactor: Cleans up the takeUntil code * Refactor: Adds tests for request function * Refactor: Separates into smaller functions * Refactor: Adds last error tests * Started to changed so we require getBackendSrv from the @grafana-runtime when applicable. * Using the getBackendSrv from @grafana/runtime. * Changed so we use the getBackendSrv from the @grafana-runtime when possible. * Fixed so Server Admin -> Orgs works again. * Removed unused dependency. * Fixed digest issues on the Server Admin -> Users page. * Fix: Fixes digest problems in Playlists * Fix: Fixes digest issues in VersionHistory * Tests: Fixes broken tests * Fix: Fixes digest issues in Alerting => Notification channels * Fixed digest issues on the Intive page. * Fixed so we run digest after password reset email sent. * Fixed digest issue when trying to sign up account. * Fixed so the Server Admin -> Edit Org works with backendSrv * Fixed so Server Admin -> Users works with backend srv. * Fixed digest issues in Server Admin -> Orgs * Fix: Fixes digest issues in DashList plugin * Fixed digest issues on Server Admin -> users. * Fix: Fixes digest issues with Snapshots * Fixed digest issue when deleting a user. * Fix: Fixes digest issues with dashLink * Chore: Changes RxJs version to 6.5.4 which includes the same cancellation fix * Fix: Fixes digest issue when toggling folder in manage dashboards * Fix: Fixes bug in executeInOrder * Fix: Fixes digest issue with CreateFolderCtrl and FolderDashboardsCtrl * Fix: Fixes tslint error in test * Refactor: Changes default behaviour for emitted messages as before migration * Fix: Fixes various digest issues when saving, starring or deleting dashboards * Fix: Fixes digest issues with FolderPickerCtrl * Fixed digest issue. * Fixed digest issues. * Fixed issues with angular digest. * Removed the this.digest pattern. Co-authored-by: Hugo Häggmark <hugo.haggmark@gmail.com> Co-authored-by: Marcus Andersson <systemvetaren@gmail.com>
153 lines
3.6 KiB
TypeScript
153 lines
3.6 KiB
TypeScript
// @ts-ignore
|
|
import configureMockStore from 'redux-mock-store';
|
|
import { PlaylistSrv } from '../playlist_srv';
|
|
import { setStore } from 'app/store/store';
|
|
|
|
const getMock = jest.fn();
|
|
|
|
jest.mock('@grafana/runtime', () => {
|
|
const original = jest.requireActual('@grafana/runtime');
|
|
return {
|
|
...original,
|
|
getBackendSrv: () => ({
|
|
get: getMock,
|
|
}),
|
|
};
|
|
});
|
|
|
|
const mockStore = configureMockStore<any, any>();
|
|
|
|
setStore(
|
|
mockStore({
|
|
location: {},
|
|
}) as any
|
|
);
|
|
|
|
const dashboards = [{ url: 'dash1' }, { url: 'dash2' }];
|
|
|
|
const createPlaylistSrv = (): [PlaylistSrv, { url: jest.MockInstance<any, any> }] => {
|
|
const mockLocation = {
|
|
url: jest.fn(),
|
|
search: () => ({}),
|
|
path: () => '/playlists/1',
|
|
};
|
|
|
|
const mockTimeout = jest.fn();
|
|
(mockTimeout as any).cancel = jest.fn();
|
|
|
|
return [new PlaylistSrv(mockLocation, mockTimeout), mockLocation];
|
|
};
|
|
|
|
const mockWindowLocation = (): [jest.MockInstance<any, 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 hrefMock: jest.MockInstance<any, any>;
|
|
let unmockLocation: () => void;
|
|
const initialUrl = 'http://localhost/playlist';
|
|
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
getMock.mockImplementation(
|
|
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}`);
|
|
}
|
|
})
|
|
);
|
|
|
|
[srv] = 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++) {
|
|
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++) {
|
|
srv.next();
|
|
}
|
|
|
|
srv.stop();
|
|
await srv.start(1);
|
|
|
|
// Another 2 loops
|
|
for (let i = 0; i < 4; i++) {
|
|
srv.next();
|
|
}
|
|
|
|
expect(hrefMock).toHaveBeenCalledTimes(3);
|
|
expect(hrefMock).toHaveBeenLastCalledWith(initialUrl);
|
|
});
|
|
|
|
it('storeUpdated should stop playlist when navigating away', async () => {
|
|
await srv.start(1);
|
|
|
|
srv.storeUpdated();
|
|
|
|
expect(srv.isPlaying).toBe(false);
|
|
});
|
|
|
|
it('storeUpdated should not stop playlist when navigating to next dashboard', async () => {
|
|
await srv.start(1);
|
|
|
|
srv.next();
|
|
|
|
setStore(
|
|
mockStore({
|
|
location: {
|
|
path: 'dash2',
|
|
},
|
|
}) as any
|
|
);
|
|
|
|
expect((srv as any).validPlaylistUrl).toBe('dash2');
|
|
|
|
srv.storeUpdated();
|
|
|
|
expect(srv.isPlaying).toBe(true);
|
|
});
|
|
});
|