diff options
| -rw-r--r-- | app/models/import.rb | 9 | ||||
| -rw-r--r-- | app/services/parent_import_notifier.rb | 17 | ||||
| -rw-r--r-- | spec/factories/imports.rb | 4 | ||||
| -rw-r--r-- | spec/factories/workbench_imports.rb | 9 | ||||
| -rw-r--r-- | spec/models/import_spec.rb | 2 | ||||
| -rw-r--r-- | spec/services/parent_import_notifier_spec.rb | 93 | 
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 | 
