323 lines
8.6 KiB
JavaScript
323 lines
8.6 KiB
JavaScript
import reducer from 'src/kapacitor/reducers/rules'
|
|
import {defaultRuleConfigs} from 'src/kapacitor/constants'
|
|
import {ALERT_NODES_ACCESSORS} from 'src/kapacitor/constants'
|
|
|
|
import {
|
|
chooseTrigger,
|
|
addEvery,
|
|
removeEvery,
|
|
updateRuleValues,
|
|
updateDetails,
|
|
updateMessage,
|
|
updateAlerts,
|
|
updateAlertNodes,
|
|
updateAlertProperty,
|
|
updateRuleName,
|
|
deleteRuleSuccess,
|
|
updateRuleStatusSuccess,
|
|
} from 'src/kapacitor/actions/view'
|
|
|
|
describe('Kapacitor.Reducers.rules', () => {
|
|
it('can choose a trigger', () => {
|
|
const ruleID = 1
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
trigger: '',
|
|
},
|
|
}
|
|
|
|
let newState = reducer(initialState, chooseTrigger(ruleID, 'deadman'))
|
|
expect(newState[ruleID].trigger).to.equal('deadman')
|
|
expect(newState[ruleID].values).to.equal(defaultRuleConfigs.deadman)
|
|
|
|
newState = reducer(initialState, chooseTrigger(ruleID, 'relative'))
|
|
expect(newState[ruleID].trigger).to.equal('relative')
|
|
expect(newState[ruleID].values).to.equal(defaultRuleConfigs.relative)
|
|
|
|
newState = reducer(initialState, chooseTrigger(ruleID, 'threshold'))
|
|
expect(newState[ruleID].trigger).to.equal('threshold')
|
|
expect(newState[ruleID].values).to.equal(defaultRuleConfigs.threshold)
|
|
})
|
|
|
|
it('can update the every', () => {
|
|
const ruleID = 1
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
every: null,
|
|
},
|
|
}
|
|
|
|
let newState = reducer(initialState, addEvery(ruleID, '30s'))
|
|
expect(newState[ruleID].every).to.equal('30s')
|
|
|
|
newState = reducer(newState, removeEvery(ruleID))
|
|
expect(newState[ruleID].every).to.equal(null)
|
|
})
|
|
|
|
it('can update the values', () => {
|
|
const ruleID = 1
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
trigger: 'deadman',
|
|
values: defaultRuleConfigs.deadman,
|
|
},
|
|
}
|
|
|
|
const newDeadmanValues = {duration: '5m'}
|
|
const newState = reducer(
|
|
initialState,
|
|
updateRuleValues(ruleID, 'deadman', newDeadmanValues)
|
|
)
|
|
expect(newState[ruleID].values).to.equal(newDeadmanValues)
|
|
|
|
const newRelativeValues = {func: 'max', change: 'change'}
|
|
const finalState = reducer(
|
|
newState,
|
|
updateRuleValues(ruleID, 'relative', newRelativeValues)
|
|
)
|
|
expect(finalState[ruleID].trigger).to.equal('relative')
|
|
expect(finalState[ruleID].values).to.equal(newRelativeValues)
|
|
})
|
|
|
|
it('can update the message', () => {
|
|
const ruleID = 1
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
message: '',
|
|
},
|
|
}
|
|
|
|
const message = 'im a kapacitor rule message'
|
|
const newState = reducer(initialState, updateMessage(ruleID, message))
|
|
expect(newState[ruleID].message).to.equal(message)
|
|
})
|
|
|
|
it('can update the alerts', () => {
|
|
const ruleID = 1
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
alerts: [],
|
|
},
|
|
}
|
|
|
|
const alerts = ['slack']
|
|
const newState = reducer(initialState, updateAlerts(ruleID, alerts))
|
|
expect(newState[ruleID].alerts).to.equal(alerts)
|
|
})
|
|
|
|
it('can update an alerta alert', () => {
|
|
const ruleID = 1
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
alerts: [],
|
|
alertNodes: [],
|
|
},
|
|
}
|
|
|
|
const tickScript = `stream
|
|
|alert()
|
|
.alerta()
|
|
.resource('Hostname or service')
|
|
.event('Something went wrong')
|
|
.environment('Development')
|
|
.group('Dev. Servers')
|
|
.services('a b c')
|
|
`
|
|
|
|
let newState = reducer(
|
|
initialState,
|
|
updateAlertNodes(ruleID, 'alerta', tickScript)
|
|
)
|
|
const expectedStr = `alerta().resource('Hostname or service').event('Something went wrong').environment('Development').group('Dev. Servers').services('a b c')`
|
|
let actualStr = ALERT_NODES_ACCESSORS.alerta(newState[ruleID])
|
|
|
|
// Test both data structure and accessor string
|
|
expect(actualStr).to.equal(expectedStr)
|
|
|
|
// Test that accessor string is the same if fed back in
|
|
newState = reducer(newState, updateAlertNodes(ruleID, 'alerta', actualStr))
|
|
actualStr = ALERT_NODES_ACCESSORS.alerta(newState[ruleID])
|
|
expect(actualStr).to.equal(expectedStr)
|
|
})
|
|
|
|
it('can update the name', () => {
|
|
const ruleID = 1
|
|
const name = 'New name'
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
name: 'Random album title',
|
|
},
|
|
}
|
|
|
|
const newState = reducer(initialState, updateRuleName(ruleID, name))
|
|
expect(newState[ruleID].name).to.equal(name)
|
|
})
|
|
|
|
it('it can delete a rule', () => {
|
|
const rule1 = 1
|
|
const rule2 = 2
|
|
const initialState = {
|
|
[rule1]: {
|
|
id: rule1,
|
|
},
|
|
[rule2]: {
|
|
id: rule2,
|
|
},
|
|
}
|
|
|
|
expect(Object.keys(initialState).length).to.equal(2)
|
|
const newState = reducer(initialState, deleteRuleSuccess(rule2))
|
|
expect(Object.keys(newState).length).to.equal(1)
|
|
expect(newState[rule1]).to.equal(initialState[rule1])
|
|
})
|
|
|
|
it('can update details', () => {
|
|
const ruleID = 1
|
|
const details = 'im some rule details'
|
|
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
details: '',
|
|
},
|
|
}
|
|
|
|
const newState = reducer(initialState, updateDetails(ruleID, details))
|
|
expect(newState[ruleID].details).to.equal(details)
|
|
})
|
|
|
|
it('can update properties', () => {
|
|
const ruleID = 1
|
|
|
|
const alertNodeName = 'pushover'
|
|
|
|
const alertProperty1_Name = 'device'
|
|
const alertProperty1_ArgsOrig =
|
|
'pineapple_kingdom_control_room,bob_cOreos_watch'
|
|
const alertProperty1_ArgsDiff = 'pineapple_kingdom_control_tower'
|
|
|
|
const alertProperty2_Name = 'URLTitle'
|
|
const alertProperty2_ArgsOrig = 'Cubeapple Rising'
|
|
const alertProperty2_ArgsDiff = 'Cubeapple Falling'
|
|
|
|
const alertProperty1_Orig = {
|
|
name: alertProperty1_Name,
|
|
args: [alertProperty1_ArgsOrig],
|
|
}
|
|
const alertProperty1_Diff = {
|
|
name: alertProperty1_Name,
|
|
args: [alertProperty1_ArgsDiff],
|
|
}
|
|
const alertProperty2_Orig = {
|
|
name: alertProperty2_Name,
|
|
args: [alertProperty2_ArgsOrig],
|
|
}
|
|
const alertProperty2_Diff = {
|
|
name: alertProperty2_Name,
|
|
args: [alertProperty2_ArgsDiff],
|
|
}
|
|
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
alertNodes: [
|
|
{
|
|
name: 'pushover',
|
|
args: null,
|
|
properties: null,
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
const getAlertPropertyArgs = (matchState, propertyName) =>
|
|
matchState[ruleID].alertNodes
|
|
.find(node => node.name === alertNodeName)
|
|
.properties.find(property => property.name === propertyName).args[0]
|
|
|
|
// add first property
|
|
let newState = reducer(
|
|
initialState,
|
|
updateAlertProperty(ruleID, alertNodeName, alertProperty1_Orig)
|
|
)
|
|
expect(getAlertPropertyArgs(newState, alertProperty1_Name)).to.equal(
|
|
alertProperty1_ArgsOrig
|
|
)
|
|
|
|
// change first property
|
|
newState = reducer(
|
|
initialState,
|
|
updateAlertProperty(ruleID, alertNodeName, alertProperty1_Diff)
|
|
)
|
|
expect(getAlertPropertyArgs(newState, alertProperty1_Name)).to.equal(
|
|
alertProperty1_ArgsDiff
|
|
)
|
|
|
|
// add second property
|
|
newState = reducer(
|
|
initialState,
|
|
updateAlertProperty(ruleID, alertNodeName, alertProperty2_Orig)
|
|
)
|
|
expect(getAlertPropertyArgs(newState, alertProperty1_Name)).to.equal(
|
|
alertProperty1_ArgsDiff
|
|
)
|
|
expect(getAlertPropertyArgs(newState, alertProperty2_Name)).to.equal(
|
|
alertProperty2_ArgsOrig
|
|
)
|
|
expect(
|
|
newState[ruleID].alertNodes.find(node => node.name === alertNodeName)
|
|
.properties.length
|
|
).to.equal(2)
|
|
|
|
// change second property
|
|
newState = reducer(
|
|
initialState,
|
|
updateAlertProperty(ruleID, alertNodeName, alertProperty2_Diff)
|
|
)
|
|
expect(getAlertPropertyArgs(newState, alertProperty1_Name)).to.equal(
|
|
alertProperty1_ArgsDiff
|
|
)
|
|
expect(getAlertPropertyArgs(newState, alertProperty2_Name)).to.equal(
|
|
alertProperty2_ArgsDiff
|
|
)
|
|
expect(
|
|
newState[ruleID].alertNodes.find(node => node.name === alertNodeName)
|
|
.properties.length
|
|
).to.equal(2)
|
|
})
|
|
|
|
it('can update status', () => {
|
|
const ruleID = 1
|
|
const status = 'enabled'
|
|
|
|
const initialState = {
|
|
[ruleID]: {
|
|
id: ruleID,
|
|
queryID: 988,
|
|
status: 'disabled',
|
|
},
|
|
}
|
|
|
|
const newState = reducer(
|
|
initialState,
|
|
updateRuleStatusSuccess(ruleID, status)
|
|
)
|
|
expect(newState[ruleID].status).to.equal(status)
|
|
})
|
|
})
|