paradeiser 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Guardfile +1 -0
  4. data/README.md +98 -6
  5. data/TODO.md +22 -6
  6. data/VISION.md +171 -26
  7. data/bin/par +20 -4
  8. data/lib/paradeiser/controllers/breaks_controller.rb +0 -1
  9. data/lib/paradeiser/controllers/controller.rb +15 -1
  10. data/lib/paradeiser/controllers/paradeiser_controller.rb +23 -1
  11. data/lib/paradeiser/controllers/pomodori_controller.rb +23 -1
  12. data/lib/paradeiser/errors.rb +6 -0
  13. data/lib/paradeiser/executor.rb +1 -1
  14. data/lib/paradeiser/initializers/inflections.rb +3 -0
  15. data/lib/paradeiser/models/break.rb +1 -0
  16. data/lib/paradeiser/models/pomodoro.rb +13 -1
  17. data/lib/paradeiser/models/repository.rb +11 -1
  18. data/lib/paradeiser/models/scheduled.rb +7 -1
  19. data/lib/paradeiser/refinements/pluralize.rb +10 -0
  20. data/lib/paradeiser/router.rb +0 -2
  21. data/lib/paradeiser/version.rb +1 -1
  22. data/lib/paradeiser/view.rb +1 -1
  23. data/lib/paradeiser/views/breaks/finish.erb +1 -0
  24. data/lib/paradeiser/views/breaks/start.erb +1 -0
  25. data/lib/paradeiser/views/paradeiser/init.erb +1 -1
  26. data/lib/paradeiser/views/paradeiser/report.erb +10 -4
  27. data/lib/paradeiser/views/paradeiser/status.erb +2 -1
  28. data/lib/paradeiser/views/pomodori/annotate.erb +1 -0
  29. data/lib/paradeiser/views/pomodori/cancel.erb +1 -0
  30. data/lib/paradeiser/views/pomodori/interrupt.erb +1 -0
  31. data/lib/paradeiser/views/pomodori/log.erb +1 -0
  32. data/lib/paradeiser/views/pomodori/start.erb +1 -1
  33. data/paradeiser.gemspec +2 -0
  34. data/test/bin/notify-send +1 -0
  35. data/test/helper.rb +7 -24
  36. data/test/integration/test_annotate.rb +19 -0
  37. data/test/integration/test_finish.rb +9 -0
  38. data/test/integration/test_interrupt.rb +9 -0
  39. data/test/integration/test_log.rb +12 -0
  40. data/test/integration/test_no_args.rb +7 -0
  41. data/test/integration/test_start.rb +7 -0
  42. data/test/integration/test_status.rb +10 -0
  43. data/test/integration/test_unknown.rb +7 -0
  44. data/test/lib/at_mock.rb +1 -1
  45. data/test/lib/controller_test.rb +25 -0
  46. data/test/lib/integration_test.rb +45 -0
  47. data/test/lib/paradeiser_controller_test.rb +7 -0
  48. data/test/lib/view_test.rb +12 -0
  49. data/test/unit/test_break.rb +7 -44
  50. data/test/unit/test_break_view.rb +22 -0
  51. data/test/unit/test_breaks_controller.rb +66 -0
  52. data/test/unit/test_paradeiser_controller_export.rb +107 -0
  53. data/test/unit/test_paradeiser_controller_report.rb +73 -26
  54. data/test/unit/test_paradeiser_controller_status.rb +42 -24
  55. data/test/unit/test_paradeiser_view_init.rb +7 -0
  56. data/test/unit/test_paradeiser_view_report.rb +132 -0
  57. data/test/unit/test_paradeiser_view_status.rb +17 -0
  58. data/test/unit/test_pomodori_controller.rb +241 -33
  59. data/test/unit/test_pomodori_view.rb +26 -13
  60. data/test/unit/test_pomodoro.rb +23 -81
  61. data/test/unit/test_pomodoro_hooks.rb +12 -25
  62. data/test/unit/test_repository.rb +5 -21
  63. data/test/unit/test_scheduler.rb +1 -1
  64. metadata +61 -8
  65. data/test/integration/test_par.rb +0 -17
  66. data/test/unit/test_break_controller.rb +0 -56
  67. data/test/unit/test_paradeiser_view.rb +0 -66
@@ -1,44 +1,91 @@
1
1
  require 'helper'
