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

Only care about tests/ if no globs given #306

Merged
merged 9 commits into from
Oct 27, 2018
Merged

Only care about tests/ if no globs given #306

merged 9 commits into from
Oct 27, 2018

Conversation

jackfranklin
Copy link
Collaborator

We run our tests via elm-test 'frontend/**/*Tests.elm' as our app is a
big monorepo and we don't want our Elm tests in the top level tests
directory.

However, doing this gives us an error that the tests/ folder doesn't
exist. I updated the code to only check for and use tests/ if not
given a glob.

@rtfeldman let me know what you think!

We run our tests via `elm-test 'frontend/**/*Tests.elm'` as our app is a
big monorepo and we don't want our Elm tests in the top level `tests`
directory.

However, doing this gives us an error that the `tests/` folder doesn't
exist. I updated the code to only check for and use `tests/` if not
given a glob.
@rtfeldman
Copy link
Owner

This is interesting!

One of my design goals with elm-test is: "You can open up any project and run the command elm-test and have it run all the project's tests."

That said, I've heard a few times that the hard requirement creates problems for people incrementally adopting Elm in existing applications.

Something we've talked about as a long-term goal is integrating elm-test into elm publish such that it can run all your tests, and your dependencies' tests, and tell you if what you're about to publish will break someone else's project. I definitely do not want to sacrifice that!

However, that concern only applies to packages, not applications. So here's how I'd like to proceed:

  1. This is fine for applications. If elm.json has "type": "application" then it can use the glob as an alternative to tests/. It'll be less ergonomic in the sense that you can no longer run elm-test by itself, but it's presumably not the end of the world to invoke elm-test with the appropriate glob some other way.
  2. I'd like packages to continue having the tests/ requirement. I don't see a use case for incrementally adopting a package, and I think having that requirement will pay off in the long run.

Thoughts?

@jackfranklin
Copy link
Collaborator Author

This is fine for applications. If elm.json has "type": "application" then it can use the glob as an alternative to tests/

Agree that this is good for applications and less good for packages 👍

It'll be less ergonomic in the sense that you can no longer run elm-test by itself,

The goal of this PR is to not do this - the goal of this PR is that elm-test still works and assumes the tests/ directory, but if you supply a glob, it no longer cares about it. I think that's the behaviour my changes create.

I'd like packages to continue having the tests/ requirement. I don't see a use case for incrementally adopting a package, and I think having that requirement will pay off in the long run.

Agree with this. For a package you have complete control of the repo and so this requirement makes sense.

I will update the PR - thanks for your thoughts!

@jackfranklin
Copy link
Collaborator Author

the goal of this PR is that elm-test still works and assumes the tests/ directory, but if you supply a glob, it no longer cares about it. I think that's the behaviour my changes create.

I am wrong! This changed the behaviour I think of running just elm-test in an application, so I need to fix that.

@rtfeldman
Copy link
Owner

Yeah, so I think the goal should be:

  • If you're a package, it should work exactly as pre-PR - if you don't have a tests/ directory, it errors regardless of whether you supplied a glob.
  • If you're an application, and you didn't supply a glob, and you don't have a tests/ directory, it also errors just like before.
  • If you're an application, and you did supply a glob, then it skips the tests/ directory check.

I think that should do the trick!

@sporto
Copy link

sporto commented Oct 25, 2018

I quite like the original idea, why the need for a /tests folder in packages? Collocating the tests with the code is quite nice and it would be great if it is supported for both applications and packages.

@jackfranklin
Copy link
Collaborator Author

@rtfeldman I think I've now updated the code here to work as you explained it above. Let me know what you think!

lib/Generate.js Outdated Show resolved Hide resolved
lib/elm-test.js Outdated
@@ -302,15 +302,15 @@ if (args._[0] === "make") {
? 'No tests found for the file pattern "' +
fileGlobs.toString() +
'"\n\nMaybe try running elm-test with no arguments?'
: "No tests found in the tests/ directory.\n\nNOTE: Make sure you're running elm-test from your project's root directory, where its elm.json lives.\n\nTo generate some initial tests to get things going, run elm-test init";
: "No tests found in the tests/ directory.\n\nNOTE: Make sure you're running elm-test from your project's root directory, where its elm.json lives.\n\nTo generate some initial tests to get things going, run elm-test init.\n\nAlternatively, if you have tests in a different directory, try calling elm-test with a glob: elm-test 'frontend-app/**/*Tests.elm'.";
Copy link
Owner

Choose a reason for hiding this comment

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

Maybe say "Alternatively, if your application has tests" instead? This advice won't work if they are working on a package!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Nice idea - updated 👍

@rtfeldman
Copy link
Owner

why the need for a /tests folder in packages? Collocating the tests with the code is quite nice and it would be great if it is supported for both applications and packages.

It's very easy to add flexibility and very painful to take it away once people have come to rely on it. In the application case there are different design constraints, in that people may not have total control over their directory structures. In the package case, they do.

So I'm convinced that "I am going to have a really hard time using elm-test in my application if this is how the directory structure has to be" justifies adding this flexibility, especially since applications aren't shared the way packages are.

However, I don't feel confident I grasp the full implications of that choice for packages. The consequences of making that change are serious; if I add the flexibility and then end up having to take it away, I will have caused a lot of pain by saying yes right now. That's why I want to leave packages as-is.

I hear you that removing the tests/ requirement sounds nice for package authors, and I'll keep it in mind for the future! This does not close the door to making that change later.

Richard Feldman and others added 2 commits October 25, 2018 14:31
@jackfranklin
Copy link
Collaborator Author

@rtfeldman nice comments, thank you! Updated the PR :)

lib/elm-test.js Outdated
@@ -302,15 +302,15 @@ if (args._[0] === "make") {
? 'No tests found for the file pattern "' +
fileGlobs.toString() +
'"\n\nMaybe try running elm-test with no arguments?'
: "No tests found in the tests/ directory.\n\nNOTE: Make sure you're running elm-test from your project's root directory, where its elm.json lives.\n\nTo generate some initial tests to get things going, run elm-test init";
: "No tests found in the tests/ directory.\n\nNOTE: Make sure you're running elm-test from your project's root directory, where its elm.json lives.\n\nTo generate some initial tests to get things going, run elm-test init.\n\nAlternatively, if your application has tests in a different directory, try calling elm-test with a glob: elm-test 'frontend-app/**/*Tests.elm'.";
Copy link
Collaborator

Choose a reason for hiding this comment

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

I know you say "your application" but I think we should hide this when testing a package. (It's possible the surrounding code already does that.)

Copy link
Owner

Choose a reason for hiding this comment

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

I don't think it does, but that seems like a good idea. 👍

@jackfranklin
Copy link
Collaborator Author

@mgold nice idea - just to check, is 58db81a what you had in mind?

@rtfeldman
Copy link
Owner

I'm assuming this is what you had in mind @mgold; I'm gonna merge so people can try beta11 over the weekend...got the last release blocker bug merged too, so I think this might be the last beta release!

@rtfeldman rtfeldman merged commit 00fcf1f into rtfeldman:master Oct 27, 2018
@mgold
Copy link
Collaborator

mgold commented Oct 27, 2018

I'm assuming this is what you had in mind

Yup!

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