| /* |
| * 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"); |
| var fs = require("fs"); |
| const { ReviewerConfig } = require("../shared/reviewerConfig"); |
| const configPath = "test-config.yml"; |
| const configContents = `labels: |
| - name: "Go" |
| reviewers: ["testReviewer1", "testReviewer2"] |
| exclusionList: ["testReviewer3"] # These users will never be suggested as reviewers |
| # I don't know the other areas well enough to assess who the normal committers/contributors who might want to be reviewers are |
| - name: "Java" |
| reviewers: ["testReviewer3", "testReviewer2"] |
| exclusionList: [] # These users will never be suggested as reviewers |
| - name: "Python" |
| reviewers: ["testReviewer4"] |
| exclusionList: [] # These users will never be suggested as reviewers |
| fallbackReviewers: ["testReviewer5", "testReviewer1", "testReviewer3"] # List of committers to use when no label matches |
| `; |
| describe("ReviewerConfig", function () { |
| before(function () { |
| if (fs.existsSync(configPath)) { |
| fs.rmSync(configPath); |
| } |
| fs.writeFileSync(configPath, configContents); |
| }); |
| |
| after(function () { |
| fs.rmSync(configPath); |
| }); |
| |
| describe("getReviewersForLabels()", function () { |
| it("should return all reviewers configured for all labels", function () { |
| const config = new ReviewerConfig(configPath); |
| const reviewersForLabels = config.getReviewersForLabels( |
| [{ name: "Go" }, { name: "Java" }], |
| [] |
| ); |
| assert( |
| reviewersForLabels["Go"].find( |
| (reviewer) => reviewer === "testReviewer1" |
| ), |
| "Return value for Go label should include testReviewer1" |
| ); |
| assert( |
| reviewersForLabels["Go"].find( |
| (reviewer) => reviewer === "testReviewer2" |
| ), |
| "Return value for Go label should include testReviewer2" |
| ); |
| assert( |
| !reviewersForLabels["Go"].find( |
| (reviewer) => reviewer === "testReviewer3" |
| ), |
| "Return value for Go label should not include testReviewer3" |
| ); |
| assert( |
| !reviewersForLabels["Go"].find( |
| (reviewer) => reviewer === "testReviewer4" |
| ), |
| "Return value for Go label should not include testReviewer4" |
| ); |
| |
| assert( |
| reviewersForLabels["Java"].find( |
| (reviewer) => reviewer === "testReviewer3" |
| ), |
| "Return value for Java label should include testReviewer3" |
| ); |
| assert( |
| reviewersForLabels["Java"].find( |
| (reviewer) => reviewer === "testReviewer2" |
| ), |
| "Return value for Java label should include testReviewer2" |
| ); |
| assert( |
| !reviewersForLabels["Java"].find( |
| (reviewer) => reviewer === "testReviewer4" |
| ), |
| "Return value for Java label should not include testReviewer4" |
| ); |
| assert( |
| !reviewersForLabels["Java"].find( |
| (reviewer) => reviewer === "testReviewer1" |
| ), |
| "Return value for Java label should not include testReviewer1" |
| ); |
| assert( |
| !reviewersForLabels["Java"].find( |
| (reviewer) => reviewer === "testReviewer5" |
| ), |
| "Return value for Java label should not include testReviewer5" |
| ); |
| |
| assert( |
| Object.keys(reviewersForLabels).indexOf("Python") == -1, |
| "No reviewers should be included for python" |
| ); |
| }); |
| |
| it("should return no entry if a label is not configured", function () { |
| const config = new ReviewerConfig(configPath); |
| const reviewersForLabels = config.getReviewersForLabels( |
| [{ name: "FakeLabel" }], |
| [] |
| ); |
| |
| assert( |
| !("FakeLabel" in reviewersForLabels), |
| "FakeLabel should not be included in the returned label map" |
| ); |
| }); |
| |
| it("should exclude any reviewers who are passed into the exlusionList", function () { |
| const config = new ReviewerConfig(configPath); |
| const reviewersForLabels = config.getReviewersForLabels( |
| [{ name: "Go" }, { name: "Java" }], |
| ["testReviewer1"] |
| ); |
| |
| assert( |
| !reviewersForLabels["Go"].find( |
| (reviewer) => reviewer === "testReviewer1" |
| ), |
| "testReviewer1 should have been excluded from the result set" |
| ); |
| }); |
| }); |
| |
| describe("getReviewersForLabel()", function () { |
| it("should return all reviewers configured for a label", function () { |
| const config = new ReviewerConfig(configPath); |
| const reviewersForGo = config.getReviewersForLabel("Go", []); |
| |
| assert( |
| reviewersForGo.find((reviewer) => reviewer === "testReviewer1"), |
| "Return value for Go label should include testReviewer1" |
| ); |
| assert( |
| reviewersForGo.find((reviewer) => reviewer === "testReviewer2"), |
| "Return value for Go label should include testReviewer2" |
| ); |
| assert( |
| !reviewersForGo.find((reviewer) => reviewer === "testReviewer3"), |
| "Return value for Go label should not include testReviewer3" |
| ); |
| assert( |
| !reviewersForGo.find((reviewer) => reviewer === "testReviewer4"), |
| "Return value for Go label should not include testReviewer4" |
| ); |
| }); |
| |
| it("should return an empty list if a label is not configured", function () { |
| const config = new ReviewerConfig(configPath); |
| const reviewersForFakeLabel = config.getReviewersForLabel( |
| "FakeLabel", |
| [] |
| ); |
| assert.equal(0, reviewersForFakeLabel.length); |
| }); |
| |
| it("should exclude any reviewers who are passed into the exlusionList", function () { |
| const config = new ReviewerConfig(configPath); |
| const reviewersForGo = config.getReviewersForLabel("Go", [ |
| "testReviewer1", |
| ]); |
| |
| assert( |
| !reviewersForGo.find((reviewer) => reviewer === "testReviewer1"), |
| "Return value for Go label should not include testReviewer1" |
| ); |
| }); |
| }); |
| |
| describe("getExclusionListForLabel()", function () { |
| it("should get the exclusion list configured for a label", function () { |
| const config = new ReviewerConfig(configPath); |
| const goExclusionList = config.getExclusionListForLabel("Go"); |
| |
| assert( |
| goExclusionList.find((reviewer) => reviewer === "testReviewer3"), |
| "Return value for Go label should include testReviewer3" |
| ); |
| assert.equal(1, goExclusionList.length); |
| }); |
| }); |
| |
| describe("getFallbackReviewers()", function () { |
| it("should get the configured falback list", function () { |
| const config = new ReviewerConfig(configPath); |
| const fallbackReviewers = config.getFallbackReviewers([]); |
| |
| assert.equal(3, fallbackReviewers.length); |
| assert( |
| fallbackReviewers.find((reviewer) => reviewer === "testReviewer5"), |
| "Fallback reviewers should include testReviewer5" |
| ); |
| assert( |
| fallbackReviewers.find((reviewer) => reviewer === "testReviewer1"), |
| "Fallback reviewers should include testReviewer1" |
| ); |
| assert( |
| fallbackReviewers.find((reviewer) => reviewer === "testReviewer3"), |
| "Fallback reviewers should include testReviewer3" |
| ); |
| }); |
| |
| it("should not include excluded reviewers", function () { |
| const config = new ReviewerConfig(configPath); |
| const fallbackReviewers = config.getFallbackReviewers([ |
| "testReviewer1", |
| "testReviewer3", |
| ]); |
| |
| assert.equal(1, fallbackReviewers.length); |
| assert( |
| fallbackReviewers.find((reviewer) => reviewer === "testReviewer5"), |
| "Fallback reviewers should only include testReviewer5" |
| ); |
| }); |
| }); |
| }); |