2
2
 
3
- class TestParadeiserControllerReport < ControllerTest
3
+ class TestParadeiserControllerReport < ParadeiserControllerTest
4
+ ATTR_NAMES = %w{has_output @finished @canceled @external_interrupts @internal_interrupts @breaks @break_minutes}
5
+
4
6
  def setup
5
7
  @backend = PStoreMock.new
6
8
  end
7
9
 
8
10
  def test_idle
9
- br3ak, has_output = invoke(:report, '@pom', 'has_output')
10
- assert_empty(br3ak)
11
- assert_equal(true, has_output)
11
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
12
+ assert_equal(0, attrs[:finished])
13
+ end
14
+
15
+ def test_has_output
16
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
17
+ assert_equal(true, attrs[:has_output])
18
+ end
19
+
20
+ def test_finished
21
+ pom = produce(Pomodoro) # can't use mocks as long as the controller uses kind_of?
22
+ pom.started_at = Time.new(8)
23
+ pom.finished_at = Time.new(16)
24
+ pom.finish!
25
+ @backend[:bar] = pom
26
+
27
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
28
+ assert_equal(1, attrs[:finished])
12
29
  end
13
30
 
14
- def test_active_break
15
- @backend[:foo] = SchedulableMock.new(:status_name => :active)
31
+ def test_canceled
32
+ pom = produce(Pomodoro)
33
+ pom.started_at = Time.new(16)
34
+ pom.canceled_at = Time.new(24)
35
+ pom.cancel!
36
+ @backend[:bar] = pom
16
37
 
17
- br3ak, has_output = invoke(:report, '@pom', 'has_output')
18
- assert_equal(1, br3ak.size)
19
- assert_equal(true, has_output)
38
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
39
+ assert_equal(1, attrs[:canceled])
20
40
  end
21
41
 
22
- def test_finished_break
23
- @backend[:foo] = SchedulableMock.new(:status_name => :finished)
24
- @backend[:bar] = SchedulableMock.new(:status_name => :active)
25
- br3ak, has_output = invoke(:report, '@pom', 'has_output')
26
- assert_equal(2, br3ak.size)
27
- assert_equal(true, has_output)
42
+ def test_external_interrupts
43
+ pom = produce(Pomodoro)
44
+ pom.started_at = Time.new(24)
45
+ pom.canceled_at = Time.new(32)
46
+ pom.interrupt!(:external)
47
+ @backend[:bar] = pom
48
+
49
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
50
+ assert_equal(1, attrs[:external_interrupts])
28
51
  end
29
52
 
30
- def test_active_pom
31
- @backend[:bar] = SchedulableMock.new(:status_name => :active)
32
- pomodori, has_output = invoke(:report, '@pom', 'has_output')
33
- assert_equal(1, pomodori.size)
34
- assert_equal(true, has_output)
53
+ def test_internal_interrupts
54
+ pom = produce(Pomodoro)
55
+ pom.started_at = Time.new(32)
56
+ pom.canceled_at = Time.new(64)
57
+ pom.interrupt!(:internal)
58
+ @backend[:bar] = pom
59
+
60
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
61
+ assert_equal(1, attrs[:internal_interrupts])
35
62
  end
36
63
 
37
- def test_finished_pom
38
- @backend[:foo] = SchedulableMock.new(:status_name => :finished)
39
- @backend[:bar] = SchedulableMock.new(:status_name => :active)
40
- pomodori, has_output = invoke(:report, '@pom', 'has_output')
41
- assert_equal(2, pomodori.size)
42
- assert_equal(true, has_output)
64
+ def test_breaks
65
+ br3ak = produce(Break)
66
+ br3ak.started_at = Time.new(164)
67
+ br3ak.finished_at = Time.new(128)
68
+ @backend[:foo] = br3ak
69
+
70
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
71
+ assert_equal(1, attrs[:breaks])
72
+ end
73
+
74
+ def test_break_minutes
75
+ @backend[:foo] = make_break(5)
76
+ @backend[:bar] = make_break(3)
77
+ @backend[:baz] = make_break(2)
78
+
79
+ attrs = invoke(:report, nil, nil, *ATTR_NAMES)
80
+ assert_equal(10, attrs[:break_minutes])
81
+ end
82
+
83
+ private
84
+
85
+ def make_break(minutes = 5)
86
+ Break.new.tap do |b|
87
+ b.started_at = srand
88
+ b.finished_at = b.started_at + minutes * 60
89
+ end
43
90
  end
