spec/unit/ridley/resources/node_resource_spec.rb in ridley-0.10.0.rc1 vs spec/unit/ridley/resources/node_resource_spec.rb in ridley-0.10.0.rc2

- old
+ new

@@ -8,17 +8,25 @@ server_url: "https://api.opscode.com/organizations/vialstudios", validator_client: "chef-validator", ssh: { user: "reset", password: "lol" - } + }, + winrm: { + user: "Administrator", + password: "secret" + }, + encrypted_data_bag_secret_path: nil ) end + let(:host) { "33.33.33.10" } describe "ClassMethods" do subject { Ridley::NodeResource } + let(:worker) { double('worker', alive?: true, terminate: nil) } + describe "::bootstrap" do let(:boot_options) do { validator_path: fixtures_path.join("reset.pem").to_s, encrypted_data_bag_secret_path: fixtures_path.join("reset.pem").to_s @@ -34,10 +42,137 @@ pending subject.bootstrap(connection, "33.33.33.10", "33.33.33.11", boot_options) end end + describe "::chef_run" do + subject { chef_run } + let(:chef_run) { described_class.chef_run(connection, host) } + let(:response) { [:ok, double('response', stdout: 'success_message')] } + + before do + Ridley::NodeResource.stub(:configured_worker_for).and_return(worker) + worker.stub(:chef_client).and_return(response) + end + + it { should eq(response) } + + context "when it executes unsuccessfully" do + let(:response) { [:error, double('response', stderr: 'failure_message')] } + + it {should eq(response)} + end + + it "terminates the worker" do + worker.should_receive(:terminate) + chef_run + end + end + + describe "::put_secret" do + subject { put_secret } + let(:put_secret) { described_class.put_secret(connection, host, secret_path)} + let(:response) { [:ok, double('response', stdout: 'success_message')] } + let(:secret_path) { fixtures_path.join("reset.pem").to_s } + + before do + Ridley::NodeResource.stub(:configured_worker_for).and_return(worker) + worker.stub(:put_secret).and_return(response) + end + + it { should eq(response) } + + context "when it executes unsuccessfully" do + let(:response) { [:error, double('response', stderr: 'failure_message')] } + + it { should eq(response) } + end + + it "terminates the worker" do + worker.should_receive(:terminate) + put_secret + end + end + + describe "::ruby_script" do + subject { ruby_script } + let(:ruby_script) { described_class.ruby_script(connection, host, command_lines) } + let(:response) { [:ok, double('response', stdout: 'success_message')] } + let(:command_lines) { ["puts 'hello'", "puts 'there'"] } + + before do + Ridley::NodeResource.stub(:configured_worker_for).and_return(worker) + worker.stub(:ruby_script).and_return(response) + end + + it { should eq(response) } + + context "when it executes unsuccessfully" do + let(:response) { [:error, double('response', stderr: 'failure_message')] } + + it { should eq(response) } + end + + it "terminates the worker" do + worker.should_receive(:terminate) + ruby_script + end + end + + describe "::execute_command" do + subject { execute_command } + + let(:execute_command) { described_class.execute_command(connection, host, command) } + let(:response) { [:ok, double('response', stdout: 'success_message')] } + let(:command) { "echo 'hello world'" } + + before do + Ridley::NodeResource.stub(:configured_worker_for).and_return(worker) + worker.stub(:run).and_return(response) + end + + it { should eq(response) } + + context "when it executes unsuccessfully" do + let(:response) { [:error, double('response', stderr: 'failure_message')] } + + it { should eq(response) } + end + end + + describe "::configured_worker_for" do + subject { configured_worker_for } + + let(:configured_worker_for) { described_class.send(:configured_worker_for, connection, host) } + + context "when the best connector is SSH" do + before do + Ridley::HostConnector.stub(:best_connector_for).and_yield(Ridley::HostConnector::SSH) + end + + it "returns an SSH worker instance" do + configured_worker_for.should be_a(Ridley::HostConnector::SSH::Worker) + end + + its(:user) { should eq("reset") } + end + + context "when the best connector is WinRM" do + before do + Ridley::HostConnector.stub(:best_connector_for).and_yield(Ridley::HostConnector::WinRM) + Ridley::HostConnector::WinRM::CommandUploader.stub(:new) + end + + it "returns a WinRm worker instance" do + configured_worker_for.should be_a(Ridley::HostConnector::WinRM::Worker) + end + + its(:user) { should eq("Administrator") } + its(:password) { should eq("secret") } + end + end + describe "::merge_data" do it "finds the target node and sends it the merge_data message" do data = double('data') node = double('node') node.should_receive(:merge_data).with(data) @@ -46,11 +181,12 @@ subject.merge_data(connection, node, data) end end end - subject { Ridley::NodeResource.new(connection) } + subject { node_resource } + let(:node_resource) { Ridley::NodeResource.new(connection) } describe "#set_chef_attribute" do it "sets an normal node attribute at the nested path" do subject.set_chef_attribute('deep.nested.item', true) @@ -240,14 +376,45 @@ describe "#chef_solo" do pending end describe "#chef_client" do - pending + subject { chef_client } + let(:chef_client) { node_resource.chef_client } + let(:worker) { double('worker', chef_client: response) } + let(:response) { [:ok, Ridley::HostConnector::Response.new(host)] } + + before do + Ridley::HostConnector.stub(:best_connector_for).and_yield(Ridley::HostConnector::SSH) + Ridley::HostConnector::SSH.stub(:start).and_yield(worker) + end + + it "returns a HostConnector::Response" do + + chef_client.should be_a(Ridley::HostConnector::Response) + end end describe "#put_secret" do - pending + subject { put_secret } + let(:put_secret) { node_resource.put_secret } + let(:worker) { double('worker', put_secret: response) } + let(:response) { [:ok, Ridley::HostConnector::Response.new(host)] } + + before do + Ridley::HostConnector.stub(:best_connector_for).and_yield(Ridley::HostConnector::SSH) + Ridley::HostConnector::SSH.stub(:start).and_yield(worker) + end + + context "when the client does not have an encrypted file" do + it "returns nil" do + put_secret.should be_nil + end + end + + it "returns a HostConnector::Response" do + pending + end end describe "#merge_data" do before(:each) do subject.name = "reset.riotgames.com"