-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rename alert status OK to Recovered and fix some UX issues around disabling a rule while being in an error state #98135
Changes from 2 commits
4cff048
7bca356
c7b2485
6b27795
4c18b9f
0caa15d
8b41644
624ae75
cfb1c25
e57fc5c
07d5dfe
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,6 +8,8 @@ | |
import * as React from 'react'; | ||
import uuid from 'uuid'; | ||
import { shallow } from 'enzyme'; | ||
import { mountWithIntl, nextTick } from '@kbn/test/jest'; | ||
import { act } from '@testing-library/react'; | ||
import { AlertDetails } from './alert_details'; | ||
import { Alert, ActionType, AlertTypeModel, AlertType } from '../../../../types'; | ||
import { EuiTitle, EuiBadge, EuiFlexItem, EuiSwitch, EuiButtonEmpty, EuiText } from '@elastic/eui'; | ||
|
@@ -463,6 +465,74 @@ describe('disable button', () => { | |
handler!({} as React.FormEvent); | ||
expect(enableAlert).toHaveBeenCalledTimes(1); | ||
}); | ||
|
||
it('should bring back error banner after re-enable if previously dismissed', async () => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After re-enabling the rule, it would have a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah I see. I think that's fine. The test name made me think the error banner should reappear right away but I think it's ok if it doesn't. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, I see what you mean. I fixed the test name in this commit: 624ae75. |
||
const alert = mockAlert({ | ||
enabled: true, | ||
executionStatus: { | ||
status: 'error', | ||
lastExecutionDate: new Date('2020-08-20T19:23:38Z'), | ||
error: { | ||
reason: AlertExecutionStatusErrorReasons.Execute, | ||
message: 'Fail', | ||
}, | ||
}, | ||
}); | ||
|
||
const alertType: AlertType = { | ||
id: '.noop', | ||
name: 'No Op', | ||
actionGroups: [{ id: 'default', name: 'Default' }], | ||
recoveryActionGroup, | ||
actionVariables: { context: [], state: [], params: [] }, | ||
defaultActionGroupId: 'default', | ||
producer: ALERTS_FEATURE_ID, | ||
authorizedConsumers, | ||
minimumLicenseRequired: 'basic', | ||
enabledInLicense: true, | ||
}; | ||
|
||
const disableAlert = jest.fn(); | ||
const enableAlert = jest.fn(); | ||
const wrapper = mountWithIntl( | ||
<AlertDetails | ||
alert={alert} | ||
alertType={alertType} | ||
actionTypes={[]} | ||
{...mockAlertApis} | ||
disableAlert={disableAlert} | ||
enableAlert={enableAlert} | ||
/> | ||
); | ||
|
||
await act(async () => { | ||
await nextTick(); | ||
wrapper.update(); | ||
}); | ||
|
||
// Dismiss the error banner | ||
await act(async () => { | ||
wrapper.find('[data-test-subj="dismiss-execution-error"]').first().simulate('click'); | ||
await nextTick(); | ||
}); | ||
|
||
// Disable the alert | ||
await act(async () => { | ||
wrapper.find('[data-test-subj="disableSwitch"] .euiSwitch__button').first().simulate('click'); | ||
await nextTick(); | ||
}); | ||
expect(disableAlert).toHaveBeenCalled(); | ||
|
||
// Enable the alert | ||
await act(async () => { | ||
wrapper.find('[data-test-subj="disableSwitch"] .euiSwitch__button').first().simulate('click'); | ||
await nextTick(); | ||
}); | ||
expect(enableAlert).toHaveBeenCalled(); | ||
|
||
// Ensure error banner is back | ||
expect(wrapper.find('[data-test-subj="dismiss-execution-error"]').length).toBeGreaterThan(0); | ||
}); | ||
}); | ||
|
||
describe('mute button', () => { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -119,6 +119,7 @@ export default function createEnableAlertTests({ getService }: FtrProviderContex | |
.auth(user.username, user.password) | ||
.expect(200); | ||
expect(typeof updatedAlert.scheduled_task_id).to.eql('string'); | ||
expect(updatedAlert.execution_status.status).to.eql('pending'); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Note to self: this is flaky in the scenario the rule finished running before the API call is made.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Had to remove the integration test: cfb1c25. It will always be a race condition between enabling the rule and checking if the execution status is |
||
const { _source: taskRecord } = await getScheduledTask( | ||
updatedAlert.scheduled_task_id | ||
); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -49,6 +49,7 @@ export default function createEnableAlertTests({ getService }: FtrProviderContex | |
.set('kbn-xsrf', 'foo') | ||
.expect(200); | ||
expect(typeof updatedAlert.scheduled_task_id).to.eql('string'); | ||
expect(updatedAlert.execution_status.status).to.eql('pending'); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Note to self: this is flaky in the scenario the rule finished running before the API call is made.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Had to remove the integration test: cfb1c25. It will always be a race condition between enabling the rule and checking if the execution status is |
||
const { _source: taskRecord } = await getScheduledTask(updatedAlert.scheduled_task_id); | ||
expect(taskRecord.type).to.eql('task'); | ||
expect(taskRecord.task.taskType).to.eql('alerting:test.noop'); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Does it make sense to reset the
lastExecutionDate
here? I guess it would quickly be overwritten the next time the rule runs, but technically, this date is not the last time the rule was executed.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like we do set that field to the same "current date" for other cases of
status: 'pending'
. So, it's consistent. I think we picked the namelastExecutionDate
before starting to usepending
, and so ... the name kinda doesn't make sense any more. Would be better described (I think) as "lastStateUpdateDate" or something.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think that makes sense. Should I create an issue for 8.0 release? This way we can make it a breaking change.
I think copying how it's done on create is ok for now but definitely strange.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DateDateDate
I'm not against changing the name to better reflect reality, especially as an 8.0 thing. Though I wonder if
lastStateUpdate
makes sense - the date value is supposed to reflect the last execution, except we knew we didn't have that date in some previous 7.x release, and obviously don't have one for newly created rules. So it does kind of make sense to continue with the current name, with the caveat that you need to check to see if thestatus
is 'pending' which means "it hasn't run yet". Basically, if we call itlastStateUpdate
, would folks expect other changes might also change this date? What happens to these fields when disabling a rule?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I read this as "the execution status is pending, and it's been pending since
lastExecutionDate
". So any name that can reflect that and last time the rule executed I'm +1. Seems like a separate issue to be created?