44
91
  end
@@ -1,14 +1,16 @@
1
1
  require 'helper'
2
2
 
3
- class TestParadeiserControllerStatus < ControllerTest
3
+ class TestParadeiserControllerStatus < ParadeiserControllerTest
4
4
  def setup
5
5
  @backend = PStoreMock.new
6
6
  end
7
7
 
8
8
  def test_status_idle
9
- exitstatus, has_output = invoke(:status, 'exitstatus', 'has_output')
10
- assert_equal(-1, exitstatus)
11
- assert_equal(true, has_output)
9
+ attrs = invoke(:status, nil, nil, 'exitstatus', 'has_output')
10
+ assert_equal(-1, attrs[:exitstatus])
11
+ assert_equal(true, attrs[:has_output])
12
+ refute_empty(attrs[:stdout])
13
+ assert_empty(attrs[:stderr])
12
14
  assert_equal(0, @backend.size)
13
15
  end
14
16
 
@@ -17,12 +19,16 @@ class TestParadeiserControllerStatus < ControllerTest
17
19
  :status => 'active',
18
20
  :status_name => :active,
19
21
  :active => true,
20
- :name => 'pomodoro')
22
+ :name => 'pomodoro',
23
+ :remaining => 0,
24
+ :started_at => Time.now)
21
25
 
22
- pom, has_output, exitstatus = invoke(:status, '@pom', 'has_output', 'exitstatus')
23
- assert_equal(0, exitstatus)
24
- assert_equal(:active, pom.status_name)
25
- assert_equal(true, has_output)
26
+ attrs = invoke(:status, nil, nil, '@pom', 'has_output', 'exitstatus')
27
+ assert_equal(0, attrs[:exitstatus])
28
+ assert_equal(:active, attrs[:pom].status_name)
29
+ assert_equal(true, attrs[:has_output])
30
+ refute_empty(attrs[:stdout])
31
+ assert_empty(attrs[:stderr])
26
32
  assert_equal(1, @backend.size)
27
33
  end
28
34
 
@@ -31,12 +37,16 @@ class TestParadeiserControllerStatus < ControllerTest
31
37
  :status => 'finished',
32
38
  :status_name => :finished,
33
39
  :finished => true,
34
- :name => 'pomodoro')
40
+ :name => 'pomodoro',
41
+ :remaining => 0,
42
+ :finished_at => Time.now)
35
43
 
36
- pom, has_output, exitstatus = invoke(:status, '@pom', 'has_output', 'exitstatus')
37
- assert_equal(1, exitstatus)
38
- assert_equal(:finished, pom.status_name)
39
- assert_equal(true, has_output)
44
+ attrs = invoke(:status, nil, nil, '@pom', 'has_output', 'exitstatus')
45
+ assert_equal(1, attrs[:exitstatus])
46
+ assert_equal(:finished, attrs[:pom].status_name)
47
+ assert_equal(true, attrs[:has_output])
48
+ refute_empty(attrs[:stdout])
49
+ assert_empty(attrs[:stderr])
40
50
  assert_equal(1, @backend.size)
41
51
  end
42
52
 
@@ -45,12 +55,16 @@ class TestParadeiserControllerStatus < ControllerTest
45
55
  :status => 'active',
46
56
  :status_name => :active,
47
57
  :active => true,
48
- :name => 'break')
58
+ :name => 'break',
59
+ :remaining => 0,
60
+ :started_at => Time.now)
49
61
 
50
- pom, has_output, exitstatus = invoke(:status, '@pom', 'has_output', 'exitstatus')
51
- assert_equal(2, exitstatus)
52
- assert_equal(:active, pom.status_name)
53
- assert_equal(true, has_output)
62
+ attrs = invoke(:status, nil, nil, '@pom', 'has_output', 'exitstatus')
63
+ assert_equal(2, attrs[:exitstatus])
64
+ assert_equal(:active, attrs[:pom].status_name)
65
+ assert_equal(true, attrs[:has_output])
66
+ refute_empty(attrs[:stdout])
67
+ assert_empty(attrs[:stderr])
54
68
  assert_equal(1, @backend.size)
55
69
  end
56
70
 
