Skip to content

Commit 7c73c5c

Browse files
fix: Add greater than zero validation for sync_interval (#61)
1 parent b807eac commit 7c73c5c

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

server/app/contracts/sync_contracts.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ class Create < Dry::Validation::Contract
4242
rule(sync: :sync_interval_unit) do
4343
key.failure("invalid connector type") unless Sync.sync_interval_units.keys.include?(value.downcase)
4444
end
45+
46+
rule("sync.sync_interval") do
47+
key.failure("must be greater than 0") if value <= 0
48+
end
4549
end
4650

4751
class Update < Dry::Validation::Contract
@@ -73,6 +77,10 @@ class Update < Dry::Validation::Contract
7377
rule(sync: :sync_interval_unit) do
7478
key.failure("invalid connector type") if key? && !Sync.sync_interval_units.keys.include?(value.downcase)
7579
end
80+
81+
rule("sync.sync_interval") do
82+
key.failure("must be greater than 0") if value <= 0
83+
end
7684
end
7785

7886
class Destroy < Dry::Validation::Contract

server/app/models/sync.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class Sync < ApplicationRecord
2828
validates :model_id, presence: true
2929
validates :configuration, presence: true
3030
validates :schedule_type, presence: true
31-
validates :sync_interval, presence: true
31+
validates :sync_interval, presence: true, numericality: { greater_than: 0 }
3232
validates :sync_interval_unit, presence: true
3333
validates :stream_name, presence: true
3434
validates :status, presence: true

server/spec/contracts/sync_contracts_spec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,50 @@
6565
expect(result.errors[:sync][:sync_mode]).to include("invalid sync mode")
6666
end
6767
end
68+
69+
context "with non-positive sync_interval" do
70+
let(:invalid_inputs) { { sync: valid_inputs[:sync].merge(sync_interval: 0) } }
71+
72+
it "fails validation" do
73+
result = contract.call(invalid_inputs)
74+
expect(result.errors[:sync][:sync_interval]).to include("must be greater than 0")
75+
end
76+
end
77+
end
78+
79+
describe SyncContracts::Update do
80+
subject(:contract) { described_class.new }
81+
82+
let(:valid_inputs) do
83+
{
84+
id: 1,
85+
sync: {
86+
source_id: 1,
87+
model_id: 2,
88+
destination_id: 3,
89+
schedule_type: "automated",
90+
sync_interval: 15,
91+
sync_interval_unit: "hours",
92+
sync_mode: "incremental",
93+
stream_name: "updated_stream"
94+
}
95+
}
96+
end
97+
98+
context "with valid inputs" do
99+
it "passes validation" do
100+
expect(contract.call(valid_inputs)).to be_success
101+
end
102+
end
103+
104+
context "with non-positive sync_interval" do
105+
let(:invalid_inputs) { { id: 1, sync: valid_inputs[:sync].merge(sync_interval: -1) } }
106+
107+
it "fails validation" do
108+
result = contract.call(invalid_inputs)
109+
expect(result.errors[:sync][:sync_interval]).to include("must be greater than 0")
110+
end
111+
end
68112
end
69113

70114
describe SyncContracts::Destroy do

server/spec/models/sync_spec.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,4 +314,23 @@
314314
hash_including(options: hash_including(workflow_id: a_string_starting_with("terminate-"))))
315315
end
316316
end
317+
318+
describe "validations" do
319+
let(:source) do
320+
create(:connector, connector_type: "source", connector_name: "Snowflake")
321+
end
322+
let(:destination) { create(:connector, connector_type: "destination") }
323+
let!(:catalog) { create(:catalog, connector: destination) }
324+
let(:sync) { build(:sync, sync_interval: 3, sync_interval_unit: "hours", source:, destination:) }
325+
326+
it "validates that sync_interval is greater than 0" do
327+
sync.sync_interval = 0
328+
expect(sync).not_to be_valid
329+
expect(sync.errors[:sync_interval]).to include("must be greater than 0")
330+
331+
sync.sync_interval = -1
332+
expect(sync).not_to be_valid
333+
expect(sync.errors[:sync_interval]).to include("must be greater than 0")
334+
end
335+
end
317336
end

0 commit comments

Comments
 (0)