Commit 70b2b72b authored by Tiago Botelho's avatar Tiago Botelho

refactors tests

parent 5deb212c
...@@ -24,7 +24,7 @@ module Gitlab ...@@ -24,7 +24,7 @@ module Gitlab
def self.nulls_last_order(field, direction = 'ASC') def self.nulls_last_order(field, direction = 'ASC')
order = "#{field} #{direction}" order = "#{field} #{direction}"
if Gitlab::Database.postgresql? if postgresql?
order << ' NULLS LAST' order << ' NULLS LAST'
else else
# `field IS NULL` will be `0` for non-NULL columns and `1` for NULL # `field IS NULL` will be `0` for non-NULL columns and `1` for NULL
...@@ -38,7 +38,7 @@ module Gitlab ...@@ -38,7 +38,7 @@ module Gitlab
def self.nulls_first_order(field, direction = 'ASC') def self.nulls_first_order(field, direction = 'ASC')
order = "#{field} #{direction}" order = "#{field} #{direction}"
if Gitlab::Database.postgresql? if postgresql?
order << ' NULLS FIRST' order << ' NULLS FIRST'
else else
# `field IS NULL` will be `0` for non-NULL columns and `1` for NULL # `field IS NULL` will be `0` for non-NULL columns and `1` for NULL
...@@ -50,15 +50,15 @@ module Gitlab ...@@ -50,15 +50,15 @@ module Gitlab
end end
def self.random def self.random
Gitlab::Database.postgresql? ? "RANDOM()" : "RAND()" postgresql? ? "RANDOM()" : "RAND()"
end end
def self.minute_interval(value) def self.minute_interval(value)
Gitlab::Database.postgresql? ? "#{value} * '1 minute'::interval" : "INTERVAL #{value} MINUTE" postgresql? ? "#{value} * '1 minute'::interval" : "INTERVAL #{value} MINUTE"
end end
def true_value def true_value
if Gitlab::Database.postgresql? if postgresql?
"'t'" "'t'"
else else
1 1
...@@ -66,7 +66,7 @@ module Gitlab ...@@ -66,7 +66,7 @@ module Gitlab
end end
def false_value def false_value
if Gitlab::Database.postgresql? if postgresql?
"'f'" "'f'"
else else
0 0
......
...@@ -7,14 +7,10 @@ describe UpdateAllMirrorsWorker do ...@@ -7,14 +7,10 @@ describe UpdateAllMirrorsWorker do
end end
describe '#perform' do describe '#perform' do
project_count_with_time = { DateTime.now.beginning_of_hour + 15.minutes => 2,
DateTime.now.beginning_of_hour => 3,
DateTime.now.beginning_of_day => 4
}
let!(:mirror1) { create(:empty_project, :mirror, sync_time: Gitlab::Mirror::FIFTEEN) } let!(:mirror1) { create(:empty_project, :mirror, sync_time: Gitlab::Mirror::FIFTEEN) }
let!(:mirror2) { create(:empty_project, :mirror, sync_time: Gitlab::Mirror::HOURLY) } let!(:mirror2) { create(:empty_project, :mirror, sync_time: Gitlab::Mirror::HOURLY) }
let!(:mirror3) { create(:empty_project, :mirror, sync_time: Gitlab::Mirror::DAILY) } let!(:mirror3) { create(:empty_project, :mirror, sync_time: Gitlab::Mirror::DAILY) }
let!(:mirror4) { create(:empty_project, :mirror) }
it 'fails stuck mirrors' do it 'fails stuck mirrors' do
worker = described_class.new worker = described_class.new
...@@ -24,19 +20,65 @@ describe UpdateAllMirrorsWorker do ...@@ -24,19 +20,65 @@ describe UpdateAllMirrorsWorker do
worker.perform worker.perform
end end
project_count_with_time.each do |time, project_count| describe 'update times' do
describe "at #{time}" do after do
let!(:mirror4) { create(:empty_project, :mirror, sync_time: Gitlab::Mirror::DAILY, mirror_last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes } Timecop.return
let(:mirrors) { Project.mirror.where("mirror_last_successful_update_at + #{Gitlab::Database.minute_interval('sync_time')} <= ? OR sync_time IN (?)", time, Gitlab::Mirror.sync_times) } end
describe 'fifteen' do
before do
time = DateTime.now.beginning_of_hour + 15.minutes
Timecop.freeze(time)
mirror4.update_attributes(mirror_last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes)
end
it 'enqueues a job on mirrored Projects' do
mirrors = [mirror1, mirror4]
worker = described_class.new
mirrors.each do |mirror|
expect(worker).to receive(:rand).with((mirror.sync_time / 2).minutes).and_return(mirror.sync_time / 2)
expect(RepositoryUpdateMirrorDispatchWorker).to receive(:perform_in).with(mirror.sync_time / 2, mirror.id)
end
worker.perform
end
end
describe 'hourly' do
before do before do
time = DateTime.now.beginning_of_hour
Timecop.freeze(time)
mirror4.update_attributes(mirror_last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes)
end
it 'enqueues a job on mirrored Projects' do
mirrors = [mirror1, mirror2, mirror4]
worker = described_class.new
mirrors.each do |mirror|
expect(worker).to receive(:rand).with((mirror.sync_time / 2).minutes).and_return(mirror.sync_time / 2)
expect(RepositoryUpdateMirrorDispatchWorker).to receive(:perform_in).with(mirror.sync_time / 2, mirror.id)
end
worker.perform
end
end
describe 'daily' do
before do
time = DateTime.now.beginning_of_day
Timecop.freeze(time) Timecop.freeze(time)
mirror4.update_attributes(mirror_last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes)
end end
it 'enqueues a job on mirrored Projects' do it 'enqueues a job on mirrored Projects' do
mirrors = [mirror1, mirror2, mirror3, mirror4]
worker = described_class.new worker = described_class.new
expect(mirrors.count).to eq(project_count)
mirrors.each do |mirror| mirrors.each do |mirror|
expect(worker).to receive(:rand).with((mirror.sync_time / 2).minutes).and_return(mirror.sync_time / 2) expect(worker).to receive(:rand).with((mirror.sync_time / 2).minutes).and_return(mirror.sync_time / 2)
expect(RepositoryUpdateMirrorDispatchWorker).to receive(:perform_in).with(mirror.sync_time / 2, mirror.id) expect(RepositoryUpdateMirrorDispatchWorker).to receive(:perform_in).with(mirror.sync_time / 2, mirror.id)
......
...@@ -2,14 +2,11 @@ require 'rails_helper' ...@@ -2,14 +2,11 @@ require 'rails_helper'
describe UpdateAllRemoteMirrorsWorker do describe UpdateAllRemoteMirrorsWorker do
describe "#perform" do describe "#perform" do
project_count_with_time = { DateTime.now.beginning_of_hour + 15.minutes => 2,
DateTime.now.beginning_of_hour => 3,
DateTime.now.beginning_of_day => 4
}
let!(:mirror1) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::FIFTEEN) } let!(:mirror1) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::FIFTEEN) }
let!(:mirror2) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::HOURLY) } let!(:mirror2) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::HOURLY) }
let!(:mirror3) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::DAILY) } let!(:mirror3) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::DAILY) }
let!(:mirror4) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::DAILY) }
it 'fails stuck mirrors' do it 'fails stuck mirrors' do
worker = described_class.new worker = described_class.new
...@@ -19,20 +16,63 @@ describe UpdateAllRemoteMirrorsWorker do ...@@ -19,20 +16,63 @@ describe UpdateAllRemoteMirrorsWorker do
worker.perform worker.perform
end end
project_count_with_time.each do |time, project_count| describe 'update times' do
describe "at #{time}" do after do
let!(:mirror4) { create(:project, :remote_mirror, sync_time: Gitlab::Mirror::DAILY) } Timecop.return
let(:mirrors) { RemoteMirror.where("last_successful_update_at + #{Gitlab::Database.minute_interval('sync_time')} <= ? OR sync_time IN (?)", time, Gitlab::Mirror.sync_times) } end
describe 'fifteen' do
before do
time = DateTime.now.beginning_of_hour + 15.minutes
Timecop.freeze(time)
mirror4.remote_mirrors.first.update_attributes(last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes)
end
it 'enqueues a job on mirrored Projects' do
mirrors = [mirror1, mirror4]
worker = described_class.new
mirrors.each do |mirror|
expect(RepositoryUpdateRemoteMirrorWorker).to receive(:perform_async).with(mirror.id)
end
worker.perform
end
end
describe "hourly" do
before do before do
time = DateTime.now.beginning_of_hour
Timecop.freeze(time)
mirror4.remote_mirrors.first.update_attributes(last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes)
end
it 'enqueues a job on mirrored Projects' do
mirrors = [mirror1, mirror2, mirror4]
worker = described_class.new
mirrors.each do |mirror|
expect(RepositoryUpdateRemoteMirrorWorker).to receive(:perform_async).with(mirror.id)
end
worker.perform
end
end
describe "daily" do
before do
time = DateTime.now.beginning_of_day
Timecop.freeze(time) Timecop.freeze(time)
mirror4.remote_mirrors.first.update_attributes(last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes) mirror4.remote_mirrors.first.update_attributes(last_successful_update_at: time - (Gitlab::Mirror::DAILY + 5).minutes)
end end
it 'enqueues a job on mirrored Projects' do it 'enqueues a job on mirrored Projects' do
mirrors = [mirror1, mirror2, mirror3, mirror4]
worker = described_class.new worker = described_class.new
expect(mirrors.count).to eq(project_count)
mirrors.each do |mirror| mirrors.each do |mirror|
expect(RepositoryUpdateRemoteMirrorWorker).to receive(:perform_async).with(mirror.id) expect(RepositoryUpdateRemoteMirrorWorker).to receive(:perform_async).with(mirror.id)
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment