whenever 0.9.2 → 0.9.3
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/.travis.yml +1 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +0 -5
- data/README.md +3 -1
- data/lib/whenever.rb +10 -11
- data/lib/whenever/capistrano/v3/tasks/whenever.rake +2 -2
- data/lib/whenever/command_line.rb +9 -9
- data/lib/whenever/cron.rb +11 -11
- data/lib/whenever/job.rb +2 -2
- data/lib/whenever/job_list.rb +18 -7
- data/lib/whenever/numeric_seconds.rb +54 -0
- data/lib/whenever/tasks/whenever.rake +2 -2
- data/lib/whenever/version.rb +1 -1
- data/test/functional/command_line_test.rb +221 -224
- data/test/functional/output_at_test.rb +188 -249
- data/test/functional/output_default_defined_jobs_test.rb +214 -290
- data/test/functional/output_defined_job_test.rb +65 -91
- data/test/functional/output_env_test.rb +22 -26
- data/test/functional/output_jobs_for_roles_test.rb +46 -66
- data/test/functional/output_redirection_test.rb +231 -309
- data/test/test_case.rb +39 -0
- data/test/test_helper.rb +33 -14
- data/test/unit/capistrano_support_test.rb +126 -148
- data/test/unit/cron_test.rb +188 -215
- data/test/unit/job_test.rb +111 -121
- data/whenever.gemspec +0 -2
- metadata +15 -41
data/test/test_case.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Whenever
|
2
|
+
begin
|
3
|
+
require 'minitest/autorun'
|
4
|
+
begin
|
5
|
+
# 2.0.0
|
6
|
+
class TestCase < MiniTest::Test; end
|
7
|
+
rescue NameError
|
8
|
+
# 1.9.3
|
9
|
+
class TestCase < MiniTest::Unit::TestCase; end
|
10
|
+
end
|
11
|
+
rescue LoadError
|
12
|
+
# 1.8.7
|
13
|
+
require 'test/unit'
|
14
|
+
class TestCase < Test::Unit::TestCase
|
15
|
+
def default_test; end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TestCase
|
20
|
+
class << self
|
21
|
+
def setup(&block)
|
22
|
+
define_method(:setup) do
|
23
|
+
super()
|
24
|
+
instance_eval(&block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test(name, &block)
|
29
|
+
define_method("test_#{name}".to_sym, &block)
|
30
|
+
end
|
31
|
+
alias should test
|
32
|
+
end
|
33
|
+
|
34
|
+
def assert_no_match(regexp, string)
|
35
|
+
message = "<#{regexp}> expected to not match\n<#{string}>"
|
36
|
+
assert regexp !~ string, message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,18 +1,37 @@
|
|
1
|
-
# Want to test the files here, in lib, not in an installed version of the gem.
|
2
|
-
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
1
|
require 'whenever'
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
require 'mocha'
|
2
|
+
require 'test_case'
|
3
|
+
require 'mocha/setup'
|
7
4
|
|
8
|
-
module
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
module Whenever::TestHelpers
|
6
|
+
protected
|
7
|
+
def new_job(options={})
|
8
|
+
Whenever::Job.new(options)
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse_time(time = nil, task = nil, at = nil)
|
12
|
+
Whenever::Output::Cron.new(time, task, at).time_in_cron_syntax
|
13
|
+
end
|
14
|
+
|
15
|
+
def two_hours
|
16
|
+
"0 0,2,4,6,8,10,12,14,16,18,20,22 * * *"
|
17
|
+
end
|
18
|
+
|
19
|
+
def assert_days_and_hours_and_minutes_equals(expected, time)
|
20
|
+
cron = parse_time(Whenever.seconds(2, :months), 'some task', time)
|
21
|
+
minutes, hours, days, *garbage = cron.split(' ')
|
22
|
+
assert_equal expected, [days, hours, minutes]
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert_hours_and_minutes_equals(expected, time)
|
26
|
+
cron = parse_time(Whenever.seconds(2, :days), 'some task', time)
|
27
|
+
minutes, hours, *garbage = cron.split(' ')
|
28
|
+
assert_equal expected, [hours, minutes]
|
29
|
+
end
|
30
|
+
|
31
|
+
def assert_minutes_equals(expected, time)
|
32
|
+
cron = parse_time(Whenever.seconds(2, :hours), 'some task', time)
|
33
|
+
assert_equal expected, cron.split(' ')[0]
|
34
|
+
end
|
14
35
|
end
|
15
36
|
|
16
|
-
|
17
|
-
include TestExtensions
|
18
|
-
end
|
37
|
+
Whenever::TestCase.send(:include, Whenever::TestHelpers)
|
@@ -1,169 +1,147 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'test_helper'
|
2
|
+
require 'whenever/capistrano/v2/support'
|
3
3
|
|
4
4
|
class CapistranoSupportTestSubject
|
5
5
|
include Whenever::CapistranoSupport
|
6
6
|
end
|
7
7
|
|
8
|
-
class
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
class CapistranoTestCase < Whenever::TestCase
|
9
|
+
setup do
|
10
|
+
@capistrano = CapistranoSupportTestSubject.new
|
11
|
+
configuration = mock()
|
12
|
+
configuration.stubs(:load).yields(@capistrano)
|
13
|
+
Whenever::CapistranoSupport.load_into(configuration)
|
14
|
+
end
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
17
|
+
class CapistranoSupportTest < CapistranoTestCase
|
18
|
+
should "return fetch(:whenever_options) from #whenever_options" do
|
19
|
+
@capistrano.expects(:fetch).with(:whenever_options)
|
20
|
+
@capistrano.whenever_options
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
should "return whenever_options[:roles] as an array from #whenever_roles with one role" do
|
24
|
+
@capistrano.stubs(:whenever_options).returns({:roles => :role1})
|
25
|
+
assert_equal [:role1], @capistrano.whenever_roles
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
should "return an empty array from #whenever_roles with no defined roles" do
|
29
|
+
@capistrano.stubs(:whenever_options).returns({})
|
30
|
+
assert_equal [], @capistrano.whenever_roles
|
31
|
+
end
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
33
|
+
should "return the list of servers returned by find_servers from #whenever_servers" do
|
34
|
+
@capistrano.stubs(:whenever_options).returns({})
|
35
|
+
@capistrano.stubs(:find_servers).returns([:server1, :server2])
|
38
36
|
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
37
|
+
assert_equal [:server1, :server2], @capistrano.whenever_servers
|
38
|
+
end
|
43
39
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
40
|
+
should "#whenever_prepare_for_rollback: set path to previous_release if there is a previous release" do
|
41
|
+
args = {}
|
42
|
+
@capistrano.stubs(:fetch).with(:previous_release).returns("/some/path/20121221010000")
|
43
|
+
assert_equal({:path => "/some/path/20121221010000"}, @capistrano.whenever_prepare_for_rollback(args))
|
44
|
+
end
|
48
45
|
|
49
|
-
|
50
|
-
|
46
|
+
should "#whenever_prepare_for_rollback: set path to release_path and flags to whenever_clear_flags if there is no previous release" do
|
47
|
+
args = {}
|
48
|
+
@capistrano.stubs(:fetch).with(:previous_release).returns(nil)
|
49
|
+
@capistrano.stubs(:fetch).with(:release_path).returns("/some/path/20121221010000")
|
50
|
+
@capistrano.stubs(:fetch).with(:whenever_clear_flags).returns("--clear-crontab whenever_identifier")
|
51
|
+
assert_equal({:path => "/some/path/20121221010000", :flags => "--clear-crontab whenever_identifier"}, @capistrano.whenever_prepare_for_rollback(args))
|
52
|
+
end
|
53
|
+
|
54
|
+
should "#whenever_run_commands: require :command arg" do
|
55
|
+
assert_raises ArgumentError do
|
56
|
+
@capistrano.whenever_run_commands(:options => {}, :path => {}, :flags => {})
|
51
57
|
end
|
58
|
+
end
|
52
59
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
@capistrano.stubs(:whenever_servers).returns(@mock_servers)
|
57
|
-
end
|
58
|
-
|
59
|
-
should "return a map of servers to their role(s)" do
|
60
|
-
@capistrano.stubs(:whenever_roles).returns([:role1, :role2])
|
61
|
-
@capistrano.stubs(:role_names_for_host).with("foo").returns([:role1])
|
62
|
-
@capistrano.stubs(:role_names_for_host).with("bar").returns([:role2])
|
63
|
-
assert_equal({"foo" => [:role1], "bar" => [:role2]}, @capistrano.whenever_server_roles)
|
64
|
-
end
|
65
|
-
|
66
|
-
should "exclude non-requested roles" do
|
67
|
-
@capistrano.stubs(:whenever_roles).returns([:role1, :role2])
|
68
|
-
@capistrano.stubs(:role_names_for_host).with("foo").returns([:role1, :role3])
|
69
|
-
@capistrano.stubs(:role_names_for_host).with("bar").returns([:role2])
|
70
|
-
assert_equal({"foo" => [:role1], "bar" => [:role2]}, @capistrano.whenever_server_roles)
|
71
|
-
end
|
72
|
-
|
73
|
-
should "include all roles for servers w/ >1 when they're requested" do
|
74
|
-
@capistrano.stubs(:whenever_roles).returns([:role1, :role2, :role3])
|
75
|
-
@capistrano.stubs(:role_names_for_host).with("foo").returns([:role1, :role3])
|
76
|
-
@capistrano.stubs(:role_names_for_host).with("bar").returns([:role2])
|
77
|
-
assert_equal({"foo" => [:role1, :role3], "bar" => [:role2]}, @capistrano.whenever_server_roles)
|
78
|
-
end
|
60
|
+
should "#whenever_run_commands: require :path arg" do
|
61
|
+
assert_raises ArgumentError do
|
62
|
+
@capistrano.whenever_run_commands(:options => {}, :command => {}, :flags => {})
|
79
63
|
end
|
64
|
+
end
|
80
65
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
@capistrano.stubs(:fetch).with(:previous_release).returns("/some/path/20121221010000")
|
85
|
-
assert_equal({:path => "/some/path/20121221010000"}, @capistrano.whenever_prepare_for_rollback(args))
|
86
|
-
end
|
87
|
-
|
88
|
-
should "set path to release_path and flags to whenever_clear_flags if there is no previous release" do
|
89
|
-
args = {}
|
90
|
-
@capistrano.stubs(:fetch).with(:previous_release).returns(nil)
|
91
|
-
@capistrano.stubs(:fetch).with(:release_path).returns("/some/path/20121221010000")
|
92
|
-
@capistrano.stubs(:fetch).with(:whenever_clear_flags).returns("--clear-crontab whenever_identifier")
|
93
|
-
assert_equal({:path => "/some/path/20121221010000", :flags => "--clear-crontab whenever_identifier"}, @capistrano.whenever_prepare_for_rollback(args))
|
94
|
-
end
|
66
|
+
should "#whenever_run_commands: require :flags arg" do
|
67
|
+
assert_raises ArgumentError do
|
68
|
+
@capistrano.whenever_run_commands(:options => {}, :path => {}, :command => {})
|
95
69
|
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class ServerRolesTest < CapistranoTestCase
|
74
|
+
setup do
|
75
|
+
@mock_servers = ["foo", "bar"]
|
76
|
+
@capistrano.stubs(:whenever_servers).returns(@mock_servers)
|
96
77
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
end
|
161
|
-
|
162
|
-
@capistrano.whenever_run_commands(:command => "whenever",
|
163
|
-
:path => "/foo/bar",
|
164
|
-
:flags => "--flag1 --flag2")
|
165
|
-
end
|
166
|
-
end
|
78
|
+
@mock_server1, @mock_server2, @mock_server3 = mock("Server1"), mock("Server2"), mock("Server3")
|
79
|
+
@mock_server1.stubs(:host).returns("server1.foo.com")
|
80
|
+
@mock_server2.stubs(:host).returns("server2.foo.com")
|
81
|
+
@mock_server3.stubs(:host => "server3.foo.com", :port => 1022, :user => 'test')
|
82
|
+
@mock_servers = [@mock_server1, @mock_server2]
|
83
|
+
end
|
84
|
+
|
85
|
+
should "return a map of servers to their role(s)" do
|
86
|
+
@capistrano.stubs(:whenever_roles).returns([:role1, :role2])
|
87
|
+
@capistrano.stubs(:role_names_for_host).with("foo").returns([:role1])
|
88
|
+
@capistrano.stubs(:role_names_for_host).with("bar").returns([:role2])
|
89
|
+
assert_equal({"foo" => [:role1], "bar" => [:role2]}, @capistrano.whenever_server_roles)
|
90
|
+
end
|
91
|
+
|
92
|
+
should "exclude non-requested roles" do
|
93
|
+
@capistrano.stubs(:whenever_roles).returns([:role1, :role2])
|
94
|
+
@capistrano.stubs(:role_names_for_host).with("foo").returns([:role1, :role3])
|
95
|
+
@capistrano.stubs(:role_names_for_host).with("bar").returns([:role2])
|
96
|
+
assert_equal({"foo" => [:role1], "bar" => [:role2]}, @capistrano.whenever_server_roles)
|
97
|
+
end
|
98
|
+
|
99
|
+
should "include all roles for servers w/ >1 when they're requested" do
|
100
|
+
@capistrano.stubs(:whenever_roles).returns([:role1, :role2, :role3])
|
101
|
+
@capistrano.stubs(:role_names_for_host).with("foo").returns([:role1, :role3])
|
102
|
+
@capistrano.stubs(:role_names_for_host).with("bar").returns([:role2])
|
103
|
+
assert_equal({"foo" => [:role1, :role3], "bar" => [:role2]}, @capistrano.whenever_server_roles)
|
104
|
+
end
|
105
|
+
|
106
|
+
should "call run for each host w/ appropriate role args" do
|
107
|
+
@capistrano.stubs(:role_names_for_host).with(@mock_server1).returns([:role1])
|
108
|
+
@capistrano.stubs(:role_names_for_host).with(@mock_server2).returns([:role2])
|
109
|
+
@capistrano.stubs(:whenever_servers).returns(@mock_servers)
|
110
|
+
roles = [:role1, :role2]
|
111
|
+
@capistrano.stubs(:whenever_options).returns({:roles => roles})
|
112
|
+
|
113
|
+
@capistrano.expects(:run).once.with('cd /foo/bar && whenever --flag1 --flag2 --roles role1', {:roles => roles, :hosts => @mock_server1})
|
114
|
+
@capistrano.expects(:run).once.with('cd /foo/bar && whenever --flag1 --flag2 --roles role2', {:roles => roles, :hosts => @mock_server2})
|
115
|
+
|
116
|
+
@capistrano.whenever_run_commands(:command => "whenever",
|
117
|
+
:path => "/foo/bar",
|
118
|
+
:flags => "--flag1 --flag2")
|
119
|
+
end
|
120
|
+
|
121
|
+
should "call run w/ all role args for servers w/ >1 role" do
|
122
|
+
@capistrano.stubs(:role_names_for_host).with(@mock_server1).returns([:role1, :role3])
|
123
|
+
@capistrano.stubs(:whenever_servers).returns([@mock_server1])
|
124
|
+
roles = [:role1, :role2, :role3]
|
125
|
+
@capistrano.stubs(:whenever_options).returns({:roles => roles})
|
126
|
+
|
127
|
+
@capistrano.expects(:run).once.with('cd /foo/bar && whenever --flag1 --flag2 --roles role1,role3', {:roles => roles, :hosts => @mock_server1})
|
128
|
+
|
129
|
+
@capistrano.whenever_run_commands(:command => "whenever",
|
130
|
+
:path => "/foo/bar",
|
131
|
+
:flags => "--flag1 --flag2")
|
132
|
+
end
|
133
|
+
|
134
|
+
should "call run w/ proper server options (port, user)" do
|
135
|
+
@capistrano.stubs(:role_names_for_host).with(@mock_server3).returns([:role3])
|
136
|
+
@capistrano.stubs(:whenever_servers).returns([@mock_server3])
|
137
|
+
@capistrano.stubs(:whenever_options).returns({:roles => [:role3]})
|
138
|
+
|
139
|
+
@capistrano.expects(:run).once.with do |command, options|
|
140
|
+
options[:hosts].user == "test" && options[:hosts].port == 1022
|
167
141
|
end
|
142
|
+
|
143
|
+
@capistrano.whenever_run_commands(:command => "whenever",
|
144
|
+
:path => "/foo/bar",
|
145
|
+
:flags => "--flag1 --flag2")
|
168
146
|
end
|
169
147
|
end
|
data/test/unit/cron_test.rb
CHANGED
@@ -1,253 +1,226 @@
|
|
1
|
-
require
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
|
-
class CronTest <
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
assert_raises ArgumentError do
|
8
|
-
parse_time(59.seconds)
|
9
|
-
end
|
10
|
-
|
11
|
-
assert_raises ArgumentError do
|
12
|
-
parse_time(0.minutes)
|
13
|
-
end
|
3
|
+
class CronTest < Whenever::TestCase
|
4
|
+
should "raise if less than 1 minute" do
|
5
|
+
assert_raises ArgumentError do
|
6
|
+
parse_time(Whenever.seconds(59, :seconds))
|
14
7
|
end
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
assert_equal '* * * * *', parse_time(1.minute)
|
19
|
-
assert_equal '0,5,10,15,20,25,30,35,40,45,50,55 * * * *', parse_time(5.minutes)
|
20
|
-
assert_equal '7,14,21,28,35,42,49,56 * * * *', parse_time(7.minutes)
|
21
|
-
assert_equal '0,30 * * * *', parse_time(30.minutes)
|
22
|
-
assert_equal '32 * * * *', parse_time(32.minutes)
|
23
|
-
assert_not_equal '60 * * * *', parse_time(60.minutes) # 60 minutes bumps up into the hour range
|
24
|
-
end
|
25
|
-
|
26
|
-
# Test all minutes
|
27
|
-
(2..59).each do |num|
|
28
|
-
should "parse correctly for #{num} minutes" do
|
29
|
-
start = 0
|
30
|
-
start += num unless 60.modulo(num).zero?
|
31
|
-
minutes = (start..59).step(num).to_a
|
32
|
-
|
33
|
-
assert_equal "#{minutes.join(',')} * * * *", parse_time(num.minutes)
|
34
|
-
end
|
9
|
+
assert_raises ArgumentError do
|
10
|
+
parse_time(Whenever.seconds(0, :minutes))
|
35
11
|
end
|
36
12
|
end
|
37
13
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
14
|
+
# For santity, do some tests on straight String
|
15
|
+
should "parse correctly" do
|
16
|
+
assert_equal '* * * * *', parse_time(Whenever.seconds(1, :minute))
|
17
|
+
assert_equal '0,5,10,15,20,25,30,35,40,45,50,55 * * * *', parse_time(Whenever.seconds(5, :minutes))
|
18
|
+
assert_equal '7,14,21,28,35,42,49,56 * * * *', parse_time(Whenever.seconds(7, :minutes))
|
19
|
+
assert_equal '0,30 * * * *', parse_time(Whenever.seconds(30, :minutes))
|
20
|
+
assert_equal '32 * * * *', parse_time(Whenever.seconds(32, :minutes))
|
21
|
+
assert '60 * * * *' != parse_time(Whenever.seconds(60, :minutes)) # 60 minutes bumps up into the hour range
|
22
|
+
end
|
47
23
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
24
|
+
# Test all minutes
|
25
|
+
(2..59).each do |num|
|
26
|
+
should "parse correctly for #{num} minutes" do
|
27
|
+
start = 0
|
28
|
+
start += num unless 60.modulo(num).zero?
|
29
|
+
minutes = (start..59).step(num).to_a
|
53
30
|
|
54
|
-
|
55
|
-
end
|
31
|
+
assert_equal "#{minutes.join(',')} * * * *", parse_time(Whenever.seconds(num, :minutes))
|
56
32
|
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class CronParseHoursTest < Whenever::TestCase
|
37
|
+
should "parse correctly" do
|
38
|
+
assert_equal '0 * * * *', parse_time(Whenever.seconds(1, :hour))
|
39
|
+
assert_equal '0 0,2,4,6,8,10,12,14,16,18,20,22 * * *', parse_time(Whenever.seconds(2, :hours))
|
40
|
+
assert_equal '0 0,3,6,9,12,15,18,21 * * *', parse_time(Whenever.seconds(3, :hours))
|
41
|
+
assert_equal '0 5,10,15,20 * * *', parse_time(Whenever.seconds(5, :hours))
|
42
|
+
assert_equal '0 17 * * *', parse_time(Whenever.seconds(17, :hours))
|
43
|
+
assert '0 24 * * *' != parse_time(Whenever.seconds(24, :hours)) # 24 hours bumps up into the day range
|
44
|
+
end
|
57
45
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
end
|
46
|
+
(2..23).each do |num|
|
47
|
+
should "parse correctly for #{num} hours" do
|
48
|
+
start = 0
|
49
|
+
start += num unless 24.modulo(num).zero?
|
50
|
+
hours = (start..23).step(num).to_a
|
64
51
|
|
65
|
-
|
66
|
-
# Basically just testing that Chronic parses some times and we get the minutes out of it
|
67
|
-
assert_minutes_equals "1", '3:01am'
|
68
|
-
assert_minutes_equals "1", 'January 21 2:01 PM'
|
69
|
-
assert_minutes_equals "0", 'midnight'
|
70
|
-
assert_minutes_equals "59", '13:59'
|
52
|
+
assert_equal "0 #{hours.join(',')} * * *", parse_time(Whenever.seconds(num, :hours))
|
71
53
|
end
|
72
54
|
end
|
73
55
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
assert_equal '0 0 1,17 * *', parse_time(16.days)
|
81
|
-
assert_equal '0 0 17 * *', parse_time(17.days)
|
82
|
-
assert_equal '0 0 29 * *', parse_time(29.days)
|
83
|
-
assert_not_equal '0 0 30 * *', parse_time(30.days) # 30 days bumps into the month range
|
84
|
-
end
|
85
|
-
|
86
|
-
should "parse correctly when given an 'at' with hours, minutes as a Time" do
|
87
|
-
# first param is an array with [hours, minutes]
|
88
|
-
assert_hours_and_minutes_equals %w(3 45), '3:45am'
|
89
|
-
assert_hours_and_minutes_equals %w(20 1), '8:01pm'
|
90
|
-
assert_hours_and_minutes_equals %w(0 0), 'midnight'
|
91
|
-
assert_hours_and_minutes_equals %w(1 23), '1:23 AM'
|
92
|
-
assert_hours_and_minutes_equals %w(23 59), 'March 21 11:59 pM'
|
93
|
-
end
|
56
|
+
should "parse correctly when given an 'at' with minutes as an Integer" do
|
57
|
+
assert_minutes_equals "1", 1
|
58
|
+
assert_minutes_equals "14", 14
|
59
|
+
assert_minutes_equals "27", 27
|
60
|
+
assert_minutes_equals "55", 55
|
61
|
+
end
|
94
62
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
63
|
+
should "parse correctly when given an 'at' with minutes as a Time" do
|
64
|
+
# Basically just testing that Chronic parses some times and we get the minutes out of it
|
65
|
+
assert_minutes_equals "1", '3:01am'
|
66
|
+
assert_minutes_equals "1", 'January 21 2:01 PM'
|
67
|
+
assert_minutes_equals "0", 'midnight'
|
68
|
+
assert_minutes_equals "59", '13:59'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class CronParseDaysTest < Whenever::TestCase
|
73
|
+
should "parse correctly" do
|
74
|
+
assert_equal '0 0 * * *', parse_time(Whenever.seconds(1, :days))
|
75
|
+
assert_equal '0 0 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * *', parse_time(Whenever.seconds(2, :days))
|
76
|
+
assert_equal '0 0 1,5,9,13,17,21,25,29 * *', parse_time(Whenever.seconds(4, :days))
|
77
|
+
assert_equal '0 0 1,8,15,22 * *', parse_time(Whenever.seconds(7, :days))
|
78
|
+
assert_equal '0 0 1,17 * *', parse_time(Whenever.seconds(16, :days))
|
79
|
+
assert_equal '0 0 17 * *', parse_time(Whenever.seconds(17, :days))
|
80
|
+
assert_equal '0 0 29 * *', parse_time(Whenever.seconds(29, :days))
|
81
|
+
assert '0 0 30 * *' != parse_time(Whenever.seconds(30, :days)) # 30 days bumps into the month range
|
103
82
|
end
|
104
83
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
assert_equal '0 0 1 8 *', parse_time(8.months)
|
114
|
-
assert_equal '0 0 1 9 *', parse_time(9.months)
|
115
|
-
assert_equal '0 0 1 10 *', parse_time(10.months)
|
116
|
-
assert_equal '0 0 1 11 *', parse_time(11.months)
|
117
|
-
assert_equal '0 0 1 12 *', parse_time(12.months)
|
118
|
-
end
|
84
|
+
should "parse correctly when given an 'at' with hours, minutes as a Time" do
|
85
|
+
# first param is an array with [hours, minutes]
|
86
|
+
assert_hours_and_minutes_equals %w(3 45), '3:45am'
|
87
|
+
assert_hours_and_minutes_equals %w(20 1), '8:01pm'
|
88
|
+
assert_hours_and_minutes_equals %w(0 0), 'midnight'
|
89
|
+
assert_hours_and_minutes_equals %w(1 23), '1:23 AM'
|
90
|
+
assert_hours_and_minutes_equals %w(23 59), 'March 21 11:59 pM'
|
91
|
+
end
|
119
92
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
93
|
+
should "parse correctly when given an 'at' with hours as an Integer" do
|
94
|
+
# first param is an array with [hours, minutes]
|
95
|
+
assert_hours_and_minutes_equals %w(1 0), 1
|
96
|
+
assert_hours_and_minutes_equals %w(3 0), 3
|
97
|
+
assert_hours_and_minutes_equals %w(15 0), 15
|
98
|
+
assert_hours_and_minutes_equals %w(19 0), 19
|
99
|
+
assert_hours_and_minutes_equals %w(23 0), 23
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class CronParseMonthsTest < Whenever::TestCase
|
104
|
+
should "parse correctly" do
|
105
|
+
assert_equal '0 0 1 * *', parse_time(Whenever.seconds(1, :month))
|
106
|
+
assert_equal '0 0 1 1,3,5,7,9,11 *', parse_time(Whenever.seconds(2, :months))
|
107
|
+
assert_equal '0 0 1 1,4,7,10 *', parse_time(Whenever.seconds(3, :months))
|
108
|
+
assert_equal '0 0 1 1,5,9 *', parse_time(Whenever.seconds(4, :months))
|
109
|
+
assert_equal '0 0 1 1,6 *', parse_time(Whenever.seconds(5, :months))
|
110
|
+
assert_equal '0 0 1 7 *', parse_time(Whenever.seconds(7, :months))
|
111
|
+
assert_equal '0 0 1 8 *', parse_time(Whenever.seconds(8, :months))
|
112
|
+
assert_equal '0 0 1 9 *', parse_time(Whenever.seconds(9, :months))
|
113
|
+
assert_equal '0 0 1 10 *', parse_time(Whenever.seconds(10, :months))
|
114
|
+
assert_equal '0 0 1 11 *', parse_time(Whenever.seconds(11, :months))
|
115
|
+
assert_equal '0 0 1 12 *', parse_time(Whenever.seconds(12, :months))
|
116
|
+
end
|
128
117
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
118
|
+
should "parse months with a date and/or time" do
|
119
|
+
# should set the day to 1 if no date is given
|
120
|
+
assert_equal '0 17 1 * *', parse_time(Whenever.seconds(1, :month), nil, "5pm")
|
121
|
+
# should use the date if one is given
|
122
|
+
assert_equal '0 2 23 * *', parse_time(Whenever.seconds(1, :month), nil, "February 23rd at 2am")
|
123
|
+
# should use an iteger as the day
|
124
|
+
assert_equal '0 0 5 * *', parse_time(Whenever.seconds(1, :month), nil, 5)
|
125
|
+
end
|
136
126
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
127
|
+
should "parse correctly when given an 'at' with days, hours, minutes as a Time" do
|
128
|
+
# first param is an array with [days, hours, minutes]
|
129
|
+
assert_days_and_hours_and_minutes_equals %w(1 3 45), 'January 1st 3:45am'
|
130
|
+
assert_days_and_hours_and_minutes_equals %w(11 23 0), 'Feb 11 11PM'
|
131
|
+
assert_days_and_hours_and_minutes_equals %w(22 1 1), 'march 22nd at 1:01 am'
|
132
|
+
assert_days_and_hours_and_minutes_equals %w(23 0 0), 'march 22nd at midnight' # looks like midnight means the next day
|
143
133
|
end
|
144
134
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
135
|
+
should "parse correctly when given an 'at' with days as an Integer" do
|
136
|
+
# first param is an array with [days, hours, minutes]
|
137
|
+
assert_days_and_hours_and_minutes_equals %w(1 0 0), 1
|
138
|
+
assert_days_and_hours_and_minutes_equals %w(15 0 0), 15
|
139
|
+
assert_days_and_hours_and_minutes_equals %w(29 0 0), 29
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class CronParseDaysOfWeekTest < Whenever::TestCase
|
144
|
+
should "parse days of the week correctly" do
|
145
|
+
{
|
146
|
+
'0' => %w(sun Sunday SUNDAY SUN),
|
147
|
+
'1' => %w(mon Monday MONDAY MON),
|
148
|
+
'2' => %w(tue tues Tuesday TUESDAY TUE),
|
149
|
+
'3' => %w(wed Wednesday WEDNESDAY WED),
|
150
|
+
'4' => %w(thu thurs thur Thursday THURSDAY THU),
|
151
|
+
'5' => %w(fri Friday FRIDAY FRI),
|
152
|
+
'6' => %w(sat Saturday SATURDAY SAT)
|
153
|
+
}.each do |day, day_tests|
|
154
|
+
day_tests.each do |day_test|
|
155
|
+
assert_equal "0 0 * * #{day}", parse_time(day_test)
|
159
156
|
end
|
160
157
|
end
|
158
|
+
end
|
161
159
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
160
|
+
should "allow additional directives" do
|
161
|
+
assert_equal '30 13 * * 5', parse_time('friday', nil, "1:30 pm")
|
162
|
+
assert_equal '22 2 * * 1', parse_time('Monday', nil, "2:22am")
|
163
|
+
assert_equal '55 17 * * 4', parse_time('THU', nil, "5:55PM")
|
164
|
+
end
|
167
165
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
166
|
+
should "parse weekday correctly" do
|
167
|
+
assert_equal '0 0 * * 1-5', parse_time('weekday')
|
168
|
+
assert_equal '0 0 * * 1-5', parse_time('Weekdays')
|
169
|
+
assert_equal '0 1 * * 1-5', parse_time('Weekdays', nil, "1:00 am")
|
170
|
+
assert_equal '59 5 * * 1-5', parse_time('Weekdays', nil, "5:59 am")
|
171
|
+
end
|
174
172
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
173
|
+
should "parse weekend correctly" do
|
174
|
+
assert_equal '0 0 * * 6,0', parse_time('weekend')
|
175
|
+
assert_equal '0 0 * * 6,0', parse_time('Weekends')
|
176
|
+
assert_equal '0 7 * * 6,0', parse_time('Weekends', nil, "7am")
|
177
|
+
assert_equal '2 18 * * 6,0', parse_time('Weekends', nil, "6:02PM")
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
class CronParseShortcutsTest < Whenever::TestCase
|
182
|
+
should "parse a :symbol into the correct shortcut" do
|
183
|
+
assert_equal '@reboot', parse_time(:reboot)
|
184
|
+
assert_equal '@annually', parse_time(:annually)
|
185
|
+
assert_equal '@yearly', parse_time(:yearly)
|
186
|
+
assert_equal '@daily', parse_time(:daily)
|
187
|
+
assert_equal '@midnight', parse_time(:midnight)
|
188
|
+
assert_equal '@monthly', parse_time(:monthly)
|
189
|
+
assert_equal '@weekly', parse_time(:weekly)
|
190
|
+
assert_equal '@hourly', parse_time(:hourly)
|
181
191
|
end
|
182
192
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
assert_equal '@monthly', parse_time(:monthly)
|
191
|
-
assert_equal '@weekly', parse_time(:weekly)
|
192
|
-
assert_equal '@hourly', parse_time(:hourly)
|
193
|
-
end
|
193
|
+
should "convert time-based shortcuts to times" do
|
194
|
+
assert_equal '0 0 1 * *', parse_time(:month)
|
195
|
+
assert_equal '0 0 * * *', parse_time(:day)
|
196
|
+
assert_equal '0 * * * *', parse_time(:hour)
|
197
|
+
assert_equal '0 0 1 12 *', parse_time(:year)
|
198
|
+
assert_equal '0 0 1,8,15,22 * *', parse_time(:week)
|
199
|
+
end
|
194
200
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
assert_equal '0 * * * *', parse_time(:hour)
|
199
|
-
assert_equal '0 0 1 12 *', parse_time(:year)
|
200
|
-
assert_equal '0 0 1,8,15,22 * *', parse_time(:week)
|
201
|
+
should "raise an exception if a valid shortcut is given but also an :at" do
|
202
|
+
assert_raises ArgumentError do
|
203
|
+
parse_time(:hourly, nil, "1:00 am")
|
201
204
|
end
|
202
205
|
|
203
|
-
|
204
|
-
|
205
|
-
parse_time(:hourly, nil, "1:00 am")
|
206
|
-
end
|
207
|
-
|
208
|
-
assert_raises ArgumentError do
|
209
|
-
parse_time(:reboot, nil, 5)
|
210
|
-
end
|
211
|
-
|
212
|
-
assert_raises ArgumentError do
|
213
|
-
parse_time(:daily, nil, '4:20pm')
|
214
|
-
end
|
206
|
+
assert_raises ArgumentError do
|
207
|
+
parse_time(:reboot, nil, 5)
|
215
208
|
end
|
216
|
-
end
|
217
209
|
|
218
|
-
|
219
|
-
|
220
|
-
crons = ['0 0 27-31 * *', '* * * * *', '2/3 1,9,22 11-26 1-6 *',
|
221
|
-
"*\t*\t*\t*\t*",
|
222
|
-
'@reboot', '@yearly', '@annually', '@monthly', '@weekly',
|
223
|
-
'@daily', '@midnight', '@hourly']
|
224
|
-
crons.each do |cron|
|
225
|
-
assert_equal cron, parse_time(cron)
|
226
|
-
end
|
210
|
+
assert_raises ArgumentError do
|
211
|
+
parse_time(:daily, nil, '4:20pm')
|
227
212
|
end
|
228
213
|
end
|
214
|
+
end
|
229
215
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
cron = parse_time(2.days, 'some task', time)
|
240
|
-
minutes, hours, *garbage = cron.split(' ')
|
241
|
-
assert_equal expected, [hours, minutes]
|
242
|
-
end
|
243
|
-
|
244
|
-
def assert_minutes_equals(expected, time)
|
245
|
-
cron = parse_time(2.hours, 'some task', time)
|
246
|
-
assert_equal expected, cron.split(' ')[0]
|
247
|
-
end
|
248
|
-
|
249
|
-
def parse_time(time = nil, task = nil, at = nil)
|
250
|
-
Whenever::Output::Cron.new(time, task, at).time_in_cron_syntax
|
216
|
+
class CronParseRawTest < Whenever::TestCase
|
217
|
+
should "return the same cron sytax" do
|
218
|
+
crons = ['0 0 27-31 * *', '* * * * *', '2/3 1,9,22 11-26 1-6 *',
|
219
|
+
"*\t*\t*\t*\t*",
|
220
|
+
'@reboot', '@yearly', '@annually', '@monthly', '@weekly',
|
221
|
+
'@daily', '@midnight', '@hourly']
|
222
|
+
crons.each do |cron|
|
223
|
+
assert_equal cron, parse_time(cron)
|
224
|
+
end
|
251
225
|
end
|
252
|
-
|
253
|
-
end
|
226
|
+
end
|