paradeiser 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/README.md +96 -35
- data/TODO.md +14 -15
- data/VISION.md +92 -84
- data/bin/{pom → par} +32 -2
- data/doc/Paradeiser::Break_status.svg +50 -0
- data/doc/Paradeiser::Pomodoro_status.svg +40 -22
- data/lib/paradeiser.rb +3 -3
- data/lib/paradeiser/controllers/breaks_controller.rb +19 -0
- data/lib/paradeiser/controllers/controller.rb +3 -3
- data/lib/paradeiser/controllers/paradeiser_controller.rb +13 -2
- data/lib/paradeiser/controllers/pomodori_controller.rb +36 -17
- data/lib/paradeiser/errors.rb +12 -6
- data/lib/paradeiser/executor.rb +2 -0
- data/lib/paradeiser/initializers/inflections.rb +4 -0
- data/lib/paradeiser/models/break.rb +40 -0
- data/lib/paradeiser/models/hook.rb +4 -4
- data/lib/paradeiser/models/interrupt.rb +18 -0
- data/lib/paradeiser/models/job.rb +1 -1
- data/lib/paradeiser/models/pomodoro.rb +30 -22
- data/lib/paradeiser/models/repository.rb +26 -13
- data/lib/paradeiser/models/scheduled.rb +25 -0
- data/lib/paradeiser/models/scheduler.rb +1 -1
- data/lib/paradeiser/models/status.rb +21 -0
- data/lib/paradeiser/{refinements.rb → refinements/numeric.rb} +4 -0
- data/lib/paradeiser/router.rb +12 -7
- data/lib/paradeiser/version.rb +1 -1
- data/lib/paradeiser/views/paradeiser/init.erb +1 -1
- data/lib/paradeiser/views/paradeiser/report.erb +5 -0
- data/lib/paradeiser/views/paradeiser/status.erb +13 -0
- data/paradeiser.gemspec +2 -0
- data/templates/linux/hooks/after-finish-break +10 -0
- data/templates/linux/hooks/after-finish-pomodoro +10 -0
- data/templates/linux/hooks/after-start-break +7 -0
- data/templates/linux/hooks/after-start-pomodoro +7 -0
- data/templates/mac/hooks/after-finish-break +10 -0
- data/templates/mac/hooks/after-finish-pomodoro +10 -0
- data/templates/mac/hooks/after-start-break +7 -0
- data/templates/mac/hooks/after-start-pomodoro +7 -0
- data/test/helper.rb +37 -4
- data/test/integration/{test_pom.rb → test_par.rb} +4 -4
- data/test/lib/{pomodoro_mock.rb → schedulable_mock.rb} +9 -1
- data/test/unit/test_break.rb +99 -0
- data/test/unit/test_break_controller.rb +56 -0
- data/test/unit/test_interrupt.rb +36 -0
- data/test/unit/test_paradeiser_controller_init.rb +92 -0
- data/test/unit/test_paradeiser_controller_report.rb +44 -0
- data/test/unit/test_paradeiser_controller_status.rb +70 -0
- data/test/unit/test_paradeiser_view.rb +66 -0
- data/test/unit/test_pomodori_controller.rb +87 -31
- data/test/unit/test_pomodori_view.rb +0 -50
- data/test/unit/test_pomodoro.rb +131 -9
- data/test/unit/test_pomodoro_hooks.rb +165 -17
- data/test/unit/test_repository.rb +38 -15
- data/test/unit/test_router.rb +4 -4
- data/test/unit/test_status.rb +26 -0
- metadata +70 -17
- data/lib/paradeiser/views/pomodori/report.erb +0 -5
- data/lib/paradeiser/views/pomodori/status.erb +0 -9
- data/templates/linux/hooks/after-finish +0 -10
- data/templates/linux/hooks/after-start +0 -7
- data/templates/mac/hooks/after-finish +0 -10
- data/templates/mac/hooks/after-start +0 -7
- data/test/unit/test_paradeiser_controller.rb +0 -88
@@ -6,7 +6,7 @@ class TestPomodoriController < MiniTest::Test
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_start
|
9
|
-
pom, has_output = invoke(:start, '@pom', 'has_output')
|
9
|
+
pom, has_output = invoke(:start, nil, '@pom', 'has_output')
|
10
10
|
assert_equal(:active, pom.status_name)
|
11
11
|
assert_equal(false, has_output)
|
12
12
|
assert_equal(1, @backend.size)
|
@@ -24,80 +24,136 @@ class TestPomodoriController < MiniTest::Test
|
|
24
24
|
|
25
25
|
def test_finish
|
26
26
|
invoke(:start)
|
27
|
-
pom, has_output = invoke(:finish, '@pom', 'has_output')
|
27
|
+
pom, has_output = invoke(:finish, nil, '@pom', 'has_output')
|
28
28
|
assert_equal(:finished, pom.status_name)
|
29
29
|
assert_equal(false, has_output)
|
30
30
|
assert_equal(1, @backend.size)
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_finish_idle
|
34
|
-
assert_raises
|
34
|
+
assert_raises NotActiveError do
|
35
35
|
invoke(:finish)
|
36
36
|
end
|
37
37
|
assert_equal(0, @backend.size)
|
38
38
|
end
|
39
39
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
assert_equal(
|
40
|
+
def test_finish_canceled
|
41
|
+
invoke(:start)
|
42
|
+
invoke(:cancel)
|
43
|
+
assert_equal(1, @backend.size)
|
44
|
+
|
45
|
+
assert_raises NotActiveError do
|
46
|
+
invoke(:finish)
|
47
|
+
end
|
48
|
+
assert_equal(1, @backend.size)
|
49
|
+
assert_equal(:canceled, @backend[@backend.roots.first].status_name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_interrupt_idle
|
53
|
+
assert_raises NotActiveError do
|
54
|
+
invoke(:interrupt)
|
55
|
+
end
|
56
|
+
assert_equal(0, @backend.size)
|
44
57
|
end
|
45
58
|
|
46
|
-
def
|
59
|
+
def test_interrupt_active
|
47
60
|
invoke(:start)
|
48
|
-
|
49
|
-
assert_equal(
|
50
|
-
|
61
|
+
pom, has_output = invoke(:interrupt, OpenStruct.new, '@pom', 'has_output')
|
62
|
+
assert_equal(:active, pom.status_name)
|
63
|
+
|
64
|
+
interrupts = pom.interrupts
|
65
|
+
refute_nil(interrupts)
|
66
|
+
refute_empty(interrupts)
|
67
|
+
assert_equal(1, interrupts.size)
|
68
|
+
|
69
|
+
interrupt = interrupts.first
|
70
|
+
refute_nil(interrupt)
|
71
|
+
refute_nil(interrupt.created_at)
|
72
|
+
assert_equal(:internal, interrupt.type)
|
51
73
|
end
|
52
74
|
|
53
|
-
def
|
75
|
+
def test_interrupt_active_internal
|
54
76
|
invoke(:start)
|
55
|
-
invoke(:
|
77
|
+
pom = invoke(:interrupt, OpenStruct.new(:internal => true), '@pom')
|
78
|
+
interrupt = pom.interrupts.first
|
79
|
+
assert_equal(:internal, interrupt.type)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_interrupt_active_external
|
56
83
|
invoke(:start)
|
57
|
-
|
58
|
-
|
59
|
-
assert_equal(
|
84
|
+
pom = invoke(:interrupt, OpenStruct.new(:external => true), '@pom')
|
85
|
+
interrupt = pom.interrupts.first
|
86
|
+
assert_equal(:external, interrupt.type)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_interrupt_finished
|
90
|
+
invoke(:start)
|
91
|
+
invoke(:finish)
|
92
|
+
assert_equal(1, @backend.size)
|
93
|
+
|
94
|
+
assert_raises NotActiveError do
|
95
|
+
invoke(:interrupt)
|
96
|
+
end
|
97
|
+
|
98
|
+
assert_equal(1, @backend.size)
|
60
99
|
end
|
61
100
|
|
62
|
-
def
|
63
|
-
|
64
|
-
|
65
|
-
|
101
|
+
def test_cancel_idle
|
102
|
+
assert_raises NotActiveError do
|
103
|
+
invoke(:cancel)
|
104
|
+
end
|
66
105
|
assert_equal(0, @backend.size)
|
67
106
|
end
|
68
107
|
|
69
|
-
def
|
108
|
+
def test_cancel_active
|
70
109
|
invoke(:start)
|
71
|
-
pom, has_output = invoke(:
|
72
|
-
assert_equal(:
|
73
|
-
assert_equal(
|
110
|
+
pom, has_output = invoke(:cancel, nil, '@pom', 'has_output')
|
111
|
+
assert_equal(:canceled, pom.status_name)
|
112
|
+
assert_equal(false, has_output)
|
74
113
|
assert_equal(1, @backend.size)
|
75
114
|
end
|
76
115
|
|
77
|
-
def
|
116
|
+
def test_cancel_finished
|
78
117
|
invoke(:start)
|
79
118
|
invoke(:finish)
|
80
|
-
pom, has_output = invoke(:status, '@pom', 'has_output')
|
81
|
-
assert_equal(:finished, pom.status_name)
|
82
|
-
assert_equal(true, has_output)
|
83
119
|
assert_equal(1, @backend.size)
|
120
|
+
|
121
|
+
assert_raises NotActiveError do
|
122
|
+
invoke(:cancel)
|
123
|
+
end
|
124
|
+
|
125
|
+
assert_equal(1, @backend.size)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_cancel_again
|
129
|
+
invoke(:start)
|
130
|
+
invoke(:cancel)
|
131
|
+
assert_equal(1, @backend.size)
|
132
|
+
invoke(:start)
|
133
|
+
assert_equal(2, @backend.size)
|
84
134
|
end
|
85
135
|
|
86
136
|
private
|
87
137
|
|
88
|
-
def invoke(method, *attributes)
|
138
|
+
def invoke(method, options = nil, *attributes)
|
89
139
|
controller = PomodoriController.new(method)
|
90
140
|
|
91
141
|
Repository.stub :backend, @backend do
|
92
142
|
Scheduler.stub(:add, nil) do
|
93
143
|
Scheduler.stub(:clear, nil) do
|
94
|
-
controller.call(nil,
|
144
|
+
controller.call(nil, options)
|
95
145
|
end
|
96
146
|
end
|
97
147
|
end
|
98
148
|
|
99
|
-
attributes.map do |attribute|
|
149
|
+
result = attributes.map do |attribute|
|
100
150
|
controller.get_binding.eval(attribute)
|
101
151
|
end
|
152
|
+
|
153
|
+
if 1 == result.size
|
154
|
+
result.first
|
155
|
+
else
|
156
|
+
result
|
157
|
+
end
|
102
158
|
end
|
103
159
|
end
|
@@ -6,56 +6,6 @@ class TestPomodoriView < MiniTest::Test
|
|
6
6
|
@pom.id = 1
|
7
7
|
end
|
8
8
|
|
9
|
-
def test_status_idle
|
10
|
-
out, err = render(:status)
|
11
|
-
assert_match(/^Current state is idle.$/m, out)
|
12
|
-
assert_empty(err)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_status_active
|
16
|
-
start!
|
17
|
-
out, err = render(:status)
|
18
|
-
assert_match(/^Pomodoro #1 is active for another \d{1,2} minutes \(started at .*\)\.$/m, out)
|
19
|
-
assert_empty(err)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_status_finished
|
23
|
-
start!
|
24
|
-
finish!
|
25
|
-
out, err = render(:status)
|
26
|
-
assert_match(/^No active pomodoro. Last one was finished at .*\.$/m, out)
|
27
|
-
assert_empty(err)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_report_empty
|
31
|
-
@pom = []
|
32
|
-
out, err = render(:report)
|
33
|
-
assert_equal(1, out.lines.size)
|
34
|
-
assert_match(/^ID \| Status \| Started \| Ended$/m, out.lines.first)
|
35
|
-
assert_empty(err)
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_report_one_active
|
39
|
-
start!
|
40
|
-
@pom = [@pom]
|
41
|
-
out, err = render(:report)
|
42
|
-
assert_equal(2, out.lines.size)
|
43
|
-
assert_match(/^ID \| Status \| Started \| Ended$/m, out.lines[0])
|
44
|
-
assert_match(/^1 \| active \| \d{1,2}:\d{1,2} \| $/m, out.lines[1])
|
45
|
-
assert_empty(err)
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_report_one_finished
|
49
|
-
start!
|
50
|
-
finish!
|
51
|
-
@pom = [@pom]
|
52
|
-
out, err = render(:report)
|
53
|
-
assert_equal(2, out.lines.size)
|
54
|
-
assert_match(/^ID \| Status \| Started \| Ended$/m, out.lines[0])
|
55
|
-
assert_match(/^1 \| finished \| \d{1,2}:\d{1,2} \| \d{1,2}:\d{1,2}$/m, out.lines[1])
|
56
|
-
assert_empty(err)
|
57
|
-
end
|
58
|
-
|
59
9
|
def test_start
|
60
10
|
out, err = render(:start)
|
61
11
|
assert_match(/^Starting pomodoro #1\.$/m, out)
|
data/test/unit/test_pomodoro.rb
CHANGED
@@ -7,15 +7,21 @@ class TestPomodoro < MiniTest::Test
|
|
7
7
|
|
8
8
|
def test_virgin
|
9
9
|
assert_equal(:idle, @pom.status_name)
|
10
|
+
refute(@pom.started_at)
|
11
|
+
refute(@pom.canceled_at)
|
12
|
+
refute(@pom.finished_at)
|
10
13
|
end
|
11
14
|
|
12
15
|
def test_finish_idle
|
13
16
|
assert_raises StateMachine::InvalidTransition do
|
14
17
|
finish!
|
15
18
|
end
|
19
|
+
refute(@pom.started_at)
|
20
|
+
refute(@pom.canceled_at)
|
21
|
+
refute(@pom.finished_at)
|
16
22
|
end
|
17
23
|
|
18
|
-
def
|
24
|
+
def test_finish_active
|
19
25
|
start!
|
20
26
|
assert_equal(:active, @pom.status_name)
|
21
27
|
|
@@ -27,6 +33,29 @@ class TestPomodoro < MiniTest::Test
|
|
27
33
|
|
28
34
|
assert_equal(:finished, @pom.status_name)
|
29
35
|
assert_equal(now, @pom.finished_at.to_i)
|
36
|
+
refute(@pom.canceled_at)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_finish_finished
|
40
|
+
start!
|
41
|
+
finish!
|
42
|
+
assert_raises StateMachine::InvalidTransition do
|
43
|
+
finish!
|
44
|
+
end
|
45
|
+
refute(@pom.canceled_at)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_finish_canceled
|
49
|
+
start!
|
50
|
+
cancel!
|
51
|
+
assert_raises StateMachine::InvalidTransition do
|
52
|
+
finish!
|
53
|
+
end
|
54
|
+
refute(@pom.finished_at)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_length
|
58
|
+
assert_equal(25 * 60, @pom.length)
|
30
59
|
end
|
31
60
|
|
32
61
|
def test_duration_idle
|
@@ -63,12 +92,20 @@ class TestPomodoro < MiniTest::Test
|
|
63
92
|
assert_equal(later - now, @pom.duration)
|
64
93
|
end
|
65
94
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
95
|
+
def test_duration_canceled
|
96
|
+
now = srand
|
97
|
+
|
98
|
+
Time.stub :now, Time.at(now) do
|
99
|
+
start!
|
100
|
+
end
|
101
|
+
|
102
|
+
later = now + rand(42)
|
103
|
+
|
104
|
+
Time.stub :now, Time.at(later) do
|
105
|
+
cancel!
|
71
106
|
end
|
107
|
+
|
108
|
+
assert_equal(later - now, @pom.duration)
|
72
109
|
end
|
73
110
|
|
74
111
|
def test_start
|
@@ -82,19 +119,104 @@ class TestPomodoro < MiniTest::Test
|
|
82
119
|
assert_equal(now, @pom.started_at.to_i)
|
83
120
|
end
|
84
121
|
|
85
|
-
def
|
122
|
+
def test_remaining_active
|
86
123
|
now = srand
|
87
124
|
|
88
125
|
Time.stub :now, Time.at(now) do
|
89
126
|
start!
|
90
|
-
assert_equal(Pomodoro::
|
127
|
+
assert_equal(Pomodoro::MINUTES_25 * 60, @pom.remaining)
|
91
128
|
end
|
92
129
|
|
93
130
|
delta = 600
|
94
131
|
later = now + delta
|
95
132
|
|
96
133
|
Time.stub :now, Time.at(later) do
|
97
|
-
assert_equal(Pomodoro::
|
134
|
+
assert_equal(Pomodoro::MINUTES_25 * 60 - delta, @pom.remaining)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_interrupt
|
139
|
+
start!
|
140
|
+
assert_equal(0, @pom.interrupts.size)
|
141
|
+
|
142
|
+
now = srand
|
143
|
+
|
144
|
+
Time.stub :now, Time.at(now) do
|
145
|
+
interrupt!
|
98
146
|
end
|
147
|
+
|
148
|
+
assert_equal(1, @pom.interrupts.size)
|
149
|
+
|
150
|
+
int = @pom.interrupts.first
|
151
|
+
assert_equal(now, int.created_at.to_i)
|
152
|
+
assert_equal(:internal, int.type)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_interrupt_internal
|
156
|
+
start!
|
157
|
+
interrupt!(:internal)
|
158
|
+
assert_equal(1, @pom.interrupts.size)
|
159
|
+
int = @pom.interrupts.first
|
160
|
+
assert_equal(:internal, int.type)
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_interrupt_external
|
164
|
+
start!
|
165
|
+
interrupt!(:external)
|
166
|
+
assert_equal(1, @pom.interrupts.size)
|
167
|
+
int = @pom.interrupts.first
|
168
|
+
assert_equal(:external, int.type)
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_interrupt_unknown
|
172
|
+
start!
|
173
|
+
assert_raises InvalidTypeError do
|
174
|
+
interrupt!(:unknown)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_interrupt_idle
|
179
|
+
assert_raises StateMachine::InvalidTransition do
|
180
|
+
interrupt!
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_interrupt_finished
|
185
|
+
start!
|
186
|
+
finish!
|
187
|
+
assert_raises StateMachine::InvalidTransition do
|
188
|
+
interrupt!
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_interrupt_canceled
|
193
|
+
start!
|
194
|
+
cancel!
|
195
|
+
assert_raises StateMachine::InvalidTransition do
|
196
|
+
interrupt!
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_cancel_idle
|
201
|
+
assert_raises StateMachine::InvalidTransition do
|
202
|
+
cancel!
|
203
|
+
end
|
204
|
+
refute(@pom.finished_at)
|
205
|
+
refute(@pom.canceled_at)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_cancel_active
|
209
|
+
start!
|
210
|
+
assert_equal(:active, @pom.status_name)
|
211
|
+
|
212
|
+
now = srand
|
213
|
+
|
214
|
+
Time.stub :now, Time.at(now) do
|
215
|
+
cancel!
|
216
|
+
end
|
217
|
+
|
218
|
+
assert_equal(:canceled, @pom.status_name)
|
219
|
+
assert_equal(now, @pom.canceled_at.to_i)
|
220
|
+
refute(@pom.finished_at)
|
99
221
|
end
|
100
222
|
end
|
@@ -3,36 +3,47 @@ require 'tmpdir'
|
|
3
3
|
|
4
4
|
class TestPomodoroHooks < MiniTest::Test
|
5
5
|
def setup
|
6
|
-
|
7
|
-
|
6
|
+
# Cannot use fakefs because hooks will not execute under it, but as part of
|
7
|
+
# the real FS. Instead, we set the $PAR_DIR to point to a temp directory
|
8
|
+
@orig_PAR_DIR = ENV['PAR_DIR']
|
9
|
+
ENV['PAR_DIR'] = Dir.mktmpdir
|
8
10
|
end
|
9
11
|
|
10
12
|
def teardown
|
11
|
-
FileUtils.rm_rf(Paradeiser.
|
12
|
-
ENV['
|
13
|
+
FileUtils.rm_rf(Paradeiser.par_dir)
|
14
|
+
ENV['PAR_DIR'] = @orig_PAR_DIR
|
13
15
|
end
|
14
16
|
|
15
|
-
def
|
16
|
-
hook_name = 'before-
|
17
|
+
def test_before_start_pomodoro_success
|
18
|
+
hook_name = 'before-start-pomodoro'
|
19
|
+
pom = Pomodoro.new
|
20
|
+
token_file = create_hook('Pomodoro', hook_name)
|
21
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
22
|
+
pom.start
|
23
|
+
assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
24
|
+
assert_equal(:active, pom.status_name)
|
25
|
+
assert_equal("Pomodoro #{Repository.next_id} #{pom.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
|
26
|
+
end
|
17
27
|
|
28
|
+
def test_before_finish_pomodoro_success
|
29
|
+
hook_name = 'before-finish-pomodoro'
|
18
30
|
pom = Pomodoro.new
|
19
31
|
pom.id = SecureRandom.random_number(1000)
|
20
32
|
pom.start
|
21
|
-
token_file = create_hook(hook_name)
|
33
|
+
token_file = create_hook('Pomodoro', hook_name)
|
22
34
|
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
23
35
|
pom.finish
|
24
36
|
assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
25
37
|
assert_equal(:finished, pom.status_name)
|
26
|
-
assert_equal("Pomodoro #{pom.id}
|
38
|
+
assert_equal("Pomodoro #{pom.id} #{pom.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
|
27
39
|
end
|
28
40
|
|
29
|
-
def
|
30
|
-
hook_name = 'before-finish'
|
31
|
-
|
41
|
+
def test_before_finish_pomodoro_error
|
42
|
+
hook_name = 'before-finish-pomodoro'
|
32
43
|
pom = Pomodoro.new
|
33
44
|
pom.id = SecureRandom.random_number(1000)
|
34
45
|
pom.start
|
35
|
-
token_file = create_hook(hook_name, false)
|
46
|
+
token_file = create_hook('Pomodoro', hook_name, false)
|
36
47
|
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
37
48
|
|
38
49
|
assert_raises HookFailedError do
|
@@ -43,19 +54,156 @@ class TestPomodoroHooks < MiniTest::Test
|
|
43
54
|
assert_equal(:active, pom.status_name)
|
44
55
|
end
|
45
56
|
|
57
|
+
def test_before_finish_break_success
|
58
|
+
hook_name = 'before-finish-break'
|
59
|
+
br3ak = Break.new
|
60
|
+
br3ak.id = SecureRandom.random_number(1000)
|
61
|
+
br3ak.start
|
62
|
+
token_file = create_hook('Break', hook_name)
|
63
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
64
|
+
br3ak.finish
|
65
|
+
assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
66
|
+
assert_equal(:finished, br3ak.status_name)
|
67
|
+
assert_equal("Break #{br3ak.id} #{br3ak.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_before_finish_break_error
|
71
|
+
hook_name = 'before-finish-break'
|
72
|
+
br3ak = Break.new
|
73
|
+
br3ak.id = SecureRandom.random_number(1000)
|
74
|
+
br3ak.start
|
75
|
+
token_file = create_hook('Break', hook_name, false)
|
76
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
77
|
+
|
78
|
+
assert_raises HookFailedError do
|
79
|
+
br3ak.finish
|
80
|
+
end
|
81
|
+
|
82
|
+
refute_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
83
|
+
assert_equal(:active, br3ak.status_name)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_before_interrupt_success
|
87
|
+
hook_name = 'before-interrupt-pomodoro'
|
88
|
+
pom = Pomodoro.new
|
89
|
+
pom.start
|
90
|
+
token_file = create_hook('Pomodoro', hook_name)
|
91
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
92
|
+
pom.interrupt
|
93
|
+
assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
94
|
+
assert_equal(:active, pom.status_name)
|
95
|
+
assert_equal("Pomodoro #{Repository.next_id} #{pom.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_before_interrupt_error
|
99
|
+
hook_name = 'before-interrupt-pomodoro'
|
100
|
+
pom = Pomodoro.new
|
101
|
+
pom.start
|
102
|
+
token_file = create_hook('Pomodoro', hook_name, false)
|
103
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
104
|
+
|
105
|
+
assert_raises HookFailedError do
|
106
|
+
pom.interrupt
|
107
|
+
end
|
108
|
+
|
109
|
+
refute_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
110
|
+
assert_equal(:active, pom.status_name)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_after_interrupt_success
|
114
|
+
hook_name = 'after-interrupt-pomodoro'
|
115
|
+
pom = Pomodoro.new
|
116
|
+
pom.start
|
117
|
+
token_file = create_hook('Pomodoro', hook_name, false)
|
118
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
119
|
+
|
120
|
+
assert_raises HookFailedError do
|
121
|
+
pom.interrupt
|
122
|
+
end
|
123
|
+
|
124
|
+
refute_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
125
|
+
assert_equal(:active, pom.status_name)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_after_interrupt_error
|
129
|
+
hook_name = 'after-interrupt-pomodoro'
|
130
|
+
pom = Pomodoro.new
|
131
|
+
pom.start
|
132
|
+
token_file = create_hook('Pomodoro', hook_name)
|
133
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
134
|
+
pom.interrupt
|
135
|
+
assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
136
|
+
assert_equal(:active, pom.status_name)
|
137
|
+
assert_equal("Pomodoro #{Repository.next_id} #{pom.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_before_cancel_success
|
141
|
+
hook_name = 'before-cancel-pomodoro'
|
142
|
+
pom = Pomodoro.new
|
143
|
+
pom.start
|
144
|
+
token_file = create_hook('Pomodoro', hook_name)
|
145
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
146
|
+
pom.cancel
|
147
|
+
assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
148
|
+
assert_equal(:canceled, pom.status_name)
|
149
|
+
assert_equal("Pomodoro #{Repository.next_id} #{pom.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_before_cancel_error
|
153
|
+
hook_name = 'before-cancel-pomodoro'
|
154
|
+
pom = Pomodoro.new
|
155
|
+
pom.start
|
156
|
+
token_file = create_hook('Pomodoro', hook_name, false)
|
157
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
158
|
+
|
159
|
+
assert_raises HookFailedError do
|
160
|
+
pom.cancel
|
161
|
+
end
|
162
|
+
|
163
|
+
refute_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
164
|
+
assert_equal(:active, pom.status_name)
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_after_cancel_success
|
168
|
+
hook_name = 'after-cancel-pomodoro'
|
169
|
+
pom = Pomodoro.new
|
170
|
+
pom.start
|
171
|
+
token_file = create_hook('Pomodoro', hook_name, false)
|
172
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
173
|
+
|
174
|
+
assert_raises HookFailedError do
|
175
|
+
pom.cancel
|
176
|
+
end
|
177
|
+
|
178
|
+
refute_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
179
|
+
assert_equal(:canceled, pom.status_name)
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_after_cancel_error
|
183
|
+
hook_name = 'after-cancel-pomodoro'
|
184
|
+
pom = Pomodoro.new
|
185
|
+
pom.start
|
186
|
+
token_file = create_hook('Pomodoro', hook_name)
|
187
|
+
refute_path_exists(token_file, "Token file must not exist before #{hook_name} hook is executed")
|
188
|
+
pom.cancel
|
189
|
+
assert_path_exists(token_file, "#{hook_name} hook should have created a token file")
|
190
|
+
assert_equal(:canceled, pom.status_name)
|
191
|
+
assert_equal("Pomodoro #{Repository.next_id} #{pom.started_at.strftime('%H:%M')}", File.read(token_file).chomp)
|
192
|
+
end
|
193
|
+
|
46
194
|
private
|
47
195
|
|
48
|
-
def create_hook(
|
196
|
+
def create_hook(thing, hook_name, hook_succeeds = true)
|
49
197
|
token_file = File.join(Dir.tmpdir, SecureRandom.uuid)
|
50
198
|
|
51
199
|
hooks_dir = Paradeiser.hooks_dir
|
52
200
|
FileUtils.mkdir(hooks_dir)
|
53
201
|
|
54
|
-
hook_file = File.join(hooks_dir,
|
202
|
+
hook_file = File.join(hooks_dir, hook_name)
|
55
203
|
|
56
204
|
File.open(hook_file, 'w') do |f|
|
57
205
|
if hook_succeeds
|
58
|
-
f.write(hook_contents_success(token_file))
|
206
|
+
f.write(hook_contents_success(thing, token_file))
|
59
207
|
else
|
60
208
|
f.write(hook_contents_failure)
|
61
209
|
end
|
@@ -67,10 +215,10 @@ private
|
|
67
215
|
token_file
|
68
216
|
end
|
69
217
|
|
70
|
-
def hook_contents_success(token_file)
|
218
|
+
def hook_contents_success(thing, token_file)
|
71
219
|
hook_contents =<<"EOF"
|
72
220
|
#!/bin/sh
|
73
|
-
echo "
|
221
|
+
echo "#{thing} $PAR_#{thing.upcase}_ID $PAR_#{thing.upcase}_STARTED_AT" > #{token_file}
|
74
222
|
EOF
|
75
223
|
end
|
76
224
|
|