File: value_sets_bytes_parser_test.rb

package info (click to toggle)
ruby-activerecord-import 1.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 840 kB
  • sloc: ruby: 4,698; makefile: 7
file content (106 lines) | stat: -rw-r--r-- 4,153 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# frozen_string_literal: true

require File.expand_path(File.dirname(__FILE__) + '/test_helper')

require 'activerecord-import/value_sets_parser'

describe ActiveRecord::Import::ValueSetsBytesParser do
  context "#parse - computing insert value sets" do
    let(:parser) { ActiveRecord::Import::ValueSetsBytesParser }
    let(:base_sql) { "INSERT INTO atable (a,b,c)" }
    let(:values) { ["(1,2,3)", "(2,3,4)", "(3,4,5)"] }

    context "when the max allowed bytes is 30 and the base SQL is 26 bytes" do
      it "should raise ActiveRecord::Import::ValueSetTooLargeError" do
        error = assert_raises ActiveRecord::Import::ValueSetTooLargeError do
          parser.parse values, reserved_bytes: base_sql.size, max_bytes: 30
        end
        assert_match(/33 bytes exceeds the max allowed for an insert \[30\]/, error.message)
      end
    end

    context "when the max allowed bytes is 33 and the base SQL is 26 bytes" do
      it "should return 3 value sets when given 3 value sets of 7 bytes a piece" do
        value_sets = parser.parse values, reserved_bytes: base_sql.size, max_bytes: 33
        assert_equal 3, value_sets.size
      end
    end

    context "when the max allowed bytes is 40 and the base SQL is 26 bytes" do
      it "should return 3 value sets when given 3 value sets of 7 bytes a piece" do
        value_sets = parser.parse values, reserved_bytes: base_sql.size, max_bytes: 40
        assert_equal 3, value_sets.size
      end
    end

    context "when the max allowed bytes is 41 and the base SQL is 26 bytes" do
      it "should return 2 value sets when given 2 value sets of 7 bytes a piece" do
        value_sets = parser.parse values, reserved_bytes: base_sql.size, max_bytes: 41
        assert_equal 2, value_sets.size
      end
    end

    context "when the max allowed bytes is 48 and the base SQL is 26 bytes" do
      it "should return 2 value sets when given 2 value sets of 7 bytes a piece" do
        value_sets = parser.parse values, reserved_bytes: base_sql.size, max_bytes: 48
        assert_equal 2, value_sets.size
      end
    end

    context "when the max allowed bytes is 49 and the base SQL is 26 bytes" do
      it "should return 1 value sets when given 1 value sets of 7 bytes a piece" do
        value_sets = parser.parse values, reserved_bytes: base_sql.size, max_bytes: 49
        assert_equal 1, value_sets.size
      end
    end

    context "when the max allowed bytes is 999999 and the base SQL is 26 bytes" do
      it "should return 1 value sets when given 1 value sets of 7 bytes a piece" do
        value_sets = parser.parse values, reserved_bytes: base_sql.size, max_bytes: 999_999
        assert_equal 1, value_sets.size
      end
    end

    it "should properly build insert value set based on max packet allowed" do
      values = [
        "('1','2','3')",
        "('4','5','6')",
        "('7','8','9')"
      ]

      base_sql_size_in_bytes = 15
      max_bytes = 30

      value_sets = parser.parse values, reserved_bytes: base_sql_size_in_bytes, max_bytes: max_bytes
      assert_equal 3, value_sets.size, 'Three value sets were expected!'

      # Each element in the value_sets array must be an array
      value_sets.each_with_index do |e, i|
        assert_kind_of Array, e, "Element #{i} was expected to be an Array!"
      end

      # Each element in the values array should have a 1:1 correlation to the elements
      # in the returned value_sets arrays
      assert_equal values[0], value_sets[0].first
      assert_equal values[1], value_sets[1].first
      assert_equal values[2], value_sets[2].first
    end

    context "data contains multi-byte chars" do
      it "should properly build insert value set based on max packet allowed" do
        # each accented e should be 2 bytes, so each entry is 6 bytes instead of 5
        values = [
          "('é')",
          "('é')"
        ]

        base_sql_size_in_bytes = 15
        max_bytes = 26

        value_sets = parser.parse values, reserved_bytes: base_sql_size_in_bytes, max_bytes: max_bytes

        assert_equal 2, value_sets.size, 'Two value sets were expected!'
      end
    end
  end
end