daq_flow 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.ruby-version +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +62 -0
- data/LICENSE.txt +22 -0
- data/README.md +165 -0
- data/Rakefile +10 -0
- data/bin/daq_flow +23 -0
- data/flash_flow.gemspec +28 -0
- data/flash_flow.yml.erb.example +42 -0
- data/lib/flash_flow.rb +7 -0
- data/lib/flash_flow/branch_merger.rb +55 -0
- data/lib/flash_flow/cmd_runner.rb +54 -0
- data/lib/flash_flow/config.rb +84 -0
- data/lib/flash_flow/data.rb +6 -0
- data/lib/flash_flow/data/base.rb +89 -0
- data/lib/flash_flow/data/bitbucket.rb +152 -0
- data/lib/flash_flow/data/branch.rb +124 -0
- data/lib/flash_flow/data/collection.rb +211 -0
- data/lib/flash_flow/data/github.rb +140 -0
- data/lib/flash_flow/data/store.rb +44 -0
- data/lib/flash_flow/git.rb +267 -0
- data/lib/flash_flow/install.rb +19 -0
- data/lib/flash_flow/lock.rb +23 -0
- data/lib/flash_flow/merge.rb +6 -0
- data/lib/flash_flow/merge/acceptance.rb +154 -0
- data/lib/flash_flow/merge/base.rb +116 -0
- data/lib/flash_flow/merge_order.rb +27 -0
- data/lib/flash_flow/notifier.rb +23 -0
- data/lib/flash_flow/options.rb +34 -0
- data/lib/flash_flow/resolve.rb +143 -0
- data/lib/flash_flow/shadow_repo.rb +44 -0
- data/lib/flash_flow/time_helper.rb +32 -0
- data/lib/flash_flow/version.rb +4 -0
- data/log/.keep +0 -0
- data/test/lib/data/test_base.rb +10 -0
- data/test/lib/data/test_branch.rb +206 -0
- data/test/lib/data/test_collection.rb +308 -0
- data/test/lib/data/test_store.rb +70 -0
- data/test/lib/lock/test_github.rb +74 -0
- data/test/lib/merge/test_acceptance.rb +230 -0
- data/test/lib/test_branch_merger.rb +78 -0
- data/test/lib/test_config.rb +63 -0
- data/test/lib/test_git.rb +73 -0
- data/test/lib/test_merge_order.rb +71 -0
- data/test/lib/test_notifier.rb +33 -0
- data/test/lib/test_resolve.rb +69 -0
- data/test/minitest_helper.rb +41 -0
- data/update_gem.sh +5 -0
- metadata +192 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
require 'flash_flow/git'
|
4
|
+
|
5
|
+
module FlashFlow
|
6
|
+
class ShadowGit < Git
|
7
|
+
|
8
|
+
def initialize(config, logger=nil)
|
9
|
+
super
|
10
|
+
|
11
|
+
# create_shadow_repo
|
12
|
+
# @cmd_runner.dir = flash_flow_dir
|
13
|
+
|
14
|
+
run("clean -x -f")
|
15
|
+
run("fetch #{remote}")
|
16
|
+
run("remote prune #{remote}")
|
17
|
+
run("reset --hard HEAD")
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_shadow_repo
|
21
|
+
unless Dir.exists?(flash_flow_dir)
|
22
|
+
@cmd_runner.run("mkdir -p #{flash_flow_dir}")
|
23
|
+
@cmd_runner.run("cp -R #{current_dir} #{flash_flow_base_dir}")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
FLASH_FLOW_BASE = '.flash_flow'
|
28
|
+
def flash_flow_base_dir
|
29
|
+
if current_dir =~ /\.flash_flow/
|
30
|
+
"#{current_dir.split(FLASH_FLOW_BASE).first}#{FLASH_FLOW_BASE}"
|
31
|
+
else
|
32
|
+
"#{current_dir}/../#{FLASH_FLOW_BASE}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def current_dir
|
37
|
+
Dir.getwd
|
38
|
+
end
|
39
|
+
|
40
|
+
def flash_flow_dir
|
41
|
+
@flash_flow_dir ||= flash_flow_base_dir + "/#{File.basename(current_dir)}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
3
|
+
module FlashFlow
|
4
|
+
module TimeHelper
|
5
|
+
|
6
|
+
def with_time_zone(tz_name)
|
7
|
+
prev_tz = ENV['TZ']
|
8
|
+
ENV['TZ'] = tz_name
|
9
|
+
yield
|
10
|
+
ensure
|
11
|
+
ENV['TZ'] = prev_tz
|
12
|
+
end
|
13
|
+
|
14
|
+
def massage_time(time)
|
15
|
+
case time
|
16
|
+
when Time
|
17
|
+
time
|
18
|
+
when NilClass
|
19
|
+
Time.now
|
20
|
+
else
|
21
|
+
Time.parse(time)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def two_weeks
|
26
|
+
60 * 60 * 24 * 14
|
27
|
+
end
|
28
|
+
|
29
|
+
module_function :with_time_zone, :massage_time, :two_weeks
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
data/log/.keep
ADDED
File without changes
|
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
require 'flash_flow/data/store'
|
3
|
+
|
4
|
+
module FlashFlow
|
5
|
+
module Data
|
6
|
+
class TestBranch < Minitest::Test
|
7
|
+
|
8
|
+
def test_merge_returns_self_if_other_is_nil
|
9
|
+
branch = Branch.from_hash(branch_hash)
|
10
|
+
assert_equal(branch.merge(nil), branch)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_merge_keeps_the_oldest_created_at
|
14
|
+
new_branch = Branch.from_hash(branch_hash)
|
15
|
+
old_branch = Branch.from_hash(branch_hash)
|
16
|
+
old_branch.created_at -= 1000
|
17
|
+
|
18
|
+
assert_equal(new_branch.merge(old_branch).created_at, old_branch.created_at)
|
19
|
+
assert_equal(old_branch.merge(new_branch).created_at, old_branch.created_at)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_merge_handles_nil_stories
|
23
|
+
new_branch = Branch.from_hash(branch_hash)
|
24
|
+
old_branch = Branch.from_hash(branch_hash)
|
25
|
+
|
26
|
+
new_branch.stories = nil
|
27
|
+
old_branch.stories = ['456', '789']
|
28
|
+
|
29
|
+
assert_equal(old_branch.merge(new_branch).stories, ['456', '789'])
|
30
|
+
assert_equal(new_branch.merge(old_branch).stories, ['456', '789'])
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_merge_unions_the_stories
|
34
|
+
new_branch = Branch.from_hash(branch_hash)
|
35
|
+
old_branch = Branch.from_hash(branch_hash)
|
36
|
+
|
37
|
+
new_branch.stories = ['123', '456']
|
38
|
+
old_branch.stories = ['456', '789']
|
39
|
+
|
40
|
+
assert_equal(new_branch.merge(old_branch).stories, ['123', '456', '789'])
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_merge_uses_other_status
|
44
|
+
new_branch = Branch.from_hash(branch_hash)
|
45
|
+
old_branch = Branch.from_hash(branch_hash)
|
46
|
+
|
47
|
+
old_branch.success!
|
48
|
+
new_branch.fail!
|
49
|
+
old_branch.merge(new_branch)
|
50
|
+
|
51
|
+
assert(old_branch.fail?)
|
52
|
+
assert(new_branch.fail?)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_merge_sets_updated_at
|
56
|
+
new_branch = Branch.from_hash(branch_hash)
|
57
|
+
old_branch = Branch.from_hash(branch_hash)
|
58
|
+
|
59
|
+
original_updated_at = new_branch.updated_at
|
60
|
+
|
61
|
+
assert(old_branch.merge(new_branch).updated_at > original_updated_at)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_merge_sets_created_at_if_not_set
|
65
|
+
new_branch = Branch.from_hash(branch_hash)
|
66
|
+
old_branch = Branch.from_hash(branch_hash)
|
67
|
+
|
68
|
+
new_branch.created_at = old_branch.created_at = nil
|
69
|
+
|
70
|
+
assert_in_delta(old_branch.merge(new_branch).created_at.to_i, Time.now.to_i, 100)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_from_hash
|
74
|
+
branch = Branch.from_hash(branch_hash)
|
75
|
+
assert_equal(branch.ref, branch_hash['ref'])
|
76
|
+
assert_equal(branch.status, branch_hash['status'])
|
77
|
+
assert_equal(branch.stories, branch_hash['stories'])
|
78
|
+
assert_equal(branch.metadata, branch_hash['metadata'])
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_from_hash_conflict_sha
|
82
|
+
branch = Branch.from_hash(branch_hash)
|
83
|
+
assert_equal(branch.conflict_sha, 'conflict_sha')
|
84
|
+
|
85
|
+
hash = branch_hash.merge({ 'conflict_sha' => nil, 'metadata' => { 'conflict_sha' => 'another_sha' } })
|
86
|
+
branch = Branch.from_hash(hash)
|
87
|
+
assert_equal(branch.conflict_sha, 'another_sha')
|
88
|
+
|
89
|
+
hash = branch_hash.merge({ 'conflict_sha' => nil})
|
90
|
+
branch = Branch.from_hash(hash)
|
91
|
+
assert_equal(branch.conflict_sha, nil)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_from_hash_with_time_objects
|
95
|
+
branch_hash['updated_at'] = Time.now - 200
|
96
|
+
branch_hash['created_at'] = Time.now - 200
|
97
|
+
branch = Branch.from_hash(branch_hash)
|
98
|
+
assert_equal(branch.updated_at, branch_hash['updated_at'])
|
99
|
+
assert_equal(branch.created_at, branch_hash['created_at'])
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_from_hash_with_nil_times
|
103
|
+
time = Time.parse('2015-05-22 09:47:07 -0700')
|
104
|
+
branch_hash['updated_at'] = branch_hash['created_at'] = nil
|
105
|
+
Time.stub(:now, time) do
|
106
|
+
branch = Branch.from_hash(branch_hash)
|
107
|
+
|
108
|
+
assert_equal(branch.updated_at, time)
|
109
|
+
assert_equal(branch.created_at, time)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_from_hash_with_string_times
|
114
|
+
time = Time.parse('2015-05-22 09:47:07 -0700')
|
115
|
+
branch_hash['updated_at'] = '2015-05-22 09:47:07 -0700'
|
116
|
+
branch_hash['created_at'] = '2015-05-22 09:47:07 -0700'
|
117
|
+
branch = Branch.from_hash(branch_hash)
|
118
|
+
assert_equal(branch.updated_at, time)
|
119
|
+
assert_equal(branch.created_at, time)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_double_equals
|
123
|
+
branch1 = Branch.from_hash(branch_hash)
|
124
|
+
branch2 = Branch.from_hash(branch_hash)
|
125
|
+
assert(branch1 == branch2)
|
126
|
+
|
127
|
+
branch1.ref = 'different ref'
|
128
|
+
refute(branch1 == branch2)
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_to_hash
|
132
|
+
branch1 = Branch.from_hash(branch_hash)
|
133
|
+
assert_equal(branch1.to_hash, branch_hash)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_success
|
137
|
+
branch = Branch.new(1)
|
138
|
+
|
139
|
+
branch.success!
|
140
|
+
assert(branch.success?)
|
141
|
+
|
142
|
+
branch.fail!
|
143
|
+
refute(branch.success?)
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_fail
|
147
|
+
branch = Branch.new(1)
|
148
|
+
|
149
|
+
branch.fail!
|
150
|
+
assert(branch.fail?)
|
151
|
+
|
152
|
+
branch.success!
|
153
|
+
refute(branch.fail?)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_removed
|
157
|
+
branch = Branch.new(1)
|
158
|
+
|
159
|
+
branch.removed!
|
160
|
+
assert(branch.removed?)
|
161
|
+
|
162
|
+
branch.success!
|
163
|
+
refute(branch.removed?)
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_deleted
|
167
|
+
branch = Branch.new(1)
|
168
|
+
|
169
|
+
branch.deleted!
|
170
|
+
assert(branch.deleted?)
|
171
|
+
|
172
|
+
branch.success!
|
173
|
+
refute(branch.deleted?)
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_unknown
|
177
|
+
branch = Branch.new(1)
|
178
|
+
|
179
|
+
branch.unknown!
|
180
|
+
assert(branch.unknown?)
|
181
|
+
|
182
|
+
branch.success!
|
183
|
+
refute(branch.unknown?)
|
184
|
+
end
|
185
|
+
|
186
|
+
private
|
187
|
+
|
188
|
+
def branch_hash
|
189
|
+
@branch_hash ||= {
|
190
|
+
'ref' => 'branch 1',
|
191
|
+
'sha' => 'random_sha',
|
192
|
+
'status' => 'success',
|
193
|
+
'merge_order' => nil,
|
194
|
+
'resolutions' => {},
|
195
|
+
'stories' => ['123'],
|
196
|
+
'conflict_sha' => 'conflict_sha',
|
197
|
+
'metadata' => {
|
198
|
+
'some' => 'data'
|
199
|
+
},
|
200
|
+
'updated_at' => Time.now - 1000,
|
201
|
+
'created_at' => Time.now - 1000,
|
202
|
+
}
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
@@ -0,0 +1,308 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
module FlashFlow
|
4
|
+
module Data
|
5
|
+
class TestCollection < Minitest::Test
|
6
|
+
|
7
|
+
def setup_fake_branches
|
8
|
+
Object.send(:remove_const, :FakeBranches) if Object.const_defined?(:FakeBranches)
|
9
|
+
|
10
|
+
fake_branches_class = Class.new do
|
11
|
+
@branches = Minitest::Mock.new
|
12
|
+
def self.new(opts=nil); @branches; end
|
13
|
+
def self.branches; @branches; end
|
14
|
+
end
|
15
|
+
Object.const_set('FakeBranches', fake_branches_class)
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup
|
19
|
+
setup_fake_branches
|
20
|
+
@fake_branches = FakeBranches.branches
|
21
|
+
@branch = Branch.new('some_branch')
|
22
|
+
@collection = Collection.new({ 'class' => { 'name' => 'FakeBranches' }})
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_from_hash_set_branches
|
26
|
+
hash = { 'some_branch' => Branch.new('some_branch') }
|
27
|
+
assert_equal(Collection.from_hash(hash).branches, hash)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_fetch_calls_collection_class
|
31
|
+
@fake_branches.expect(:fetch, [], [])
|
32
|
+
@collection.fetch
|
33
|
+
|
34
|
+
@fake_branches.verify
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_fetch_returns_nil_if_no_collection_class
|
38
|
+
assert_nil(@collection.fetch)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_fetch_maps_collection_class_to_branches
|
42
|
+
branch = Data::Branch.new('some_branch')
|
43
|
+
@fake_branches.expect(:fetch, [Branch.from_hash({'ref' => branch.ref })], [])
|
44
|
+
@collection.fetch
|
45
|
+
|
46
|
+
assert_equal(@collection.branches.values, [branch])
|
47
|
+
@fake_branches.verify
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_reverse_merge_when_old_is_empty
|
51
|
+
@collection.mark_success(@branch)
|
52
|
+
|
53
|
+
merged = @collection.reverse_merge(Collection.from_hash({}))
|
54
|
+
assert_equal(['some_branch'], merged.to_h.keys)
|
55
|
+
assert(merged.get('some_branch').success?)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_reverse_merge_old_marks_old_branches
|
59
|
+
@collection.mark_success(@branch)
|
60
|
+
|
61
|
+
merged = @collection.reverse_merge(Collection.from_hash(old_branches))
|
62
|
+
assert(merged.get('some_old_branch').unknown?)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_reverse_merge_old_adds_new_stories
|
66
|
+
@collection.mark_success(@branch)
|
67
|
+
@collection.add_story('some_branch', '456')
|
68
|
+
merged = @collection.reverse_merge(Collection.from_hash(old_branches))
|
69
|
+
|
70
|
+
assert_equal(['222', '456'], merged.get('some_branch').stories)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_reverse_merge_old_uses_old_created_at
|
74
|
+
@collection.add_to_merge('some_old_branch')
|
75
|
+
@collection.add_to_merge('some_new_branch')
|
76
|
+
old_branch_collection = Collection.from_hash(old_branches)
|
77
|
+
merged = @collection.reverse_merge(old_branch_collection)
|
78
|
+
|
79
|
+
assert_equal(old_branch_collection.get('some_branch').created_at, merged.get('some_branch').created_at)
|
80
|
+
# Assert the new branch is created_at within the last minute
|
81
|
+
assert(merged.get('some_new_branch').created_at > (Time.now - 60))
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_reverse_merge_old_uses_new_status
|
85
|
+
@collection.mark_failure(old_branches['some_branch'])
|
86
|
+
merged = @collection.reverse_merge(Collection.from_hash(old_branches))
|
87
|
+
|
88
|
+
assert(merged.get('some_branch').fail?)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_fetch_returns_a_collection_instance
|
92
|
+
FakeBranches.branches.expect(:fetch, [])
|
93
|
+
collection = Collection.fetch({ 'class' => { 'name' => 'FakeBranches' }})
|
94
|
+
assert(collection.is_a?(Collection))
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_add_to_merge_new_branch
|
98
|
+
@collection.add_to_merge('some_branch')
|
99
|
+
assert_equal(@collection.get('some_branch').ref, 'some_branch')
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_add_to_merge_existing_branch
|
103
|
+
@collection.mark_failure(@branch)
|
104
|
+
@collection.add_to_merge(@branch.ref)
|
105
|
+
|
106
|
+
assert_equal(@collection.get(@branch.ref), @branch)
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_add_to_merge_calls_branches_class
|
110
|
+
@fake_branches.expect(:add_to_merge, true, [@branch])
|
111
|
+
@collection.add_to_merge(@branch.ref)
|
112
|
+
|
113
|
+
@fake_branches.verify
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_remove_from_merge_new_branch
|
117
|
+
@collection.remove_from_merge(@branch.ref)
|
118
|
+
assert(@collection.get(@branch.ref).removed?)
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_remove_from_merge_existing_branch
|
122
|
+
@collection.mark_success(@branch)
|
123
|
+
assert(@collection.get(@branch.ref).success?)
|
124
|
+
@collection.remove_from_merge(@branch.ref)
|
125
|
+
assert(@collection.get(@branch.ref).removed?)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_remove_from_merge_calls_branches_class
|
129
|
+
@fake_branches.expect(:remove_from_merge, true, [@branch])
|
130
|
+
@collection.remove_from_merge(@branch.ref)
|
131
|
+
@fake_branches.verify
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_mark_success_new_branch
|
135
|
+
@collection.mark_success(@branch)
|
136
|
+
assert(@collection.get(@branch.ref).success?)
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_mark_success_existing_branch
|
140
|
+
branch = @collection.add_to_merge(@branch.ref)
|
141
|
+
@collection.mark_failure(branch)
|
142
|
+
@collection.mark_success(branch)
|
143
|
+
assert(@collection.get(@branch.ref).success?)
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_mark_success_calls_branches_class
|
147
|
+
@fake_branches.expect(:mark_success, true, [@branch])
|
148
|
+
@collection.mark_success(@branch)
|
149
|
+
@fake_branches.verify
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_mark_failure_existing_branch
|
153
|
+
branch = @collection.add_to_merge(@branch.ref)
|
154
|
+
@collection.mark_success(branch)
|
155
|
+
@collection.mark_failure(branch)
|
156
|
+
assert(@collection.get(@branch.ref).fail?)
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_mark_failure_new_branch
|
160
|
+
@collection.mark_failure(@branch)
|
161
|
+
assert(@branch.fail?)
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_mark_failure_calls_branches_class
|
165
|
+
@fake_branches.expect(:mark_failure, true, [@branch])
|
166
|
+
@collection.mark_failure(@branch)
|
167
|
+
@fake_branches.verify
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_mark_deleted_new_branch
|
171
|
+
@collection.mark_deleted(@branch)
|
172
|
+
assert(@collection.get(@branch.ref).deleted?)
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_mark_deleted_existing_branch
|
176
|
+
branch = @collection.add_to_merge(@branch.ref)
|
177
|
+
@collection.mark_failure(branch)
|
178
|
+
@collection.mark_deleted(branch)
|
179
|
+
assert(@collection.get(@branch.ref).deleted?)
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_mark_deleted_calls_branches_class
|
183
|
+
@fake_branches.expect(:mark_deleted, true, [@branch])
|
184
|
+
@collection.mark_deleted(@branch)
|
185
|
+
@fake_branches.verify
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_add_story
|
189
|
+
@collection.add_to_merge('some_branch')
|
190
|
+
@collection.add_story('some_branch', '999')
|
191
|
+
assert_equal(@collection.get('some_branch').stories, ['999'])
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_add_story_calls_branches_class
|
195
|
+
@fake_branches.expect(:add_story, true, [@branch, '999'])
|
196
|
+
@collection.add_to_merge('some_branch')
|
197
|
+
@collection.add_story('some_branch', '999')
|
198
|
+
@fake_branches.verify
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_code_reviewd_returns_true
|
202
|
+
collection = Collection.new({})
|
203
|
+
assert(collection.code_reviewed?(@branch))
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_code_reviewd_calls_branches_class
|
207
|
+
@fake_branches.expect(:code_reviewed?, true, [@branch])
|
208
|
+
@collection.code_reviewed?(@branch)
|
209
|
+
@fake_branches.verify
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_branch_link_returns_nil
|
213
|
+
collection = Collection.new({})
|
214
|
+
assert_nil(collection.branch_link(@branch))
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_branch_link_calls_branches_class
|
218
|
+
@fake_branches.expect(:branch_link, 'http://link_to_branch.com', [@branch])
|
219
|
+
assert_equal('http://link_to_branch.com', @collection.branch_link(@branch))
|
220
|
+
@fake_branches.verify
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_current_branches
|
224
|
+
branch1 = Branch.new('111')
|
225
|
+
branch2 = Branch.new('222')
|
226
|
+
branch3 = Branch.new('333')
|
227
|
+
branch2.current_record = true
|
228
|
+
@collection.mark_success(branch1)
|
229
|
+
@collection.mark_success(branch2)
|
230
|
+
@collection.mark_success(branch3)
|
231
|
+
|
232
|
+
assert_equal(@collection.current_branches, [branch2])
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_mark_all_as_current
|
236
|
+
branch1 = Branch.new('111')
|
237
|
+
branch2 = Branch.new('222')
|
238
|
+
branch3 = Branch.new('333')
|
239
|
+
branch2.current_record = true
|
240
|
+
@collection.mark_success(branch1)
|
241
|
+
@collection.mark_success(branch2)
|
242
|
+
@collection.mark_success(branch3)
|
243
|
+
|
244
|
+
assert_equal(@collection.current_branches, [branch2])
|
245
|
+
|
246
|
+
@collection.mark_all_as_current
|
247
|
+
|
248
|
+
assert_equal(@collection.current_branches, [branch1, branch2, branch3])
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_failures
|
252
|
+
mark_branches
|
253
|
+
|
254
|
+
assert_equal(@collection.failures, [fail1, fail2])
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_successes
|
258
|
+
mark_branches
|
259
|
+
|
260
|
+
assert_equal(@collection.successes, [success1, success2])
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_removals
|
264
|
+
mark_branches
|
265
|
+
|
266
|
+
assert_equal(@collection.removals, [removed1])
|
267
|
+
end
|
268
|
+
|
269
|
+
private
|
270
|
+
|
271
|
+
def mark_branches
|
272
|
+
@collection.mark_failure(fail1)
|
273
|
+
@collection.mark_success(success1)
|
274
|
+
@collection.mark_failure(fail2)
|
275
|
+
@removed1 = @collection.remove_from_merge(removed1.ref)
|
276
|
+
@collection.mark_success(success2)
|
277
|
+
@collection.mark_all_as_current
|
278
|
+
end
|
279
|
+
|
280
|
+
def fail1
|
281
|
+
@fail1 ||= Branch.new('111')
|
282
|
+
end
|
283
|
+
|
284
|
+
def fail2
|
285
|
+
@fail2 ||= Branch.new('333')
|
286
|
+
end
|
287
|
+
|
288
|
+
def success1
|
289
|
+
@success1 ||= Branch.new('222')
|
290
|
+
end
|
291
|
+
|
292
|
+
def success2
|
293
|
+
@success2 ||= Branch.new('555')
|
294
|
+
end
|
295
|
+
|
296
|
+
def removed1
|
297
|
+
@removed1 ||= Branch.new('444')
|
298
|
+
end
|
299
|
+
|
300
|
+
def old_branches
|
301
|
+
@old_branches ||= {
|
302
|
+
'some_old_branch' => Branch.from_hash({'ref' => 'some_old_branch', 'created_at' => (Time.now - 3600), 'stories' => ['111']}),
|
303
|
+
'some_branch' => Branch.from_hash({'ref' => 'some_branch', 'status' => 'success', 'created_at' => (Time.now - 1800), 'stories' => ['222']})
|
304
|
+
}
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|