File: save_test.rb

package info (click to toggle)
vagrant 2.3.7%2Bgit20230731.5fc64cde%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 17,616 kB
  • sloc: ruby: 111,820; sh: 462; makefile: 123; ansic: 34; lisp: 1
file content (131 lines) | stat: -rw-r--r-- 3,765 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
require File.expand_path("../../../../../base", __FILE__)

require Vagrant.source_root.join("plugins/commands/snapshot/command/save")

describe VagrantPlugins::CommandSnapshot::Command::Save do
  include_context "unit"

  let(:iso_env) do
    # We have to create a Vagrantfile so there is a root path
    env = isolated_environment
    env.vagrantfile("")
    env.create_vagrant_env
  end

  let(:guest)   { double("guest") }
  let(:host)    { double("host") }
  let(:machine) { iso_env.machine(iso_env.machine_names[0], :dummy) }

  let(:argv) { [] }

  subject { described_class.new(argv, iso_env) }

  before do
    allow(machine.provider).to receive(:capability).with(:snapshot_list).
      and_return([])

    allow(machine.provider).to receive(:capability?).with(:snapshot_list).
      and_return(true)

    allow(subject).to receive(:with_target_vms) { |&block| block.call machine }
  end

  describe "execute" do
    context "with no arguments" do
      it "shows help" do
        expect { subject.execute }.
          to raise_error(Vagrant::Errors::CLIInvalidUsage)
      end
    end

    context "with an unsupported provider" do
      let(:argv)     { ["test"] }

      before do
        allow(machine.provider).to receive(:capability?).with(:snapshot_list).
          and_return(false)
      end

      it "raises an exception" do
        machine.id = "foo"
        expect { subject.execute }.
          to raise_error(Vagrant::Errors::SnapshotNotSupported)
      end
    end

    context "with a snapshot name given" do
      let(:argv)     { ["test"] }
      it "calls snapshot_save with a snapshot name" do
        machine.id = "foo"

        expect(machine).to receive(:action) do |name, opts|
          expect(name).to eq(:snapshot_save)
          expect(opts[:snapshot_name]).to eq("test")
        end

        expect(subject.execute).to eq(0)
      end

      it "doesn't snapshot a non-existent machine" do
        machine.id = nil

        expect(subject).to receive(:with_target_vms){}

        expect(machine).to_not receive(:action)
        expect(subject.execute).to eq(0)
      end
    end

    context "with a snapshot guest and name given" do
      let(:argv)     { ["foo", "backup"] }
      it "calls snapshot_save with a snapshot name" do
        machine.id = "foo"

        expect(machine).to receive(:action) do |name, opts|
          expect(name).to eq(:snapshot_save)
          expect(opts[:snapshot_name]).to eq("backup")
        end

        expect(subject.execute).to eq(0)
      end

      it "doesn't snapshot a non-existent machine" do
        machine.id = nil

        expect(machine).to_not receive(:action)
        expect(subject.execute).to eq(0)
      end
    end

    context "with a duplicate snapshot name given and no force flag" do
      let(:argv)     { ["test"] }

      it "fails to take a snapshot and prints a warning to the user" do
        machine.id = "fool"

        allow(machine.provider).to receive(:capability).with(:snapshot_list).
          and_return(["test"])

        expect(machine).to_not receive(:action)
        expect { subject.execute }.
          to raise_error(Vagrant::Errors::SnapshotConflictFailed)
      end
    end

    context "with a duplicate snapshot name given and a force flag" do
      let(:argv)     { ["test", "--force"] }

      it "deletes the existing snapshot and takes a new one" do
        machine.id = "foo"

        allow(machine.provider).to receive(:capability).with(:snapshot_list).
          and_return(["test"])

        expect(machine).to receive(:action).with(:snapshot_delete, snapshot_name: "test")
        expect(machine).to receive(:action).with(:snapshot_save, snapshot_name: "test")

        expect(subject.execute).to eq(0)
      end
    end
  end
end