From a39f7eb8ae4842333bb77c8719624eddcc56b126 Mon Sep 17 00:00:00 2001 From: dajiaohuang Date: Sat, 24 Oct 2026 13:56:00 +0800 Subject: [PATCH] Validate fill batch size --- lib/pgslice/cli/fill.rb | 6 +++++- test/fill_validation_test.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test/fill_validation_test.rb diff --git a/lib/pgslice/cli/fill.rb b/lib/pgslice/cli/fill.rb index 64a3f53..2b7c9e1 100644 --- a/lib/pgslice/cli/fill.rb +++ b/lib/pgslice/cli/fill.rb @@ -9,6 +9,11 @@ class CLI option :where, desc: "Conditions to filter" option :sleep, type: :numeric, desc: "Seconds to sleep between batches" def fill(table) + batch_size = options[:batch_size] + unless batch_size.is_a?(Numeric) && batch_size.to_i == batch_size && batch_size.positive? + abort "Batch size must be a positive integer" + end + table = create_table(table) source_table = create_table(options[:source_table]) if options[:source_table] dest_table = create_table(options[:dest_table]) if options[:dest_table] @@ -64,7 +69,6 @@ def fill(table) starting_id = max_dest_id fields = source_table.columns.map { |c| quote_ident(c) }.join(", ") - batch_size = options[:batch_size] i = 1 batch_count = ((max_source_id - starting_id) / batch_size.to_f).ceil diff --git a/test/fill_validation_test.rb b/test/fill_validation_test.rb new file mode 100644 index 0000000..2228326 --- /dev/null +++ b/test/fill_validation_test.rb @@ -0,0 +1,27 @@ +require "minitest/autorun" +require_relative "../lib/pgslice" + +PgSlice::CLI.exit_on_failure = false + +class FillValidationTest < Minitest::Test + class TableSetupReached < StandardError; end + + def test_rejects_invalid_batch_sizes_before_table_or_database_access + [0, -1, 0.5, 1.5].each do |batch_size| + cli = PgSlice::CLI.allocate + cli.define_singleton_method(:options) { {batch_size: batch_size} } + cli.define_singleton_method(:create_table) { |_| raise TableSetupReached } + + error = assert_raises(Thor::Error) { cli.fill("events") } + assert_equal "Batch size must be a positive integer", error.message + end + end + + def test_accepts_positive_integer_batch_size_before_table_setup + cli = PgSlice::CLI.allocate + cli.define_singleton_method(:options) { {batch_size: 10} } + cli.define_singleton_method(:create_table) { |_| raise TableSetupReached } + + assert_raises(TableSetupReached) { cli.fill("events") } + end +end