|
1 | 1 | require 'core/connector_settings' |
2 | 2 | require 'connectors/crawler/scheduler' |
| 3 | +require 'timecop' |
3 | 4 |
|
4 | 5 | describe Connectors::Crawler::Scheduler do |
5 | 6 | subject { described_class.new(poll_interval, heartbeat_interval) } |
|
67 | 68 | let(:weekly_enabled) { false } |
68 | 69 | let(:weekly_interval) { '0 0 * * 1 ?' } |
69 | 70 | let(:monthly_enabled) { false } |
70 | | - let(:monthly_interval) { '0 0 * 1 * ?' } |
| 71 | + let(:monthly_interval) { '0 0 1 * * ?' } |
71 | 72 | let(:custom_scheduling_settings) do |
72 | 73 | { |
73 | 74 | :weekly_key => { |
|
88 | 89 | let(:weekly_next_trigger_time) { 1.day.from_now } |
89 | 90 | let(:monthly_next_trigger_time) { 1.day.from_now } |
90 | 91 |
|
| 92 | + let(:time_at_poll_start) { Timecop.freeze(Time.now) } |
| 93 | + |
91 | 94 | let(:cron_parser) { instance_double(Fugit::Cron) } |
92 | 95 |
|
93 | 96 | before(:each) do |
94 | 97 | allow(Core::ConnectorSettings).to receive(:fetch_crawler_connectors).and_return(connector_settings) |
95 | 98 |
|
96 | | - allow(subject).to receive(:sync_triggered?).with(connector_settings).and_call_original |
97 | | - allow(subject).to receive(:custom_sync_triggered?).with(connector_settings).and_call_original |
98 | | - |
| 99 | + allow(subject).to receive(:sync_triggered?).with(connector_settings, time_at_poll_start).and_call_original |
| 100 | + allow(subject).to receive(:custom_sync_triggered?).with(connector_settings, time_at_poll_start).and_call_original |
99 | 101 | allow(connector_settings).to receive(:connector_status_allows_sync?).and_return(true) |
100 | 102 | allow(connector_settings).to receive(:sync_now?).and_return(sync_now) |
101 | 103 | allow(connector_settings).to receive(:full_sync_scheduling).and_return(full_sync_scheduling) |
|
109 | 111 | allow(Fugit::Cron).to receive(:parse).and_return(cron_parser) |
110 | 112 | end |
111 | 113 |
|
| 114 | + after(:each) do |
| 115 | + Timecop.return |
| 116 | + end |
| 117 | + |
112 | 118 | context 'when none are enabled' do |
113 | 119 | it_behaves_like 'does not trigger', :sync |
114 | 120 | end |
115 | 121 |
|
116 | 122 | context 'when one custom scheduling is enabled and ready to sync' do |
117 | 123 | let(:monthly_enabled) { true } |
118 | | - let(:monthly_next_trigger_time) { Time.now + poll_interval - 10 } |
| 124 | + let(:monthly_next_trigger_time) { time_at_poll_start + poll_interval - 10 } |
119 | 125 |
|
120 | 126 | before(:each) do |
121 | 127 | allow(Utility::Cron).to receive(:quartz_to_crontab).with(monthly_interval) |
|
125 | 131 | it_behaves_like 'triggers', :monthly_key |
126 | 132 | end |
127 | 133 |
|
128 | | - context 'when all custom schedulings are enabled and ready to sync' do |
| 134 | + context 'when all custom scheduling is enabled and ready to sync' do |
129 | 135 | let(:weekly_enabled) { true } |
130 | 136 | let(:monthly_enabled) { true } |
131 | 137 |
|
132 | | - let(:weekly_next_trigger_time) { Time.now + poll_interval - 10 } |
133 | | - let(:monthly_next_trigger_time) { Time.now + poll_interval - 10 } |
| 138 | + let(:weekly_next_trigger_time) { time_at_poll_start + poll_interval - 10 } |
| 139 | + let(:monthly_next_trigger_time) { time_at_poll_start + poll_interval - 10 } |
134 | 140 |
|
135 | 141 | before(:each) do |
136 | 142 | allow(cron_parser).to receive(:next_time).and_return(weekly_next_trigger_time, monthly_next_trigger_time) |
|
145 | 151 | let(:weekly_enabled) { true } |
146 | 152 | let(:monthly_enabled) { true } |
147 | 153 |
|
148 | | - let(:next_trigger_time) { Time.now + poll_interval - 10 } |
149 | | - let(:weekly_next_trigger_time) { Time.now + poll_interval - 10 } |
150 | | - let(:monthly_next_trigger_time) { Time.now + poll_interval - 10 } |
| 154 | + let(:next_trigger_time) { time_at_poll_start + poll_interval - 10 } |
| 155 | + let(:weekly_next_trigger_time) { time_at_poll_start + poll_interval - 10 } |
| 156 | + let(:monthly_next_trigger_time) { time_at_poll_start + poll_interval - 10 } |
151 | 157 |
|
152 | 158 | before(:each) do |
153 | 159 | allow(cron_parser).to receive(:next_time).and_return(next_trigger_time, weekly_next_trigger_time, monthly_next_trigger_time) |
|
156 | 162 | # it will return the base scheduling |
157 | 163 | it_behaves_like 'triggers', nil |
158 | 164 | end |
| 165 | + |
| 166 | + context 'when base and custom scheduling are enabled and are scheduled after the poll interval' do |
| 167 | + let(:sync_enabled) { true } |
| 168 | + let(:weekly_enabled) { true } |
| 169 | + let(:monthly_enabled) { true } |
| 170 | + |
| 171 | + let(:next_trigger_time) { time_at_poll_start + poll_interval + 10 } |
| 172 | + let(:weekly_next_trigger_time) { time_at_poll_start + poll_interval + 10 } |
| 173 | + let(:monthly_next_trigger_time) { time_at_poll_start + poll_interval + 10 } |
| 174 | + |
| 175 | + before(:each) do |
| 176 | + allow(cron_parser).to receive(:next_time).with(time_at_poll_start).and_return(next_trigger_time, weekly_next_trigger_time, monthly_next_trigger_time) |
| 177 | + end |
| 178 | + |
| 179 | + # functionally the same as shared test 'does not trigger' but with an extra expect() to check for debug messages |
| 180 | + it 'does not yield task' do |
| 181 | + # expect three debug messages because three schedules are not being triggered |
| 182 | + expect(Utility::Logger).to receive(:debug).exactly(3).times.with(match(/^Sync for (\w+.*)|( - \w+) not triggered as .*/)) |
| 183 | + expect { |b| subject.when_triggered(&b) }.to_not yield_control |
| 184 | + end |
| 185 | + end |
| 186 | + |
| 187 | + context 'when base and custom scheduling are enabled, but one is scheduled after the poll interval' do |
| 188 | + let(:sync_enabled) { true } |
| 189 | + let(:weekly_enabled) { true } |
| 190 | + |
| 191 | + let(:next_trigger_time) { time_at_poll_start + poll_interval + 10 } |
| 192 | + let(:weekly_next_trigger_time) { time_at_poll_start + poll_interval - 10 } |
| 193 | + |
| 194 | + before(:each) do |
| 195 | + allow(cron_parser).to receive(:next_time).with(time_at_poll_start).and_return(next_trigger_time, weekly_next_trigger_time) |
| 196 | + end |
| 197 | + |
| 198 | + # functionally the same as shared test 'triggers', but with an extra expect() to check for a debug message |
| 199 | + it 'yields :sync task with an optional scheduling_key value' do |
| 200 | + expect(Utility::Logger).to receive(:debug).exactly(1).times.with(match(/^Sync for (\w+.*)|( - \w+) not triggered as .*/)) |
| 201 | + expect { |b| subject.when_triggered(&b) }.to yield_with_args(connector_settings, :sync, :weekly_key) |
| 202 | + end |
| 203 | + end |
| 204 | + |
| 205 | + context 'when base and custom scheduling are enabled and require sync and are scheduled at the start of the poll interval' do |
| 206 | + let(:sync_enabled) { true } |
| 207 | + let(:weekly_enabled) { true } |
| 208 | + let(:monthly_enabled) { true } |
| 209 | + |
| 210 | + let(:next_trigger_time) { time_at_poll_start } |
| 211 | + let(:weekly_next_trigger_time) { time_at_poll_start } |
| 212 | + let(:monthly_next_trigger_time) { time_at_poll_start } |
| 213 | + |
| 214 | + before(:each) do |
| 215 | + allow(cron_parser).to receive(:next_time).with(time_at_poll_start).and_return(next_trigger_time, weekly_next_trigger_time, monthly_next_trigger_time) |
| 216 | + end |
| 217 | + |
| 218 | + it_behaves_like 'triggers', nil |
| 219 | + end |
| 220 | + |
| 221 | + context 'when base and custom scheduling are enabled and require sync and are scheduled at end of the poll interval' do |
| 222 | + let(:sync_enabled) { true } |
| 223 | + let(:weekly_enabled) { true } |
| 224 | + let(:monthly_enabled) { true } |
| 225 | + |
| 226 | + let(:next_trigger_time) { time_at_poll_start + poll_interval } |
| 227 | + let(:weekly_next_trigger_time) { time_at_poll_start + poll_interval } |
| 228 | + let(:monthly_next_trigger_time) { time_at_poll_start + poll_interval } |
| 229 | + |
| 230 | + before(:each) do |
| 231 | + allow(cron_parser).to receive(:next_time).with(time_at_poll_start).and_return(next_trigger_time, weekly_next_trigger_time, monthly_next_trigger_time) |
| 232 | + end |
| 233 | + |
| 234 | + it_behaves_like 'triggers', nil |
| 235 | + end |
159 | 236 | end |
160 | 237 | end |
161 | 238 | end |
0 commit comments