require File.expand_path("../base", __FILE__)

describe "vagrant box" do
  include_context "acceptance"

  it "has no boxes by default" do
    result = execute("vagrant", "box", "list")
    result.stdout.should match_output(:no_boxes)
  end

  it "can add a box from a file" do
    require_box("default")

    # Add the box, which we expect to succeed
    result = execute("vagrant", "box", "add", "foo", box_path("default"))
    result.should succeed

    # Verify that the box now shows up in the list of available boxes
    result = execute("vagrant", "box", "list")
    result.stdout.should match_output(:box_installed, "foo")
  end

  it "errors if attempting to add a box with the same name" do
    require_box("default")

    # Add the box, which we expect to succeed
    assert_execute("vagrant", "box", "add", "foo", box_path("default"))

    # Adding it again should not succeed
    result = execute("vagrant", "box", "add", "foo", box_path("default"))
    result.should_not succeed
    result.stderr.should match_output(:box_already_exists, "foo")
  end

  it "overwrites a box when adding with `--force`" do
    require_box("default")

    # Add the box, which we expect to succeed
    assert_execute("vagrant", "box", "add", "foo", box_path("default"))

    # Adding it again should not succeed
    assert_execute("vagrant", "box", "add", "foo", box_path("default"), "--force")
  end

  it "gives an error if the file doesn't exist" do
    result = execute("vagrant", "box", "add", "foo", "/tmp/nope/nope/nope/nonono.box")
    result.should_not succeed
    result.stderr.should match_output(:box_path_doesnt_exist)
  end

  it "gives an error if the file is not a valid box" do
    invalid = environment.workdir.join("nope.txt")
    invalid.open("w+") do |f|
      f.write("INVALID!")
    end

    result = execute("vagrant", "box", "add", "foo", invalid.to_s)
    result.should_not succeed
    result.stderr.should match_output(:box_invalid)
  end

  it "can add a box from an HTTP server" do
    pending("Need to setup HTTP server functionality")
  end

  it "can remove a box" do
    require_box("default")

    # Add the box, remove the box, then verify that the box no longer
    # shows up in the list of available boxes.
    execute("vagrant", "box", "add", "foo", box_path("default"))
    execute("vagrant", "box", "remove", "foo")
    result = execute("vagrant", "box", "list")
    result.should succeed
    result.stdout.should match_output(:no_boxes)
  end

  it "can repackage a box" do
    require_box("default")

    original_size = File.size(box_path("default"))
    logger.debug("Original package size: #{original_size}")

    # Add the box, repackage it, and verify that a package.box is
    # dumped of relatively similar size.
    execute("vagrant", "box", "add", "foo", box_path("default"))
    execute("vagrant", "box", "repackage", "foo")

    # By default, repackage should dump into package.box into the CWD
    repackaged_file = environment.workdir.join("package.box")
    repackaged_file.file?.should be, "package.box should exist in cwd of environment"

    # Compare the sizes
    repackaged_size = repackaged_file.size
    logger.debug("Repackaged size: #{repackaged_size}")
    size_diff = (repackaged_size - original_size).abs
    size_diff.should be < 1000, "Sizes should be very similar"
  end
end