| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {assert} from 'chai'; |
| import {_CROS_CLOSURE_SLO, _CROS_CLOSURE_SLO_DAYS_BY_PRIORITY, |
| _isCrosClosureEligible, SloCompletionStatus, determineSloStatus} |
| from './slo-rules.js'; |
| |
| const P1_FIELD_VALUE = Object.freeze({ |
| fieldRef: { |
| fieldId: 1, |
| fieldName: 'Pri', |
| type: 'ENUM_TYPE', |
| }, |
| value: '1'}); |
| |
| // TODO(crbug.com/monorail/7843): Separate testing of determineSloStatus from |
| // testing of specific SLO Rules. Add testing for a rule that throws an error. |
| describe('determineSloStatus', () => { |
| it('returns null for ineligible issues', () => { |
| const ineligibleIssue = { |
| componentRefs: [{path: 'Some>Other>Component'}], |
| fieldValues: [P1_FIELD_VALUE], |
| labelRefs: [], |
| localId: 1, |
| projectName: 'x', |
| }; |
| assert.isNull(determineSloStatus(ineligibleIssue)); |
| }); |
| |
| it('returns null for eligible issues without defined priority', () => { |
| const ineligibleIssue = { |
| componentRefs: [{path: 'OS>Systems>CrashReporting'}], |
| fieldValues: [], |
| labelRefs: [], |
| localId: 1, |
| projectName: 'x', |
| }; |
| assert.isNull(determineSloStatus(ineligibleIssue)); |
| }); |
| |
| it('returns SloStatus with target for incomplete eligible issues', () => { |
| const openedTimestamp = 1412362587; |
| const eligibleIssue = { |
| componentRefs: [{path: 'OS>Systems>CrashReporting'}], |
| fieldValues: [P1_FIELD_VALUE], |
| labelRefs: [], |
| localId: 1, |
| openedTimestamp: openedTimestamp, |
| projectName: 'x', |
| }; |
| const status = determineSloStatus(eligibleIssue); |
| |
| const expectedTarget = new Date(openedTimestamp * 1000); |
| expectedTarget.setDate( |
| expectedTarget.getDate() + _CROS_CLOSURE_SLO_DAYS_BY_PRIORITY['1']); |
| |
| assert.equal(status.target.valueOf(), expectedTarget.valueOf()); |
| assert.equal(status.completion, SloCompletionStatus.INCOMPLETE); |
| assert.equal(status.rule, _CROS_CLOSURE_SLO); |
| }); |
| |
| it('returns SloStatus without target for complete eligible issues', () => { |
| const eligibleIssue = { |
| componentRefs: [{path: 'OS>Systems>CrashReporting'}], |
| fieldValues: [P1_FIELD_VALUE], |
| labelRefs: [], |
| localId: 1, |
| projectName: 'x', |
| statusRef: {status: 'Closed', meansOpen: false}, |
| }; |
| const status = determineSloStatus(eligibleIssue); |
| assert.isNull(status.target); |
| assert.equal(status.completion, SloCompletionStatus.COMPLETE); |
| assert.equal(status.rule, _CROS_CLOSURE_SLO); |
| }); |
| }); |
| |
| describe('_isCrosClosureEligible', () => { |
| let crosIssue; |
| beforeEach(() => { |
| crosIssue = { |
| componentRefs: [{path: 'OS>Systems>CrashReporting'}], |
| fieldValues: [], |
| labelRefs: [], |
| localId: 1, |
| projectName: 'x', |
| }; |
| }); |
| |
| it('returns true when eligible', () => { |
| assert.isTrue(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns true if at least one eligible component', () => { |
| crosIssue.componentRefs.push({path: 'Some>Other>Component'}); |
| assert.isTrue(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns false for issues in wrong component', () => { |
| crosIssue.componentRefs = [{path: 'Some>Other>Component'}]; |
| assert.isFalse(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns false for Feature', () => { |
| crosIssue.fieldValues.push( |
| {fieldRef: {fieldName: 'Type'}, value: 'Feature'}); |
| assert.isFalse(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns false for FLT-Launch', () => { |
| crosIssue.fieldValues.push( |
| {fieldRef: {fieldName: 'Type'}, value: 'FLT-Launch'}); |
| assert.isFalse(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns false for Postmortem-Followup', () => { |
| crosIssue.fieldValues.push( |
| {fieldRef: {fieldName: 'Type'}, value: 'Postmortem-Followup'}); |
| assert.isFalse(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns false for Design-Review', () => { |
| crosIssue.fieldValues.push( |
| {fieldRef: {fieldName: 'Type'}, value: 'Design-Review'}); |
| assert.isFalse(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns true for other types', () => { |
| crosIssue.fieldValues.push( |
| {fieldRef: {fieldName: 'type'}, value: 'Any-Other-Type'}); |
| assert.isTrue(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns false for p1 with milestone', () => { |
| crosIssue.fieldValues.push(P1_FIELD_VALUE); |
| crosIssue.fieldValues.push({fieldRef: {fieldName: 'M'}, value: 'any'}); |
| assert.isFalse(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns true for p1 without milestone', () => { |
| crosIssue.fieldValues.push(P1_FIELD_VALUE); |
| crosIssue.fieldValues.push({fieldRef: {fieldName: 'Other'}, value: 'any'}); |
| assert.isTrue(_isCrosClosureEligible(crosIssue)); |
| }); |
| |
| it('returns false for ChromeOS_No_SLO label', () => { |
| crosIssue.labelRefs.push({label: 'ChromeOS_No_SLO'}); |
| assert.isFalse(_isCrosClosureEligible(crosIssue)); |
| }); |
| }); |