| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| var assert = require("assert"); | |
| const { ReviewersForLabel } = require("../shared/reviewersForLabel"); | |
| describe("ReviewersForLabel", function () { | |
| describe("assignNextReviewer()", function () { | |
| it("should repeatedly assign the reviewer who reviewed least recently", function () { | |
| const dateOfLastReviewAssignment = { | |
| testReviewer1: 1, | |
| testReviewer2: 3, | |
| testReviewer3: 4, | |
| testReviewer4: 2, | |
| }; | |
| let reviewersForGo = new ReviewersForLabel("Go", { | |
| dateOfLastReviewAssignment: dateOfLastReviewAssignment, | |
| }); | |
| assert.equal( | |
| "testReviewer1", | |
| reviewersForGo.assignNextReviewer([ | |
| "testReviewer1", | |
| "testReviewer2", | |
| "testReviewer3", | |
| "testReviewer4", | |
| ]) | |
| ); | |
| assert.equal( | |
| "testReviewer4", | |
| reviewersForGo.assignNextReviewer([ | |
| "testReviewer1", | |
| "testReviewer2", | |
| "testReviewer3", | |
| "testReviewer4", | |
| ]) | |
| ); | |
| assert.equal( | |
| "testReviewer2", | |
| reviewersForGo.assignNextReviewer([ | |
| "testReviewer1", | |
| "testReviewer2", | |
| "testReviewer3", | |
| "testReviewer4", | |
| ]) | |
| ); | |
| assert.equal( | |
| "testReviewer3", | |
| reviewersForGo.assignNextReviewer([ | |
| "testReviewer1", | |
| "testReviewer2", | |
| "testReviewer3", | |
| "testReviewer4", | |
| ]) | |
| ); | |
| assert.equal( | |
| "testReviewer1", | |
| reviewersForGo.assignNextReviewer([ | |
| "testReviewer1", | |
| "testReviewer2", | |
| "testReviewer3", | |
| "testReviewer4", | |
| ]) | |
| ); | |
| }); | |
| it("should assign a reviewer who hasnt reviewed before", function () { | |
| const dateOfLastReviewAssignment = { | |
| testReviewer1: 1, | |
| testReviewer2: 2, | |
| testReviewer3: 3, | |
| testReviewer4: 4, | |
| }; | |
| let reviewersForGo = new ReviewersForLabel("Go", { | |
| dateOfLastReviewAssignment: dateOfLastReviewAssignment, | |
| }); | |
| assert.equal( | |
| "testReviewer5", | |
| reviewersForGo.assignNextReviewer([ | |
| "testReviewer1", | |
| "testReviewer2", | |
| "testReviewer3", | |
| "testReviewer4", | |
| "testReviewer5", | |
| ]) | |
| ); | |
| }); | |
| it("should only assign reviewers in the availableReviewers list", function () { | |
| const dateOfLastReviewAssignment = { | |
| testReviewer1: 1, | |
| testReviewer2: 2, | |
| testReviewer3: 3, | |
| testReviewer4: 4, | |
| }; | |
| let reviewersForGo = new ReviewersForLabel("Go", { | |
| dateOfLastReviewAssignment: dateOfLastReviewAssignment, | |
| }); | |
| assert.equal( | |
| "testReviewer2", | |
| reviewersForGo.assignNextReviewer(["testReviewer4", "testReviewer2"]) | |
| ); | |
| }); | |
| it("should throw if no reviewer available", function () { | |
| const dateOfLastReviewAssignment = { | |
| testReviewer1: 1, | |
| testReviewer2: 2, | |
| testReviewer3: 3, | |
| testReviewer4: 4, | |
| }; | |
| let reviewersForGo = new ReviewersForLabel("Go", { | |
| dateOfLastReviewAssignment: dateOfLastReviewAssignment, | |
| }); | |
| assert.throws(() => reviewersForGo.assignNextReviewer([])); | |
| }); | |
| }); | |
| describe("getBackupReviewer()", function () { | |
| it("should pick the next least recently assigned reviewer from the label without updating timestamps", function () { | |
| const dateOfLastReviewAssignment = { | |
| testReviewer1: 10, | |
| testReviewer2: 20, | |
| testReviewer3: 30, | |
| }; | |
| let reviewersForGo = new ReviewersForLabel("Go", { | |
| dateOfLastReviewAssignment: { ...dateOfLastReviewAssignment }, | |
| }); | |
| const backup = reviewersForGo.getBackupReviewer( | |
| ["testReviewer1", "testReviewer2", "testReviewer3"], | |
| "testReviewer1", | |
| ["fallback1"] | |
| ); | |
| assert.equal(backup, "testReviewer2"); | |
| assert.deepEqual( | |
| reviewersForGo.dateOfLastReviewAssignment, | |
| dateOfLastReviewAssignment | |
| ); | |
| }); | |
| it("should fall back to fallbackReviewers when label only has one available reviewer", function () { | |
| const dateOfLastReviewAssignment = { | |
| testReviewer1: 10, | |
| fallback1: 50, | |
| fallback2: 15, | |
| }; | |
| let reviewersForSpanner = new ReviewersForLabel("spanner", { | |
| dateOfLastReviewAssignment: { ...dateOfLastReviewAssignment }, | |
| }); | |
| const backup = reviewersForSpanner.getBackupReviewer( | |
| ["testReviewer1"], | |
| "testReviewer1", | |
| ["testReviewer1", "fallback1", "fallback2"] | |
| ); | |
| assert.equal(backup, "fallback2"); | |
| assert.deepEqual( | |
| reviewersForSpanner.dateOfLastReviewAssignment, | |
| dateOfLastReviewAssignment | |
| ); | |
| }); | |
| }); | |
| }); |