Commit 1acaf75d authored by Shinya Maeda's avatar Shinya Maeda

Implement ayufan validator

parent 0c9795a7
...@@ -15,11 +15,7 @@ module Ci ...@@ -15,11 +15,7 @@ module Ci
validates :cron_timezone, cron_timezone: true, presence: { unless: :importing? } validates :cron_timezone, cron_timezone: true, presence: { unless: :importing? }
validates :ref, presence: { unless: :importing? } validates :ref, presence: { unless: :importing? }
validates :description, presence: true validates :description, presence: true
validates :variables, uniqueness_of_in_memory: { validates :variables, variable_duplicates: true
:collection => :variables,
:attrs => [:pipeline_schedule_id, :key],
:message => ['variables.key', 'keys are duplicated']
}
before_save :set_next_run_at before_save :set_next_run_at
......
# UniquenessOfInMemoryValidator
#
# This validtor is designed for especially the following condition
# - Use `accepts_nested_attributes_for :xxx` in a parent model
# - Use `validates :xxx, uniqueness: { scope: :xxx_id }` in a child model
#
# Inspired by https://stackoverflow.com/a/2883129/2522666
module ActiveRecord
class Base
# Validate that the the objects in +collection+ are unique
# when compared against all their non-blank +attrs+. If not
# add +message+ to the base errors.
def validate_uniqueness_of_in_memory(collection, attrs, message)
hashes = collection.inject({}) do |hash, record|
key = attrs.map { |a| record.send(a).to_s }.join
if key.blank? || record.marked_for_destruction?
key = record.object_id
end
hash[key] = record unless hash[key]
hash
end
if collection.length > hashes.length
self.errors.add(*message)
end
end
end
end
class UniquenessOfInMemoryValidator < ActiveModel::Validator
def validate(record)
record.validate_uniqueness_of_in_memory(
record.public_send(options[:collection]),
options[:attrs],
options[:message])
end
end
...@@ -171,7 +171,7 @@ describe Projects::PipelineSchedulesController do ...@@ -171,7 +171,7 @@ describe Projects::PipelineSchedulesController do
.to change { Ci::PipelineSchedule.count }.by(0) .to change { Ci::PipelineSchedule.count }.by(0)
.and change { Ci::PipelineScheduleVariable.count }.by(0) .and change { Ci::PipelineScheduleVariable.count }.by(0)
expect(assigns(:schedule).errors['variables.key']).not_to be_empty expect(assigns(:schedule).errors['variables']).not_to be_empty
end end
end end
end end
...@@ -269,7 +269,7 @@ describe Projects::PipelineSchedulesController do ...@@ -269,7 +269,7 @@ describe Projects::PipelineSchedulesController do
it 'returns an error that variables are duplciated' do it 'returns an error that variables are duplciated' do
go go
expect(assigns(:schedule).errors['variables.key']).not_to be_empty expect(assigns(:schedule).errors['variables']).not_to be_empty
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment