Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion lib/pgslice/cli/fill.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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
Expand Down
27 changes: 27 additions & 0 deletions test/fill_validation_test.rb
Original file line number Diff line number Diff line change
@@ -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