Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(client): wrap cmd.SetArgs to fix bugs for cmd.SetArgs #18960

Merged
merged 24 commits into from
Jan 25, 2024

Conversation

levisyin
Copy link
Contributor

@levisyin levisyin commented Jan 6, 2024

Refer to:

Since spf13/pflag looks like unmaintained for a long time(above 3 years), it's hard to get support from them for adding new Reset() error function to pflag.Value interface. I made some improvements to testutil.SetArgs to support more test cases.

Now, the new implementation of testutil.SetArgs supports all built-in implementations of pflag.Value and pflag.SliceValue.

Note: testutil.SetArgs is only compatible with the following flag types:

  1. the implementations of pflag.Value
  2. the built-in implementations of pflag.SliceValue
  3. the custom implementations of pflag.SliceValue that are split by comma ",", others are not compatible with.

cc @julienrbrt

@levisyin levisyin requested a review from a team as a code owner January 6, 2024 02:41
Copy link
Contributor

coderabbitai bot commented Jan 6, 2024

Walkthrough

The overall change introduces a new utility function, ResetArgs, to handle the resetting of command arguments and flags within unit tests, specifically for the cobra.Command structure. This update addresses the problem where flag values were not being reset correctly between test runs, and it accommodates different flag types and delimiters. Additionally, associated test cases and mock flag structures have been added to validate the functionality and to handle flags with comma and semicolon delimiters.

Changes

File Path Change Summary
internal/testutil/cmd.go Introduces ResetArgs function to reset command arguments and flags for unit testing, addressing issues with cmd.ResetArgs not resetting flag values as expected. It also handles specific flag types and their default values.
internal/testutil/cmd_test.go Includes test functions for cobra.Command.SetArgs and custom implementations of pflag.SliceValue, illustrating issues with the method not resetting flags as expected and custom implementations of pflag.SliceValue with different delimiters.
internal/testutil/mock_flags.go Introduces MockFlagsWithComma and MockFlagsWithSemicolon structs representing flag sets with specific delimiters, along with methods for manipulating and retrieving flag values.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share

Tips

Chat

There are 3 ways to chat with CodeRabbit:

Note: Auto-reply has been disabled for this repository by the repository owner. The CodeRabbit bot will not respond to your comments unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit tests for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository from git and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit tests.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • The JSON schema for the configuration file is available here.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/coderabbit-overrides.v2.json

CodeRabbit Discord Community

Join our Discord Community to get help, request features, and share feedback.

internal/testutil/cmd.go Outdated Show resolved Hide resolved
internal/testutil/cmd_test.go Outdated Show resolved Hide resolved
@levisyin
Copy link
Contributor Author

levisyin commented Jan 8, 2024

@julienrbrt Hi sir, could you please help me review this pr😀

@facundomedica
Copy link
Member

Would it be possible to add Reset instead of SetArgs? I think that'll be cleaner, so you'd do testutil.Reset(cmd) and then cmd.SetArgs only if you need it.
Another things I can think of:

  • if there's a bug in the newly introduced method, the problems will be contained to a very small area.
  • reviewing/debugging code where there are 2 methods that have the same name but do 2 slightly different things is annoying.

Lmk what you think

@levisyin
Copy link
Contributor Author

Would it be possible to add Reset instead of SetArgs? I think that'll be cleaner, so you'd do testutil.Reset(cmd) and then cmd.SetArgs only if you need it. Another things I can think of:

* if there's a bug in the newly introduced method, the problems will be contained to a very small area.

* reviewing/debugging code where there are 2 methods that have the same name but do 2 slightly different things is annoying.

Lmk what you think

SGTM

internal/testutil/cmd.go Outdated Show resolved Hide resolved
@levisyin
Copy link
Contributor Author

@facundomedica Suggestion addressed.
PS: I renamed SetArgs to ResetArgs, I think it's more appropriate

@facundomedica
Copy link
Member

Perfect, although I meant to say that ResetArgs should only do the resetting/clearing. We shouldn't be passing args to it other than the cmd

@levisyin
Copy link
Contributor Author

Perfect, although I meant to say that ResetArgs should only do the resetting/clearing. We shouldn't be passing args to it other than the cmd

It makes sense, I will remove the args param

@levisyin
Copy link
Contributor Author

@facundomedica Hi sir, suggestion addressed😀

Copy link
Member

@facundomedica facundomedica left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some changes required but lgtm

internal/testutil/cmd.go Outdated Show resolved Hide resolved
import "strings"

type MockFlagsWithComma struct {
Ary []string
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Ary []string
Arg []string

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or Args?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually it means 'Array', not 'arg' or 'args', just for illustrate slice type field

levisyin and others added 2 commits January 16, 2024 18:08
Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com>
Copy link
Contributor

@likhita-809 likhita-809 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tiny nits. Otherwise code lgtm

internal/testutil/cmd.go Outdated Show resolved Hide resolved
internal/testutil/cmd.go Outdated Show resolved Hide resolved
internal/testutil/cmd.go Outdated Show resolved Hide resolved
levisyin and others added 4 commits January 23, 2024 18:14
Co-authored-by: Likhita Polavarapu <78951027+likhita-809@users.noreply.github.com>
Co-authored-by: Likhita Polavarapu <78951027+likhita-809@users.noreply.github.com>
Co-authored-by: Likhita Polavarapu <78951027+likhita-809@users.noreply.github.com>
internal/testutil/cmd.go Outdated Show resolved Hide resolved
internal/testutil/cmd.go Outdated Show resolved Hide resolved
@julienrbrt julienrbrt added this pull request to the merge queue Jan 25, 2024
Merged via the queue into cosmos:main with commit bb58af8 Jan 25, 2024
55 of 57 checks passed
@levisyin levisyin deleted the feat/wrap-cmd-setargs branch January 25, 2024 09:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants