aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/line_referential.rb2
-rw-r--r--app/models/line_referential_sync.rb12
-rw-r--r--app/workers/line_referential_sync_worker.rb11
-rw-r--r--lib/stif/codif_line_synchronization.rb13
-rw-r--r--spec/factories/line_referential_syncs.rb1
-rw-r--r--spec/factories/line_referentials.rb1
-rw-r--r--spec/models/line_referential_sync_spec.rb11
-rw-r--r--spec/spec_helper.rb5
-rw-r--r--spec/workers/line_referential_sync_worker_spec.rb17
9 files changed, 53 insertions, 20 deletions
diff --git a/app/models/line_referential.rb b/app/models/line_referential.rb
index ccab5bf8a..f33934dfc 100644
--- a/app/models/line_referential.rb
+++ b/app/models/line_referential.rb
@@ -7,7 +7,7 @@ class LineReferential < ActiveRecord::Base
has_many :companies, class_name: 'Chouette::Company'
has_many :networks, class_name: 'Chouette::Network'
- has_one :line_referential_sync
+ has_many :line_referential_syncs
def add_member(organisation, options = {})
attributes = options.merge organisation: organisation
diff --git a/app/models/line_referential_sync.rb b/app/models/line_referential_sync.rb
index 35e074d4e..c0af54ac1 100644
--- a/app/models/line_referential_sync.rb
+++ b/app/models/line_referential_sync.rb
@@ -1,9 +1,17 @@
class LineReferentialSync < ActiveRecord::Base
belongs_to :line_referential
- after_create :synchronize
+ after_create :perform_sync
+ validate :multiple_process_validation, :on => :create
private
- def synchronize
+ def perform_sync
LineReferentialSyncWorker.perform_async(self.id)
end
+
+ # There can be only one instance running
+ def multiple_process_validation
+ if self.class.where(ended_at: nil, line_referential_id: line_referential_id).count > 0
+ errors.add(:base, :multiple_process)
+ end
+ end
end
diff --git a/app/workers/line_referential_sync_worker.rb b/app/workers/line_referential_sync_worker.rb
index 719a10190..e63bf97cc 100644
--- a/app/workers/line_referential_sync_worker.rb
+++ b/app/workers/line_referential_sync_worker.rb
@@ -1,19 +1,24 @@
class LineReferentialSyncWorker
include Sidekiq::Worker
+ sidekiq_options :retry => false
def update_started_at lref_sync
lref_sync.update_attribute(:started_at, Time.now)
+ end
+ def update_ended_at lref_sync
+ lref_sync.update_attribute(:ended_at, Time.now)
end
def perform(lref_sync_id)
lref_sync = LineReferentialSync.find lref_sync_id
-
+ update_started_at lref_sync
begin
Stif::CodifLineSynchronization.synchronize
- lref_sync.update_attribute(:ended_at, Time.now)
rescue Exception => e
- ap 'call to rescue Exception'
+ ap "LineReferentialSyncWorker perform:rescue #{e.message}"
+ ensure
+ update_ended_at lref_sync
end
end
end
diff --git a/lib/stif/codif_line_synchronization.rb b/lib/stif/codif_line_synchronization.rb
index 4bbc48946..fee785766 100644
--- a/lib/stif/codif_line_synchronization.rb
+++ b/lib/stif/codif_line_synchronization.rb
@@ -1,15 +1,8 @@
module Stif
module CodifLineSynchronization
class << self
- # Don't check last synchronizations if force_sync
- def synchronize force_sync = false
- # Check last synchronization and synchronization interval
- date = DateTime.now.to_date - LineReferential.first.sync_interval.days
- last_sync = LineReferential.first.line_referential_sync.line_sync_operations.where(status: :ok).last.try(:created_at)
- return if last_sync.present? && last_sync.to_date > date && !force_sync
-
+ def synchronize
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
- # TODO Check exceptions and status messages
begin
# Fetch Codifline data
client = Codifligne::API.new
@@ -60,13 +53,9 @@ module Stif
total_codifligne_elements = operators.count + lines.count + networks.count + groups_of_lines.count
total_deleted = deleted_op + deleted_li + deleted_ne + deleted_gr
total_time = elapsed_time_since start_time
-
- LineReferential.first.line_referential_sync.record_status :ok, I18n.t('synchronization.codifligne.message.success', time: total_time, imported: total_codifligne_elements, deleted: total_deleted)
rescue Exception => e
total_time = elapsed_time_since start_time
-
Rails.logger.error "Codifligne:sync - Error: #{e}, ended after #{total_time} seconds"
- LineReferential.first.line_referential_sync.record_status :ko, I18n.t('synchronization.codifligne.message.failure', time: total_time)
end
end
diff --git a/spec/factories/line_referential_syncs.rb b/spec/factories/line_referential_syncs.rb
index 8f0d1e6fb..27b7a9fb9 100644
--- a/spec/factories/line_referential_syncs.rb
+++ b/spec/factories/line_referential_syncs.rb
@@ -1,4 +1,5 @@
FactoryGirl.define do
factory :line_referential_sync do
+ association :line_referential, :factory => :line_referential
end
end
diff --git a/spec/factories/line_referentials.rb b/spec/factories/line_referentials.rb
index 47d0727c5..cfce1399f 100644
--- a/spec/factories/line_referentials.rb
+++ b/spec/factories/line_referentials.rb
@@ -1,6 +1,5 @@
FactoryGirl.define do
factory :line_referential do
sequence(:name) { |n| "Line Referential #{n}" }
- association :line_referential_sync, :factory => :line_referential_sync
end
end
diff --git a/spec/models/line_referential_sync_spec.rb b/spec/models/line_referential_sync_spec.rb
index 0cab0389c..f5c738792 100644
--- a/spec/models/line_referential_sync_spec.rb
+++ b/spec/models/line_referential_sync_spec.rb
@@ -4,5 +4,16 @@ RSpec.describe LineReferentialSync, :type => :model do
it 'should have a valid factory' do
expect(FactoryGirl.build(:line_referential_sync)).to be_valid
end
+
it { is_expected.to belong_to(:line_referential) }
+
+ it 'should validate multiple sync instance' do
+ lref_sync = build(:line_referential_sync, line_referential: create(:line_referential_sync).line_referential)
+ expect(lref_sync).to be_invalid
+ end
+
+ it 'should call LineReferentialSyncWorker on create' do
+ expect(LineReferentialSyncWorker).to receive(:perform_async)
+ create :line_referential_sync
+ end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 93b148496..dd062bc84 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -13,6 +13,8 @@ require 'will_paginate/array'
require 'fakeweb'
require 'webmock/rspec'
require 'simplecov'
+require 'sidekiq/testing'
+Sidekiq::Testing.fake!
if ENV['JOB_NAME']
require 'simplecov-rcov'
@@ -43,6 +45,9 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
+ config.before(:each) do
+ Sidekiq::Worker.clear_all
+ end
#Capybara.exact = true
Capybara.javascript_driver = :poltergeist
diff --git a/spec/workers/line_referential_sync_worker_spec.rb b/spec/workers/line_referential_sync_worker_spec.rb
index 0a1172e41..f1a63c9db 100644
--- a/spec/workers/line_referential_sync_worker_spec.rb
+++ b/spec/workers/line_referential_sync_worker_spec.rb
@@ -1,4 +1,19 @@
require 'rails_helper'
RSpec.describe LineReferentialSyncWorker, type: :worker do
- pending "add some examples to (or delete) #{__FILE__}"
+ let!(:line_referential_sync) { create :line_referential_sync }
+
+ it 'should call codifline synchronize on worker perform' do
+ expect(Stif::CodifLineSynchronization).to receive(:synchronize)
+ LineReferentialSyncWorker.new.perform(line_referential_sync.id)
+ end
+
+ it 'should update line_referential_sync started_at on worker perform' do
+ LineReferentialSyncWorker.new.perform(line_referential_sync.id)
+ expect(line_referential_sync.reload.started_at).not_to be_nil
+ end
+
+ it 'should update line_referential_sync ended_at on worker perform success' do
+ LineReferentialSyncWorker.new.perform(line_referential_sync.id)
+ expect(line_referential_sync.reload.started_at).not_to be_nil
+ end
end