diff --git a/plugins/commands/login/client.rb b/plugins/commands/login/client.rb index f06772be9..1e8381fe4 100644 --- a/plugins/commands/login/client.rb +++ b/plugins/commands/login/client.rb @@ -58,13 +58,21 @@ module VagrantPlugins nil end - # Reads the access token if there is one, or returns nil otherwise. + # Reads the access token if there is one. This will first read the + # `ATLAS_TOKEN` environment variable and then fallback to the stored + # access token on disk. # # @return [String] def token - token_path.read - rescue Errno::ENOENT - return nil + if ENV["ATLAS_TOKEN"] && !ENV["ATLAS_TOKEN"].empty? + return ENV["ATLAS_TOKEN"] + end + + if token_path.exist? + return token_path.read.strip + end + + nil end protected diff --git a/test/unit/plugins/commands/login/client_test.rb b/test/unit/plugins/commands/login/client_test.rb index 7c9480442..fcdf1b902 100644 --- a/test/unit/plugins/commands/login/client_test.rb +++ b/test/unit/plugins/commands/login/client_test.rb @@ -5,49 +5,59 @@ require Vagrant.source_root.join("plugins/commands/login/command") describe VagrantPlugins::LoginCommand::Client do include_context "unit" + def stub_env(key, value = nil) + allow(ENV).to receive(:[]).and_call_original + allow(ENV).to receive(:[]) + .with(key) + .and_return(value) + end + let(:env) { isolated_environment.create_vagrant_env } subject { described_class.new(env) } + before do + stub_env("ATLAS_TOKEN", nil) + subject.clear_token + end + describe "#logged_in?" do - it "quickly returns false if no token is set" do - expect(subject).to_not be_logged_in + let(:url) { "#{Vagrant.server_url}/api/v1/authenticate?access_token=#{token}" } + let(:headers) { { "Content-Type" => "application/json" } } + + before { allow(subject).to receive(:token).and_return(token) } + + context "when there is no token" do + let(:token) { nil } + + it "returns false" do + expect(subject.logged_in?).to be(false) + end end - it "returns true if the endpoint returns 200" do - subject.store_token("foo") + context "when there is a token" do + let(:token) { "ABCD1234" } - response = { - "token" => "baz", - } + it "returns true if the endpoint returns a 200" do + stub_request(:get, url) + .with(headers: headers) + .to_return(body: JSON.pretty_generate("token" => token)) + expect(subject.logged_in?).to be(true) + end - headers = { "Content-Type" => "application/json" } - url = "#{Vagrant.server_url}/api/v1/authenticate?access_token=foo" - stub_request(:get, url). - with(headers: headers). - to_return(status: 200, body: JSON.dump(response)) + it "returns false if the endpoint returns a non-200" do + stub_request(:get, url) + .with(headers: headers) + .to_return(body: JSON.pretty_generate("bad" => true), status: 401) + expect(subject.logged_in?).to be(false) + end - expect(subject).to be_logged_in - end - - it "returns false if 401 is returned" do - subject.store_token("foo") - - url = "#{Vagrant.server_url}/api/v1/authenticate?access_token=foo" - stub_request(:get, url). - to_return(status: 401, body: "") - - expect(subject).to_not be_logged_in - end - - it "raises an exception if it can't reach the sever" do - subject.store_token("foo") - - url = "#{Vagrant.server_url}/api/v1/authenticate?access_token=foo" - stub_request(:get, url).to_raise(SocketError) - - expect { subject.logged_in? }. - to raise_error(VagrantPlugins::LoginCommand::Errors::ServerUnreachable) + it "raises an exception if the server cannot be found" do + stub_request(:get, url) + .to_raise(SocketError) + expect { subject.logged_in? } + .to raise_error(VagrantPlugins::LoginCommand::Errors::ServerUnreachable) + end end end @@ -89,11 +99,29 @@ describe VagrantPlugins::LoginCommand::Client do end end - describe "#token, #store_token, #clear_token" do - it "returns nil if there is no token" do - expect(subject.token).to be_nil + describe "#token" do + it "reads ATLAS_TOKEN" do + stub_env("ATLAS_TOKEN", "ABCD1234") + expect(subject.token).to eq("ABCD1234") end + it "reads the stored file" do + subject.store_token("EFGH5678") + expect(subject.token).to eq("EFGH5678") + end + + it "prefers the environment variable" do + stub_env("ATLAS_TOKEN", "ABCD1234") + subject.store_token("EFGH5678") + expect(subject.token).to eq("ABCD1234") + end + + it "returns nil if there's no token set" do + expect(subject.token).to be(nil) + end + end + + describe "#store_token, #clear_token" do it "stores the token and can re-access it" do subject.store_token("foo") expect(subject.token).to eq("foo")