aboutsummaryrefslogtreecommitdiffstats
path: root/switchtower/test/scm/subversion_test.rb
blob: fa65714b6bfafa4c552e15f4f18f3ed5f6bc795c (plain) (blame)
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
$:.unshift File.dirname(__FILE__) + "/../../lib"

require File.dirname(__FILE__) + "/../utils"
require 'test/unit'
require 'switchtower/scm/subversion'

class ScmSubversionTest < Test::Unit::TestCase
  class SubversionTest < SwitchTower::SCM::Subversion
    attr_accessor :story
    attr_reader   :last_path

    def svn_log(path)
      @last_path = path
      story.shift
    end
  end

  class MockChannel
    attr_reader :sent_data

    def send_data(data)
      @sent_data ||= []
      @sent_data << data
    end

    def [](name)
      "value"
    end
  end

  class MockActor
    attr_reader :command
    attr_reader :channels
    attr_accessor :story

    def initialize(config)
      @config = config
    end

    def run(command)
      @command = command
      @channels ||= []
      @channels << MockChannel.new
      story.each { |stream, line| yield @channels.last, stream, line }
    end

    def method_missing(sym, *args)
      @config.send(sym, *args)
    end
  end

  def setup
    @config = MockConfiguration.new
    @config[:repository] = "/hello/world"
    @config[:svn] = "/path/to/svn"
    @config[:password] = "chocolatebrownies"
    @scm = SubversionTest.new(@config)
    @actor = MockActor.new(@config)
    @log_msg = <<MSG.strip
------------------------------------------------------------------------
r1967 | minam | 2005-08-03 06:59:03 -0600 (Wed, 03 Aug 2005) | 2 lines

Initial commit of the new switchtower utility

------------------------------------------------------------------------
MSG
    @scm.story = [ @log_msg ]
  end

  def test_latest_revision
    @scm.story = [ @log_msg ]
    assert_equal "1967", @scm.latest_revision
    assert_equal "/hello/world", @scm.last_path
  end

  def test_latest_revision_searching_upwards
    @scm.story = [ "-----------------------------\n", @log_msg ]
    assert_equal "1967", @scm.latest_revision
    assert_equal "/hello", @scm.last_path
  end

  def test_checkout
    @actor.story = []
    assert_nothing_raised { @scm.checkout(@actor) }
    assert_nil @actor.channels.last.sent_data
    assert_match %r{/path/to/svn}, @actor.command
  end

  def test_checkout_needs_ssh_password
    @actor.story = [[:out, "Password: "]]
    assert_nothing_raised { @scm.checkout(@actor) }
    assert_equal ["chocolatebrownies\n"], @actor.channels.last.sent_data
  end

  def test_checkout_needs_http_password
    @actor.story = [[:out, "Password for (something): "]]
    assert_nothing_raised { @scm.checkout(@actor) }
    assert_equal ["chocolatebrownies\n"], @actor.channels.last.sent_data
  end
end