Skip to content

Commit bf420f1

Browse files
committed
Use Active Model validations and validate class name as well
1 parent 49ae908 commit bf420f1

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

app/models/solid_queue/recurring_task.rb

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ module SolidQueue
44
class RecurringTask < Record
55
serialize :arguments, coder: Arguments, default: []
66

7+
validate :supported_schedule
8+
validate :existing_job_class
9+
710
class << self
811
def wrap(args)
912
args.is_a?(self) ? args : from_configuration(args.first, **args.second)
@@ -44,10 +47,6 @@ def enqueue(at:)
4447
end
4548
end
4649

47-
def valid?
48-
parsed_schedule.instance_of?(Fugit::Cron)
49-
end
50-
5150
def to_s
5251
"#{class_name}.perform_later(#{arguments.map(&:inspect).join(",")}) [ #{parsed_schedule.original} ]"
5352
end
@@ -61,6 +60,19 @@ def to_h
6160
end
6261

6362
private
63+
def supported_schedule
64+
unless parsed_schedule.instance_of?(Fugit::Cron)
65+
errors.add :schedule, :unsupported, message: "is not a supported recurring schedule"
66+
end
67+
end
68+
69+
def existing_job_class
70+
unless job_class.present?
71+
errors.add :class_name, :undefined, message: "doesn't correspond to an existing class"
72+
end
73+
end
74+
75+
6476
def using_solid_queue_adapter?
6577
job_class.queue_adapter_name.inquiry.solid_queue?
6678
end
@@ -81,12 +93,13 @@ def arguments_with_kwargs
8193
end
8294
end
8395

96+
8497
def parsed_schedule
8598
@parsed_schedule ||= Fugit.parse(schedule)
8699
end
87100

88101
def job_class
89-
@job_class ||= class_name.safe_constantize
102+
@job_class ||= class_name&.safe_constantize
90103
end
91104
end
92105
end

test/models/solid_queue/recurring_task_test.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,16 @@ def perform
114114
task = recurring_task_with(class_name: "JobWithoutArguments", schedule: "every second")
115115
assert task.valid?
116116
assert task.to_s.ends_with? "[ * * * * * * ]"
117+
118+
# Empty schedule
119+
assert_not SolidQueue::RecurringTask.new(key: "task-id", class_name: "SolidQueue::RecurringTaskTest::JobWithoutArguments").valid?
120+
end
121+
122+
test "undefined job class" do
123+
assert_not recurring_task_with(class_name: "UnknownJob").valid?
124+
125+
# Empty class name
126+
assert_not SolidQueue::RecurringTask.new(key: "task-id", schedule: "every minute").valid?
117127
end
118128

119129
private
@@ -130,6 +140,6 @@ def enqueue_and_assert_performed_with_result(task, result)
130140
end
131141

132142
def recurring_task_with(class_name:, schedule: "every hour", args: nil)
133-
SolidQueue::RecurringTask.from_configuration("task-id", class: "SolidQueue::RecurringTaskTest::#{class_name}", schedule: schedule, args: args)
143+
SolidQueue::RecurringTask.new(key: "task-id", class_name: "SolidQueue::RecurringTaskTest::#{class_name}", schedule: schedule, arguments: args)
134144
end
135145
end

0 commit comments

Comments
 (0)