be_taskable 0.5.0
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/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +178 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +20 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/be_taskable.gemspec +100 -0
- data/docs/task_refresh_activity_diagram.delineato +0 -0
- data/docs/taskable_complete_flow.delineato +0 -0
- data/lib/be_taskable/task.rb +173 -0
- data/lib/be_taskable/task_assignment.rb +60 -0
- data/lib/be_taskable/task_resolver.rb +47 -0
- data/lib/be_taskable/task_runner.rb +87 -0
- data/lib/be_taskable/taskable.rb +157 -0
- data/lib/be_taskable/tasker.rb +21 -0
- data/lib/be_taskable.rb +28 -0
- data/lib/generators/be_taskable/migration_generator.rb +44 -0
- data/lib/generators/be_taskable/resolver_generator.rb +28 -0
- data/lib/generators/be_taskable/templates/active_record/migration.rb +35 -0
- data/lib/generators/be_taskable/templates/resolver.rb.tpl +67 -0
- data/readme.md +292 -0
- data/spec/be_taskable/integration/end_to_end_spec.rb +79 -0
- data/spec/be_taskable/integration/irrelevance_spec.rb +70 -0
- data/spec/be_taskable/unit/be_taskable_spec.rb +17 -0
- data/spec/be_taskable/unit/task_assignment_spec.rb +185 -0
- data/spec/be_taskable/unit/task_runner_spec.rb +200 -0
- data/spec/be_taskable/unit/task_spec.rb +490 -0
- data/spec/be_taskable/unit/taskable_spec.rb +309 -0
- data/spec/be_taskable/unit/tasker_spec.rb +24 -0
- data/spec/database.yml +19 -0
- data/spec/models.rb +38 -0
- data/spec/schema.rb +37 -0
- data/spec/spec_helper.rb +96 -0
- metadata +245 -0
@@ -0,0 +1,309 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe 'BeTaskable::Taskable' do
|
4
|
+
|
5
|
+
let(:task) { double.as_null_object }
|
6
|
+
let(:assignee) { double.as_null_object }
|
7
|
+
let(:taskable) { Taskable.new }
|
8
|
+
let(:resolver) { double.as_null_object }
|
9
|
+
|
10
|
+
before do
|
11
|
+
taskable.stub(:task_resolver_for_action).and_return(resolver)
|
12
|
+
resolver.stub(:assignees_for_task).and_return([])
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#_task_resolver_name_for_action' do
|
16
|
+
|
17
|
+
it "responds to _task_resolver_name_for_action" do
|
18
|
+
expect(Taskable).to respond_to('_task_resolver_name_for_action')
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns the right name" do
|
22
|
+
res = Taskable._task_resolver_name_for_action('publish')
|
23
|
+
expect(res).to eq('TaskablePublishTaskResolver')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns the right name for underscored actions" do
|
27
|
+
res = Taskable._task_resolver_name_for_action('publish_something')
|
28
|
+
expect(res).to eq('TaskablePublishSomethingTaskResolver')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#_task_resolver_for_action' do
|
33
|
+
|
34
|
+
it "throws if it cannot find the resolver" do
|
35
|
+
expect{ Taskable._task_resolver_for_action('update') }.to raise_error
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns the resolver" do
|
39
|
+
res = Taskable._task_resolver_for_action('publish')
|
40
|
+
expect(res).to be_instance_of(TaskablePublishTaskResolver)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it "responds to taskable?" do
|
45
|
+
expect(taskable).to be_taskable
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".task_resolver_for_action" do
|
49
|
+
it "asks the class" do
|
50
|
+
taskable.unstub(:task_resolver_for_action)
|
51
|
+
action = 'publish'
|
52
|
+
Taskable.should_receive(:_task_resolver_for_action).with(action)
|
53
|
+
taskable.task_resolver_for_action(action)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ".tasks" do
|
58
|
+
it "responds to tasks" do
|
59
|
+
expect(taskable).to respond_to('tasks')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "finds the tasks" do
|
63
|
+
taskable.save
|
64
|
+
taskable.tasks.create
|
65
|
+
taskable.tasks.create
|
66
|
+
expect(taskable.tasks.size).to eq(2)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe ".create_task_for_action" do
|
71
|
+
|
72
|
+
before do
|
73
|
+
taskable.save
|
74
|
+
end
|
75
|
+
|
76
|
+
it "raises if it cannot find the resolver" do
|
77
|
+
taskable.unstub(:task_resolver_for_action)
|
78
|
+
expect{ taskable.create_task_for_action('view') }.to raise_error
|
79
|
+
end
|
80
|
+
|
81
|
+
it "raises if the taskable is not saved" do
|
82
|
+
taskable = Taskable.new
|
83
|
+
expect{ taskable.create_task_for_action('publish') }.to raise_error(ActiveRecord::RecordNotSaved)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "creates a task" do
|
87
|
+
task = taskable.create_task_for_action('publish')
|
88
|
+
expect(taskable.tasks.size).to eq(1)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "creates a different task everytime" do
|
92
|
+
task1 = taskable.create_task_for_action('publish')
|
93
|
+
task2 = taskable.create_task_for_action('publish')
|
94
|
+
expect(taskable.tasks.size).to eq(2)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "has the right taskable" do
|
98
|
+
task = taskable.create_task_for_action('publish')
|
99
|
+
expect(task.taskable).to eq(taskable)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "returns the task with the right action" do
|
103
|
+
task = taskable.create_task_for_action('publish')
|
104
|
+
expect(task.action).to eq('publish')
|
105
|
+
end
|
106
|
+
|
107
|
+
it "calls task.refresh" do
|
108
|
+
task = double.as_null_object
|
109
|
+
task.should_receive(:refresh)
|
110
|
+
taskable.tasks.stub(:create).and_return(task)
|
111
|
+
task = taskable.create_task_for_action('publish')
|
112
|
+
end
|
113
|
+
|
114
|
+
it "calls task.on_creation" do
|
115
|
+
task = double.as_null_object
|
116
|
+
task.should_receive(:on_creation)
|
117
|
+
taskable.tasks.stub(:create).and_return(task)
|
118
|
+
task = taskable.create_task_for_action('publish')
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe ".create_or_refresh_task_for_action" do
|
123
|
+
it "uses an existing task if possible" do
|
124
|
+
taskable.save
|
125
|
+
taskable.create_task_for_action('publish')
|
126
|
+
taskable.should_not_receive(:create_task_for_action)
|
127
|
+
taskable.create_or_refresh_task_for_action('publish')
|
128
|
+
end
|
129
|
+
|
130
|
+
it "creates a new task if not there" do
|
131
|
+
taskable.should_receive(:create_task_for_action)
|
132
|
+
taskable.create_or_refresh_task_for_action('publish')
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe ".tasks_for_action" do
|
137
|
+
it "responds to tasks_for_action" do
|
138
|
+
expect(taskable).to respond_to('tasks_for_action')
|
139
|
+
end
|
140
|
+
|
141
|
+
it "finds the tasks" do
|
142
|
+
taskable.save
|
143
|
+
task1 = taskable.tasks.create(action: 'create')
|
144
|
+
task2 = taskable.tasks.create(action: 'update')
|
145
|
+
|
146
|
+
expect(taskable.tasks_for_action('create')).to eq([task1])
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe ".last_task_for_action" do
|
151
|
+
it "responds to last_task_for_action" do
|
152
|
+
expect(taskable).to respond_to('last_task_for_action')
|
153
|
+
end
|
154
|
+
|
155
|
+
it "finds the task" do
|
156
|
+
taskable.save
|
157
|
+
task1 = taskable.tasks.create(taskable: taskable, action: 'create')
|
158
|
+
task2 = taskable.tasks.create(taskable: taskable, action: 'update')
|
159
|
+
|
160
|
+
res = taskable.last_task_for_action('create')
|
161
|
+
expect(res).to eq(task1)
|
162
|
+
end
|
163
|
+
|
164
|
+
it "returns nil if it cannot find the task" do
|
165
|
+
res = taskable.last_task_for_action('create')
|
166
|
+
expect(res).to be_nil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe ".task_assignments" do
|
171
|
+
it "responds to task_assignments" do
|
172
|
+
expect(taskable).to respond_to('task_assignments')
|
173
|
+
end
|
174
|
+
|
175
|
+
it "finds the assignments" do
|
176
|
+
taskable.save
|
177
|
+
task1 = taskable.tasks.create(taskable: taskable, action: 'create')
|
178
|
+
task2 = taskable.tasks.create(taskable: taskable, action: 'update')
|
179
|
+
task1.assignments.create
|
180
|
+
task2.assignments.create
|
181
|
+
expect(taskable.task_assignments.size).to eq(2)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe ".task_assignments_for_action" do
|
186
|
+
it "responds to task_assignments_for_action" do
|
187
|
+
expect(taskable).to respond_to('task_assignments_for_action')
|
188
|
+
end
|
189
|
+
|
190
|
+
it "finds the assignments" do
|
191
|
+
taskable.save
|
192
|
+
task1 = taskable.tasks.create(action: 'publish')
|
193
|
+
task2 = taskable.tasks.create(action: 'submit')
|
194
|
+
task1.assignments.create
|
195
|
+
task2.assignments.create
|
196
|
+
res = taskable.task_assignments_for_action('publish')
|
197
|
+
expect(res.size).to eq(1)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "returns an empty array if if cannot find the task" do
|
201
|
+
res = taskable.task_assignments_for_action('review')
|
202
|
+
expect(res).to be_empty
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe ".task_assignment_for" do
|
207
|
+
it "requires an assignee" do
|
208
|
+
expect{ taskable.task_assignment_for('publish') }.to raise_error(ArgumentError)
|
209
|
+
end
|
210
|
+
|
211
|
+
it "calls assignment_for on task" do
|
212
|
+
task.should_receive(:assignment_for).with(assignee)
|
213
|
+
taskable.stub(:last_task_for_action).and_return(task)
|
214
|
+
taskable.task_assignment_for('publish', assignee)
|
215
|
+
end
|
216
|
+
|
217
|
+
it "returns nil if if cannot find the task" do
|
218
|
+
res = taskable.task_assignment_for('publish', assignee)
|
219
|
+
expect(res).to be_nil
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe ".complete_task_for_action" do
|
224
|
+
|
225
|
+
it "requires an action" do
|
226
|
+
expect{ taskable.complete_task_for_action }.to raise_error(ArgumentError)
|
227
|
+
end
|
228
|
+
|
229
|
+
it "calls complete! on the task" do
|
230
|
+
task = double.as_null_object
|
231
|
+
task.should_receive(:complete!)
|
232
|
+
taskable.stub(:last_task_for_action).and_return(task)
|
233
|
+
taskable.complete_task_for_action('publish')
|
234
|
+
end
|
235
|
+
|
236
|
+
it "return true" do
|
237
|
+
task = double.as_null_object
|
238
|
+
task.stub(:complete!).and_return(true)
|
239
|
+
taskable.stub(:last_task_for_action).and_return(task)
|
240
|
+
res = taskable.complete_task_for_action('publish')
|
241
|
+
expect(res).to be_true
|
242
|
+
end
|
243
|
+
|
244
|
+
it "returns false if it cannot find the task" do
|
245
|
+
res = taskable.complete_task_for_action('publish')
|
246
|
+
expect(res).to be_false
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
describe ".complete_task_for" do
|
251
|
+
|
252
|
+
it "requires an assignee" do
|
253
|
+
expect{ taskable.complete_task_for('publish') }.to raise_error(ArgumentError)
|
254
|
+
end
|
255
|
+
|
256
|
+
it "calls complete_by on task" do
|
257
|
+
task.should_receive(:complete_by).with(assignee)
|
258
|
+
taskable.stub(:last_task_for_action).and_return(task)
|
259
|
+
taskable.complete_task_for('publish', assignee)
|
260
|
+
end
|
261
|
+
|
262
|
+
it "returns true" do
|
263
|
+
task.stub(:complete_by).and_return(true)
|
264
|
+
taskable.stub(:last_task_for_action).and_return(task)
|
265
|
+
res = taskable.complete_task_for('publish', assignee)
|
266
|
+
expect(res).to be_true
|
267
|
+
end
|
268
|
+
|
269
|
+
it "returns false if it cannot find the task" do
|
270
|
+
res = taskable.complete_task_for('publish', assignee)
|
271
|
+
expect(res).to be_false
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
describe ".complete_tasks_for_action" do
|
276
|
+
it "returns false if it cannot find any tasks" do
|
277
|
+
res = taskable.complete_tasks_for_action('review')
|
278
|
+
expect(res).to be_false
|
279
|
+
end
|
280
|
+
|
281
|
+
it "sends complete! to all tasks" do
|
282
|
+
task1 = double.as_null_object
|
283
|
+
task2 = double.as_null_object
|
284
|
+
task1.should_receive(:complete!)
|
285
|
+
task2.should_receive(:complete!)
|
286
|
+
tasks = [task1, task2]
|
287
|
+
taskable.stub(:current_tasks_for_action).and_return(tasks)
|
288
|
+
res = taskable.complete_tasks_for_action('review')
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
describe ".expire_tasks_for_action" do
|
293
|
+
it "returns false if it cannot find any tasks" do
|
294
|
+
res = taskable.expire_tasks_for_action('review')
|
295
|
+
expect(res).to be_false
|
296
|
+
end
|
297
|
+
|
298
|
+
it "sends expire to all tasks" do
|
299
|
+
task1 = double.as_null_object
|
300
|
+
task2 = double.as_null_object
|
301
|
+
task1.should_receive(:expire)
|
302
|
+
task2.should_receive(:expire)
|
303
|
+
tasks = [task1, task2]
|
304
|
+
taskable.stub(:current_tasks_for_action).and_return(tasks)
|
305
|
+
res = taskable.expire_tasks_for_action('review')
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe 'BeTaskable::Tasker' do
|
4
|
+
|
5
|
+
let(:user) { User.new }
|
6
|
+
let(:task) { BeTaskable::Task.new }
|
7
|
+
|
8
|
+
it "responds to tasker?" do
|
9
|
+
expect(user).to be_tasker
|
10
|
+
end
|
11
|
+
|
12
|
+
it "responds to task_assignments" do
|
13
|
+
expect(user).to respond_to(:task_assignments)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has task assignments" do
|
17
|
+
user.save
|
18
|
+
task.save
|
19
|
+
assignment = BeTaskable::TaskAssignment.create(task: task, assignee: user)
|
20
|
+
|
21
|
+
expect(user.task_assignments.size).to eq(1)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/spec/database.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
sqlite3:
|
2
|
+
adapter: sqlite3
|
3
|
+
database: be_taskable.sqlite3
|
4
|
+
|
5
|
+
mysql:
|
6
|
+
adapter: mysql2
|
7
|
+
hostname: localhost
|
8
|
+
username: root
|
9
|
+
password:
|
10
|
+
database: be_taskable
|
11
|
+
charset: utf8
|
12
|
+
|
13
|
+
postgresql:
|
14
|
+
adapter: postgresql
|
15
|
+
hostname: localhost
|
16
|
+
username: postgres
|
17
|
+
password:
|
18
|
+
database: be_taskable
|
19
|
+
encoding: utf8
|
data/spec/models.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
class User < ActiveRecord::Base
|
2
|
+
be_tasker
|
3
|
+
end
|
4
|
+
|
5
|
+
class Taskable < ActiveRecord::Base
|
6
|
+
be_taskable
|
7
|
+
end
|
8
|
+
|
9
|
+
class TaskablePublishTaskResolver < BeTaskable::TaskResolver
|
10
|
+
end
|
11
|
+
|
12
|
+
class TaskableReviewTaskResolver < BeTaskable::TaskResolver
|
13
|
+
|
14
|
+
def consensus?(assignments)
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def assignees_for_task(task)
|
19
|
+
[]
|
20
|
+
end
|
21
|
+
|
22
|
+
def due_date_for_assignment(assignment)
|
23
|
+
DateTime.now + 10.days
|
24
|
+
end
|
25
|
+
|
26
|
+
def label_for_task(task)
|
27
|
+
"Task label #{task.id}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def label_for_assignment(assignment)
|
31
|
+
"Assignment label #{assignment.id}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def url_for_assignment(assignment)
|
35
|
+
"Assignment url #{assignment.id}"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/spec/schema.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
ActiveRecord::Schema.define :version => 0 do
|
2
|
+
|
3
|
+
create_table 'users', force: true do |t|
|
4
|
+
t.timestamps
|
5
|
+
end
|
6
|
+
|
7
|
+
create_table 'taskables', force: true do |t|
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
create_table 'be_taskable_tasks', force: true do |t|
|
12
|
+
t.string :action
|
13
|
+
t.string :state
|
14
|
+
t.integer :taskable_id
|
15
|
+
t.string :taskable_type
|
16
|
+
t.string :label
|
17
|
+
t.datetime :completed_at
|
18
|
+
t.datetime :expired_at
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table 'be_taskable_task_assignments', force: true do |t|
|
23
|
+
t.integer :task_id
|
24
|
+
t.integer :assignee_id
|
25
|
+
t.string :assignee_type
|
26
|
+
t.string :label
|
27
|
+
t.string :url
|
28
|
+
t.boolean :confirmed
|
29
|
+
t.boolean :enacted
|
30
|
+
t.datetime :visible_at
|
31
|
+
t.datetime :complete_by
|
32
|
+
t.datetime :completed_at
|
33
|
+
t.datetime :expired_at
|
34
|
+
t.timestamps
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
# $LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
# require 'gbg_tasks'
|
4
|
+
|
5
|
+
$LOAD_PATH << "." unless $LOAD_PATH.include?(".")
|
6
|
+
require 'logger'
|
7
|
+
require 'database_cleaner'
|
8
|
+
require 'active_record'
|
9
|
+
require 'action_view'
|
10
|
+
require 'action_controller'
|
11
|
+
require 'rspec/rails'
|
12
|
+
require 'rspec-steps'
|
13
|
+
|
14
|
+
# Make sure the right version of bundler is loaded
|
15
|
+
begin
|
16
|
+
require "rubygems"
|
17
|
+
require "bundler"
|
18
|
+
|
19
|
+
if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.5")
|
20
|
+
raise RuntimeError, "Your bundler version is too old. Run `gem install bundler` to upgrade."
|
21
|
+
end
|
22
|
+
|
23
|
+
# Set up load paths for all bundled gems
|
24
|
+
Bundler.setup
|
25
|
+
rescue Bundler::GemNotFound
|
26
|
+
raise RuntimeError, "Bundler couldn't find some gems. Did you run \`bundlee install\`?"
|
27
|
+
end
|
28
|
+
|
29
|
+
Bundler.require
|
30
|
+
require File.expand_path('../../lib/be_taskable', __FILE__)
|
31
|
+
|
32
|
+
# set adapter to use, default is sqlite3
|
33
|
+
# to use an alternative adapter run => rake spec DB='postgresql'
|
34
|
+
db_name = ENV['DB'] || 'sqlite3'
|
35
|
+
database_yml = File.expand_path('../database.yml', __FILE__)
|
36
|
+
|
37
|
+
# Load the data
|
38
|
+
if File.exists?(database_yml)
|
39
|
+
active_record_configuration = YAML.load_file(database_yml)
|
40
|
+
|
41
|
+
ActiveRecord::Base.configurations = active_record_configuration
|
42
|
+
config = ActiveRecord::Base.configurations[db_name]
|
43
|
+
|
44
|
+
begin
|
45
|
+
ActiveRecord::Base.establish_connection(db_name)
|
46
|
+
ActiveRecord::Base.connection
|
47
|
+
rescue
|
48
|
+
case db_name
|
49
|
+
when /mysql/
|
50
|
+
ActiveRecord::Base.establish_connection(config.merge('database' => nil))
|
51
|
+
ActiveRecord::Base.connection.create_database(config['database'], {:charset => 'utf8', :collation => 'utf8_unicode_ci'})
|
52
|
+
when 'postgresql'
|
53
|
+
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
54
|
+
ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => 'utf8'))
|
55
|
+
end
|
56
|
+
|
57
|
+
ActiveRecord::Base.establish_connection(config)
|
58
|
+
end
|
59
|
+
|
60
|
+
ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
|
61
|
+
ActiveRecord::Base.default_timezone = :utc
|
62
|
+
|
63
|
+
ActiveRecord::Base.silence do
|
64
|
+
ActiveRecord::Migration.verbose = false
|
65
|
+
|
66
|
+
load(File.dirname(__FILE__) + '/schema.rb')
|
67
|
+
load(File.dirname(__FILE__) + '/models.rb')
|
68
|
+
end
|
69
|
+
|
70
|
+
else
|
71
|
+
raise "Please create #{database_yml} first to configure your database. Take a look at: #{database_yml}.sample"
|
72
|
+
end
|
73
|
+
|
74
|
+
RSpec.configure do |config|
|
75
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
76
|
+
config.fail_fast = true
|
77
|
+
|
78
|
+
# Run specs in random order to surface order dependencies. If you find an
|
79
|
+
# order dependency and want to debug it, you can fix the order by providing
|
80
|
+
# the seed, which is printed after each run.
|
81
|
+
# --seed 1234
|
82
|
+
# config.order = "random"
|
83
|
+
|
84
|
+
config.before :suite do
|
85
|
+
DatabaseCleaner.strategy = :deletion
|
86
|
+
end
|
87
|
+
|
88
|
+
config.before(:each) do
|
89
|
+
DatabaseCleaner.start
|
90
|
+
end
|
91
|
+
|
92
|
+
config.after(:each) do
|
93
|
+
DatabaseCleaner.clean
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|