spec/unit/actions/compose_environment_spec.rb in vagrant-skytap-0.2.6 vs spec/unit/actions/compose_environment_spec.rb in vagrant-skytap-0.2.7

- old
+ new

@@ -23,33 +23,49 @@ require File.expand_path("../../base", __FILE__) describe VagrantPlugins::Skytap::Action::ComposeEnvironment do include_context "rest_api" + let(:json_path) { File.join(File.expand_path('../..', __FILE__), 'support', 'api_responses') } + let(:vm1_attrs) { read_json(json_path, 'vm1.json').merge("id" => "1") } + let(:vm2_attrs) { vm1_attrs.merge("id" => "2") } + let(:environment_attrs) { read_json(json_path, 'empty_environment.json').merge('vms' => [vm1_attrs]) } + let(:app) { lambda { |env| } } - let(:env) { { machine: machine, machines: [machine], environment: environment, ui: ui, api_client: api_client } } + let(:env) { { machine: machine, machines: machines, ui: ui, api_client: api_client, parallel: true } } let(:provider_config) do double(:provider_config, vm_url: "/vms/1", username: "jsmith", api_token: "123123", base_url: base_url) end let(:api_client) { API::Client.new(provider_config) } let(:machine) { double(:machine, name: "vm1", id: nil, :id= => nil, provider_config: provider_config) } - let(:existing_machine) { double(:existing_machine, name: "vm2", id: 2) } + let(:existing_machine) { double(:existing_machine, name: "vm2", id: "2") } + let(:machines) { [machine] } let(:environment) { double(:environment, url: "foo") } let(:new_environment) { double(:environment, url: "foo", vms: [vm], properties: environment_properties) } - let(:vm) { double(:vm, id: 1, parent_url: "https://example.com/templates/1") } + let(:vm) { double(:vm, id: "1", parent_url: "https://example.com/templates/1", :stopped? => true) } let(:environment_properties) { double(:environment_properties, read: nil, write: nil) } - let(:subject) { described_class.new(app, env) } + let(:instance) { described_class.new(app, env) } + let(:get_vm_attrs) { vm1_attrs } + let(:post_config_attrs) { environment_attrs } + let(:put_config_attrs) { environment_attrs } before do - stub_request(:get, /.*/).to_return(body: '{}', status: 200) + allow_any_instance_of(API::Environment).to receive(:properties).and_return(environment_properties) + env[:environment] = environment + + stub_get(%r{/vms/\d+}, get_vm_attrs) + stub_post(%r{/configurations$}, post_config_attrs) + stub_put(%r{/configurations/\d+}, put_config_attrs) end describe "#call" do + subject {instance} + it "does nothing if all machines exist" do machine.stub(id: 1) expect(app).to receive(:call).with(env) expect(API::Environment).to_not receive(:create!) @@ -57,11 +73,11 @@ expect(environment).to_not receive(:add_vms) subject.call(env) end - it "makes a single create! call when creating an environment with 1 machine", run: true do + it "makes a single create! call when creating an environment with 1 machine" do myenv = env.merge(environment: nil) expect(app).to receive(:call).with(myenv) expect(API::Environment).to receive(:create!).and_return(new_environment) expect(API::Vm).to receive(:fetch).once.and_return(vm) @@ -80,24 +96,68 @@ subject.call(myenv) end end + describe "add_vms" do + subject {instance} + + before do + stub_get(%r{/vms/1}, vm1_attrs) + stub_get(%r{/vms/2}, vm2_attrs) + # Hack so the region mismatch check always passes + stub_get(%r{/templates/\d+}, {"region" => environment_attrs["region"]}) + end + + context "when creating an environment from 2 vms with the same parent" do + let(:post_config_attrs) do + environment_attrs.merge('vms' => [vm1_attrs, vm2_attrs]) + end + + let(:provider_config2) do + double(:provider_config2, vm_url: "/vms/2", username: "jsmith", api_token: "123123", base_url: base_url) + end + let(:machine2) do + double(:machine2, name: "vm2", id: nil, :id= => nil, provider_config: provider_config2) + end + + context "when machines are ordered by vm_id" do + it "maps the machines to the correct vms" do + expect(machine).to receive(:id=).with("1") + expect(machine2).to receive(:id=).with("2") + subject.add_vms(nil, [machine, machine2]) + end + end + + context "when machines are not ordered by vm_id" do + it "maps the machines to the correct vms" do + expect(machine).to receive(:id=).with("1") + expect(machine2).to receive(:id=).with("2") + subject.add_vms(nil, [machine2, machine]) + end + end + end + end + describe "fetch_source_vms" do + subject {instance} + it "fetches a vm and returns a mapping" do vms = subject.fetch_source_vms([machine]) expect(a_request(:get, %r{/vms/\d+$})).to have_been_made.once expect(vms.count).to eq(1) expect(vms.keys.first).to eq("vm1") expect(vms.values.first).to be_a_kind_of(API::Vm) end end describe "get_groupings" do - let(:vm_in_same_template) { double(:vm_in_same_template, id: 2, parent_url: "https://example.com/templates/1")} - let(:vm_in_different_template) { double(:vm_in_different_template, id: 3, parent_url: "https://example.com/templates/2")} + let(:vm_in_same_template) { double(:vm_in_same_template, id: "2", parent_url: "https://example.com/templates/1")} + let(:vm_in_different_template) { double(:vm_in_different_template, id: "3", parent_url: "https://example.com/templates/2")} + subject {instance} + it "returns a single group for a single vm" do expect(subject.get_groupings({"vm1" => vm})).to eq([ ["vm1"] ]) end it "groups vms in same template together" do @@ -113,8 +173,12 @@ expect(subject.get_groupings({"vm1" => vm, "vm2" => vm})).to eq([ ["vm2"], ["vm1"] ]) end it "respects parallel flag" do expect(subject.get_groupings({"vm1" => vm, "vm2" => vm_in_same_template}, parallel: false)).to eq([ ["vm1"], ["vm2"] ]) + end + + it "sorts machines in group by vm id" do + expect(subject.get_groupings({"vm1" => vm_in_same_template, "vm2" => vm})).to eq([ ["vm2", "vm1"] ]) end end end