manual-approval/approval_test.go
Thomas Stringer 9dd24779eb Fix bug with not accepting newlines
Prior to this PR, if there was a newline (or multiple newline
characters) at the end of the keyword then it wouldn't match. With this
fix any number of newlines at the end of the keyword match will now be
considered for approve or deny.
2022-05-25 19:38:04 -04:00

332 lines
7.3 KiB
Go

package main
import (
"testing"
"github.com/google/go-github/v43/github"
)
func TestApprovalFromComments(t *testing.T) {
login1 := "login1"
login2 := "login2"
login3 := "login3"
bodyApproved := "Approved"
bodyDenied := "Denied"
bodyPending := "not approval or denial"
testCases := []struct {
name string
comments []*github.IssueComment
approvers []string
minimumApprovals int
expectedStatus approvalStatus
}{
{
name: "single_approver_single_comment_approved",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyApproved,
},
},
approvers: []string{login1},
expectedStatus: approvalStatusApproved,
},
{
name: "single_approver_single_comment_denied",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyDenied,
},
},
approvers: []string{login1},
expectedStatus: approvalStatusDenied,
},
{
name: "single_approver_single_comment_pending",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyPending,
},
},
approvers: []string{login1},
expectedStatus: approvalStatusPending,
},
{
name: "single_approver_multi_comment_approved",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyPending,
},
{
User: &github.User{Login: &login1},
Body: &bodyApproved,
},
},
approvers: []string{login1},
expectedStatus: approvalStatusApproved,
},
{
name: "multi_approver_approved",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyApproved,
},
{
User: &github.User{Login: &login2},
Body: &bodyApproved,
},
},
approvers: []string{login1, login2},
expectedStatus: approvalStatusApproved,
},
{
name: "multi_approver_mixed",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyPending,
},
{
User: &github.User{Login: &login2},
Body: &bodyApproved,
},
},
approvers: []string{login1, login2},
expectedStatus: approvalStatusPending,
},
{
name: "multi_approver_denied",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyDenied,
},
{
User: &github.User{Login: &login2},
Body: &bodyApproved,
},
},
approvers: []string{login1, login2},
expectedStatus: approvalStatusDenied,
},
{
name: "multi_approver_minimum_one_approval",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyPending,
},
{
User: &github.User{Login: &login2},
Body: &bodyApproved,
},
},
approvers: []string{login1, login2},
expectedStatus: approvalStatusApproved,
minimumApprovals: 1,
},
{
name: "multi_approver_minimum_two_approvals",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyApproved,
},
{
User: &github.User{Login: &login2},
Body: &bodyApproved,
},
},
approvers: []string{login1, login2, login3},
expectedStatus: approvalStatusApproved,
minimumApprovals: 2,
},
{
name: "multi_approver_approvals_less_than_minimum",
comments: []*github.IssueComment{
{
User: &github.User{Login: &login1},
Body: &bodyApproved,
},
},
approvers: []string{login1, login2, login3},
expectedStatus: approvalStatusPending,
minimumApprovals: 2,
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
actual, err := approvalFromComments(testCase.comments, testCase.approvers, testCase.minimumApprovals)
if err != nil {
t.Fatalf("error getting approval from comments: %v", err)
}
if actual != testCase.expectedStatus {
t.Fatalf("actual %s, expected %s", actual, testCase.expectedStatus)
}
})
}
}
func TestApprovedCommentBody(t *testing.T) {
testCases := []struct {
name string
commentBody string
isSuccess bool
}{
{
name: "approved_lowercase_no_punctuation",
commentBody: "approved",
isSuccess: true,
},
{
name: "approve_lowercase_no_punctuation",
commentBody: "approve",
isSuccess: true,
},
{
name: "lgtm_lowercase_no_punctuation",
commentBody: "lgtm",
isSuccess: true,
},
{
name: "yes_lowercase_no_punctuation",
commentBody: "yes",
isSuccess: true,
},
{
name: "approve_uppercase_no_punctuation",
commentBody: "APPROVE",
isSuccess: true,
},
{
name: "approved_titlecase_period",
commentBody: "Approved.",
isSuccess: true,
},
{
name: "approved_titlecase_exclamation",
commentBody: "Approved!",
isSuccess: true,
},
{
name: "approved_titlecase_multi_exclamation",
commentBody: "Approved!!",
isSuccess: true,
},
{
name: "approved_titlecase_question",
commentBody: "Approved?",
isSuccess: false,
},
{
name: "sentence_with_keyword",
commentBody: "should i approve this",
isSuccess: false,
},
{
name: "sentence_without_keyword",
commentBody: "this is just some random comment",
isSuccess: false,
},
{
name: "approved_with_newline",
commentBody: "approved\n",
isSuccess: true,
},
{
name: "approved_with_exclamation_newline",
commentBody: "approved!\n",
isSuccess: true,
},
{
name: "approved_with_multi_exclamation_multi_newline",
commentBody: "approved!!!\n\n\n",
isSuccess: true,
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
actual, err := isApproved(testCase.commentBody)
if err != nil {
t.Fatalf("error getting approval: %v", err)
}
if actual != testCase.isSuccess {
t.Fatalf("expected %v but got %v", testCase.isSuccess, actual)
}
})
}
}
func TestDeniedCommentBody(t *testing.T) {
testCases := []struct {
name string
commentBody string
isSuccess bool
}{
{
name: "denied_lowercase_no_punctuation",
commentBody: "denied",
isSuccess: true,
},
{
name: "deny_lowercase_no_punctuation",
commentBody: "deny",
isSuccess: true,
},
{
name: "no_lowercase_no_punctuation",
commentBody: "no",
isSuccess: true,
},
{
name: "deny_uppercase_no_punctuation",
commentBody: "DENY",
isSuccess: true,
},
{
name: "denied_titlecase_period",
commentBody: "Denied.",
isSuccess: true,
},
{
name: "denied_titlecase_exclamation",
commentBody: "Denied!",
isSuccess: true,
},
{
name: "deny_titlecase_question",
commentBody: "Deny?",
isSuccess: false,
},
{
name: "sentence_with_keyword",
commentBody: "should i deny this",
isSuccess: false,
},
{
name: "sentence_without_keyword",
commentBody: "this is just some random comment",
isSuccess: false,
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
actual, err := isDenied(testCase.commentBody)
if err != nil {
t.Fatalf("error getting approval: %v", err)
}
if actual != testCase.isSuccess {
t.Fatalf("expected %v but got %v", testCase.isSuccess, actual)
}
})
}
}