diff options
| author | cedricnjanga | 2017-10-02 17:34:49 +0200 |
|---|---|---|
| committer | cedricnjanga | 2017-10-02 17:36:41 +0200 |
| commit | cba31dc411ceb47f80202c1d3a32a2e031630b13 (patch) | |
| tree | 429718a617260f5013bb9d07b828e3d1bd26c738 | |
| parent | 466dde61ed0cdf32c06cb3738e32f38c50c4558e (diff) | |
| download | chouette-core-cba31dc411ceb47f80202c1d3a32a2e031630b13.tar.bz2 | |
Refs #4665
Add a controller concern to deal with date filters
| -rw-r--r-- | app/controllers/compliance_check_sets_controller.rb | 37 | ||||
| -rw-r--r-- | app/controllers/compliance_control_sets_controller.rb | 33 | ||||
| -rw-r--r-- | app/controllers/concerns/ransack_date_filter.rb | 48 | ||||
| -rw-r--r-- | app/controllers/imports_controller.rb | 28 | ||||
| -rw-r--r-- | app/controllers/time_tables_controller.rb | 49 | ||||
| -rw-r--r-- | app/controllers/workbenches_controller.rb | 32 | ||||
| -rw-r--r-- | app/models/chouette/time_table.rb | 4 | ||||
| -rw-r--r-- | app/models/compliance_check_set.rb | 4 | ||||
| -rw-r--r-- | app/models/compliance_control_set.rb | 4 | ||||
| -rw-r--r-- | app/models/import.rb | 4 | ||||
| -rw-r--r-- | app/views/compliance_check_sets/_filters.html.slim | 4 | ||||
| -rw-r--r-- | app/views/compliance_control_sets/_filters.html.slim | 4 | ||||
| -rw-r--r-- | app/views/imports/_filters.html.slim | 4 | ||||
| -rw-r--r-- | app/views/time_tables/_filter.html.slim | 5 | ||||
| -rw-r--r-- | app/views/workbenches/_filters.html.slim | 4 | ||||
| -rw-r--r-- | spec/features/workbenches_spec.rb | 16 |
16 files changed, 129 insertions, 151 deletions
diff --git a/app/controllers/compliance_check_sets_controller.rb b/app/controllers/compliance_check_sets_controller.rb index d61fbafdb..3e093deab 100644 --- a/app/controllers/compliance_check_sets_controller.rb +++ b/app/controllers/compliance_check_sets_controller.rb @@ -1,13 +1,15 @@ class ComplianceCheckSetsController < BreadcrumbController defaults resource_class: ComplianceCheckSet - before_action :ransack_created_at_params, only: [:index] + include RansackDateFilter + set_date_param "created_at", DateTime + before_action :set_date_time_params, only: [:index] respond_to :html belongs_to :workbench def index index! do |format| - scope = ransack_period @compliance_check_sets + scope = ransack_period_range(scope: @compliance_check_sets, error_message: t('compliance_check_sets.filters.error_period_filter'), query: :where_created_at_between) @q_for_form = scope.ransack(params[:q]) format.html { @compliance_check_sets = ModelDecorator.decorate( @@ -17,35 +19,4 @@ class ComplianceCheckSetsController < BreadcrumbController } end end - - - private - - def ransack_created_at_params - start_date = [] - end_date = [] - - if params[:q] && params[:q][:created_at] && !params[:q][:created_at].has_value?(nil) && !params[:q][:created_at].has_value?("") - [1, 2, 3].each do |key| - start_date << params[:q][:created_at]["begin(#{key}i)"].to_i - end_date << params[:q][:created_at]["end(#{key}i)"].to_i - end - params[:q].delete(:created_at) - @begin_range = DateTime.new(*start_date, 0, 0, 0) rescue nil - @end_range = DateTime.new(*end_date, 23, 59, 59) rescue nil - end - end - - # Fake ransack filter - def ransack_period scope - return scope unless !!@begin_range && !!@end_range - - if @begin_range > @end_range - flash.now[:error] = t('compliance_check_sets.filters.error_period_filter') - else - scope = scope.where_created_at_between(@begin_range, @end_range) - end - scope - end - end
\ No newline at end of file diff --git a/app/controllers/compliance_control_sets_controller.rb b/app/controllers/compliance_control_sets_controller.rb index e3304c0b8..0e4520d1f 100644 --- a/app/controllers/compliance_control_sets_controller.rb +++ b/app/controllers/compliance_control_sets_controller.rb @@ -1,11 +1,13 @@ class ComplianceControlSetsController < BreadcrumbController defaults resource_class: ComplianceControlSet - before_action :ransack_updated_at_params, only: [:index] + include RansackDateFilter + set_date_param "updated_at", DateTime + before_action :set_date_time_params, only: [:index] respond_to :html def index index! do |format| - scope = ransack_period @compliance_control_sets + scope = ransack_period_range(scope: @compliance_control_sets, error_message: t('imports.filters.error_period_filter'), query: :where_updated_at_between) @q_for_form = scope.ransack(params[:q]) format.html { @compliance_control_sets = decorate_compliance_control_sets(@q_for_form.result) @@ -44,33 +46,6 @@ class ComplianceControlSetsController < BreadcrumbController ) end - def ransack_updated_at_params - start_date = [] - end_date = [] - - if params[:q] && params[:q][:updated_at] && !params[:q][:updated_at].has_value?(nil) && !params[:q][:updated_at].has_value?("") - [1, 2, 3].each do |key| - start_date << params[:q][:updated_at]["begin(#{key}i)"].to_i - end_date << params[:q][:updated_at]["end(#{key}i)"].to_i - end - params[:q].delete([:updated_at]) - @begin_range = DateTime.new(*start_date,0,0,0) rescue nil - @end_range = DateTime.new(*end_date,23,59,59) rescue nil - end - end - - # Fake ransack filter - def ransack_period scope - return scope unless !!@begin_range && !!@end_range - - if @begin_range > @end_range - flash.now[:error] = t('imports.filters.error_period_filter') - else - scope = scope.where_updated_at_between(@begin_range, @end_range) - end - scope - end - def compliance_control_set_params params.require(:compliance_control_set).permit(:name, :id) end diff --git a/app/controllers/concerns/ransack_date_filter.rb b/app/controllers/concerns/ransack_date_filter.rb new file mode 100644 index 000000000..20ab764b3 --- /dev/null +++ b/app/controllers/concerns/ransack_date_filter.rb @@ -0,0 +1,48 @@ +module RansackDateFilter + extend ActiveSupport::Concern + cattr_accessor :date_param + + included do + + def set_date_time_params + start_date = [] + end_date = [] + + if params[:q] && params[:q][@@date_param] && !params[:q][@@date_param].has_value?(nil) && !params[:q][@@date_param].has_value?("") + [1, 2, 3].each do |key| + start_date << params[:q][@@date_param]["start_date(#{key}i)"].to_i + end_date << params[:q][@@date_param]["end_date(#{key}i)"].to_i + end + params[:q].delete([@@date_param]) + + if @@klass == DateTime + @begin_range = @@klass.new(*start_date,0,0,0) rescue nil + @end_range = @@klass.new(*end_date,23,59,59) rescue nil + else + @begin_range = @@klass.new(*start_date) rescue nil + @end_range = @@klass.new(*end_date) rescue nil + end + end + + # Fake ransack filter + def ransack_period_range **options + return options[:scope] unless !!@begin_range && !!@end_range + + if @begin_range > @end_range + flash.now[:error] = options[:error_message] + else + scope = options[:scope].send options[:query], @begin_range..@end_range + end + scope + end + end + + def self.set_date_param(param_name, klass) + @@date_param = param_name + @@klass = klass + end + + private_class_method :set_date_param + + end +end
\ No newline at end of file diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb index f2e65e445..4a12706bc 100644 --- a/app/controllers/imports_controller.rb +++ b/app/controllers/imports_controller.rb @@ -1,8 +1,11 @@ class ImportsController < BreadcrumbController include PolicyChecker + include RansackDateFilter + set_date_param "started_at", DateTime + before_action :set_date_time_params, only: [:index] + skip_before_action :authenticate_user!, only: [:download] defaults resource_class: Import, collection_name: 'imports', instance_name: 'import' - before_action :ransack_started_at_params, only: [:index] before_action :ransack_status_params, only: [:index] respond_to :html belongs_to :workbench @@ -48,7 +51,8 @@ class ImportsController < BreadcrumbController protected def collection scope = parent.imports.where(type: "WorkbenchImport") - scope = ransack_period scope + + scope = ransack_period_range(scope: scope, error_message: t('imports.filters.error_period_filter'), query: :where_started_at_in) @q = scope.search(params[:q]) @@ -77,16 +81,16 @@ class ImportsController < BreadcrumbController end # Fake ransack filter - def ransack_period scope - return scope unless !!@begin_range && !!@end_range - - if @begin_range > @end_range - flash.now[:error] = t('imports.filters.error_period_filter') - else - scope = scope.where_started_at_between(@begin_range, @end_range) - end - scope - end + # def ransack_period scope + # return scope unless !!@begin_range && !!@end_range + + # if @begin_range > @end_range + # flash.now[:error] = t('imports.filters.error_period_filter') + # else + # scope = scope.where_started_at_between(@begin_range..@end_range) + # end + # scope + # end def ransack_status_params if params[:q] diff --git a/app/controllers/time_tables_controller.rb b/app/controllers/time_tables_controller.rb index 0054963c9..12dc26367 100644 --- a/app/controllers/time_tables_controller.rb +++ b/app/controllers/time_tables_controller.rb @@ -1,5 +1,8 @@ class TimeTablesController < ChouetteController include TimeTablesHelper + include RansackDateFilter + set_date_param "bounding_dates", Date + before_action :set_date_time_params, only: [:index] defaults :resource_class => Chouette::TimeTable respond_to :html respond_to :xml @@ -131,7 +134,7 @@ class TimeTablesController < ChouetteController params[:q].delete("tag_search") scope = select_time_tables.tagged_with(tags, :any => true) if tags.any? end - scope = ransack_periode(scope) + scope = ransack_period_range(scope: scope, error_message: t('referentials.errors.validity_period'), query: :overlapping) @q = scope.search(params[:q]) if sort_column && sort_direction @@ -159,28 +162,28 @@ class TimeTablesController < ChouetteController end private - def ransack_periode scope - return scope unless params[:q] - return scope unless params[:q]['end_date_lteq(1i)'].present? - - begin_range = flatten_date('start_date_gteq') - end_range = flatten_date('end_date_lteq') - - if begin_range > end_range - flash.now[:error] = t('referentials.errors.validity_period') - else - scope = scope.overlapping(begin_range, end_range) - params[:q] = params[:q].slice('comment_cont', 'color_cont_any') - @begin_range = begin_range - @end_range = end_range - end - scope - end - - def flatten_date key - date_int = %w(1 2 3).map {|e| params[:q]["#{key}(#{e}i)"].to_i } - Date.new(*date_int) - end + # def ransack_periode scope + # return scope unless params[:q] + # return scope unless params[:q]['end_date_lteq(1i)'].present? + + # begin_range = flatten_date('start_date_gteq') + # end_range = flatten_date('end_date_lteq') + + # if begin_range > end_range + # flash.now[:error] = t('referentials.errors.validity_period') + # else + # scope = scope.overlapping(begin_range, end_range) + # params[:q] = params[:q].slice('comment_cont', 'color_cont_any') + # @begin_range = begin_range + # @end_range = end_range + # end + # scope + # end + + # def flatten_date key + # date_int = %w(1 2 3).map {|e| params[:q]["#{key}(#{e}i)"].to_i } + # Date.new(*date_int) + # end def sort_column referential.time_tables.column_names.include?(params[:sort]) ? params[:sort] : 'comment' diff --git a/app/controllers/workbenches_controller.rb b/app/controllers/workbenches_controller.rb index d597ba371..68b6e176c 100644 --- a/app/controllers/workbenches_controller.rb +++ b/app/controllers/workbenches_controller.rb @@ -1,5 +1,8 @@ class WorkbenchesController < BreadcrumbController before_action :query_params, only: [:show] + include RansackDateFilter + set_date_param "validity_period", Date + before_action :set_date_time_params, only: [:show] defaults resource_class: Workbench respond_to :html, only: [:show, :index] @@ -11,7 +14,7 @@ class WorkbenchesController < BreadcrumbController def show scope = resource.all_referentials scope = ransack_associated_lines(scope) - scope = ransack_period(scope) + scope = ransack_period_range(scope: scope, error_message: t('referentials.errors.validity_period'), query: :in_periode) scope = ransack_status(scope) @q_for_form = scope.ransack(params[:q]) @@ -69,33 +72,6 @@ class WorkbenchesController < BreadcrumbController end # Fake ransack filter - def ransack_period scope - period = params[:q]['validity_period'] - return scope unless period - - begin - if period['begin_gteq'].kind_of?(Array) - begin_range = Date.new(*period['begin_gteq'].map(&:to_i)) - end_range = Date.new(*period['end_lteq'].map(&:to_i)) - else - begin_range = Date.new(period["begin_gteq(1i)"].to_i, period["begin_gteq(2i)"].to_i, period["begin_gteq(3i)"].to_i) - end_range = Date.new(period["end_lteq(1i)"].to_i, period["end_lteq(2i)"].to_i, period["end_lteq(3i)"].to_i) - end - rescue Exception => e - return scope - end - - if begin_range > end_range - flash.now[:error] = t('referentials.errors.validity_period') - else - scope = scope.in_periode(begin_range..end_range) - @begin_range = begin_range - @end_range = end_range - end - scope - end - - # Fake ransack filter def ransack_status scope archived = !params[:q]['archived_at_not_null'].to_i.zero? unarchived = !params[:q]['archived_at_null'].to_i.zero? diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index 8821a5201..72496273e 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -21,12 +21,12 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord belongs_to :calendar belongs_to :created_from, class_name: 'Chouette::TimeTable' - scope :overlapping, -> (date_start, date_end) do + scope :overlapping, -> (period_range) do joins(" LEFT JOIN time_table_periods ON time_tables.id = time_table_periods.time_table_id LEFT JOIN time_table_dates ON time_tables.id = time_table_dates.time_table_id ") - .where("(time_table_periods.period_start <= :end AND time_table_periods.period_end >= :start) OR (time_table_dates.date BETWEEN :start AND :end)", {start: date_start, end: date_end}) + .where("(time_table_periods.period_start <= :end AND time_table_periods.period_end >= :begin) OR (time_table_dates.date BETWEEN :begin AND :end)", {begin: period_range.begin, end: period_range.end}) end after_save :save_shortcuts diff --git a/app/models/compliance_check_set.rb b/app/models/compliance_check_set.rb index 4c00c3516..e4146e0e2 100644 --- a/app/models/compliance_check_set.rb +++ b/app/models/compliance_check_set.rb @@ -11,8 +11,8 @@ class ComplianceCheckSet < ActiveRecord::Base enumerize :status, in: %w[new pending successful warning failed running aborted canceled] - scope :where_created_at_between, ->(start_date, end_date) do - where('created_at BETWEEN ? AND ?', start_date, end_date) + scope :where_created_at_between, ->(period_range) do + where('created_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) end end diff --git a/app/models/compliance_control_set.rb b/app/models/compliance_control_set.rb index 40e269146..1ab0fd6d2 100644 --- a/app/models/compliance_control_set.rb +++ b/app/models/compliance_control_set.rb @@ -4,7 +4,7 @@ class ComplianceControlSet < ActiveRecord::Base has_many :compliance_controls, dependent: :destroy validates :name, presence: true - scope :where_updated_at_between, ->(start_date, end_date) do - where('updated_at BETWEEN ? AND ?', start_date, end_date) + scope :where_updated_at_between, ->(period_range) do + where('updated_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) end end diff --git a/app/models/import.rb b/app/models/import.rb index 74f7ef10c..64f713914 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -9,8 +9,8 @@ class Import < ActiveRecord::Base has_many :resources, class_name: "ImportResource", dependent: :destroy has_many :children, foreign_key: :parent_id, class_name: "Import", dependent: :destroy - scope :where_started_at_between, ->(start_date, end_date) do - where('started_at BETWEEN ? AND ?', start_date, end_date) + scope :where_started_at_in, ->(period_range) do + where('started_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) end extend Enumerize diff --git a/app/views/compliance_check_sets/_filters.html.slim b/app/views/compliance_check_sets/_filters.html.slim index a9467a7fe..c5c968c6a 100644 --- a/app/views/compliance_check_sets/_filters.html.slim +++ b/app/views/compliance_check_sets/_filters.html.slim @@ -15,8 +15,8 @@ = f.label Import.human_attribute_name(:created_at), required: false, class: 'control-label' .filter_menu = f.simple_fields_for :created_at do |p| - = p.input :begin, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @begin_range, include_blank: @begin_range ? false : true - = p.input :end, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @end_range, include_blank: @end_range ? false : true + = p.input :start_date, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @begin_range, include_blank: @begin_range ? false : true + = p.input :end_date, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @end_range, include_blank: @end_range ? false : true .actions = link_to t('actions.erase'), @compliance_checks_sets, class: 'btn btn-link' diff --git a/app/views/compliance_control_sets/_filters.html.slim b/app/views/compliance_control_sets/_filters.html.slim index 56cac8bd2..f70a997f5 100644 --- a/app/views/compliance_control_sets/_filters.html.slim +++ b/app/views/compliance_control_sets/_filters.html.slim @@ -14,8 +14,8 @@ = f.label Import.human_attribute_name(:updated_at), required: false, class: 'control-label' .filter_menu = f.simple_fields_for :updated_at do |p| - = p.input :begin, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @begin_range, include_blank: @begin_range ? false : true - = p.input :end, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @end_range, include_blank: @end_range ? false : true + = p.input :start_date, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @begin_range, include_blank: @begin_range ? false : true + = p.input :end_date, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @end_range, include_blank: @end_range ? false : true .actions = link_to t('actions.erase'), @compliance_control_set, class: 'btn btn-link' diff --git a/app/views/imports/_filters.html.slim b/app/views/imports/_filters.html.slim index 85099b99a..b1f23e2c8 100644 --- a/app/views/imports/_filters.html.slim +++ b/app/views/imports/_filters.html.slim @@ -15,8 +15,8 @@ = f.label Import.human_attribute_name(:started_at), required: false, class: 'control-label' .filter_menu = f.simple_fields_for :started_at do |p| - = p.input :begin, as: :date, label: false, wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true - = p.input :end, as: :date, label: false, wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true + = p.input :start_date, as: :date, label: false, wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true + = p.input :end_date, as: :date, label: false, wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true .actions = link_to t('actions.erase'), workbench_imports_path(@workbench), class: 'btn btn-link' diff --git a/app/views/time_tables/_filter.html.slim b/app/views/time_tables/_filter.html.slim index 043aa87d0..a4d90d1cc 100644 --- a/app/views/time_tables/_filter.html.slim +++ b/app/views/time_tables/_filter.html.slim @@ -14,8 +14,9 @@ .form-group.togglable = f.label Chouette::TimeTable.human_attribute_name(:bounding_dates), required: false, class: 'control-label' .filter_menu - = f.input :start_date_gteq, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true - = f.input :end_date_lteq, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true + = f.simple_fields_for :bounding_dates do |p| + = f.input :start_date, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true + = f.input :end_date, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true .actions diff --git a/app/views/workbenches/_filters.html.slim b/app/views/workbenches/_filters.html.slim index 8da629e9c..4d9e0066c 100644 --- a/app/views/workbenches/_filters.html.slim +++ b/app/views/workbenches/_filters.html.slim @@ -25,8 +25,8 @@ = f.label Referential.human_attribute_name(:validity_period), required: false, class: 'control-label' .filter_menu = f.simple_fields_for :validity_period do |p| - = p.input :begin_gteq, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true - = p.input :end_lteq, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true + = p.input :start_date, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true + = p.input :end_date, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true .actions = link_to t('actions.erase'), @workbench, class: 'btn btn-link' diff --git a/spec/features/workbenches_spec.rb b/spec/features/workbenches_spec.rb index 14809dec1..e33f8c134 100644 --- a/spec/features/workbenches_spec.rb +++ b/spec/features/workbenches_spec.rb @@ -113,8 +113,8 @@ describe 'Workbenches', type: :feature do it 'should show results for referential in range' do dates = referential.validity_period.to_a - fill_validity_field dates[0], 'begin_gteq' - fill_validity_field dates[1], 'end_lteq' + fill_validity_field dates[0], 'start_date' + fill_validity_field dates[1], 'end_date' click_button I18n.t('actions.filter') expect(page).to have_content(referential.name) @@ -123,8 +123,8 @@ describe 'Workbenches', type: :feature do it 'should keep filtering on sort' do dates = referential.validity_period.to_a - fill_validity_field dates[0], 'begin_gteq' - fill_validity_field dates[1], 'end_lteq' + fill_validity_field dates[0], 'start_date' + fill_validity_field dates[1], 'end_date' click_button I18n.t('actions.filter') find('a[href*="&sort=validity_period"]').click @@ -134,8 +134,8 @@ describe 'Workbenches', type: :feature do end it 'should not show results for out off range' do - fill_validity_field(Date.today - 2.year, 'begin_gteq') - fill_validity_field(Date.today - 1.year, 'end_lteq') + fill_validity_field(Date.today - 2.year, 'start_date') + fill_validity_field(Date.today - 1.year, 'end_date') click_button I18n.t('actions.filter') expect(page).to_not have_content(referential.name) @@ -144,12 +144,12 @@ describe 'Workbenches', type: :feature do it 'should keep value on submit' do dates = referential.validity_period.to_a - ['begin_gteq', 'end_lteq'].each_with_index do |field, index| + ['start_date', 'end_date'].each_with_index do |field, index| fill_validity_field dates[index], field end click_button I18n.t('actions.filter') - ['begin_gteq', 'end_lteq'].each_with_index do |field, index| + ['start_date', 'end_date'].each_with_index do |field, index| expect(find("#q_validity_period_#{field}_3i").value).to eq dates[index].day.to_s expect(find("#q_validity_period_#{field}_2i").value).to eq dates[index].month.to_s expect(find("#q_validity_period_#{field}_1i").value).to eq dates[index].year.to_s |