@@ -59,12 +73,16 @@ class TestParadeiserControllerStatus < ControllerTest
59
73
  :status => 'finished',
60
74
  :status_name => :finished,
61
75
  :finished => true,
62
- :name => 'break')
76
+ :name => 'break',
77
+ :remaining => 0,
78
+ :finished_at => Time.now)
63
79
 
64
- pom, has_output, exitstatus = invoke(:status, '@pom', 'has_output', 'exitstatus')
65
- assert_equal(3, exitstatus)
66
- assert_equal(:finished, pom.status_name)
67
- assert_equal(true, has_output)
80
+ attrs = invoke(:status, nil, nil, '@pom', 'has_output', 'exitstatus')
81
+ assert_equal(3, attrs[:exitstatus])
82
+ assert_equal(:finished, attrs[:pom].status_name)
83
+ assert_equal(true, attrs[:has_output])
84
+ refute_empty(attrs[:stdout])
85
+ assert_empty(attrs[:stderr])
68
86
  assert_equal(1, @backend.size)
69
87
  end
70
88
  end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestParadeiserViewInit < ParadeiserViewTest
4
+ def test_init
5
+ assert_match(/^Successfully initialized .+\.$/, render(:init))
6
+ end
7
+ end
@@ -0,0 +1,132 @@
1
+ require 'helper'
2
+
3
+ class TestParadeiserViewReport < ParadeiserViewTest
4
+
5
+ def setup
6
+ @annotations = []
7
+ end
8
+
9
+ def test_report_0
10
+ out = render(:report)
11
+ assert(out)
12
+ lines = out.lines
13
+ assert_equal(6, lines.size)
14
+
15
+ i = 0
16
+ assert_equal('# Pomodoro Report', lines[i].chomp)
17
+
18
+ i += 1
19
+ assert_match(/^- \d pomodori finished$/, lines[i].chomp)
20
+ assert_equal('0', lines[i][2])
21
+
22
+ i += 1
23
+ assert_match(/^- \d pomodori canceled$/, lines[i].chomp)
24
+ assert_equal('0', lines[i][2])
25
+
26
+ i += 1
27
+ assert_match(/^- \d internal interrupts$/, lines[i].chomp)
28
+ assert_equal('0', lines[i][2])
29
+
30
+ i += 1
31
+ assert_match(/^- \d external interrupts$/, lines[i].chomp)
32
+ assert_equal('0', lines[i][2])
33
+
34
+ i += 1
35
+ assert_match(/^- \d breaks \(\d minutes in total\)$/, lines[i].chomp)
36
+ assert_equal('0', lines[i][2])
37
+ assert_equal('0', lines[i][12])
38
+ end
39
+
40
+ def test_report_1
41
+ @finished = 1
42
+ @canceled = 1
43
+ @external_interrupts = 1
44
+ @internal_interrupts = 1
45
+ @breaks = 1
46
+ @break_minutes = 1
47
+
48
+ out = render(:report)
49
+ assert(out)
50
+ lines = out.lines
51
+ assert_equal(6, lines.size)
52
+
53
+ i = 0
54
+ assert_equal('# Pomodoro Report', lines[i].chomp)
55
+
56
+ i += 1
57
+ assert_match(/^- \d pomodoro finished$/, lines[i].chomp)
58
+ assert_equal('1', lines[i][2])
59
+
60
+ i += 1
61
+ assert_match(/^- \d pomodoro canceled$/, lines[i].chomp)
62
+ assert_equal('1', lines[i][2])
63
+
64
+ i += 1
65
+ assert_match(/^- \d internal interrupt$/, lines[i].chomp)
66
+ assert_equal('1', lines[i][2])
67
+
68
+ i += 1
69
+ assert_match(/^- \d external interrupt$/, lines[i].chomp)
70
+ assert_equal('1', lines[i][2])
71
+
72
+ i += 1
73
+ assert_match(/^- \d break \(\d minute in total\)$/, lines[i].chomp)
74
+ assert_equal('1', lines[i][2])
75
+ assert_equal('1', lines[i][11])
76
+ end
77
+
78
+ def test_report_2
79
+ @finished = 2
80
+ @canceled = 2
81
+ @external_interrupts = 2
82
+ @internal_interrupts = 2
83
+ @breaks = 2
84
+ @break_minutes = 2
85
+
86
+ out = render(:report)
87
+ assert(out)
88
+ lines = out.lines
89
+ assert_equal(6, lines.size)
90
+
91
+ i = 0
92
+ assert_equal('# Pomodoro Report', lines[i].chomp)
93
+
94
+ i += 1
95
+ assert_match(/^- \d pomodori finished$/, lines[i].chomp)
96
+ assert_equal('2', lines[i][2])
97
+
98
+ i += 1
99
+ assert_match(/^- \d pomodori canceled$/, lines[i].chomp)
100
+ assert_equal('2', lines[i][2])
101
+
102
+ i += 1
103
+ assert_match(/^- \d internal interrupts$/, lines[i].chomp)
104
+ assert_equal('2', lines[i][2])
105
+
106
+ i += 1
107
+ assert_match(/^- \d external interrupts$/, lines[i].chomp)
108
+ assert_equal('2', lines[i][2])
109
+
110
+ i += 1
111
+ assert_match(/^- \d breaks \(\d minutes in total\)$/, lines[i].chomp)
112
+ assert_equal('2', lines[i][2])
113
+ assert_equal('2', lines[i][12])
114
+ end
115
+
116
+ def test_report_annotations
117
+ @annotations = ['seven eleven', 'fourty two', 'something real']
118
+
119
+ out = render(:report)
120
+ assert(out)
121
+ lines = out.lines
122
+ assert_equal(11, lines.size)
123
+
124
+ i = 7
125
+ assert_equal('## Annotations', lines[i].chomp)
126
+
127
+ i += 1
128
+ @annotations.each_with_index do |annotation, ai|
129
+ assert_equal("* #{annotation}", lines[i + ai].chomp)
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,17 @@
1
+ require 'helper'
2
+
3
+ class TestParadeiserViewStatus < ParadeiserViewTest
4
+ def setup
5
+ @pom = produce(Pomodoro)
6
+ @pom.id = 1
7
+ end
8
+
9
+ def test_active
10
+ assert_match(/^Pomodoro #1 is active for another .* minutes \(started at .*\)\.$/m, render(:status))
11
+ end
12
+
13
+ def test_finished
14
+ finish!
15
+ assert_match(/^Nothing active. Last pomodoro was finished at .*\.$/m, render(:status))
16
+ end
17
+ end
@@ -1,14 +1,29 @@
1
1
  require 'helper'
2
2
 
3
- class TestPomodoriController < MiniTest::Test
3
+ class TestPomodoriController < ControllerTest
4
4
  def setup
5
5
  @backend = PStoreMock.new
6
6
  end
7
7
 
8
+ def model
9
+ 'pomodoro'
10
+ end
11
+
8
12
  def test_start
9
- pom, has_output = invoke(:start, nil, '@pom', 'has_output')
10
- assert_equal(:active, pom.status_name)
11
- assert_equal(false, has_output)
13
+ attrs = invoke(:start, nil, nil, '@pom', 'has_output')
14
+ assert_equal(:active, attrs[:pom].status_name)
15
+ assert_equal(false, attrs[:has_output])
16
+ assert_empty(attrs[:stdout])
17
+ assert_empty(attrs[:stderr])
18
+ assert_equal(1, @backend.size)
19
+ end
20
+
21
+ def test_start_verbose
22
+ attrs = invoke(:start, nil, OpenStruct.new(:verbose => true), '@pom', 'has_output')
23
+ assert_equal(:active, attrs[:pom].status_name)
24
+ assert_equal(false, attrs[:has_output])
25
+ refute_empty(attrs[:stdout])
26
+ assert_empty(attrs[:stderr])
12
27
  assert_equal(1, @backend.size)
13
28
  end
14
29
 
@@ -24,9 +39,21 @@ class TestPomodoriController < MiniTest::Test
24
39
 
25
40
  def test_finish
26
41
  invoke(:start)
27
- pom, has_output = invoke(:finish, nil, '@pom', 'has_output')
28
- assert_equal(:finished, pom.status_name)
29
- assert_equal(false, has_output)
42
+ attrs = invoke(:finish, nil, nil, '@pom', 'has_output')
43
+ assert_equal(:finished, attrs[:pom].status_name)
44
+ assert_equal(false, attrs[:has_output])
45
+ assert_empty(attrs[:stdout])
46
+ assert_empty(attrs[:stderr])
47
+ assert_equal(1, @backend.size)
48
+ end
49
+
50
+ def test_finish_verbose
51
+ invoke(:start)
52
+ attrs = invoke(:finish, nil, OpenStruct.new(:verbose => true), '@pom', 'has_output')
53
+ assert_equal(:finished, attrs[:pom].status_name)
54
+ assert_equal(false, attrs[:has_output])
55
+ refute_empty(attrs[:stdout])
56
+ assert_empty(attrs[:stderr])
30
57
  assert_equal(1, @backend.size)
31
58
  end
32
59
 
@@ -58,10 +85,12 @@ class TestPomodoriController < MiniTest::Test
58
85
 
59
86
  def test_interrupt_active
60
87
  invoke(:start)
61
- pom, has_output = invoke(:interrupt, OpenStruct.new, '@pom', 'has_output')
62
- assert_equal(:active, pom.status_name)
88
+ attrs = invoke(:interrupt, nil, OpenStruct.new, '@pom', 'has_output')
89
+ assert_equal(:active, attrs[:pom].status_name)
90
+ assert_empty(attrs[:stdout])
91
+ assert_empty(attrs[:stderr])
63
92
 
64
- interrupts = pom.interrupts
93
+ interrupts = attrs[:pom].interrupts
65
94
  refute_nil(interrupts)
66
95
  refute_empty(interrupts)
67
96
  assert_equal(1, interrupts.size)
@@ -72,17 +101,25 @@ class TestPomodoriController < MiniTest::Test
72
101
  assert_equal(:internal, interrupt.type)
73
102
  end
74
103
 
104
+ def test_interrupt_active_verbose
105
+ invoke(:start)
106
+ attrs = invoke(:interrupt, nil, OpenStruct.new(:verbose => true), '@pom', 'has_output')
107
+ assert_equal(:active, attrs[:pom].status_name)
108
+ refute_empty(attrs[:stdout])
109
+ assert_empty(attrs[:stderr])
110
+ end
111
+
75
112
  def test_interrupt_active_internal
76
113
  invoke(:start)
77
- pom = invoke(:interrupt, OpenStruct.new(:internal => true), '@pom')
78
- interrupt = pom.interrupts.first
114
+ attrs = invoke(:interrupt, nil, OpenStruct.new(:internal => true), '@pom')
115
+ interrupt = attrs[:pom].interrupts.first
79
116
  assert_equal(:internal, interrupt.type)
80
117
  end
81
118
 
82
119
  def test_interrupt_active_external
83
120
  invoke(:start)
84
- pom = invoke(:interrupt, OpenStruct.new(:external => true), '@pom')
85
- interrupt = pom.interrupts.first
121
+ attrs = invoke(:interrupt, nil, OpenStruct.new(:external => true), '@pom')
122
+ interrupt = attrs[:pom].interrupts.first
86
123
  assert_equal(:external, interrupt.type)
87
124
  end
88
125
 
@@ -107,9 +144,21 @@ class TestPomodoriController < MiniTest::Test
107
144
 
108
145
  def test_cancel_active
109
146
  invoke(:start)
110
- pom, has_output = invoke(:cancel, nil, '@pom', 'has_output')
111
- assert_equal(:canceled, pom.status_name)
112
- assert_equal(false, has_output)
147
+ attrs = invoke(:cancel, nil, nil, '@pom', 'has_output')
148
+ assert_equal(:canceled, attrs[:pom].status_name)
149
+ assert_equal(false, attrs[:has_output])
150
+ assert_empty(attrs[:stdout])
151
+ assert_empty(attrs[:stderr])
152
+ assert_equal(1, @backend.size)
153
+ end
154
+
155
+ def test_cancel_active_verbose
156
+ invoke(:start)
157
+ attrs = invoke(:cancel, nil, OpenStruct.new(:verbose => true), '@pom', 'has_output')
158
+ assert_equal(:canceled, attrs[:pom].status_name)
159
+ assert_equal(false, attrs[:has_output])
160
+ refute_empty(attrs[:stdout])
161
+ assert_empty(attrs[:stderr])
113
162
  assert_equal(1, @backend.size)
114
163
  end
115
164
 
@@ -133,27 +182,186 @@ class TestPomodoriController < MiniTest::Test
133
182
  assert_equal(2, @backend.size)
134
183
  end
135
184
 
136
- private
185
+ def test_log_active
186
+ invoke(:start)
187
+ annotation_args = name.split('_')
188
+ attrs = invoke(:log, annotation_args, nil, '@pom', 'has_output')
189
+ pom = attrs[:pom]
190
+ assert_kind_of(Pomodoro, pom)
191
+ assert_equal(:finished, pom.status_name)
192
+ end
137
193
 
138
- def invoke(method, options = nil, *attributes)
139
- controller = PomodoriController.new(method)
194
+ def test_log_inactive
195
+ annotation_args = name.split('_')
196
+ now = srand
140
197
 
141
- Repository.stub :backend, @backend do
142
- Scheduler.stub(:add, nil) do
143
- Scheduler.stub(:clear, nil) do
144
- controller.call(nil, options)
145
- end
146
- end
198
+ attrs = Time.stub :now, Time.at(now) do
199
+ invoke(:log, annotation_args, nil, '@pom', 'has_output')
147
200
  end
148
201
 
149
- result = attributes.map do |attribute|
150
- controller.get_binding.eval(attribute)
151
- end
202
+ assert(attrs)
203
+ pom = attrs[:pom]
204
+ assert(pom)
205
+ assert_kind_of(Pomodoro, pom)
206
+ assert_equal(:finished, pom.status_name)
207
+ assert_equal(Time.at(now - Pomodoro::MINUTES_25 * 60), pom.started_at)
208
+ assert_equal(Time.at(now), pom.finished_at)
209
+
210
+ assert_empty(attrs[:stdout])
211
+ assert_empty(attrs[:stderr])
212
+ assert_equal(1, @backend.size)
213
+
214
+ annotations = attrs[:pom].annotations
215
+ assert(annotations)
216
+ assert_equal(1, annotations.size)
217
+ assert_equal(annotation_args.join(' '), annotations.first)
218
+ end
219
+
220
+ def test_log_active_verbose
221
+ invoke(:start)
222
+ attrs = invoke(:log, nil, OpenStruct.new(:verbose => true), '@pom', 'has_output')
223
+ assert_equal(:finished, attrs[:pom].status_name)
224
+ assert_equal(false, attrs[:has_output])
225
+ refute_empty(attrs[:stdout])
226
+ assert_empty(attrs[:stderr])
227
+ assert_equal(2, @backend.size)
228
+ end
229
+
230
+ def test_log_inactive_verbose
231
+ attrs = invoke(:log, nil, OpenStruct.new(:verbose => true), '@pom', 'has_output')
232
+ assert_equal(:finished, attrs[:pom].status_name)
233
+ assert_equal(false, attrs[:has_output])
234
+ refute_empty(attrs[:stdout])
235
+ assert_empty(attrs[:stderr])
236
+ assert_equal(1, @backend.size)
237
+ end
238
+
239
+ def test_annotate_active
240
+ invoke(:start)
241
+ annotation_args = 'foobar w00t'.split
242
+ attrs = invoke(:annotate, annotation_args, nil, '@pom', 'has_output')
243
+ assert_equal(:active, attrs[:pom].status_name)
244
+ assert_equal(false, attrs[:has_output])
245
+ assert_empty(attrs[:stdout])
246
+ assert_empty(attrs[:stderr])
247
+ assert_equal(1, @backend.size)
248
+ annotations = attrs[:pom].annotations
249
+ assert(annotations)
250
+ assert_equal(1, annotations.size)
251
+ assert_equal(annotation_args.join(' '), annotations.first)
252
+ end
253
+
254
+ def test_annotate_active_verbose
255
+ invoke(:start)
256
+ attrs = invoke(:annotate, ['annotation', 'args'], OpenStruct.new(:verbose => true), '@pom', 'has_output')
257
+ refute_empty(attrs[:stdout])
258
+ assert_empty(attrs[:stderr])
259
+ end
260
+
261
+ def test_annotate_second_last_successful
262
+ invoke(:start)
263
+ invoke(:finish)
264
+
265
+ @backend[:foo] = SchedulableMock.new(
266
+ :status => 'finished',
267
+ :status_name => :finished,
268
+ :finished => true,
269
+ :name => 'break',
270
+ :remaining => 0,
271
+ :finished_at => Time.now)
152
272
 
153
- if 1 == result.size
154
- result.first
155
- else
156
- result
273
+ last = Repository.stub :backend, @backend do
274
+ Repository.all.last
157
275
  end
276
+ assert_kind_of(SchedulableMock, last)
277
+
278
+ annotation_args = name.split('_')
279
+ attrs = invoke(:annotate, annotation_args, nil, '@pom', 'has_output')
280
+
281
+ pom = attrs[:pom]
282
+ assert_kind_of(Pomodoro, pom)
283
+ assert_equal(:finished, pom.status_name)
284
+
285
+ annotations = pom.annotations
286
+ assert(annotations)
287
+ assert_equal(1, annotations.size)
288
+ assert_equal(annotation_args.join(' '), annotations.first)
289
+ end
290
+
291
+ def test_annotate_last_successful
292
+ invoke(:start)
293
+ invoke(:finish)
294
+ annotation_args = name.split('_')
295
+ attrs = invoke(:annotate, annotation_args, nil, '@pom', 'has_output')
296
+ assert_equal(:finished, attrs[:pom].status_name)
297
+ assert_equal(false, attrs[:has_output])
298
+ assert_empty(attrs[:stdout])
299
+ assert_empty(attrs[:stderr])
300
+ assert_equal(1, @backend.size)
301
+ annotations = attrs[:pom].annotations
302
+ assert(annotations)
303
+ assert_equal(1, annotations.size)
304
+ assert_equal(annotation_args.join(' '), annotations.first)
305
+ end
306
+
307
+ def test_annotate_last_canceled
308
+ invoke(:start)
309
+ invoke(:cancel)
310
+ annotation_args = name.split('_')
311
+ attrs = invoke(:annotate, annotation_args, nil, '@pom', 'has_output')
312
+ assert_equal(:canceled, attrs[:pom].status_name)
313
+ assert_equal(false, attrs[:has_output])
314
+ assert_empty(attrs[:stdout])
315
+ assert_empty(attrs[:stderr])
316
+ assert_equal(1, @backend.size)
317
+ annotations = attrs[:pom].annotations
318
+ assert(annotations)
319
+ assert_equal(1, annotations.size)
320
+ assert_equal(annotation_args.join(' '), annotations.first)
321
+ end
322
+
323
+ def test_annotate_finish
324
+ invoke(:start)
325
+ annotation_args = name.split('_')
326
+ attrs = invoke(:finish, annotation_args, nil, '@pom', 'has_output')
327
+ assert_equal(:finished, attrs[:pom].status_name)
328
+ assert_equal(false, attrs[:has_output])
329
+ assert_empty(attrs[:stdout])
330
+ assert_empty(attrs[:stderr])
331
+ assert_equal(1, @backend.size)
332
+ annotations = attrs[:pom].annotations
333
+ assert(annotations)
334
+ assert_equal(1, annotations.size)
335
+ assert_equal(annotation_args.join(' '), annotations.first)
336
+ end
337
+
338
+ def test_annotate_interrupt
339
+ invoke(:start)
340
+ annotation_args = name.split('_')
341
+ attrs = invoke(:interrupt, annotation_args, OpenStruct.new, '@pom', 'has_output')
342
+ assert_equal(:active, attrs[:pom].status_name)
343
+ assert_equal(false, attrs[:has_output])
344
+ assert_empty(attrs[:stdout])
345
+ assert_empty(attrs[:stderr])
346
+ assert_equal(1, @backend.size)
347
+ annotations = attrs[:pom].annotations
348
+ assert(annotations)
349
+ assert_equal(1, annotations.size)
350
+ assert_equal(annotation_args.join(' '), annotations.first)
351
+ end
352
+
353
+ def test_annotate_cancel
354
+ invoke(:start)
355
+ annotation_args = name.split('_')
356
+ attrs = invoke(:cancel, annotation_args, nil, '@pom', 'has_output')
357
+ assert_equal(:canceled, attrs[:pom].status_name)
358
+ assert_equal(false, attrs[:has_output])
359
+ assert_empty(attrs[:stdout])
360
+ assert_empty(attrs[:stderr])
361
+ assert_equal(1, @backend.size)
362
+ annotations = attrs[:pom].annotations
363
+ assert(annotations)
364
+ assert_equal(1, annotations.size)
365
+ assert_equal(annotation_args.join(' '), annotations.first)
158
366
  end
159
367
  end