|
|
|
@ -1,10 +1,10 @@ |
|
|
|
|
import { render, screen } from '@testing-library/react'; |
|
|
|
|
import React from 'react'; |
|
|
|
|
import { Provider } from 'react-redux'; |
|
|
|
|
import { Router } from 'react-router-dom'; |
|
|
|
|
import { MemoryRouter } from 'react-router-dom'; |
|
|
|
|
import { useLocation } from 'react-use'; |
|
|
|
|
|
|
|
|
|
import { DataSourceJsonData, PluginMeta } from '@grafana/data'; |
|
|
|
|
import { locationService } from '@grafana/runtime'; |
|
|
|
|
import { configureStore } from 'app/store/configureStore'; |
|
|
|
|
|
|
|
|
|
import { CombinedRule, Rule } from '../../../types/unified-alerting'; |
|
|
|
@ -12,6 +12,7 @@ import { PromRuleType } from '../../../types/unified-alerting-dto'; |
|
|
|
|
|
|
|
|
|
import { RedirectToRuleViewer } from './RedirectToRuleViewer'; |
|
|
|
|
import { useCombinedRulesMatching } from './hooks/useCombinedRule'; |
|
|
|
|
import * as combinedRuleHooks from './hooks/useCombinedRule'; |
|
|
|
|
import { getRulesSourceByName } from './utils/datasource'; |
|
|
|
|
|
|
|
|
|
jest.mock('./hooks/useCombinedRule'); |
|
|
|
@ -21,13 +22,17 @@ jest.mock('react-router-dom', () => ({ |
|
|
|
|
Redirect: jest.fn(({}) => `Redirected`), |
|
|
|
|
})); |
|
|
|
|
|
|
|
|
|
jest.mock('react-use'); |
|
|
|
|
|
|
|
|
|
const store = configureStore(); |
|
|
|
|
const renderRedirectToRuleViewer = () => { |
|
|
|
|
const renderRedirectToRuleViewer = (pathname: string) => { |
|
|
|
|
jest.mocked(useLocation).mockReturnValue({ pathname, trigger: '' }); |
|
|
|
|
|
|
|
|
|
return render( |
|
|
|
|
<Provider store={store}> |
|
|
|
|
<Router history={locationService.getHistory()}> |
|
|
|
|
<RedirectToRuleViewer {...mockRoute('prom alert', 'test prom')} /> |
|
|
|
|
</Router> |
|
|
|
|
<MemoryRouter initialEntries={[pathname]}> |
|
|
|
|
<RedirectToRuleViewer /> |
|
|
|
|
</MemoryRouter> |
|
|
|
|
</Provider> |
|
|
|
|
); |
|
|
|
|
}; |
|
|
|
@ -55,7 +60,7 @@ describe('Redirect to Rule viewer', () => { |
|
|
|
|
error: undefined, |
|
|
|
|
}); |
|
|
|
|
mockRuleSourceByName(); |
|
|
|
|
renderRedirectToRuleViewer(); |
|
|
|
|
renderRedirectToRuleViewer('/alerting/test prom/prom alert/find'); |
|
|
|
|
expect(screen.getAllByText('Cloud test alert')).toHaveLength(2); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
@ -68,7 +73,41 @@ describe('Redirect to Rule viewer', () => { |
|
|
|
|
error: undefined, |
|
|
|
|
}); |
|
|
|
|
mockRuleSourceByName(); |
|
|
|
|
renderRedirectToRuleViewer(); |
|
|
|
|
renderRedirectToRuleViewer('/alerting/test prom/prom alert/find'); |
|
|
|
|
expect(screen.getByText('Redirected')).toBeInTheDocument(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should properly decode rule name', () => { |
|
|
|
|
const rulesMatchingSpy = jest.spyOn(combinedRuleHooks, 'useCombinedRulesMatching').mockReturnValue({ |
|
|
|
|
result: [mockedRules[0]], |
|
|
|
|
loading: false, |
|
|
|
|
dispatched: true, |
|
|
|
|
requestId: 'A', |
|
|
|
|
error: undefined, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const ruleName = 'cloud rule++ !@#$%^&*()-/?'; |
|
|
|
|
|
|
|
|
|
renderRedirectToRuleViewer(`/alerting/prom-db/${encodeURIComponent(ruleName)}/find`); |
|
|
|
|
|
|
|
|
|
expect(rulesMatchingSpy).toHaveBeenCalledWith(ruleName, 'prom-db'); |
|
|
|
|
expect(screen.getByText('Redirected')).toBeInTheDocument(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should properly decode source name', () => { |
|
|
|
|
const rulesMatchingSpy = jest.spyOn(combinedRuleHooks, 'useCombinedRulesMatching').mockReturnValue({ |
|
|
|
|
result: [mockedRules[0]], |
|
|
|
|
loading: false, |
|
|
|
|
dispatched: true, |
|
|
|
|
requestId: 'A', |
|
|
|
|
error: undefined, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const sourceName = 'prom<|>++ !@#$%^&*()-/?'; |
|
|
|
|
|
|
|
|
|
renderRedirectToRuleViewer(`/alerting/${encodeURIComponent(sourceName)}/prom alert/find`); |
|
|
|
|
|
|
|
|
|
expect(rulesMatchingSpy).toHaveBeenCalledWith('prom alert', sourceName); |
|
|
|
|
expect(screen.getByText('Redirected')).toBeInTheDocument(); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
@ -135,17 +174,3 @@ const mockedRules: CombinedRule[] = [ |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
const mockRoute = (ruleName: string, sourceName: string) => { |
|
|
|
|
return { |
|
|
|
|
route: { |
|
|
|
|
path: '/', |
|
|
|
|
component: RedirectToRuleViewer, |
|
|
|
|
}, |
|
|
|
|
queryParams: { returnTo: '/alerting/list' }, |
|
|
|
|
match: { params: { name: ruleName, sourceName: sourceName }, isExact: false, url: 'asdf', path: '' }, |
|
|
|
|
history: locationService.getHistory(), |
|
|
|
|
location: { pathname: '', hash: '', search: '', state: '' }, |
|
|
|
|
staticContext: {}, |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|