aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/import.rb9
-rw-r--r--app/services/parent_import_notifier.rb17
-rw-r--r--spec/factories/imports.rb4
-rw-r--r--spec/factories/workbench_imports.rb9
-rw-r--r--spec/models/import_spec.rb2
-rw-r--r--spec/services/parent_import_notifier_spec.rb93
6 files changed, 132 insertions, 2 deletions
diff --git a/app/models/import.rb b/app/models/import.rb
index da8244810..20b61a7f5 100644
--- a/app/models/import.rb
+++ b/app/models/import.rb
@@ -11,7 +11,14 @@ class Import < ActiveRecord::Base
validates :file, presence: true
validates_presence_of :referential, :workbench
- before_create do
+ before_create :initialize_fields
+
+ def notify_parent
+ end
+
+ private
+
+ def initialize_fields
self.token_download = SecureRandom.urlsafe_base64
self.status = Import.status.new
end
diff --git a/app/services/parent_import_notifier.rb b/app/services/parent_import_notifier.rb
new file mode 100644
index 000000000..8e6245da9
--- /dev/null
+++ b/app/services/parent_import_notifier.rb
@@ -0,0 +1,17 @@
+class ParentImportNotifier
+ def self.notify_when_finished(imports = nil)
+ imports ||= self.imports_pending_notification
+ imports.each do |import|
+ import.notify_parent
+ end
+ end
+
+ def self.imports_pending_notification
+ Import
+ .where(
+ notified_parent_at: nil,
+ status: [:failed, :successful, :aborted, :canceled]
+ )
+ .where.not(parent: nil)
+ end
+end
diff --git a/spec/factories/imports.rb b/spec/factories/imports.rb
index aaf56914f..a59bb5795 100644
--- a/spec/factories/imports.rb
+++ b/spec/factories/imports.rb
@@ -10,6 +10,10 @@ FactoryGirl.define do
started_at nil
ended_at nil
+ after(:build) do |import|
+ import.class.skip_callback(:create, :before, :initialize_fields)
+ end
+
factory :workbench_import, class: WorkbenchImport do
file {File.open(Rails.root.join('spec', 'fixtures', 'terminated_job.json'))}
end
diff --git a/spec/factories/workbench_imports.rb b/spec/factories/workbench_imports.rb
new file mode 100644
index 000000000..ea582846a
--- /dev/null
+++ b/spec/factories/workbench_imports.rb
@@ -0,0 +1,9 @@
+# require 'spec/support/file_fixtures'
+
+FactoryGirl.define do
+ # include FileFixtures
+
+ factory :workbench_import, class: WorkbenchImport, parent: :import do
+ # file { file_fixture('OFFRE_TRANSDEV_2017030112251.zip') }
+ end
+end
diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb
index c56858b44..88d339ea0 100644
--- a/spec/models/import_spec.rb
+++ b/spec/models/import_spec.rb
@@ -2,7 +2,7 @@ RSpec.describe Import, :type => :model do
it { should belong_to(:referential) }
it { should belong_to(:workbench) }
- it { should belong_to(:parent).class_name(described_class.to_s) }
+ it { should belong_to(:parent) }
it { should enumerize(:status).in("aborted", "canceled", "failed", "new", "pending", "running", "successful") }
diff --git a/spec/services/parent_import_notifier_spec.rb b/spec/services/parent_import_notifier_spec.rb
new file mode 100644
index 000000000..5888002ad
--- /dev/null
+++ b/spec/services/parent_import_notifier_spec.rb
@@ -0,0 +1,93 @@
+RSpec.describe ParentImportNotifier do
+ describe ".notify_when_finished" do
+ it "calls #notify_parent on finished imports" do
+ workbench_import = build_stubbed(:workbench_import)
+
+ finished_statuses = [:failed, :successful, :aborted, :canceled]
+ netex_imports = []
+
+ finished_statuses.each do |status|
+ netex_imports << build_stubbed(
+ :netex_import,
+ parent: workbench_import,
+ status: status
+ )
+ end
+
+ netex_imports.each do |netex_import|
+ expect(netex_import).to receive(:notify_parent)
+ end
+
+ ParentImportNotifier.notify_when_finished(netex_imports)
+ end
+
+ it "doesn't call #notify_parent if its `notified_parent_at` is set" do
+ workbench_import = create(:workbench_import)
+
+ netex_import = create(
+ :netex_import,
+ parent: workbench_import,
+ status: :failed,
+ notified_parent_at: DateTime.now
+ )
+
+ expect(netex_import).not_to receive(:notify_parent)
+
+ ParentImportNotifier.notify_when_finished
+ end
+ end
+
+ describe ".imports_pending_notification" do
+ it "includes imports with a parent and `notified_parent_at` unset" do
+ workbench_import = create(:workbench_import)
+ netex_import = create(
+ :netex_import,
+ parent: workbench_import,
+ status: :successful,
+ notified_parent_at: nil
+ )
+
+ expect(
+ ParentImportNotifier.imports_pending_notification
+ ).to eq([netex_import])
+ end
+
+ it "doesn't include imports without a parent" do
+ create(:import, parent: nil)
+
+ expect(
+ ParentImportNotifier.imports_pending_notification
+ ).to be_empty
+ end
+
+ it "doesn't include imports that aren't finished" do
+ workbench_import = create(:workbench_import)
+ [:new, :pending, :running].each do |status|
+ create(
+ :netex_import,
+ parent: workbench_import,
+ status: status,
+ notified_parent_at: nil
+ )
+ end
+
+ expect(
+ ParentImportNotifier.imports_pending_notification
+ ).to be_empty
+ end
+
+ it "doesn't include imports that have already notified their parent" do
+ workbench_import = create(:workbench_import)
+ create(
+ :netex_import,
+ parent: workbench_import,
+ status: :successful,
+ notified_parent_at: DateTime.now
+ )
+
+ expect(
+ ParentImportNotifier.imports_pending_notification
+ ).to be_empty
+ end
+ end
+end