artisan-core 0.0.1 → 0.0.2
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.
- data/lib/artisan/iterations/iteration_workflow_interactor.rb +2 -1
- data/lib/artisan/iterations/move_to_backlog.rb +2 -0
- data/lib/artisan/notifications/event_mailer.rb +26 -0
- data/lib/artisan/notifications/inviter.rb +40 -0
- data/lib/artisan/projects/project_creator.rb +2 -2
- data/lib/artisan/projects/projects_interactor.rb +5 -1
- data/lib/artisan/reports/burn_up_chart.rb +5 -0
- data/lib/artisan/reports/high_charts_data_retriever.rb +6 -4
- data/lib/artisan/reports/high_charts_interactor.rb +2 -0
- data/lib/artisan/stories/stories_interactor.rb +2 -1
- data/lib/artisan/story_exporter.rb +2 -0
- data/lib/artisan/{member.rb → teams/member.rb} +0 -0
- data/lib/artisan/teams/team.rb +53 -0
- metadata +39 -57
- data/lib/artisan/event_mailer.rb +0 -22
- data/lib/artisan/inviter.rb +0 -36
- data/lib/artisan/repository.rb +0 -51
- data/lib/artisan/team.rb +0 -50
- data/spec/crud_strategy_spec.rb +0 -100
- data/spec/event_mailer_spec.rb +0 -86
- data/spec/inviter_spec.rb +0 -58
- data/spec/member_spec.rb +0 -58
- data/spec/repository_spec.rb +0 -32
- data/spec/story_board_spec.rb +0 -36
- data/spec/story_collection_spec.rb +0 -61
- data/spec/story_column_changer_spec.rb +0 -222
- data/spec/story_exporter_spec.rb +0 -25
- data/spec/story_sorter_spec.rb +0 -67
- data/spec/team_spec.rb +0 -107
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'artisan/stories/story_collection'
|
2
|
-
|
3
|
-
describe Artisan::Stories::StoryCollection do
|
4
|
-
context "on init" do
|
5
|
-
it "has empty list of stories" do
|
6
|
-
Artisan::Stories::StoryCollection.new.stories.should == []
|
7
|
-
end
|
8
|
-
|
9
|
-
it "#new saves list of stories" do
|
10
|
-
story1, story2 = stub, stub
|
11
|
-
Artisan::Stories::StoryCollection.new([story1, story2]).all.should == [story1, story2]
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context "#estimated_points" do
|
16
|
-
it "sums the estimates of all stories" do
|
17
|
-
stories = [ stub(:estimate => 1.5), stub(:estimate => 2) ]
|
18
|
-
Artisan::Stories::StoryCollection.new(stories).estimated_points.should == 3.5
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context "#completed_points" do
|
23
|
-
it "sums the estimates of all completed stories" do
|
24
|
-
complete = stub(:estimate => 1.5, :complete? => true)
|
25
|
-
incomplete = stub(:estimate => 3, :complete? => false)
|
26
|
-
Artisan::Stories::StoryCollection.new([complete, incomplete]).completed_points.should == 1.5
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context "#billed points" do
|
31
|
-
it "sums the estimates of all billable, completed stories" do
|
32
|
-
billable = stub(:estimate => 1.5, :complete? => true, :nonbillable? => false)
|
33
|
-
nonbillable = stub(:estimate => 1.5, :complete? => true, :nonbillable? => true)
|
34
|
-
incomplete = stub(:estimate => 3, :complete? => false, :nonbillable? => false)
|
35
|
-
Artisan::Stories::StoryCollection.new([billable, nonbillable, incomplete]).billed_points.should == 1.5
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context "#billable points" do
|
40
|
-
it "sums the estimates of all billable stories" do
|
41
|
-
billable = stub(:estimate => 1.5, :complete? => true, :nonbillable? => false)
|
42
|
-
nonbillable = stub(:estimate => 1.5, :complete? => true, :nonbillable? => true)
|
43
|
-
incomplete = stub(:estimate => 3, :complete? => false, :nonbillable? => false)
|
44
|
-
Artisan::Stories::StoryCollection.new([billable, nonbillable, incomplete]).billable_points.should == 4.5
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "#all_complete?" do
|
49
|
-
it "is true if all stories are complete" do
|
50
|
-
complete1 = stub(:complete? => true)
|
51
|
-
complete2 = stub(:complete? => true)
|
52
|
-
Artisan::Stories::StoryCollection.new([complete1, complete2]).all_complete?.should be_true
|
53
|
-
end
|
54
|
-
|
55
|
-
it "is false if not all stories are complete" do
|
56
|
-
complete = stub(:complete? => true)
|
57
|
-
incomplete = stub(:complete? => false)
|
58
|
-
Artisan::Stories::StoryCollection.new([complete, incomplete]).all_complete?.should be_false
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,222 +0,0 @@
|
|
1
|
-
require "artisan/story_column_changer"
|
2
|
-
require "spec_helper"
|
3
|
-
require "artisan-memory-repository/models/project"
|
4
|
-
require "artisan-memory-repository/models/iteration"
|
5
|
-
require "artisan-memory-repository/models/user"
|
6
|
-
require "artisan-memory-repository/models/story"
|
7
|
-
|
8
|
-
class Artisan::Activity::StoryAuditor;end;
|
9
|
-
|
10
|
-
describe Artisan::StoryColumnChanger do
|
11
|
-
let(:story_repository) { Artisan::Repository.story }
|
12
|
-
|
13
|
-
context "status changes" do
|
14
|
-
before(:each) do
|
15
|
-
@user = Artisan::Repository.user.new(:login => "mike", :password => "password", :email => "mike@example.com", :full_name => "mike jansen")
|
16
|
-
@user2 = Artisan::Repository.user.new(:login => "brimans", :password => "password", :email => "briman@thegmails.com", :full_name => "briman pratt")
|
17
|
-
|
18
|
-
@project = Artisan::Repository.project.new(:name => "Artisan")
|
19
|
-
@iteration = Artisan::Repository.iteration.new(:project_id => @project.id, :committed_points => 10, :start_date => "11/05/2010", :finish_date => "11/06/2010")
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "move to backlog" do
|
23
|
-
|
24
|
-
before(:each) do
|
25
|
-
Artisan::Activity::StoryAuditor.stub!(:backlogged)
|
26
|
-
@story = Artisan::Repository.story.new(:name => 'abc', :assigned_user => @user, :complete => true, :completed_at => Date.today, :iteration => @iteration,
|
27
|
-
:accepted_at => Date.today, :accepted_by_user => @user2, :project => @project)
|
28
|
-
@project.stories = [@story]
|
29
|
-
|
30
|
-
@changer = Artisan::StoryColumnChanger.new(@story, @user)
|
31
|
-
end
|
32
|
-
|
33
|
-
it "moves a story to the backlog" do
|
34
|
-
@changer.move_to_backlog
|
35
|
-
@story.iteration.should be_nil
|
36
|
-
end
|
37
|
-
|
38
|
-
it "marks story as incomplete" do
|
39
|
-
@changer.move_to_backlog
|
40
|
-
@story.should_not be_complete
|
41
|
-
end
|
42
|
-
|
43
|
-
it "clears completed at" do
|
44
|
-
@changer.move_to_backlog
|
45
|
-
@story.completed_at.should be_nil
|
46
|
-
end
|
47
|
-
|
48
|
-
it "drops assigned user" do
|
49
|
-
@changer.move_to_backlog
|
50
|
-
@story.assigned_user_id.should be_nil
|
51
|
-
end
|
52
|
-
|
53
|
-
it "saves" do
|
54
|
-
@changer.move_to_backlog
|
55
|
-
@story.id.should_not be_nil
|
56
|
-
end
|
57
|
-
|
58
|
-
it "creates a story auditor" do
|
59
|
-
Artisan::Activity::StoryAuditor.should_receive(:backlogged).with(@story.id, @project.id, @user.id)
|
60
|
-
@changer.move_to_backlog
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
describe "move to ready" do
|
66
|
-
before :each do
|
67
|
-
@story = Artisan::Repository.story.new(:name => 'abc', :assigned_user => @user, :complete => true, :completed_at => Time.now,
|
68
|
-
:accepted_at => Time.now, :accepted_by_user => @user2, :project => @project)
|
69
|
-
|
70
|
-
@changer = Artisan::StoryColumnChanger.new(@story, @user)
|
71
|
-
Artisan::Activity::StoryAuditor.stub!(:readied)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "assigns iteration to story" do
|
75
|
-
@changer.move_to_ready(@iteration)
|
76
|
-
story_repository.ready(@iteration).should == [@story]
|
77
|
-
end
|
78
|
-
|
79
|
-
it "disassociates assigned user from story when state is changed from working" do
|
80
|
-
@changer.move_to_ready(@iteration)
|
81
|
-
@story.assigned_user_id.should be_nil
|
82
|
-
end
|
83
|
-
|
84
|
-
it "disassociates assigned user from story and marks story incomplete when state is changed from completed" do
|
85
|
-
@changer.move_to_ready(@iteration)
|
86
|
-
@story.should_not be_complete
|
87
|
-
end
|
88
|
-
|
89
|
-
it "disassociates assigned user from story and removes completed at time" do
|
90
|
-
@changer.move_to_ready(@iteration)
|
91
|
-
@story.completed_at.should be_nil
|
92
|
-
end
|
93
|
-
|
94
|
-
it "saves" do
|
95
|
-
@changer.move_to_ready(@iteration)
|
96
|
-
@story.id.should_not be_nil
|
97
|
-
end
|
98
|
-
|
99
|
-
it "creates a story auditor" do
|
100
|
-
Artisan::Activity::StoryAuditor.should_receive(:readied).with(@story.id, @project.id, @user.id)
|
101
|
-
@changer.move_to_ready(@iteration)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe "move to working" do
|
106
|
-
before :each do
|
107
|
-
@story = Artisan::Repository.story.new(:name => 'abc', :assigned_user => @user, :complete => true, :completed_at => Time.now, :accepted_at => Time.now,
|
108
|
-
:accepted_by_user => @user, :project => @project)
|
109
|
-
Artisan::Activity::StoryAuditor.stub!(:worked)
|
110
|
-
end
|
111
|
-
|
112
|
-
it "assigns story to an iteration" do
|
113
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
114
|
-
changer.move_to_working(@user, @iteration)
|
115
|
-
|
116
|
-
story_repository.working(@iteration).should == [@story]
|
117
|
-
end
|
118
|
-
|
119
|
-
it "assigns current user to story when state is changed from ready" do
|
120
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
121
|
-
changer.move_to_working(@user, @iteration)
|
122
|
-
|
123
|
-
@story.assigned_user.should == @user
|
124
|
-
end
|
125
|
-
|
126
|
-
it "marks story incomplete when state is changed from complete" do
|
127
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
128
|
-
changer.move_to_working(@user, @iteration)
|
129
|
-
|
130
|
-
@story.should_not be_complete
|
131
|
-
end
|
132
|
-
|
133
|
-
it "marks story completed at time as nil when state is changed from complete" do
|
134
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
135
|
-
changer.move_to_working(@user, @iteration)
|
136
|
-
|
137
|
-
@story.completed_at.should be_nil
|
138
|
-
end
|
139
|
-
|
140
|
-
it "marks only if there is no current user" do
|
141
|
-
@story.update_attributes(:assigned_user => @user2)
|
142
|
-
|
143
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
144
|
-
changer.move_to_working(@user, @iteration)
|
145
|
-
|
146
|
-
@story.assigned_user.should == @user2
|
147
|
-
end
|
148
|
-
|
149
|
-
it "saves" do
|
150
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
151
|
-
changer.move_to_working(@user, @iteration)
|
152
|
-
|
153
|
-
@story.id.should_not be_nil
|
154
|
-
end
|
155
|
-
|
156
|
-
it "creates a story auditor" do
|
157
|
-
Artisan::Activity::StoryAuditor.should_receive(:worked).with(@story.id, @project.id, @user.id)
|
158
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
159
|
-
changer.move_to_working(@user, @iteration)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
describe "move to completed" do
|
164
|
-
before :each do
|
165
|
-
Artisan::Activity::StoryAuditor.stub!(:completed)
|
166
|
-
Artisan::Activity::StoryAuditor.stub!(:worked)
|
167
|
-
Artisan::Activity::StoryAuditor.stub!(:accepted)
|
168
|
-
@story = Artisan::Repository.story.new(:name => 'abc', :project => @project)
|
169
|
-
end
|
170
|
-
|
171
|
-
it "saves" do
|
172
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
173
|
-
changer.move_to_completed(@user, @iteration)
|
174
|
-
|
175
|
-
@story.id.should_not be_nil
|
176
|
-
end
|
177
|
-
|
178
|
-
it "assigns story to iteration" do
|
179
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
180
|
-
changer.move_to_completed(@user, @iteration)
|
181
|
-
|
182
|
-
story_repository.completed(@iteration).should == [@story]
|
183
|
-
end
|
184
|
-
|
185
|
-
it "marks story complete" do
|
186
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
187
|
-
changer.move_to_completed(@user, @iteration)
|
188
|
-
|
189
|
-
@story.should be_complete
|
190
|
-
end
|
191
|
-
|
192
|
-
it "marks story completed at time" do
|
193
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
194
|
-
changer.move_to_completed(@user, @iteration)
|
195
|
-
|
196
|
-
@story.completed_at.should_not be_nil
|
197
|
-
end
|
198
|
-
|
199
|
-
it "sets assigned user if not set" do
|
200
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
201
|
-
changer.move_to_completed(@user, @iteration)
|
202
|
-
|
203
|
-
@story.assigned_user.should == @user
|
204
|
-
end
|
205
|
-
|
206
|
-
it "marks only if there is no current user" do
|
207
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
208
|
-
changer.move_to_working(@user2, @iteration)
|
209
|
-
|
210
|
-
changer.move_to_completed(@user, @iteration)
|
211
|
-
|
212
|
-
@story.assigned_user.should == @user2
|
213
|
-
end
|
214
|
-
|
215
|
-
it "creates a story auditor" do
|
216
|
-
Artisan::Activity::StoryAuditor.should_receive(:completed).with(@story.id, @project.id, @user.id)
|
217
|
-
changer = Artisan::StoryColumnChanger.new(@story, @user)
|
218
|
-
changer.move_to_completed(@user, @iteration)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
data/spec/story_exporter_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'artisan/story_exporter'
|
2
|
-
|
3
|
-
class Story;end;
|
4
|
-
|
5
|
-
describe StoryExporter do
|
6
|
-
|
7
|
-
context "#to_json" do
|
8
|
-
|
9
|
-
it "exports null to empty" do
|
10
|
-
StoryExporter.new(nil).to_json.should == "{}"
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns empty hash if there is no story" do
|
14
|
-
StoryExporter.new(nil).to_json.should == "{}"
|
15
|
-
end
|
16
|
-
|
17
|
-
it "calls to_json on the model" do
|
18
|
-
story = mock(Story)
|
19
|
-
story.should_receive(:to_json).with(:except => StoryExporter::UNNECESSARY_FIELDS, :include => {:assigned_user => {:only => :full_name, :methods => [:gravatar_url]}}).and_return("some_json")
|
20
|
-
StoryExporter.new(story).to_json.should == "some_json"
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
data/spec/story_sorter_spec.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require "artisan/stories/story_sorter"
|
2
|
-
require "artisan/stories/stories_interactor"
|
3
|
-
require "artisan-memory-repository/models/project"
|
4
|
-
require "artisan-memory-repository/models/user"
|
5
|
-
require "artisan-memory-repository/models/iteration"
|
6
|
-
require "artisan-memory-repository/models/story"
|
7
|
-
require "active_support/all"
|
8
|
-
|
9
|
-
describe Artisan::Stories::StorySorter do
|
10
|
-
|
11
|
-
before(:each) do
|
12
|
-
@project = Artisan::Repository.project.create(:name => "project")
|
13
|
-
@project.stories = []
|
14
|
-
@project.stories.stub!(:where).and_return(@project.stories)
|
15
|
-
|
16
|
-
@iteration = Artisan::Repository.iteration.new(:start_date => "2011-01-01", :finish_date => "2011-01-02")
|
17
|
-
@iteration.stories = []
|
18
|
-
@project.iterations = [@iteration]
|
19
|
-
|
20
|
-
@user = Artisan::Repository.user.new(:email => "test@example.com", :login => "login", :full_name => "some name")
|
21
|
-
end
|
22
|
-
|
23
|
-
#TODO - PWP - intermitten failure
|
24
|
-
it "should save order in the backlog" do
|
25
|
-
story1 = Artisan::Repository.story.new(:name => 'story1')
|
26
|
-
story2 = Artisan::Repository.story.new(:name => 'story2')
|
27
|
-
story3 = Artisan::Repository.story.new(:name => 'story3')
|
28
|
-
|
29
|
-
@project.stories << story1
|
30
|
-
@project.stories << story2
|
31
|
-
@project.stories << story3
|
32
|
-
@project.stories.stub!(:backlog).and_return(@project.stories)
|
33
|
-
|
34
|
-
Artisan::Stories::StorySorter.new(@project, 'backlog', [story2.id.to_s, story3.id.to_s, story1.id.to_s], @iteration).sort
|
35
|
-
|
36
|
-
Artisan::Stories::StoriesInteractor.new(@project.id, nil).backlog.stories.sort_by{|story| story.position}.map(&:name).should == ["story2", "story3", "story1"]
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should save order in the ready column" do
|
40
|
-
story1 = Artisan::Repository.story.new(:name => 'story1')
|
41
|
-
story2 = Artisan::Repository.story.new(:name => 'story2')
|
42
|
-
story3 = Artisan::Repository.story.new(:name => 'story3')
|
43
|
-
|
44
|
-
@iteration.stories << story1
|
45
|
-
@iteration.stories << story2
|
46
|
-
@iteration.stories << story3
|
47
|
-
|
48
|
-
@iteration.stories.should_receive(:ready).and_return(@iteration.stories)
|
49
|
-
|
50
|
-
Artisan::Stories::StorySorter.new(@project, 'ready', [story2.id.to_s, story3.id.to_s, story1.id.to_s], @iteration).sort
|
51
|
-
|
52
|
-
story2.position.should == 1
|
53
|
-
story3.position.should == 2
|
54
|
-
story1.position.should == 3
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should not blow up if it doesn't have the story" do
|
58
|
-
story = Artisan::Repository.story.new(:name => 'story1', :assigned_user => @user, :complete => true, :accepted_at => Date.today, :accepted_by_user => @user)
|
59
|
-
@iteration.stories << story
|
60
|
-
@iteration.stories.should_receive(:accepted).and_return(@iteration.stories)
|
61
|
-
|
62
|
-
Artisan::Stories::StorySorter.new(@project, 'accepted', [story.id.to_s, 233], @iteration).sort
|
63
|
-
|
64
|
-
story.position.should == 1
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
data/spec/team_spec.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require "artisan/team"
|
2
|
-
require "artisan-memory-repository/user_repository"
|
3
|
-
require "artisan-memory-repository/project_repository"
|
4
|
-
require "artisan/member"
|
5
|
-
|
6
|
-
require 'spec_helper'
|
7
|
-
|
8
|
-
class Member;end;
|
9
|
-
|
10
|
-
|
11
|
-
describe Team, "add team member" do
|
12
|
-
let(:project_repo) { Artisan::Repository.project }
|
13
|
-
let(:user_repo) { Artisan::Repository.user }
|
14
|
-
let(:project) { project_repo.create }
|
15
|
-
|
16
|
-
let(:current_user) do
|
17
|
-
user_repo.create(:full_name => "paul", :login => "anothertest")
|
18
|
-
end
|
19
|
-
|
20
|
-
let(:new_user) do
|
21
|
-
user_repo.create(:full_name => "a name", :login => "a-testtest")
|
22
|
-
end
|
23
|
-
|
24
|
-
before(:each) { user_repo.destroy_all }
|
25
|
-
|
26
|
-
it "only lets an admin add a project" do
|
27
|
-
user_management = Team.new(project, nil)
|
28
|
-
user_management.add_team_member(new_user)
|
29
|
-
user_management.user?(new_user).should be_true
|
30
|
-
end
|
31
|
-
|
32
|
-
it "adds new owners" do
|
33
|
-
user_management = Team.new(project, nil)
|
34
|
-
user_management.add_team_owner(new_user)
|
35
|
-
user_management.owner?(new_user).should be_true
|
36
|
-
end
|
37
|
-
|
38
|
-
it "doesn't add another record if the user is already on the project" do
|
39
|
-
project_repo.add_member(project, current_user, true)
|
40
|
-
user_management = Team.new(project, nil)
|
41
|
-
project.users.size.should == 1
|
42
|
-
end
|
43
|
-
|
44
|
-
it "is an owner of the project" do
|
45
|
-
project_repo.add_member(project, current_user, true)
|
46
|
-
|
47
|
-
Team.new(project, nil).owner?(current_user).should be_true
|
48
|
-
end
|
49
|
-
|
50
|
-
it "is not an owner if there is no project" do
|
51
|
-
Team.new(nil, nil).owner?(current_user).should be_false
|
52
|
-
end
|
53
|
-
|
54
|
-
it "user doesn't have the project" do
|
55
|
-
Team.new(project, nil).owner?(current_user).should be_false
|
56
|
-
end
|
57
|
-
|
58
|
-
it "user isn't the owner" do
|
59
|
-
Team.new(project, nil).owner?(current_user).should be_false
|
60
|
-
end
|
61
|
-
|
62
|
-
it "is a user of the project" do
|
63
|
-
project_repo.add_member(project, current_user, false)
|
64
|
-
|
65
|
-
Team.new(project, nil).owner?(current_user).should be_false
|
66
|
-
Team.new(project, nil).user?(current_user).should be_true
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
describe Team, "#owners" do
|
71
|
-
it "lists owners" do
|
72
|
-
project_repo.add_member(project, current_user, true)
|
73
|
-
project_repo.add_member(project, new_user, true)
|
74
|
-
|
75
|
-
owners = Team.new(project, nil).owners
|
76
|
-
owners.should be_include(new_user)
|
77
|
-
owners.should be_include(current_user)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
|
-
describe "user_management#remove_user" do
|
83
|
-
|
84
|
-
it "doesn't blow up if you can't find the user" do
|
85
|
-
Team.new(project, current_user).remove_user(new_user)
|
86
|
-
lambda{Team.new(project, current_user).remove_user(new_user)}.should_not raise_error
|
87
|
-
end
|
88
|
-
|
89
|
-
it "removes the user" do
|
90
|
-
project_repo.add_member(project, new_user, false)
|
91
|
-
|
92
|
-
Team.new(project, nil).remove_user(new_user)
|
93
|
-
|
94
|
-
project_repo.is_member?(project, new_user).should be_false
|
95
|
-
end
|
96
|
-
|
97
|
-
it "takes the user off the email lists when removed" do
|
98
|
-
@members = double(:remove_from_email_lists => nil)
|
99
|
-
Artisan::Member.stub!(:new).and_return(@members)
|
100
|
-
@members.should_receive(:remove_from_email_lists)
|
101
|
-
|
102
|
-
project_repo.add_member(project, new_user, false)
|
103
|
-
|
104
|
-
Team.new(project, nil).remove_user(new_user)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|