aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/test/language_python_test.rb
blob: d1e3867f735a1a10f0292b9f22a8fb942f928cb8 (plain)
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
require "testing_env"
require "language/python"
require "resource"

class LanguagePythonTests < Homebrew::TestCase
  def setup
    @dir = Pathname.new(mktmpdir)
    resource = stub("resource", stage: true)
    formula_bin = @dir/"formula_bin"
    @formula = mock("formula") do
      stubs(:resource).returns(resource)
      stubs(:bin).returns(formula_bin)
    end
    @venv = Language::Python::Virtualenv::Virtualenv.new(@formula, @dir, "python")
  end

  def teardown
    FileUtils.rm_rf @dir
  end

  def test_virtualenv_creation
    @formula.expects(:resource).with("homebrew-virtualenv").returns(
      mock("resource", stage: true)
    )
    @venv.create
  end

  # or at least doesn't crash the second time
  def test_virtualenv_creation_is_idempotent
    @formula.expects(:resource).with("homebrew-virtualenv").returns(
      mock("resource", stage: true)
    )
    @venv.create
    FileUtils.mkdir_p @dir/"bin"
    FileUtils.touch @dir/"bin/python"
    @venv.create
    FileUtils.rm @dir/"bin/python"
  end

  def test_pip_install_accepts_string
    @formula.expects(:system).returns(true).with do |*params|
      params.first == @dir/"bin/pip" && params.last == "foo"
    end
    @venv.pip_install "foo"
  end

  def test_pip_install_accepts_multiline_string
    @formula.expects(:system).returns(true).with do |*params|
      params.first == @dir/"bin/pip" && params[-2..-1] == ["foo", "bar"]
    end
    @venv.pip_install <<-EOS.undent
      foo
      bar
    EOS
  end

  def test_pip_install_accepts_array
    @formula.expects(:system).returns(true).with do |*params|
      params.first == @dir/"bin/pip" && params.last == "foo"
    end
    @formula.expects(:system).returns(true).with do |*params|
      params.first == @dir/"bin/pip" && params.last == "bar"
    end
    @venv.pip_install ["foo", "bar"]
  end

  def test_pip_install_accepts_resource
    res = Resource.new "test"
    res.expects(:stage).yields(nil)
    @formula.expects(:system).returns(true).with do |*params|
      params.first == @dir/"bin/pip" && params.last == Pathname.pwd
    end
    @venv.pip_install res
  end

  def test_pip_install_and_link_links_scripts
    bin = @dir/"bin"
    bin.mkpath
    dest = @formula.bin

    refute_predicate bin/"kilroy", :exist?
    refute_predicate dest/"kilroy", :exist?

    FileUtils.touch bin/"irrelevant"
    bin_before = Dir[bin/"*"]
    FileUtils.touch bin/"kilroy"
    bin_after = Dir[bin/"*"]
    @venv.expects(:pip_install).with("foo")
    Dir.expects(:[]).twice.returns(bin_before, bin_after)

    @venv.pip_install_and_link "foo"

    assert_predicate bin/"kilroy", :exist?
    assert_predicate dest/"kilroy", :exist?
    assert_predicate dest/"kilroy", :symlink?
    assert_equal((bin/"kilroy").realpath, (dest/"kilroy").realpath)
    refute_predicate dest/"irrelevant", :exist?
  end
end