aboutsummaryrefslogtreecommitdiffstats
path: root/switchtower/test/scm/cvs_test.rb
blob: 45328708260279f8135ed0de2fc5cb87cc529f95 (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
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
$:.unshift File.dirname(__FILE__) + "/../../lib"

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

class ScmCvsTest < Test::Unit::TestCase
  class CvsTest < SwitchTower::SCM::Cvs
    attr_accessor :story
    attr_reader   :last_path

    def cvs_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 release_path
      (@config[:now] || Time.now.utc).strftime("%Y%m%d%H%M%S")
    end

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

  def setup
    @config = MockConfiguration.new
    @config[:repository] = ":ext:joetester@rubyforge.org:/hello/world"
    @config[:local] = "/hello/world"
    @config[:cvs] = "/path/to/cvs"
    @config[:password] = "chocolatebrownies"
    @config[:now] = Time.utc(2005,8,24,12,0,0)
    @scm = CvsTest.new(@config)
    @actor = MockActor.new(@config)
    @log_msg = <<MSG.strip
RCS file: /var/cvs/copland/copland/LICENSE,v
Working file: LICENSE
head: 1.1
branch:
locks: strict
access list:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
----------------------------
revision 1.1
date: 2004/08/29 04:23:36;  author: minam;  state: Exp;
New implementation.
=============================================================================

RCS file: /var/cvs/copland/copland/Rakefile,v
Working file: Rakefile
head: 1.7
branch:
locks: strict
access list:
keyword substitution: kv
total revisions: 7;     selected revisions: 1
description:
----------------------------
revision 1.7
date: 2004/09/15 16:35:01;  author: minam;  state: Exp;  lines: +2 -1
Rakefile now publishes package documentation from doc/packages instead of
doc/packrat. Updated "latest updates" in manual.
=============================================================================

RCS file: /var/cvs/copland/copland/TODO,v
Working file: TODO
head: 1.18
branch:
locks: strict
access list:
keyword substitution: kv
total revisions: 18;    selected revisions: 1
description:
----------------------------
revision 1.18
date: 2004/10/12 02:21:02;  author: minam;  state: Exp;  lines: +4 -1
Added RubyConf 2004 presentation.
=============================================================================

RCS file: /var/cvs/copland/copland/Attic/build-gemspec.rb,v
Working file: build-gemspec.rb
head: 1.5
branch:
locks: strict
access list:
keyword substitution: kv
total revisions: 5;     selected revisions: 1
description:
----------------------------
revision 1.5
date: 2004/08/29 04:10:17;  author: minam;  state: dead;  lines: +0 -0
Here we go -- point of no return. Deleting existing implementation to make
way for new implementation.
=============================================================================

RCS file: /var/cvs/copland/copland/copland.gemspec,v
Working file: copland.gemspec
head: 1.12
branch:
locks: strict
access list:
keyword substitution: kv
total revisions: 13;    selected revisions: 1
description:
----------------------------
revision 1.12
date: 2004/09/11 21:45:58;  author: minam;  state: Exp;  lines: +4 -4
Minor change in how version is communicated to gemspec.
=============================================================================
MSG
    @scm.story = [ @log_msg ]
  end

  def test_latest_revision
    @scm.story = [ @log_msg ]
    assert_equal "2004-10-12 02:21:02", @scm.latest_revision
    assert_equal "/hello/world", @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/cvs}, @actor.command
  end

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