aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authorRobert2017-06-27 14:25:35 +0200
committerRobert2017-06-27 14:25:35 +0200
commitf20df3c08dfec0e3dda68401204f7d49470119a7 (patch)
tree4f27a34130d4ff044d48729f16d2dff154047ce5 /spec
parent970954938043d8d73c4457ee2d91e22c0e422e65 (diff)
parenteabd56ff9f2c7979192e54b4ae11673f1cc778c1 (diff)
downloadchouette-core-f20df3c08dfec0e3dda68401204f7d49470119a7.tar.bz2
conflicts resolved
Diffstat (limited to 'spec')
-rw-r--r--spec/factories/chouette_2_factories.rb79
-rw-r--r--spec/factories/compliance_check_results.rb8
-rw-r--r--spec/factories/compliance_check_tasks.rb8
-rw-r--r--spec/factories/export_log_messages.rb6
-rw-r--r--spec/factories/exports.rb5
-rw-r--r--spec/factories/import_tasks.rb10
-rw-r--r--spec/factories/kml_exports.rb5
-rw-r--r--spec/factories/organisations.rb6
-rw-r--r--spec/factories/referentials.rb12
-rw-r--r--spec/factories/rule_parameter_sets.rb9
-rw-r--r--spec/factories/time_table_combinations.rb3
-rw-r--r--spec/factories/users.rb10
-rw-r--r--spec/factories/vehicle_translations.rb6
-rw-r--r--spec/features/referentials_permissions_spec.rb2
-rw-r--r--spec/helpers/table_builder_helper/column_spec.rb23
-rw-r--r--spec/helpers/table_builder_helper/custom_links_spec.rb27
-rw-r--r--spec/helpers/table_builder_helper_spec.rb371
-rw-r--r--spec/javascripts/vehicle_journeys/actions_spec.js6
-rw-r--r--spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js8
-rw-r--r--spec/models/calendar_spec.rb10
-rw-r--r--spec/models/chouette/journey_pattern_spec.rb83
-rw-r--r--spec/models/chouette/vehicle_journey_spec.rb31
-rw-r--r--spec/support/pundit/policies.rb2
-rw-r--r--spec/views/lines/show.html.erb_spec.rb8
-rw-r--r--spec/views/time_tables/show.html.erb_spec.rb9
25 files changed, 649 insertions, 98 deletions
diff --git a/spec/factories/chouette_2_factories.rb b/spec/factories/chouette_2_factories.rb
deleted file mode 100644
index e8eba13e6..000000000
--- a/spec/factories/chouette_2_factories.rb
+++ /dev/null
@@ -1,79 +0,0 @@
-FactoryGirl.define do
-
- factory :organisation do
- sequence(:name) { |n| "Organisation #{n}" }
- sequence(:code) { |n| "000#{n}" }
- end
-
- factory :referential do
- sequence(:name) { |n| "Test #{n}" }
- sequence(:slug) { |n| "test_#{n}" }
- sequence(:prefix) { |n| "test_#{n}" }
- association :organisation
- association :workbench
- association :line_referential
- association :stop_area_referential
- time_zone "Europe/Paris"
- end
-
- factory :rule_parameter_set do
- sequence(:name) { |n| "Test #{n}" }
- association :organisation
- after(:create) do |rsp|
- rsp.parameters = RuleParameterSet.default_for_all_modes( rsp.organisation).parameters
- end
- end
-
- factory :user do
- association :organisation
- sequence(:name) { |n| "chouette#{n}" }
- sequence(:username) { |n| "chouette#{n}" }
- sequence(:email) { |n| "chouette#{n}@dryade.priv" }
- password "secret"
- password_confirmation "secret"
- end
-
- factory :import_task do |f|
- user_name "dummy"
- user_id 123
- no_save false
- format "Neptune"
- resources { Rack::Test::UploadedFile.new 'spec/fixtures/neptune.zip', 'application/zip', false }
- referential { Referential.find_by_slug("first") }
- end
-
- factory :kml_export do
- referential { Referential.find_by_slug("first") }
- end
-
- factory :export do
- referential { Referential.find_by_slug("first") }
- end
-
- factory :export_log_message do
- association :export
- sequence(:key) { |n| "key_#{n}" }
- end
-
- factory :vehicle_translation do
- count 1
- duration 1
- end
-
- factory :compliance_check_result do
- association :compliance_check_task
- rule_code "2-NEPTUNE-StopArea-6"
- severity "warning"
- status "nok"
- end
-
- factory :compliance_check_task do
- user_id 1
- user_name "Dummy"
- status "pending"
- referential { Referential.find_by_slug("first") }
- end
-
- factory :time_table_combination
-
-end
diff --git a/spec/factories/compliance_check_results.rb b/spec/factories/compliance_check_results.rb
new file mode 100644
index 000000000..7a3a3e956
--- /dev/null
+++ b/spec/factories/compliance_check_results.rb
@@ -0,0 +1,8 @@
+FactoryGirl.define do
+ factory :compliance_check_result do
+ association :compliance_check_task
+ rule_code "2-NEPTUNE-StopArea-6"
+ severity "warning"
+ status "nok"
+ end
+end
diff --git a/spec/factories/compliance_check_tasks.rb b/spec/factories/compliance_check_tasks.rb
new file mode 100644
index 000000000..e9fdeb5ef
--- /dev/null
+++ b/spec/factories/compliance_check_tasks.rb
@@ -0,0 +1,8 @@
+FactoryGirl.define do
+ factory :compliance_check_task do
+ user_id 1
+ user_name "Dummy"
+ status "pending"
+ referential { Referential.find_by_slug("first") }
+ end
+end
diff --git a/spec/factories/export_log_messages.rb b/spec/factories/export_log_messages.rb
new file mode 100644
index 000000000..849efd7b1
--- /dev/null
+++ b/spec/factories/export_log_messages.rb
@@ -0,0 +1,6 @@
+FactoryGirl.define do
+ factory :export_log_message do
+ association :export
+ sequence(:key) { |n| "key_#{n}" }
+ end
+end
diff --git a/spec/factories/exports.rb b/spec/factories/exports.rb
new file mode 100644
index 000000000..34427edb8
--- /dev/null
+++ b/spec/factories/exports.rb
@@ -0,0 +1,5 @@
+FactoryGirl.define do
+ factory :export do
+ referential { Referential.find_by_slug("first") }
+ end
+end
diff --git a/spec/factories/import_tasks.rb b/spec/factories/import_tasks.rb
new file mode 100644
index 000000000..9ca6db899
--- /dev/null
+++ b/spec/factories/import_tasks.rb
@@ -0,0 +1,10 @@
+FactoryGirl.define do
+ factory :import_task do |f|
+ user_name "dummy"
+ user_id 123
+ no_save false
+ format "Neptune"
+ resources { Rack::Test::UploadedFile.new 'spec/fixtures/neptune.zip', 'application/zip', false }
+ referential { Referential.find_by_slug("first") }
+ end
+end
diff --git a/spec/factories/kml_exports.rb b/spec/factories/kml_exports.rb
new file mode 100644
index 000000000..feb86c5b6
--- /dev/null
+++ b/spec/factories/kml_exports.rb
@@ -0,0 +1,5 @@
+FactoryGirl.define do
+ factory :kml_export do
+ referential { Referential.find_by_slug("first") }
+ end
+end
diff --git a/spec/factories/organisations.rb b/spec/factories/organisations.rb
new file mode 100644
index 000000000..239557a0e
--- /dev/null
+++ b/spec/factories/organisations.rb
@@ -0,0 +1,6 @@
+FactoryGirl.define do
+ factory :organisation do
+ sequence(:name) { |n| "Organisation #{n}" }
+ sequence(:code) { |n| "000#{n}" }
+ end
+end
diff --git a/spec/factories/referentials.rb b/spec/factories/referentials.rb
new file mode 100644
index 000000000..dd5bf1c2e
--- /dev/null
+++ b/spec/factories/referentials.rb
@@ -0,0 +1,12 @@
+FactoryGirl.define do
+ factory :referential do
+ sequence(:name) { |n| "Test #{n}" }
+ sequence(:slug) { |n| "test_#{n}" }
+ sequence(:prefix) { |n| "test_#{n}" }
+ association :organisation
+ association :workbench
+ association :line_referential
+ association :stop_area_referential
+ time_zone "Europe/Paris"
+ end
+end
diff --git a/spec/factories/rule_parameter_sets.rb b/spec/factories/rule_parameter_sets.rb
new file mode 100644
index 000000000..e20fff8ce
--- /dev/null
+++ b/spec/factories/rule_parameter_sets.rb
@@ -0,0 +1,9 @@
+FactoryGirl.define do
+ factory :rule_parameter_set do
+ sequence(:name) { |n| "Test #{n}" }
+ association :organisation
+ after(:create) do |rsp|
+ rsp.parameters = RuleParameterSet.default_for_all_modes( rsp.organisation).parameters
+ end
+ end
+end
diff --git a/spec/factories/time_table_combinations.rb b/spec/factories/time_table_combinations.rb
new file mode 100644
index 000000000..364d6460e
--- /dev/null
+++ b/spec/factories/time_table_combinations.rb
@@ -0,0 +1,3 @@
+FactoryGirl.define do
+ factory :time_table_combination
+end
diff --git a/spec/factories/users.rb b/spec/factories/users.rb
new file mode 100644
index 000000000..8f0ec38c0
--- /dev/null
+++ b/spec/factories/users.rb
@@ -0,0 +1,10 @@
+FactoryGirl.define do
+ factory :user do
+ association :organisation
+ sequence(:name) { |n| "chouette#{n}" }
+ sequence(:username) { |n| "chouette#{n}" }
+ sequence(:email) { |n| "chouette#{n}@dryade.priv" }
+ password "secret"
+ password_confirmation "secret"
+ end
+end
diff --git a/spec/factories/vehicle_translations.rb b/spec/factories/vehicle_translations.rb
new file mode 100644
index 000000000..1f0175222
--- /dev/null
+++ b/spec/factories/vehicle_translations.rb
@@ -0,0 +1,6 @@
+FactoryGirl.define do
+ factory :vehicle_translation do
+ count 1
+ duration 1
+ end
+end
diff --git a/spec/features/referentials_permissions_spec.rb b/spec/features/referentials_permissions_spec.rb
index 0216eeeb0..c37dff5b9 100644
--- a/spec/features/referentials_permissions_spec.rb
+++ b/spec/features/referentials_permissions_spec.rb
@@ -31,7 +31,7 @@ describe "Referentials", :type => :feature do
end
it 'shows the delete button' do
expected_href = referential_path(referential)
- expect( page ).to have_css(%{a[href=#{expected_href.inspect}] span}, text: destroy_link_text)
+ expect( page ).to have_css(%{a[href=#{expected_href.inspect}]}, text: destroy_link_text)
end
end
diff --git a/spec/helpers/table_builder_helper/column_spec.rb b/spec/helpers/table_builder_helper/column_spec.rb
new file mode 100644
index 000000000..0f27703b2
--- /dev/null
+++ b/spec/helpers/table_builder_helper/column_spec.rb
@@ -0,0 +1,23 @@
+require 'spec_helper'
+
+describe TableBuilderHelper::Column do
+ describe "#header_label" do
+ it "returns the column @name if present" do
+ expect(
+ TableBuilderHelper::Column.new(
+ name: 'ID Codif',
+ attribute: nil
+ ).header_label
+ ).to eq('ID Codif')
+ end
+
+ it "returns the I18n translation of @key if @name not present" do
+ expect(
+ TableBuilderHelper::Column.new(
+ key: :phone,
+ attribute: 'phone'
+ ).header_label(Chouette::Company)
+ ).to eq('Numéro de téléphone')
+ end
+ end
+end
diff --git a/spec/helpers/table_builder_helper/custom_links_spec.rb b/spec/helpers/table_builder_helper/custom_links_spec.rb
new file mode 100644
index 000000000..b64e97527
--- /dev/null
+++ b/spec/helpers/table_builder_helper/custom_links_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe TableBuilderHelper::CustomLinks do
+ describe "#actions_after_policy_check" do
+ it "includes :show" do
+ referential = build_stubbed(:referential)
+ user_context = UserContext.new(
+ build_stubbed(
+ :user,
+ organisation: referential.organisation,
+ permissions: [
+ 'boiv:read-offer'
+ ]
+ ),
+ referential: referential
+ )
+
+ expect(
+ TableBuilderHelper::CustomLinks.new(
+ referential,
+ user_context,
+ [:show]
+ ).actions_after_policy_check
+ ).to eq([:show])
+ end
+ end
+end
diff --git a/spec/helpers/table_builder_helper_spec.rb b/spec/helpers/table_builder_helper_spec.rb
new file mode 100644
index 000000000..8f4d98c88
--- /dev/null
+++ b/spec/helpers/table_builder_helper_spec.rb
@@ -0,0 +1,371 @@
+require 'htmlbeautifier'
+
+module TableBuilderHelper
+ include Pundit
+end
+
+describe TableBuilderHelper, type: :helper do
+ describe "#table_builder_2" do
+ it "builds a table" do
+ referential = build_stubbed(:referential)
+ workbench = referential.workbench
+
+ user_context = UserContext.new(
+ build_stubbed(
+ :user,
+ organisation: referential.organisation,
+ permissions: [
+ 'referentials.create',
+ 'referentials.edit',
+ 'referentials.destroy'
+ ]
+ ),
+ referential: referential
+ )
+ allow(helper).to receive(:current_user).and_return(user_context)
+
+ referentials = [referential]
+
+ allow(referentials).to receive(:model).and_return(Referential)
+
+ allow(helper).to receive(:params).and_return({
+ controller: 'workbenches',
+ action: 'show',
+ id: referentials[0].workbench.id
+ })
+
+ referentials = ModelDecorator.decorate(
+ referentials,
+ with: ReferentialDecorator
+ )
+
+ expected = <<-HTML
+<table class="table has-filter has-search">
+ <thead>
+ <tr>
+ <th>
+ <div class="checkbox"><input type="checkbox" name="0" id="0" value="all" /><label for="0"></label></div>
+ </th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=name">Nom<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=status">Etat<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=organisation">Organisation<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=validity_period">Période de validité englobante<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=lines">Lignes<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=created_at">Créé le<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=updated_at">Edité le<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/workbenches/#{workbench.id}?direction=desc&amp;sort=published_at">Intégré le<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <div class="checkbox"><input type="checkbox" name="#{referential.id}" id="#{referential.id}" value="#{referential.id}" /><label for="#{referential.id}"></label></div>
+ </td>
+ <td title="Voir"><a href="/referentials/#{referential.id}">#{referential.name}</a></td>
+ <td>
+ <div class='td-block'><span class='sb sb-lg sb-preparing'></span><span>En préparation</span></div>
+ </td>
+ <td>#{referential.organisation.name}</td>
+ <td>-</td>
+ <td>#{referential.lines.count}</td>
+ <td>#{I18n.localize(referential.created_at, format: :short)}</td>
+ <td>#{I18n.localize(referential.updated_at, format: :short)}</td>
+ <td></td>
+ <td class="actions">
+ <div class="btn-group">
+ <div class="btn dropdown-toggle" data-toggle="dropdown"><span class="fa fa-cog"></span></div>
+ <ul class="dropdown-menu">
+ <li><a href="/referentials/#{referential.id}">Consulter</a></li>
+ <li><a href="/referentials/#{referential.id}/edit">Editer</a></li>
+ <li><a href="/referentials/#{referential.id}/time_tables">Calendriers</a></li>
+ <li><a href="/referentials/new?from=#{referential.id}">Dupliquer</a></li>
+ <li><a rel="nofollow" data-method="put" href="/referentials/#{referential.id}/archive">Conserver</a></li>
+ <li class="delete-action"><a data-confirm="Etes vous sûr de vouloir supprimer ce jeu de données ?" rel="nofollow" data-method="delete" href="/referentials/#{referential.id}"><span class="fa fa-trash"></span>Supprimer</a></li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+ HTML
+
+ html_str = helper.table_builder_2(
+ referentials,
+ [
+ TableBuilderHelper::Column.new(
+ key: :name,
+ attribute: 'name'
+ ),
+ TableBuilderHelper::Column.new(
+ key: :status,
+ attribute: Proc.new do |w|
+ if w.archived?
+ ("<div class='td-block'><span class='fa fa-archive'></span><span>Conservé</span></div>").html_safe
+ else
+ ("<div class='td-block'><span class='sb sb-lg sb-preparing'></span><span>En préparation</span></div>").html_safe
+ end
+ end
+ ),
+ TableBuilderHelper::Column.new(
+ key: :organisation,
+ attribute: Proc.new {|w| w.organisation.name}
+ ),
+ TableBuilderHelper::Column.new(
+ key: :validity_period,
+ attribute: Proc.new do |w|
+ if w.validity_period.nil?
+ '-'
+ else
+ t(
+ 'validity_range',
+ debut: l(w.try(:validity_period).try(:begin), format: :short),
+ end: l(w.try(:validity_period).try(:end), format: :short)
+ )
+ end
+ end
+ ),
+ TableBuilderHelper::Column.new(
+ key: :lines,
+ attribute: Proc.new {|w| w.lines.count}
+ ),
+ TableBuilderHelper::Column.new(
+ key: :created_at,
+ attribute: Proc.new {|w| l(w.created_at, format: :short)}
+ ),
+ TableBuilderHelper::Column.new(
+ key: :updated_at,
+ attribute: Proc.new {|w| l(w.updated_at, format: :short)}
+ ),
+ TableBuilderHelper::Column.new(
+ key: :published_at,
+ attribute: ''
+ )
+ ],
+ selectable: true,
+ links: [:show, :edit],
+ cls: 'table has-filter has-search'
+ )
+
+ beautified_html = HtmlBeautifier.beautify(html_str, indent: ' ')
+
+ expect(beautified_html).to eq(expected.chomp)
+ end
+
+ it "can set a column as non-sortable" do
+ company = build_stubbed(:company)
+ line_referential = build_stubbed(
+ :line_referential,
+ companies: [company]
+ )
+ referential = build_stubbed(
+ :referential,
+ line_referential: line_referential
+ )
+
+ user_context = UserContext.new(
+ build_stubbed(
+ :user,
+ organisation: referential.organisation,
+ permissions: [
+ 'referentials.create',
+ 'referentials.edit',
+ 'referentials.destroy'
+ ]
+ ),
+ referential: referential
+ )
+ allow(helper).to receive(:current_user).and_return(user_context)
+ allow(TableBuilderHelper::URL).to receive(:current_referential)
+ .and_return(referential)
+
+ companies = [company]
+
+ allow(companies).to receive(:model).and_return(Chouette::Company)
+
+ allow(helper).to receive(:params).and_return({
+ controller: 'referential_companies',
+ action: 'index',
+ referential_id: referential.id
+ })
+
+ companies = ModelDecorator.decorate(
+ companies,
+ with: CompanyDecorator
+ )
+
+ expected = <<-HTML
+<table class="table has-search">
+ <thead>
+ <tr>
+ <th>ID Codif</th>
+ <th><a href="/referentials/#{referential.id}/companies?direction=desc&amp;sort=name">Nom<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/referentials/#{referential.id}/companies?direction=desc&amp;sort=phone">Numéro de téléphone<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/referentials/#{referential.id}/companies?direction=desc&amp;sort=email">Email<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th><a href="/referentials/#{referential.id}/companies?direction=desc&amp;sort=url">Page web associée<span class="orderers"><span class="fa fa-sort-asc active"></span><span class="fa fa-sort-desc "></span></span></a></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>#{company.objectid.local_id}</td>
+ <td title="Voir"><a href="/referentials/#{referential.id}/companies/#{company.id}">#{company.name}</a></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="actions">
+ <div class="btn-group">
+ <div class="btn dropdown-toggle" data-toggle="dropdown"><span class="fa fa-cog"></span></div>
+ <ul class="dropdown-menu">
+ <li><a href="/referentials/#{referential.id}/companies/#{company.id}">Consulter</a></li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+ HTML
+
+ html_str = helper.table_builder_2(
+ companies,
+ [
+ TableBuilderHelper::Column.new(
+ name: 'ID Codif',
+ attribute: Proc.new { |n| n.try(:objectid).try(:local_id) },
+ sortable: false
+ ),
+ TableBuilderHelper::Column.new(
+ key: :name,
+ attribute: 'name'
+ ),
+ TableBuilderHelper::Column.new(
+ key: :phone,
+ attribute: 'phone'
+ ),
+ TableBuilderHelper::Column.new(
+ key: :email,
+ attribute: 'email'
+ ),
+ TableBuilderHelper::Column.new(
+ key: :url,
+ attribute: 'url'
+ ),
+ ],
+ links: [:show, :edit, :delete],
+ cls: 'table has-search'
+ )
+
+ beautified_html = HtmlBeautifier.beautify(html_str, indent: ' ')
+
+ expect(beautified_html).to eq(expected.chomp)
+ end
+
+ it "can set all columns as non-sortable" do
+ company = build_stubbed(:company)
+ line_referential = build_stubbed(
+ :line_referential,
+ companies: [company]
+ )
+ referential = build_stubbed(
+ :referential,
+ line_referential: line_referential
+ )
+
+ user_context = UserContext.new(
+ build_stubbed(
+ :user,
+ organisation: referential.organisation,
+ permissions: [
+ 'referentials.create',
+ 'referentials.edit',
+ 'referentials.destroy'
+ ]
+ ),
+ referential: referential
+ )
+ allow(helper).to receive(:current_user).and_return(user_context)
+ allow(TableBuilderHelper::URL).to receive(:current_referential)
+ .and_return(referential)
+
+ companies = [company]
+
+ allow(companies).to receive(:model).and_return(Chouette::Company)
+
+ allow(helper).to receive(:params).and_return({
+ controller: 'referential_companies',
+ action: 'index',
+ referential_id: referential.id
+ })
+
+ companies = ModelDecorator.decorate(
+ companies,
+ with: CompanyDecorator
+ )
+
+ expected = <<-HTML
+<table class="table has-search">
+ <thead>
+ <tr>
+ <th>ID Codif</th>
+ <th>Nom</th>
+ <th>Numéro de téléphone</th>
+ <th>Email</th>
+ <th>Page web associée</th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>#{company.objectid.local_id}</td>
+ <td title="Voir"><a href="/referentials/#{referential.id}/companies/#{company.id}">#{company.name}</a></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="actions">
+ <div class="btn-group">
+ <div class="btn dropdown-toggle" data-toggle="dropdown"><span class="fa fa-cog"></span></div>
+ <ul class="dropdown-menu">
+ <li><a href="/referentials/#{referential.id}/companies/#{company.id}">Consulter</a></li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+ HTML
+
+ html_str = helper.table_builder_2(
+ companies,
+ [
+ TableBuilderHelper::Column.new(
+ name: 'ID Codif',
+ attribute: Proc.new { |n| n.try(:objectid).try(:local_id) }
+ ),
+ TableBuilderHelper::Column.new(
+ key: :name,
+ attribute: 'name'
+ ),
+ TableBuilderHelper::Column.new(
+ key: :phone,
+ attribute: 'phone'
+ ),
+ TableBuilderHelper::Column.new(
+ key: :email,
+ attribute: 'email'
+ ),
+ TableBuilderHelper::Column.new(
+ key: :url,
+ attribute: 'url'
+ ),
+ ],
+ sortable: false,
+ links: [:show, :edit, :delete],
+ cls: 'table has-search'
+ )
+
+ beautified_html = HtmlBeautifier.beautify(html_str, indent: ' ')
+
+ expect(beautified_html).to eq(expected.chomp)
+ end
+ end
+end
diff --git a/spec/javascripts/vehicle_journeys/actions_spec.js b/spec/javascripts/vehicle_journeys/actions_spec.js
index 19f65046f..d96baf8ef 100644
--- a/spec/javascripts/vehicle_journeys/actions_spec.js
+++ b/spec/javascripts/vehicle_journeys/actions_spec.js
@@ -188,11 +188,13 @@ describe('when clicking on validate button inside editing modal', () => {
describe('when clicking on validate button inside duplicating modal', () => {
it('should create an action to duplicate a vehiclejourney schedule', () => {
const data = {}
+ const departureDelta = 0
const expectedAction = {
type: 'DUPLICATE_VEHICLEJOURNEY',
- data
+ data,
+ departureDelta
}
- expect(actions.duplicateVehicleJourney(data)).toEqual(expectedAction)
+ expect(actions.duplicateVehicleJourney(data, departureDelta)).toEqual(expectedAction)
})
})
describe('when clicking on edit notes modal', () => {
diff --git a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
index 23ebc3d9f..620e2ffdd 100644
--- a/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
+++ b/spec/javascripts/vehicle_journeys/reducers/vehicle_journeys_spec.js
@@ -216,14 +216,15 @@ describe('vehicleJourneys reducer', () => {
delta: 627,
arrival_time : {
hour: '12',
- minute: '00'
+ minute: '01'
},
departure_time : {
hour: '22',
- minute: '27'
+ minute: '28'
},
stop_area_object_id : "FR:92024:ZDE:420553:STIF"
}]
+ let departureDelta = 1
let fakeData = {
duplicate_number: {value : 1},
additional_time: {value: '5'}
@@ -234,7 +235,8 @@ describe('vehicleJourneys reducer', () => {
expect(
vjReducer(state, {
type: 'DUPLICATE_VEHICLEJOURNEY',
- data: fakeData
+ data: fakeData,
+ departureDelta
})
).toEqual([state[0], newVJ, state[1]])
})
diff --git a/spec/models/calendar_spec.rb b/spec/models/calendar_spec.rb
index 6a2b24011..a3da95aca 100644
--- a/spec/models/calendar_spec.rb
+++ b/spec/models/calendar_spec.rb
@@ -109,15 +109,11 @@ RSpec.describe Calendar, :type => :model do
let(:calendar) { create(:calendar, date_ranges: []) }
it 'shoud fill date_ranges with date ranges' do
- expected_ranges = [
- Range.new(Date.today, Date.tomorrow)
- ]
- expected_ranges.each_with_index do |range, index|
- calendar.date_ranges << Calendar::Period.from_range(index, range)
- end
+ expected_range = Date.today..Date.tomorrow
+ calendar.date_ranges << expected_range
calendar.valid?
- expect(calendar.date_ranges.map { |period| period.begin..period.end }).to eq(expected_ranges)
+ expect(calendar.date_ranges.map { |period| period.begin..period.end }).to eq([expected_range])
end
end
diff --git a/spec/models/chouette/journey_pattern_spec.rb b/spec/models/chouette/journey_pattern_spec.rb
index 19b5060d2..aaf9a694f 100644
--- a/spec/models/chouette/journey_pattern_spec.rb
+++ b/spec/models/chouette/journey_pattern_spec.rb
@@ -2,6 +2,26 @@ require 'spec_helper'
describe Chouette::JourneyPattern, :type => :model do
+ context 'validate minimum stop_points size' do
+ let(:journey_pattern) { create :journey_pattern }
+ let(:stop_points) { journey_pattern.stop_points }
+
+ it 'should be valid if it has at least two sp' do
+ journey_pattern.stop_points.first(stop_points.size - 2).each do |sp|
+ journey_pattern.stop_points.delete(sp)
+ end
+ expect(journey_pattern).to be_valid
+ end
+
+ it 'should not be valid if it has less then two sp' do
+ journey_pattern.stop_points.first(stop_points.size - 1).each do |sp|
+ journey_pattern.stop_points.delete(sp)
+ end
+ expect(journey_pattern).to_not be_valid
+ expect(journey_pattern.errors).to have_key(:stop_points)
+ end
+ end
+
describe "state_update" do
def journey_pattern_to_state jp
jp.attributes.slice('name', 'published_name', 'registration_number').tap do |item|
@@ -24,12 +44,14 @@ describe Chouette::JourneyPattern, :type => :model do
end
it 'should attach checked stop_points' do
- state['stop_points'].each{|sp| sp['checked'] = true}
# Make sure journey_pattern has no stop_points
- journey_pattern.stop_points.delete_all
+ state['stop_points'].each{|sp| sp['checked'] = false}
+ journey_pattern.state_stop_points_update(state)
expect(journey_pattern.reload.stop_points).to be_empty
+ state['stop_points'].each{|sp| sp['checked'] = true}
journey_pattern.state_stop_points_update(state)
+
expect(journey_pattern.reload.stop_points.count).to eq(5)
end
@@ -89,6 +111,63 @@ describe Chouette::JourneyPattern, :type => :model do
expect(collection.first).to_not have_key('object_id')
end
+
+ it 'should create journey_pattern' do
+ new_state = journey_pattern_to_state(build(:journey_pattern, objectid: nil, route: route))
+ Chouette::JourneyPattern.state_create_instance route, new_state
+ expect(new_state['object_id']).to be_truthy
+ expect(new_state['new_record']).to be_truthy
+ end
+
+ it 'should delete journey_pattern' do
+ state['deletable'] = true
+ collection = [state]
+ expect {
+ Chouette::JourneyPattern.state_update route, collection
+ }.to change{Chouette::JourneyPattern.count}.from(1).to(0)
+
+ expect(collection).to be_empty
+ end
+
+ it 'should delete multiple journey_pattern' do
+ collection = 5.times.collect{journey_pattern_to_state(create(:journey_pattern, route: route))}
+ collection.map{|i| i['deletable'] = true}
+
+ expect {
+ Chouette::JourneyPattern.state_update route, collection
+ }.to change{Chouette::JourneyPattern.count}.from(5).to(0)
+ end
+
+ it 'should validate journey_pattern on update' do
+ journey_pattern.name = ''
+ collection = [state]
+ Chouette::JourneyPattern.state_update route, collection
+ expect(collection.first['errors']).to have_key(:name)
+ end
+
+ it 'should validate journey_pattern on create' do
+ new_state = journey_pattern_to_state(build(:journey_pattern, name: '', objectid: nil, route: route))
+ collection = [new_state]
+ expect {
+ Chouette::JourneyPattern.state_update route, collection
+ }.to_not change{Chouette::JourneyPattern.count}
+
+ expect(collection.first['errors']).to have_key(:name)
+ expect(collection.first).to_not have_key('object_id')
+ end
+
+ it 'should not save any journey_pattern of collection if one is invalid' do
+ journey_pattern.name = ''
+ valid_state = journey_pattern_to_state(build(:journey_pattern, objectid: nil, route: route))
+ invalid_state = journey_pattern_to_state(journey_pattern)
+ collection = [valid_state, invalid_state]
+
+ expect {
+ Chouette::JourneyPattern.state_update route, collection
+ }.to_not change{Chouette::JourneyPattern.count}
+
+ expect(collection.first).to_not have_key('object_id')
+ end
end
describe "#stop_point_ids" do
diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb
index 8f9080b99..c78ef5b33 100644
--- a/spec/models/chouette/vehicle_journey_spec.rb
+++ b/spec/models/chouette/vehicle_journey_spec.rb
@@ -351,7 +351,7 @@ describe Chouette::VehicleJourney, :type => :model do
end
end
- describe ".departure_time_between" do
+ describe ".where_departure_time_between" do
it "selects vehicle journeys whose departure times are between the
specified range" do
journey_early = create(
@@ -404,6 +404,35 @@ describe Chouette::VehicleJourney, :type => :model do
.to_a
).to eq([journey])
end
+
+ it "uses an inclusive range" do
+ journey_early = create(
+ :vehicle_journey,
+ stop_departure_time: '03:00:00'
+ )
+
+ route = journey_early.route
+ journey_pattern = journey_early.journey_pattern
+
+ journey_late = create(
+ :vehicle_journey,
+ route: route,
+ journey_pattern: journey_pattern,
+ stop_departure_time: '04:00:00'
+ )
+
+ expect(route
+ .vehicle_journeys
+ .select('DISTINCT "vehicle_journeys".*')
+ .joins('
+ LEFT JOIN "vehicle_journey_at_stops"
+ ON "vehicle_journey_at_stops"."vehicle_journey_id" =
+ "vehicle_journeys"."id"
+ ')
+ .where_departure_time_between('03:00', '04:00', allow_empty: true)
+ .to_a
+ ).to match_array([journey_early, journey_late])
+ end
end
describe ".without_time_tables" do
diff --git a/spec/support/pundit/policies.rb b/spec/support/pundit/policies.rb
index e18309226..56433b2ee 100644
--- a/spec/support/pundit/policies.rb
+++ b/spec/support/pundit/policies.rb
@@ -9,7 +9,7 @@ module Support
end
def create_user_context(user:, referential:)
- OpenStruct.new(user: user, context: {referential: referential})
+ UserContext.new(user, referential: referential)
end
def add_permissions(*permissions, for_user:)
diff --git a/spec/views/lines/show.html.erb_spec.rb b/spec/views/lines/show.html.erb_spec.rb
index 3a9efa0ce..7bc120f1a 100644
--- a/spec/views/lines/show.html.erb_spec.rb
+++ b/spec/views/lines/show.html.erb_spec.rb
@@ -3,7 +3,13 @@ require 'spec_helper'
describe "/lines/show", :type => :view do
assign_referential
- let!(:line) { assign :line, create(:line) }
+ let!(:line) do
+ line = create(:line)
+ assign :line, line.decorate(context: {
+ line_referential: line.line_referential,
+ current_organisation: referential.organisation
+ })
+ end
let!(:line_referential) { assign :line_referential, line.line_referential }
let!(:routes) { assign :routes, Array.new(2) { create(:route, :line => line) }.paginate }
let!(:map) { assign(:map, double(:to_html => '<div id="map"/>'.html_safe)) }
diff --git a/spec/views/time_tables/show.html.erb_spec.rb b/spec/views/time_tables/show.html.erb_spec.rb
index f429f9dec..edfb3f3cc 100644
--- a/spec/views/time_tables/show.html.erb_spec.rb
+++ b/spec/views/time_tables/show.html.erb_spec.rb
@@ -3,7 +3,14 @@ require 'spec_helper'
describe "/time_tables/show", :type => :view do
assign_referential
- let!(:time_table) { assign(:time_table, create(:time_table)) }
+ let!(:time_table) do
+ assign(
+ :time_table,
+ create(:time_table).decorate(context: {
+ referential: referential
+ })
+ )
+ end
let!(:year) { assign(:year, Date.today.cwyear) }
let!(:time_table_combination) {assign(:time_table_combination, TimeTableCombination.new)}