diff --git a/bot/main.go b/bot/main.go index 7d97a88..9b8d27a 100644 --- a/bot/main.go +++ b/bot/main.go @@ -147,9 +147,16 @@ func parseFlags() (flags, error) { return flags{}, trace.BadParameter("reviewers required for assign and check") } - data, err := base64.StdEncoding.DecodeString(*reviewers) - if err != nil { - return flags{}, trace.Wrap(err) + var decodedReviewers string + // Support base64-encoded JSON reviewer string and just JSON without base64 encoding + if strings.HasPrefix(*reviewers, "{") { + decodedReviewers = *reviewers + } else { + reviewerBytes, err := base64.StdEncoding.DecodeString(*reviewers) + if err != nil { + return flags{}, trace.Wrap(err) + } + decodedReviewers = string(reviewerBytes) } stats, err := base64.StdEncoding.DecodeString(*baseStats) @@ -160,7 +167,7 @@ func parseFlags() (flags, error) { return flags{ workflow: *workflow, token: *token, - reviewers: string(data), + reviewers: decodedReviewers, local: *local, org: *org, repo: *repo, diff --git a/bot/main_test.go b/bot/main_test.go new file mode 100644 index 0000000..248e355 --- /dev/null +++ b/bot/main_test.go @@ -0,0 +1,42 @@ +package main + +import ( + "encoding/base64" + "flag" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestParseFlagsReviewers(t *testing.T) { + dummyArgs := []string{ + os.Args[0], + "-workflow", + "dummy-value", + "-token", + "dummy-value", + } + + flagName := "-reviewers" + testValueJSON := `{"key": "value"}` + testValueBase64 := base64.StdEncoding.EncodeToString([]byte(testValueJSON)) + + flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) // Reset the flag lib + os.Args = append(dummyArgs, flagName, testValueBase64) + b64Flags, err := parseFlags() + require.NoError(t, err) + + flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) // Reset the flag lib + os.Args = append(dummyArgs, flagName, testValueJSON) + plainTextFlags, err := parseFlags() + require.NoError(t, err) + + // Verify that the results are the same regardless of whether or not the reviewers + // flag is base64 encoded + assert.Equal(t, b64Flags.reviewers, plainTextFlags.reviewers) + + // Basic checks + assert.Equal(t, testValueJSON, b64Flags.reviewers) +}