-
Notifications
You must be signed in to change notification settings - Fork 77
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
testscript: test custom conditions #175
base: master
Are you sure you want to change the base?
Conversation
Add a test for custom conditions: * two without arguments * two requiring an argument The companion script shows how the condition work when they match, when they don't match, and when they match but are negated.
testscript/doc.go
Outdated
if len(args) < 2 { | ||
return false, fmt.Errorf("syntax: [is_upper:word]") | ||
} | ||
return strings.ToUpper(args[1]) == args[1], nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
to make the example with an argument a bit more realistic, how about a variant of exists
? Like the built-in command, but being useful as a condition, like [exists:foo/bar] mycmd foo/bar
.
case "exists":
_, err := os.Lstat(args[1])
return err == nil, nil
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed the example
testscript/doc.go
Outdated
} | ||
return strings.ToUpper(args[1]) == args[1], nil | ||
case "always_true": | ||
return true, nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
similar to my other comment, I'd like this to be slightly more realistic: in practice I don't think anyone would write an "always true" condition :)
How about one that's tied to an env var? For example, I've used "slow" or "long" env vars to tell go test
to do more extensive testing, kinda like the opposite of go test -short
. So you could have a [long]
that checks os.Getenv("TEST_LONG") == "true"
, for instance.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
changed the example
@@ -120,6 +120,35 @@ when testing.Short() is false. | |||
|
|||
Additional conditions can be added by passing a function to Params.Condition. | |||
|
|||
An example: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No need for this to be a separate paragraph, IMO. You can attach it to the previous paragraph.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for this! I think that the example might be a bit larger than needed (people rarely need custom conditions, so it seems a bit bulky as proposed), but other opinions might vary. WDYT?
An example: | ||
|
||
Condition: func(cond string) (bool, error) { | ||
// Assume condition name and args are separated by colon (":") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think that parsing the condition here is somewhat overkill tbh, and makes the example a bit longer than it needs to be. I'm pretty sure that people writing conditions are up to the task of extrapolating from something a bit simpler.
How about just something like:
Condition: func(cond string) (bool, error) {
// Note: conditions can be more complex than this (for example [exists:/some/file]).
if cond != "someCondition" {
return false, fmt.Errorf("unknown condition")
}
// someCondition is a place-holder for any conditional logic you might want.
return someCondition(), nil
}
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can do that, if everyone agrees. However, I wanted the example to include some text manipulation logic, because I was baffled when I first tried to define a condition. What was unclear to me was that custom commands are defined as a map of functions, while custom conditions are just one function for all.
I think the current example will save users some grief.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For what it's worth, I also feel this is likely to confuse people. But perhaps what this is really telling us is that the API should be a map of condition names to func(string) (bool, error)
. What do you think?
@@ -120,6 +120,35 @@ when testing.Short() is false. | |||
|
|||
Additional conditions can be added by passing a function to Params.Condition. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe worth mentioning this:
The function will only be called when all built-in conditions have been checked for.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
@@ -0,0 +1,67 @@ | |||
[!exec:echo] skip |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would be nice to have a test that for the custom condition function returning an error, but that might be a bit awkward to do.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I couldn't find a way to do that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UPDATE: I found a way to test the errors (see testdata/custom_conditions_errors.txt
).
Admittedly, it's a hack. It may not be resilient enough to certify future code update.
I found this PR while looking for discussions about custom conditions in testscript. I could not find in this PR any doc that would explain its purpose and use cases; reading the proposed code changes lead me to think that its purpose is different from mine. EDIT: I removed further comments from here, and opened an issue Feature proposal: use environment variables as custom conditions in a txtar script #241 |
Add a test for custom conditions and a brief example in the documentation.