paradeiser 0.2.0 → 0.4.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.
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