-
Notifications
You must be signed in to change notification settings - Fork 507
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
don't load .env.local in rails' test environment #280
Conversation
I am struggling with the tests.. I created a second test file to test the dotenv-rails in development mode. But it seems like the Railtie is only initialized once.. What do you think about the tests, what would be the best way to test this? |
Hey @siegy22, thanks for the pull request! I agree that this matches expected behavior.
Railties are indeed only initialized once. One idea is to extract the paths to their own method (e.g. |
a60cfcb
to
8020c9a
Compare
In my opinion, the .env.local should not overwrite .env.test variables. When using .env.local for tests, the tests are not transparent and can't be executed for example on a CI server. As the documentation says, the `.env.local` is here for **local** overwrites. They should not overwrite a test specific variable. Tests should be run on every machine in every environment and shouldn't require any specification of environment variables. (My opinion)
b9fb116
to
0734ca1
Compare
I rebased once again and adjusted all the tests to the new circumstances. |
🎉 |
Thanks @siegy22! |
This is completely unexpected behaviour for me. I've run into .env.local not loading in test env a number of times and always assumed it was some bug due to local misconfiguration, not an intentional choice in dotenv-rails! I don't understand the rationale in this PR, for example "can't be executed for example on a CI server": why would you have an .env.local on your CI server? Anyway not a big deal now I know about it, just create an extra .env.test.local with a copy of the env var. |
I don't understand this either.
At least one very common example of this idea not holding water is that most Rails applications require a database, and the URL of that database may vary between different developer machines, and between developer machines and a CI service. Given this PR, if a developer happens to have a database setup that doesn't match the application's defaults (common), they need to specify the database URL in both You could argue that every application should come with a |
I've also just run into this issue and don't understand the rationale behind it. It was unexpected and confusing. The proposed workaround doesn't help if you have an initialiser that calls IMO this change should be reverted and As mentioned above, why would you ever need to worry about a |
This basically reverts bkeepers#280. The above-mentioned PR says: > When using .env.local for tests, the tests are not transparent and > can't be executed for example on a CI server. > As the documentation says, the .env.local is here for local > overwrites. They should not overwrite a test specific variable. Tests > should be run on every machine in every environment and shouldn't > require any specification of environment variables. While that description matches the expected behavior of Dotenv, the implementation goes too far (1) and even contradicts other bits of Dotenv's current behavior (2). About (1), a [quote][jakedouglas-comment] from the Github user named jakedouglas: >> Tests should be run on every machine in every environment and >> shouldn't require any specification of environment variables. > > At least one very common example of this idea not holding water is > that most Rails applications require a database, and the URL of that > database may vary between different developer machines, and between > developer machines and a CI service. Given this PR, if a developer > happens to have a database setup that doesn't match the > application's defaults (common), they need to specify the database > URL in both .env.local and .env.test.local in order to do local > development comprehensively. About (2), anything that .env.local could do to the test environment variables before it became ignored for that environment can now be done with .env.test.local, often at the cost of tediously duplicating variables from the currently-ignored .env.local. This contradicts the behavior intended by PR bkeepers#280 and consistency would dictate that .env.test.local be removed altogether. Only then the test variables would truly be guaranteed to always stay the same as far as Dotenv is concerned. Since (1) shows that local development might require local test variables for legitimate reasons, removing .env.test.local is not a valid option and it would make sense to instead restore loading .env.local for the test environment. [jakedouglas-comment]: bkeepers#280 (comment)
I just need to pile on and say that this change is nonsensical, frustrating, and unnecessary and the original rationale behind it doesn’t make any sense to me. |
Excuse me, @bkeepers, why wouldn't we just revert this piece of illogical code, since most of the community considers it counter-intuitive? =) |
It's been a while. While I agree with most of you guys, I think it mostly depends on how you use I only see/hear the people here that don't agree with this behaviour because obviously it's been changed with this PR. However, I feel that this can be reverted as it is a less-opinionated implementation to load the |
* Do load .env.local in Rails' test environment This basically reverts bkeepers#280. The above-mentioned PR says: > When using .env.local for tests, the tests are not transparent and > can't be executed for example on a CI server. > As the documentation says, the .env.local is here for local > overwrites. They should not overwrite a test specific variable. Tests > should be run on every machine in every environment and shouldn't > require any specification of environment variables. While that description matches the expected behavior of Dotenv, the implementation goes too far (1) and even contradicts other bits of Dotenv's current behavior (2). About (1), a [quote][jakedouglas-comment] from the Github user named jakedouglas: >> Tests should be run on every machine in every environment and >> shouldn't require any specification of environment variables. > > At least one very common example of this idea not holding water is > that most Rails applications require a database, and the URL of that > database may vary between different developer machines, and between > developer machines and a CI service. Given this PR, if a developer > happens to have a database setup that doesn't match the > application's defaults (common), they need to specify the database > URL in both .env.local and .env.test.local in order to do local > development comprehensively. About (2), anything that .env.local could do to the test environment variables before it became ignored for that environment can now be done with .env.test.local, often at the cost of tediously duplicating variables from the currently-ignored .env.local. This contradicts the behavior intended by PR bkeepers#280 and consistency would dictate that .env.test.local be removed altogether. Only then the test variables would truly be guaranteed to always stay the same as far as Dotenv is concerned. Since (1) shows that local development might require local test variables for legitimate reasons, removing .env.test.local is not a valid option and it would make sense to instead restore loading .env.local for the test environment. [jakedouglas-comment]: bkeepers#280 (comment) * Clean-up unused fixtures --------- Co-authored-by: Erwan Thomas <[email protected]> Co-authored-by: Erwan Thomas <[email protected]>
In my opinion, the .env.local should not overwrite .env.test
variables. When using .env.local for tests, the tests are not
transparent and can't be executed for example on a CI server.
As the documentation says, the
.env.local
is here for localoverwrites. They should not overwrite a test specific variable. Tests
should be run on every machine in every environment and shouldn't
require any specification of environment variables. (My opinion)
If the .env.local is needed in the test environment, it can be loaded in the test/spec helper: