diff --git a/test/unit/vagrant/util/powershell_test.rb b/test/unit/vagrant/util/powershell_test.rb index d5760fc28..f60626eb7 100644 --- a/test/unit/vagrant/util/powershell_test.rb +++ b/test/unit/vagrant/util/powershell_test.rb @@ -4,6 +4,9 @@ require 'vagrant/util/powershell' describe Vagrant::Util::PowerShell do include_context "unit" + + after{ described_class.reset! } + describe ".version" do before do allow(described_class).to receive(:executable) @@ -13,7 +16,6 @@ describe Vagrant::Util::PowerShell do after do described_class.version - described_class.reset! end it "should execute powershell command" do @@ -41,4 +43,246 @@ describe Vagrant::Util::PowerShell do end end end + + describe ".executable" do + before{ allow(Vagrant::Util::Platform).to receive(:wsl?).and_return(false) } + + context "when found in PATH" do + before{ expect(Vagrant::Util::Which).to receive(:which).with("powershell").and_return(true) } + + it "should return powershell string" do + expect(described_class.executable).to eq("powershell") + end + end + + context "when not found in PATH" do + before{ expect(Vagrant::Util::Which).to receive(:which).with("powershell").and_return(nil) } + + it "should return nil" do + expect(described_class.executable).to be_nil + end + + context "when within WSL" do + before{ expect(Vagrant::Util::Platform).to receive(:wsl?).and_return(true) } + + it "should check PATH with .exe extension" do + expect(Vagrant::Util::Which).to receive(:which).with("powershell.exe") + described_class.executable + end + + it "should return powershell.exe when found" do + expect(Vagrant::Util::Which).to receive(:which).with("powershell.exe").and_return(true) + expect(described_class.executable).to eq("powershell.exe") + end + + it "should return nil when not found" do + expect(Vagrant::Util::Which).to receive(:which).with("powershell.exe").and_return(nil) + expect(described_class.executable).to be_nil + end + end + end + end + + describe ".available?" do + context "when powershell executable is available" do + before{ expect(described_class).to receive(:executable).and_return("powershell") } + + it "should be true" do + expect(described_class.available?).to be(true) + end + end + + context "when powershell executable is not available" do + before{ expect(described_class).to receive(:executable).and_return(nil) } + + it "should be false" do + expect(described_class.available?).to be(false) + end + end + end + + describe ".execute" do + before do + allow(described_class).to receive(:validate_install!) + allow(Vagrant::Util::Subprocess).to receive(:execute) + end + + it "should validate installation before use" do + expect(described_class).to receive(:validate_install!) + described_class.execute("command") + end + + it "should include command to execute" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("custom-command") + end + described_class.execute("custom-command") + end + + it "should automatically include console resize" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("BufferSize") + end + described_class.execute("custom-command") + end + + it "should accept custom environment" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("$env:TEST_KEY=test-value") + end + described_class.execute("custom-command", env: {"TEST_KEY" => "test-value"}) + end + end + + describe ".execute_cmd" do + let(:result) do + Vagrant::Util::Subprocess::Result.new( + exit_code, stdout, stderr) + end + let(:exit_code){ 0 } + let(:stdout){ "" } + let(:stderr){ "" } + + before do + allow(described_class).to receive(:validate_install!) + allow(Vagrant::Util::Subprocess).to receive(:execute).and_return(result) + end + + it "should validate installation before use" do + expect(described_class).to receive(:validate_install!) + described_class.execute_cmd("command") + end + + it "should include command to execute" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("custom-command") + result + end + described_class.execute_cmd("custom-command") + end + + it "should automatically include console resize" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("BufferSize") + result + end + described_class.execute_cmd("custom-command") + end + + it "should accept custom environment" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("$env:TEST_KEY=test-value") + result + end + described_class.execute_cmd("custom-command", env: {"TEST_KEY" => "test-value"}) + end + + context "with command output" do + let(:stdout){ "custom-output" } + + it "should return stdout" do + expect(described_class.execute_cmd("cmd")).to eq(stdout) + end + end + + context "with failed command" do + let(:exit_code){ 1 } + + it "should return nil" do + expect(described_class.execute_cmd("cmd")).to be_nil + end + end + end + + describe ".execute_inline" do + let(:result) do + Vagrant::Util::Subprocess::Result.new( + exit_code, stdout, stderr) + end + let(:exit_code){ 0 } + let(:stdout){ "" } + let(:stderr){ "" } + + before do + allow(described_class).to receive(:validate_install!) + allow(Vagrant::Util::Subprocess).to receive(:execute).and_return(result) + end + + it "should validate installation before use" do + expect(described_class).to receive(:validate_install!) + described_class.execute_inline("command") + end + + it "should include command to execute" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("custom-command") + result + end + described_class.execute_inline("custom-command") + end + + it "should automatically include console resize" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("BufferSize") + result + end + described_class.execute_inline("custom-command") + end + + it "should accept custom environment" do + expect(Vagrant::Util::Subprocess).to receive(:execute) do |*args| + comm = args.detect{|s| s.include?("custom-command") } + expect(comm.to_s).to include("$env:TEST_KEY=test-value") + result + end + described_class.execute_inline("custom-command", env: {"TEST_KEY" => "test-value"}) + end + + it "should return a result instance" do + expect(described_class.execute_inline("cmd")).to eq(result) + end + end + + describe ".validate_install!" do + before do + allow(described_class).to receive(:available?).and_return(true) + end + + context "with version under minimum required" do + before{ expect(described_class).to receive(:version).and_return("2.1").at_least(:once) } + + it "should raise an error" do + expect{ described_class.validate_install! }.to raise_error(Vagrant::Errors::PowerShellInvalidVersion) + end + end + + context "with version above minimum required" do + before{ expect(described_class).to receive(:version).and_return("3.1").at_least(:once) } + + it "should return true" do + expect(described_class.validate_install!).to be(true) + end + end + + end + + describe ".resize_console" do + it "should return command string" do + expect(described_class.resize_console).to include("BufferSize") + end + + it "should return empty string when disabled" do + with_temp_env("VAGRANT_POWERSHELL_RESIZE_DISABLE" => "1") do + expect(described_class.resize_console).to be_empty + end + end + end end