aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authorZog2018-03-07 16:15:36 +0100
committerZog2018-03-12 12:00:14 +0100
commitdb15dc6158939d2577ccd53aac66a283ce4f3338 (patch)
tree797fe3dab0e2749aed38f250550f4e2e6a514a75 /spec
parent1245099459bd3d7dce71fdf0d7c95b2377a0034e (diff)
downloadchouette-core-db15dc6158939d2577ccd53aac66a283ce4f3338.tar.bz2
refs #6133; Add some basic specs
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/exports_controller_spec.rb36
-rw-r--r--spec/factories/exports.rb5
-rw-r--r--spec/factories/exports/export_messages.rb7
-rw-r--r--spec/factories/exports/export_resources.rb9
-rw-r--r--spec/factories/exports/exports.rb35
-rw-r--r--spec/factories/exports/netex_exports.rb7
-rw-r--r--spec/factories/exports/workbench_exports.rb5
-rw-r--r--spec/models/export/export_message_spec.rb7
-rw-r--r--spec/models/export/export_resource_spec.rb19
-rw-r--r--spec/models/export/export_spec.rb239
-rw-r--r--spec/models/import/import_message_spec.rb (renamed from spec/models/import_message_spec.rb)0
-rw-r--r--spec/models/import/import_resource_spec.rb (renamed from spec/models/import_resource_spec.rb)0
-rw-r--r--spec/models/import/import_spec.rb (renamed from spec/models/import_spec.rb)0
-rw-r--r--spec/models/import_task_spec.rb196
-rw-r--r--spec/policies/import_policy_spec.rb2
-rw-r--r--spec/support/permissions.rb1
16 files changed, 353 insertions, 215 deletions
diff --git a/spec/controllers/exports_controller_spec.rb b/spec/controllers/exports_controller_spec.rb
index 6cd6e4c54..a1a40d571 100644
--- a/spec/controllers/exports_controller_spec.rb
+++ b/spec/controllers/exports_controller_spec.rb
@@ -1,22 +1,32 @@
-require 'spec_helper'
-
-describe ExportsController, :type => :controller do
+RSpec.describe ExportsController, :type => :controller do
login_user
- describe "GET 'new'" do
- it "returns http success" do
- pending
- get 'new'
+ let(:workbench) { create :workbench }
+ let(:export) { create :export, workbench: workbench }
+
+ describe 'GET #new' do
+ it 'should be successful if authorized' do
+ get :new, workbench_id: workbench.id
expect(response).to be_success
end
- end
- describe "GET 'index'" do
- it "returns http success" do
- pending
- get 'index'
- expect(response).to be_success
+ it 'should be unsuccessful unless authorized' do
+ remove_permissions('exports.create', from_user: @user, save: true)
+ get :new, workbench_id: workbench.id
+ expect(response).not_to be_success
end
end
+ describe "POST #create" do
+ it "displays a flash message" do
+ post :create, workbench_id: workbench.id,
+ export: {
+ name: 'Offre'
+ }
+
+ expect(controller).to set_flash[:notice].to(
+ I18n.t('flash.exports.create.notice')
+ )
+ end
+ end
end
diff --git a/spec/factories/exports.rb b/spec/factories/exports.rb
deleted file mode 100644
index 34427edb8..000000000
--- a/spec/factories/exports.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-FactoryGirl.define do
- factory :export do
- referential { Referential.find_by_slug("first") }
- end
-end
diff --git a/spec/factories/exports/export_messages.rb b/spec/factories/exports/export_messages.rb
new file mode 100644
index 000000000..55394ec45
--- /dev/null
+++ b/spec/factories/exports/export_messages.rb
@@ -0,0 +1,7 @@
+FactoryGirl.define do
+ factory :export_message, class: Export::Message do
+ association :export
+ association :resource, factory: :export_resource
+ criticity :info
+ end
+end
diff --git a/spec/factories/exports/export_resources.rb b/spec/factories/exports/export_resources.rb
new file mode 100644
index 000000000..e09787b52
--- /dev/null
+++ b/spec/factories/exports/export_resources.rb
@@ -0,0 +1,9 @@
+FactoryGirl.define do
+ factory :export_resource, class: Export::Resource do
+ association :export
+ status :WARNING
+ sequence(:name) { |n| "Export resource #{n}" }
+ resource_type 'type'
+ reference 'reference'
+ end
+end
diff --git a/spec/factories/exports/exports.rb b/spec/factories/exports/exports.rb
new file mode 100644
index 000000000..66afe7652
--- /dev/null
+++ b/spec/factories/exports/exports.rb
@@ -0,0 +1,35 @@
+FactoryGirl.define do
+ factory :export, class: Export::Base do
+ sequence(:name) { |n| "Export #{n}" }
+ current_step_id "MyString"
+ current_step_progress 1.5
+ association :workbench
+ association :referential
+ file {File.open(File.join(Rails.root, 'spec', 'fixtures', 'OFFRE_TRANSDEV_2017030112251.zip'))}
+ status :new
+ started_at nil
+ ended_at nil
+ creator 'rspec'
+
+ after(:build) do |export|
+ export.class.skip_callback(:create, :before, :initialize_fields)
+ end
+ end
+
+ factory :bad_export, class: Export::Base do
+ sequence(:name) { |n| "Export #{n}" }
+ current_step_id "MyString"
+ current_step_progress 1.5
+ association :workbench
+ association :referential
+ file {File.open(File.join(Rails.root, 'spec', 'fixtures', 'terminated_job.json'))}
+ status :new
+ started_at nil
+ ended_at nil
+ creator 'rspec'
+
+ after(:build) do |export|
+ export.class.skip_callback(:create, :before, :initialize_fields)
+ end
+ end
+end
diff --git a/spec/factories/exports/netex_exports.rb b/spec/factories/exports/netex_exports.rb
new file mode 100644
index 000000000..288bba314
--- /dev/null
+++ b/spec/factories/exports/netex_exports.rb
@@ -0,0 +1,7 @@
+FactoryGirl.define do
+ factory :netex_export, class: Export::Netex, parent: :export do
+ file { File.open(Rails.root.join('spec', 'fixtures', 'OFFRE_TRANSDEV_2017030112251.zip')) }
+ association :parent, factory: :workbench_export
+
+ end
+end
diff --git a/spec/factories/exports/workbench_exports.rb b/spec/factories/exports/workbench_exports.rb
new file mode 100644
index 000000000..e00efb58a
--- /dev/null
+++ b/spec/factories/exports/workbench_exports.rb
@@ -0,0 +1,5 @@
+FactoryGirl.define do
+ factory :workbench_export, class: Export::Workbench, parent: :export do
+ file { File.open(Rails.root.join('spec', 'fixtures', 'OFFRE_TRANSDEV_2017030112251.zip')) }
+ end
+end
diff --git a/spec/models/export/export_message_spec.rb b/spec/models/export/export_message_spec.rb
new file mode 100644
index 000000000..61a3b6319
--- /dev/null
+++ b/spec/models/export/export_message_spec.rb
@@ -0,0 +1,7 @@
+require 'rails_helper'
+
+RSpec.describe Export::Message, :type => :model do
+ it { should validate_presence_of(:criticity) }
+ it { should belong_to(:export) }
+ it { should belong_to(:resource) }
+end
diff --git a/spec/models/export/export_resource_spec.rb b/spec/models/export/export_resource_spec.rb
new file mode 100644
index 000000000..7537cd2a8
--- /dev/null
+++ b/spec/models/export/export_resource_spec.rb
@@ -0,0 +1,19 @@
+require 'rails_helper'
+
+RSpec.describe Export::Resource, :type => :model do
+ it { should belong_to(:export) }
+
+ it { should enumerize(:status).in("OK", "ERROR", "WARNING", "IGNORED") }
+
+ it { should validate_presence_of(:name) }
+ it { should validate_presence_of(:resource_type) }
+ it { should validate_presence_of(:reference) }
+
+ describe 'states' do
+ let(:export_resource) { create(:export_resource) }
+
+ it 'should initialize with new state' do
+ expect(export_resource.status).to eq("WARNING")
+ end
+ end
+end
diff --git a/spec/models/export/export_spec.rb b/spec/models/export/export_spec.rb
new file mode 100644
index 000000000..089f4a2b7
--- /dev/null
+++ b/spec/models/export/export_spec.rb
@@ -0,0 +1,239 @@
+RSpec.describe Export::Base, type: :model do
+
+ it { should belong_to(:referential) }
+ it { should belong_to(:workbench) }
+ it { should belong_to(:parent) }
+
+ it { should enumerize(:status).in("aborted", "canceled", "failed", "new", "pending", "running", "successful", "warning") }
+
+ it { should validate_presence_of(:workbench) }
+ it { should validate_presence_of(:creator) }
+
+ include ActionDispatch::TestProcess
+ it { should allow_value(fixture_file_upload('OFFRE_TRANSDEV_2017030112251.zip')).for(:file) }
+ it { should_not allow_value(fixture_file_upload('users.json')).for(:file).with_message(I18n.t('errors.messages.extension_whitelist_error', extension: '"json"', allowed_types: "zip")) }
+
+ let(:workbench_export) {netex_export.parent}
+ let(:workbench_export_with_completed_steps) do
+ build_stubbed(
+ :workbench_export,
+ total_steps: 2,
+ current_step: 2
+ )
+ end
+
+ let(:netex_export) do
+ build_stubbed(
+ :netex_export
+ )
+ end
+
+ describe ".abort_old" do
+ it "changes exports older than 4 hours to aborted" do
+ Timecop.freeze(Time.now) do
+ old_export = create(
+ :workbench_export,
+ status: 'pending',
+ created_at: 4.hours.ago - 1.minute
+ )
+ current_export = create(:workbench_export, status: 'pending')
+
+ Export::Base.abort_old
+
+ expect(current_export.reload.status).to eq('pending')
+ expect(old_export.reload.status).to eq('aborted')
+ end
+ end
+
+ it "doesn't work on exports with a `finished_status`" do
+ Timecop.freeze(Time.now) do
+ export = create(
+ :workbench_export,
+ status: 'successful',
+ created_at: 4.hours.ago - 1.minute
+ )
+
+ Export::Base.abort_old
+
+ expect(export.reload.status).to eq('successful')
+ end
+ end
+
+ it "only works on the caller type" do
+ Timecop.freeze(Time.now) do
+ workbench_export = create(
+ :workbench_export,
+ status: 'pending',
+ created_at: 4.hours.ago - 1.minute
+ )
+ netex_export = create(
+ :netex_export,
+ status: 'pending',
+ created_at: 4.hours.ago - 1.minute
+ )
+
+ Export::Netex.abort_old
+
+ expect(workbench_export.reload.status).to eq('pending')
+ expect(netex_export.reload.status).to eq('aborted')
+ end
+ end
+ end
+
+ describe "#destroy" do
+ it "must destroy all child exports" do
+ netex_export = create(:netex_export)
+
+ netex_export.parent.destroy
+
+ expect(netex_export.parent).to be_destroyed
+ expect(Export::Netex.count).to eq(0)
+ end
+
+ it "must destroy all associated Export::Messages" do
+ export = create(:export)
+ create(:export_resource, export: export)
+
+ export.destroy
+
+ expect(Export::Resource.count).to eq(0)
+ end
+
+ it "must destroy all associated Export::Resources" do
+ export = create(:export)
+ create(:export_message, export: export)
+
+ export.destroy
+
+ expect(Export::Message.count).to eq(0)
+ end
+ end
+
+ describe "#notify_parent" do
+ it "must call #child_change on its parent" do
+ allow(netex_export).to receive(:update)
+
+ expect(workbench_export).to receive(:child_change)
+
+ netex_export.notify_parent
+ end
+
+ it "must update the :notified_parent_at field of the child export" do
+ allow(workbench_export).to receive(:child_change)
+
+ Timecop.freeze(DateTime.now) do
+ expect(netex_export).to receive(:update).with(
+ notified_parent_at: DateTime.now
+ )
+
+ netex_export.notify_parent
+ end
+ end
+ end
+
+ describe "#child_change" do
+ it "calls #update_status" do
+ allow(workbench_export).to receive(:update)
+
+ expect(workbench_export).to receive(:update_status)
+ workbench_export.child_change
+ end
+ end
+
+ describe "#update_status" do
+ shared_examples(
+ "updates :status to failed when >=1 child has failing status"
+ ) do |failure_status|
+ it "updates :status to failed when >=1 child has failing status" do
+ workbench_export = create(:workbench_export)
+ create(
+ :netex_export,
+ parent: workbench_export,
+ status: failure_status
+ )
+
+ workbench_export.update_status
+
+ expect(workbench_export.status).to eq('failed')
+ end
+ end
+
+ include_examples(
+ "updates :status to failed when >=1 child has failing status",
+ "failed"
+ )
+ include_examples(
+ "updates :status to failed when >=1 child has failing status",
+ "aborted"
+ )
+ include_examples(
+ "updates :status to failed when >=1 child has failing status",
+ "canceled"
+ )
+
+ it "updates :status to successful when all children are successful" do
+ workbench_export = create(:workbench_export)
+ exports = create_list(
+ :netex_export,
+ 2,
+ parent: workbench_export,
+ status: 'successful'
+ )
+
+ workbench_export.update_status
+
+ expect(workbench_export.status).to eq('successful')
+ end
+
+ it "updates :status to failed when any child has failed" do
+ workbench_export = create(:workbench_export)
+ [
+ 'failed',
+ 'successful'
+ ].each do |status|
+ create(
+ :netex_export,
+ parent: workbench_export,
+ status: status
+ )
+ end
+
+ workbench_export.update_status
+
+ expect(workbench_export.status).to eq('failed')
+ end
+
+ it "updates :status to warning when any child has warning or successful" do
+ workbench_export = create(:workbench_export)
+ [
+ 'warning',
+ 'successful'
+ ].each do |status|
+ create(
+ :netex_export,
+ parent: workbench_export,
+ status: status
+ )
+ end
+
+ workbench_export.update_status
+
+ expect(workbench_export.status).to eq('warning')
+ end
+
+ it "updates :ended_at to now when status is finished" do
+ workbench_export = create(:workbench_export)
+ create(
+ :netex_export,
+ parent: workbench_export,
+ status: 'failed'
+ )
+
+ Timecop.freeze(Time.now) do
+ workbench_export.update_status
+
+ expect(workbench_export.ended_at).to eq(Time.now)
+ end
+ end
+ end
+end
diff --git a/spec/models/import_message_spec.rb b/spec/models/import/import_message_spec.rb
index 48e03a2cc..48e03a2cc 100644
--- a/spec/models/import_message_spec.rb
+++ b/spec/models/import/import_message_spec.rb
diff --git a/spec/models/import_resource_spec.rb b/spec/models/import/import_resource_spec.rb
index 7d2eab8f1..7d2eab8f1 100644
--- a/spec/models/import_resource_spec.rb
+++ b/spec/models/import/import_resource_spec.rb
diff --git a/spec/models/import_spec.rb b/spec/models/import/import_spec.rb
index cbc5907fa..cbc5907fa 100644
--- a/spec/models/import_spec.rb
+++ b/spec/models/import/import_spec.rb
diff --git a/spec/models/import_task_spec.rb b/spec/models/import_task_spec.rb
deleted file mode 100644
index 3aa006a69..000000000
--- a/spec/models/import_task_spec.rb
+++ /dev/null
@@ -1,196 +0,0 @@
-# require 'spec_helper'
-
-# describe ImportTask, :type => :model do
-
-# subject { build :import_task }
-
-# describe ".new" do
-
-# it "should use type attribute to create a subclass" do
-# expect(ImportTask.new(:format => "Neptune")).to be_an_instance_of(NeptuneImport)
-# expect(ImportTask.new(:format => "Gtfs")).to be_an_instance_of(GtfsImport)
-# expect(ImportTask.new(:format => "Netex")).to be_an_instance_of(NetexImport)
-# expect(ImportTask.new(:format => "Csv")).to be_an_instance_of(CsvImport)
-
-# expect(NeptuneImport.new).to be_an_instance_of(NeptuneImport)
-# expect(GtfsImport.new).to be_an_instance_of(GtfsImport)
-# expect(NetexImport.new).to be_an_instance_of(NetexImport)
-# expect(CsvImport.new).to be_an_instance_of(CsvImport)
-# end
-
-# end
-
-# describe "#delayed_import" do
-# before(:each) do
-# allow(subject).to receive_messages( :delay => double( :import => true))
-# end
-# it "should call delay#import" do
-# expect(subject.delay).to receive( :import)
-# subject.send :delayed_import
-# end
-# end
-
-# describe ".create" do
-# before(:each) do
-# allow(subject).to receive_messages( :save_resources => true )
-# end
-# it "should call save_resource" do
-# expect(subject).to receive( :save_resources)
-# subject.send :save
-# end
-# it "should update file_path with #saved_resources" do
-# subject.send :save
-# expect(ImportTask.find( subject.id).file_path).to eq(subject.send( :saved_resources))
-# end
-# it "should have a compliance_check_task" do
-# subject.send :save
-# expect(ImportTask.find( subject.id).compliance_check_task).not_to be_nil
-# end
-# end
-
-# describe "#compliance_check_task" do
-# let(:rule_parameter_set){ Factory( :rule_parameter_set) }
-# let(:import_task){ Factory(:import_task, :rule_parameter_set_id => rule_parameter_set.id) }
-# let(:compliance_check_task){ import_task.compliance_check_task }
-
-# it "should have same #referential as import_task" do
-# expect(compliance_check_task.referential).to eq(import_task.referential)
-# end
-
-# it "should have same #rule_parameter_set_id as import_task" do
-# expect(compliance_check_task.rule_parameter_set_id).to eq(import_task.rule_parameter_set_id)
-# end
-
-# it "should have same #user_id as import_task" do
-# expect(compliance_check_task.user_id).to eq(import_task.user_id)
-# end
-
-# it "should have same #user_name as import_task" do
-# expect(compliance_check_task.user_name).to eq(import_task.user_name)
-# end
-# end
-
-# describe "#file_path_extension" do
-# let(:import_task){ Factory(:import_task) }
-# context "zip file to import" do
-# before(:each) do
-# import_task.file_path = "aaa/bbb.zip"
-# end
-# it "should return zip" do
-# expect(import_task.file_path_extension).to eq("zip")
-# end
-# end
-# context "xml file to import" do
-# before(:each) do
-# import_task.file_path = "aaa/bbb.xml"
-# end
-# it "should return xml" do
-# expect(import_task.file_path_extension).to eq("xml")
-# end
-# end
-# context "csv file to import" do
-# before(:each) do
-# import_task.file_path = "aaa/bbb.csv"
-# end
-# it "should return csv" do
-# expect(import_task.file_path_extension).to eq("basic")
-# end
-# end
-
-# end
-
-# context "options attributes" do
-# let(:import_task){ Factory(:import_task) }
-# describe "#no_save" do
-# it "should read parameter_set['no_save']" do
-# import_task.parameter_set[ "no_save"] = "dummy"
-# expect(import_task.no_save).to eq("dummy")
-# end
-# end
-# describe "#format" do
-# it "should read parameter_set['format']" do
-# import_task.parameter_set[ "format"] = "dummy"
-# expect(import_task.format).to eq("dummy")
-# end
-# end
-# describe "#file_path" do
-# it "should read parameter_set['file_path']" do
-# import_task.parameter_set[ "file_path"] = "dummy"
-# expect(import_task.file_path).to eq("dummy")
-# end
-# end
-# describe "#no_save=" do
-# it "should read parameter_set['no_save']" do
-# import_task.no_save = "dummy"
-# expect(import_task.parameter_set[ "no_save"]).to eq(false)
-# end
-# end
-# describe "#format=" do
-# it "should read parameter_set['format']" do
-# import_task.format = "dummy"
-# expect(import_task.parameter_set[ "format"]).to eq("dummy")
-# end
-# end
-# describe "#file_path=" do
-# it "should read parameter_set['file_path']" do
-# import_task.file_path = "dummy"
-# expect(import_task.parameter_set[ "file_path"]).to eq("dummy")
-# end
-# end
-# end
-
-# describe "#chouette_command" do
-# it "should be a Chouette::Command instance" do
-# expect(subject.send( :chouette_command).class).to eq(Chouette::Command)
-# end
-# it "should have schema same as referential.slug" do
-# expect(subject.send( :chouette_command).schema).to eq(subject.referential.slug)
-# end
-# end
-
-# describe "#import" do
-# let(:import_task){ Factory(:import_task) }
-# let(:chouette_command) { "dummy" }
-# context "for failing import" do
-# before(:each) do
-# allow(chouette_command).to receive( :run!).and_raise( "dummy")
-# allow(import_task).to receive_messages( :chouette_command => chouette_command)
-# end
-# it "should have status 'failed'" do
-# import_task.import
-# expect(import_task.status).to eq("failed")
-# end
-# it "should have status 'failed' for compliance_check_task" do
-# import_task.import
-# expect(import_task.compliance_check_task.status).to eq("failed")
-# end
-# end
-# context "for successful import" do
-# before(:each) do
-# allow(import_task).to receive_messages( :chouette_command => double( :run! => true ))
-# end
-# it "should have status 'completed'" do
-# import_task.import
-# expect(import_task.status).to eq("completed")
-# end
-# it "should have status 'completed' for compliance_check_task" do
-# import_task.import
-# expect(import_task.status).to eq("completed")
-# end
-# end
-# end
-
-# describe "#import" do
-# let(:import_task){ Factory(:import_task) }
-# let(:command_args){ "dummy" }
-# before(:each) do
-# allow(import_task).to receive_messages( :chouette_command => double( :run! => true ))
-# allow(import_task).to receive_messages( :chouette_command_args => command_args)
-# end
-# it "should call chouette_command.run! with :c => 'import', :id => id" do
-# expect(import_task.send( :chouette_command)).to receive( :run! ).with( command_args)
-# import_task.import
-# end
-# end
-
-# end
diff --git a/spec/policies/import_policy_spec.rb b/spec/policies/import_policy_spec.rb
index f9effd21a..9c7fca8a5 100644
--- a/spec/policies/import_policy_spec.rb
+++ b/spec/policies/import_policy_spec.rb
@@ -1,4 +1,4 @@
-RSpec.describe Import::BasePolicy, type: :policy do
+RSpec.describe ImportPolicy, type: :policy do
let( :record ){ build_stubbed :import }
before { stub_policy_scope(record) }
diff --git a/spec/support/permissions.rb b/spec/support/permissions.rb
index 95afd6c1c..825e44725 100644
--- a/spec/support/permissions.rb
+++ b/spec/support/permissions.rb
@@ -17,6 +17,7 @@ module Support
connection_links
calendars
footnotes
+ exports
imports
merges
journey_patterns