diff --git a/lib/dotenv/rails.rb b/lib/dotenv/rails.rb index 3a03376b..ad844ef3 100644 --- a/lib/dotenv/rails.rb +++ b/lib/dotenv/rails.rb @@ -39,6 +39,13 @@ def load Dotenv.load(*dotenv_files) end + # Public: Reload dotenv + # + # Same as `load`, but will override existing values in `ENV` + def overload + Dotenv.overload(*dotenv_files) + end + # Internal: `Rails.root` is nil in Rails 4.1 before the application is # initialized, so this falls back to the `RAILS_ROOT` environment variable, # or the current working directory. diff --git a/spec/dotenv/rails_spec.rb b/spec/dotenv/rails_spec.rb index 4c511dc2..110e2496 100644 --- a/spec/dotenv/rails_spec.rb +++ b/spec/dotenv/rails_spec.rb @@ -87,4 +87,46 @@ def add(*items) end end end + + context "overload" do + before { Dotenv::Railtie.overload } + + it "does not load .env.local in test rails environment" do + expect(Dotenv::Railtie.instance.send(:dotenv_files)).to eql( + [ + Rails.root.join(".env.test.local"), + Rails.root.join(".env.test"), + Rails.root.join(".env") + ] + ) + end + + it "does load .env.local in development environment" do + Rails.env = "development" + expect(Dotenv::Railtie.instance.send(:dotenv_files)).to eql( + [ + Rails.root.join(".env.development.local"), + Rails.root.join(".env.local"), + Rails.root.join(".env.development"), + Rails.root.join(".env") + ] + ) + end + + it "overloads .env.test with .env" do + expect(ENV["DOTENV"]).to eql("true") + end + + context "when loading a file containing already set variables" do + subject { Dotenv::Railtie.overload } + + it "overrides any existing ENV variables" do + ENV["DOTENV"] = "predefined" + + expect do + subject + end.to(change { ENV["DOTENV"] }.from("predefined").to("true")) + end + end + end end