test_db_validation.rb 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. require "minitest/autorun"
  2. require_relative "support/stubs"
  3. # Tests for DB.validate_table_name!
  4. # The stub in support/stubs.rb implements the same regex as lib/db.rb,
  5. # so these tests validate the intended allowlist pattern.
  6. class TestDbValidateTableName < Minitest::Test
  7. # --- Valid names ---
  8. def test_simple_council_name
  9. assert_equal "da_brighton", DB.validate_table_name!("da_brighton")
  10. end
  11. def test_hyphenated_council_name
  12. assert_equal "da_break_oday", DB.validate_table_name!("da_break_oday")
  13. end
  14. def test_council_with_numbers
  15. assert_equal "da_waratah_wynyard", DB.validate_table_name!("da_waratah_wynyard")
  16. end
  17. def test_all_known_tables
  18. known = %w[
  19. da_break_oday da_brighton da_burnie da_centralcoast da_centralhighlands
  20. da_circularhead da_clarence da_derwentvalley da_devonportcity da_dorset
  21. da_flinders_council da_georgetown da_glamorgan da_glenorchy da_hobartcity
  22. da_huonvalley da_kentish da_kingborough da_latrobe da_launcestoncity
  23. da_meandervalley da_northernmidlands da_southernmidlands da_tasman
  24. da_waratah_wynyard da_westcoast da_westtamar
  25. ]
  26. known.each do |t|
  27. assert_equal t, DB.validate_table_name!(t), "Expected #{t} to be valid"
  28. end
  29. end
  30. # --- Invalid names ---
  31. def test_no_da_prefix_raises
  32. assert_raises(ArgumentError) { DB.validate_table_name!("users") }
  33. end
  34. def test_sql_injection_raises
  35. assert_raises(ArgumentError) { DB.validate_table_name!("da_foo; DROP TABLE users--") }
  36. end
  37. def test_backtick_injection_raises
  38. assert_raises(ArgumentError) { DB.validate_table_name!("da_foo`") }
  39. end
  40. def test_empty_string_raises
  41. assert_raises(ArgumentError) { DB.validate_table_name!("") }
  42. end
  43. def test_nil_raises
  44. assert_raises(ArgumentError) { DB.validate_table_name!(nil) }
  45. end
  46. def test_uppercase_raises
  47. # Table names are lowercase by convention; uppercase would be unexpected
  48. assert_raises(ArgumentError) { DB.validate_table_name!("DA_BRIGHTON") }
  49. end
  50. def test_whitespace_raises
  51. assert_raises(ArgumentError) { DB.validate_table_name!("da_foo bar") }
  52. end
  53. def test_error_message_includes_name
  54. err = assert_raises(ArgumentError) { DB.validate_table_name!("bad_name") }
  55. assert_includes err.message, "bad_name"
  56. end
  57. end