activerecord-aurora-serverless-adapter 1.0.0 → 5.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +55 -63
  4. data/activerecord-aurora-serverless-adapter.gemspec +5 -2
  5. data/lib/active_record/connection_adapters/aurora_serverless/client.rb +25 -0
  6. data/lib/active_record/connection_adapters/aurora_serverless/mysql2.rb +13 -14
  7. data/lib/active_record/connection_adapters/aurora_serverless/mysql2/client.rb +4 -0
  8. data/lib/active_record/connection_adapters/aurora_serverless/version.rb +1 -1
  9. data/test/aasa_helper.rb +163 -0
  10. data/test/aurora-serverless/bin/aurora-serverless.ts +17 -0
  11. data/test/aurora-serverless/cdk.context.json +3 -0
  12. data/test/aurora-serverless/cdk.json +3 -0
  13. data/test/aurora-serverless/lib/aurora-serverless-stack.ts +194 -0
  14. data/test/aurora-serverless/package-lock.json +6485 -0
  15. data/test/aurora-serverless/package.json +21 -0
  16. data/test/aurora-serverless/tsconfig.json +23 -0
  17. data/test/bin/_deploy-aurora +8 -0
  18. data/test/bin/_wakeup +17 -0
  19. data/test/bin/deploy-aurora +8 -0
  20. data/test/bin/wakeup +8 -0
  21. data/test/cases/aasa/mysql_client_test.rb +59 -0
  22. data/test/cases/aasa/mysql_result_test.rb +63 -0
  23. data/test/cases/aasa/mysql_types_test.rb +135 -0
  24. data/test/cases/coerced_tests.rb +151 -0
  25. data/test/config.yml +20 -0
  26. data/test/support/aasa_coerceable.rb +53 -0
  27. data/test/support/aasa_env.rb +11 -0
  28. data/test/support/aasa_fixtures.rb +9 -0
  29. data/test/support/aasa_minitest.rb +39 -0
  30. data/test/support/aasa_mysqlpatch.rb +8 -0
  31. data/test/support/aasa_paths.rb +47 -0
  32. data/test/support/aasa_rake.rb +102 -0
  33. metadata +43 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d55e3b914364d41374c560c6183e7def09de56c9d3e90a9cba15bac946c10353
4
- data.tar.gz: 5266a9a3be80080fbdfe5b24a85611251ac2724994f3883066e6b2c045845168
3
+ metadata.gz: 60b59ea21f9e813832a9b157fd65ae5d9d686afb0f04c51700cd5664eeb2edcd
4
+ data.tar.gz: 6555d62f42ccb9c421382353f5fa14990c456a2d3555437b03965a3ed0d3d97d
5
5
  SHA512:
6
- metadata.gz: 347d5f9690887b426f7d290295c92ee402ed2a8d808097f2e796e46bcbf3bc201c133a531a1b7a20e8e3790fed4859d191fa1f1be6a25a7ca16a519ddb8dc34b
7
- data.tar.gz: 30192a0925ad931dd541da411a9817ac5c58d86c2f9d7c5c2ef70cf9117f3cb9cca39664946c03eafb2ea2fe03324bc56abad3c9cfa6882bec2b6b30a306e1d0
6
+ metadata.gz: 4271e26bc9ad5f0a8de508b30914cd39d7d870e45c5985a6857ec1881fcc2c6ff6b23a38d1c611c9beba607a658cabd4723b8d45140afd365121a0d992f9b762
7
+ data.tar.gz: 4cc64d2e19eff3da7f7fdc5d939f90a40c952cfdaf72fd6168b3fd7280fec7aa409038707c6c691da3522a29c49dc313f0949e5f01b6fb21b43d3fe491bb9e2a
data/Gemfile CHANGED
@@ -2,7 +2,7 @@ source "https://rubygems.org"
2
2
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
3
  gemspec
4
4
 
5
- ENV['RAILS_VERSION'] = '6.0.2.1'
5
+ ENV['RAILS_VERSION'] = '5.2.4.1'
6
6
 
7
7
  # This allows us to bundle to Rails via Git to get the ActiveRecord test files
8
8
  # which comes down to a git tag. We can also use the `RAILS_VERSION` env variable
@@ -28,3 +28,5 @@ version = ENV['RAILS_VERSION'] || begin
28
28
  end
29
29
  end
30
30
  gem 'rails', github: "rails/rails", tag: "v#{version}"
31
+ gem 'mocha', '1.9.0', require: false
32
+ gem 'bcrypt'
data/Gemfile.lock CHANGED
@@ -1,91 +1,76 @@
1
1
  GIT
2
2
  remote: https://github.com/rails/rails
3
- revision: 3a6e8a3ff94f8690dcd68d5184600eabc9e05664
4
- tag: v6.0.2.1
3
+ revision: 56f45bedd617a76e8e3596c84c872a37c8be9795
4
+ tag: v5.2.4.1
5
5
  specs:
6
- actioncable (6.0.2.1)
7
- actionpack (= 6.0.2.1)
6
+ actioncable (5.2.4.1)
7
+ actionpack (= 5.2.4.1)
8
8
  nio4r (~> 2.0)
9
9
  websocket-driver (>= 0.6.1)
10
- actionmailbox (6.0.2.1)
11
- actionpack (= 6.0.2.1)
12
- activejob (= 6.0.2.1)
13
- activerecord (= 6.0.2.1)
14
- activestorage (= 6.0.2.1)
15
- activesupport (= 6.0.2.1)
16
- mail (>= 2.7.1)
17
- actionmailer (6.0.2.1)
18
- actionpack (= 6.0.2.1)
19
- actionview (= 6.0.2.1)
20
- activejob (= 6.0.2.1)
10
+ actionmailer (5.2.4.1)
11
+ actionpack (= 5.2.4.1)
12
+ actionview (= 5.2.4.1)
13
+ activejob (= 5.2.4.1)
21
14
  mail (~> 2.5, >= 2.5.4)
22
15
  rails-dom-testing (~> 2.0)
23
- actionpack (6.0.2.1)
24
- actionview (= 6.0.2.1)
25
- activesupport (= 6.0.2.1)
16
+ actionpack (5.2.4.1)
17
+ actionview (= 5.2.4.1)
18
+ activesupport (= 5.2.4.1)
26
19
  rack (~> 2.0, >= 2.0.8)
27
20
  rack-test (>= 0.6.3)
28
21
  rails-dom-testing (~> 2.0)
29
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
30
- actiontext (6.0.2.1)
31
- actionpack (= 6.0.2.1)
32
- activerecord (= 6.0.2.1)
33
- activestorage (= 6.0.2.1)
34
- activesupport (= 6.0.2.1)
35
- nokogiri (>= 1.8.5)
36
- actionview (6.0.2.1)
37
- activesupport (= 6.0.2.1)
22
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
23
+ actionview (5.2.4.1)
24
+ activesupport (= 5.2.4.1)
38
25
  builder (~> 3.1)
39
26
  erubi (~> 1.4)
40
27
  rails-dom-testing (~> 2.0)
41
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
42
- activejob (6.0.2.1)
43
- activesupport (= 6.0.2.1)
28
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
29
+ activejob (5.2.4.1)
30
+ activesupport (= 5.2.4.1)
44
31
  globalid (>= 0.3.6)
45
- activemodel (6.0.2.1)
46
- activesupport (= 6.0.2.1)
47
- activerecord (6.0.2.1)
48
- activemodel (= 6.0.2.1)
49
- activesupport (= 6.0.2.1)
50
- activestorage (6.0.2.1)
51
- actionpack (= 6.0.2.1)
52
- activejob (= 6.0.2.1)
53
- activerecord (= 6.0.2.1)
32
+ activemodel (5.2.4.1)
33
+ activesupport (= 5.2.4.1)
34
+ activerecord (5.2.4.1)
35
+ activemodel (= 5.2.4.1)
36
+ activesupport (= 5.2.4.1)
37
+ arel (>= 9.0)
38
+ activestorage (5.2.4.1)
39
+ actionpack (= 5.2.4.1)
40
+ activerecord (= 5.2.4.1)
54
41
  marcel (~> 0.3.1)
55
- activesupport (6.0.2.1)
42
+ activesupport (5.2.4.1)
56
43
  concurrent-ruby (~> 1.0, >= 1.0.2)
57
44
  i18n (>= 0.7, < 2)
58
45
  minitest (~> 5.1)
59
46
  tzinfo (~> 1.1)
60
- zeitwerk (~> 2.2)
61
- rails (6.0.2.1)
62
- actioncable (= 6.0.2.1)
63
- actionmailbox (= 6.0.2.1)
64
- actionmailer (= 6.0.2.1)
65
- actionpack (= 6.0.2.1)
66
- actiontext (= 6.0.2.1)
67
- actionview (= 6.0.2.1)
68
- activejob (= 6.0.2.1)
69
- activemodel (= 6.0.2.1)
70
- activerecord (= 6.0.2.1)
71
- activestorage (= 6.0.2.1)
72
- activesupport (= 6.0.2.1)
47
+ rails (5.2.4.1)
48
+ actioncable (= 5.2.4.1)
49
+ actionmailer (= 5.2.4.1)
50
+ actionpack (= 5.2.4.1)
51
+ actionview (= 5.2.4.1)
52
+ activejob (= 5.2.4.1)
53
+ activemodel (= 5.2.4.1)
54
+ activerecord (= 5.2.4.1)
55
+ activestorage (= 5.2.4.1)
56
+ activesupport (= 5.2.4.1)
73
57
  bundler (>= 1.3.0)
74
- railties (= 6.0.2.1)
58
+ railties (= 5.2.4.1)
75
59
  sprockets-rails (>= 2.0.0)
76
- railties (6.0.2.1)
77
- actionpack (= 6.0.2.1)
78
- activesupport (= 6.0.2.1)
60
+ railties (5.2.4.1)
61
+ actionpack (= 5.2.4.1)
62
+ activesupport (= 5.2.4.1)
79
63
  method_source
80
64
  rake (>= 0.8.7)
81
- thor (>= 0.20.3, < 2.0)
65
+ thor (>= 0.19.0, < 2.0)
82
66
 
83
67
  PATH
84
68
  remote: .
85
69
  specs:
86
- activerecord-aurora-serverless-adapter (1.0.0)
87
- activerecord (>= 6.0)
70
+ activerecord-aurora-serverless-adapter (5.2.2)
71
+ activerecord (~> 5.2.0)
88
72
  aws-sdk-rdsdataservice
73
+ retriable
89
74
 
90
75
  GEM
91
76
  remote: https://rubygems.org/
@@ -95,9 +80,10 @@ GEM
95
80
  bundler
96
81
  rake
97
82
  thor (>= 0.14.0)
83
+ arel (9.0.0)
98
84
  aws-eventstream (1.0.3)
99
- aws-partitions (1.260.0)
100
- aws-sdk-core (3.86.0)
85
+ aws-partitions (1.265.0)
86
+ aws-sdk-core (3.89.1)
101
87
  aws-eventstream (~> 1.0, >= 1.0.2)
102
88
  aws-partitions (~> 1, >= 1.239.0)
103
89
  aws-sigv4 (~> 1.1)
@@ -107,6 +93,7 @@ GEM
107
93
  aws-sigv4 (~> 1.1)
108
94
  aws-sigv4 (1.1.0)
109
95
  aws-eventstream (~> 1.0, >= 1.0.2)
96
+ bcrypt (3.1.13)
110
97
  builder (3.2.4)
111
98
  coderay (1.1.2)
112
99
  concurrent-ruby (1.1.5)
@@ -125,6 +112,7 @@ GEM
125
112
  mini_mime (>= 0.1.1)
126
113
  marcel (0.3.3)
127
114
  mimemagic (~> 0.3.2)
115
+ metaclass (0.0.4)
128
116
  method_source (0.9.2)
129
117
  mimemagic (0.3.3)
130
118
  mini_mime (1.0.2)
@@ -137,6 +125,8 @@ GEM
137
125
  ruby-progressbar
138
126
  minitest-retry (0.1.9)
139
127
  minitest (>= 5.0)
128
+ mocha (1.9.0)
129
+ metaclass (~> 0.0.1)
140
130
  nio4r (2.5.2)
141
131
  nokogiri (1.10.7)
142
132
  mini_portile2 (~> 2.4.0)
@@ -152,6 +142,7 @@ GEM
152
142
  rails-html-sanitizer (1.3.0)
153
143
  loofah (~> 2.3)
154
144
  rake (13.0.1)
145
+ retriable (3.1.2)
155
146
  ruby-progressbar (1.10.1)
156
147
  sprockets (4.0.0)
157
148
  concurrent-ruby (~> 1.0)
@@ -168,7 +159,6 @@ GEM
168
159
  websocket-driver (0.7.1)
169
160
  websocket-extensions (>= 0.1.0)
170
161
  websocket-extensions (0.1.4)
171
- zeitwerk (2.2.2)
172
162
 
173
163
  PLATFORMS
174
164
  ruby
@@ -176,10 +166,12 @@ PLATFORMS
176
166
  DEPENDENCIES
177
167
  activerecord-aurora-serverless-adapter!
178
168
  appraisal
169
+ bcrypt
179
170
  dotenv
180
171
  minitest
181
172
  minitest-reporters
182
173
  minitest-retry
174
+ mocha (= 1.9.0)
183
175
  pry
184
176
  rails!
185
177
  rake
@@ -12,13 +12,16 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = 'https://github.com/customink/activerecord-aurora-serverless-adapter'
13
13
  spec.license = 'MIT'
14
14
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
15
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features|docker)/i})
17
+ end
16
18
  end
17
19
  spec.bindir = 'exe'
18
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
21
  spec.require_paths = ['lib']
20
- spec.add_runtime_dependency 'activerecord', '>= 6.0'
22
+ spec.add_runtime_dependency 'activerecord', '~> 5.2.0'
21
23
  spec.add_runtime_dependency 'aws-sdk-rdsdataservice'
24
+ spec.add_runtime_dependency 'retriable'
22
25
  spec.add_development_dependency 'appraisal'
23
26
  spec.add_development_dependency 'dotenv'
24
27
  spec.add_development_dependency 'minitest'
@@ -23,6 +23,14 @@ module ActiveRecord
23
23
  "#<#{self.class} database: #{database.inspect}, raw_client: #{raw_client.inspect}>"
24
24
  end
25
25
 
26
+ def execute_statement_retry(sql)
27
+ if @connected
28
+ execute_statement(sql)
29
+ else
30
+ auto_paused_retry { execute_statement(sql) }
31
+ end
32
+ end
33
+
26
34
  def execute_statement(sql)
27
35
  id = @transactions.first
28
36
  debug_transactions "EXECUTE: #{sql}", id
@@ -34,6 +42,7 @@ module ActiveRecord
34
42
  include_result_metadata: true,
35
43
  transaction_id: id
36
44
  }).tap do |r|
45
+ @connected = true
37
46
  @affected_rows = affected_rows_result(r)
38
47
  @last_id = last_id_result(r)
39
48
  end
@@ -100,6 +109,22 @@ module ActiveRecord
100
109
  field.long_value || field.string_value || field.double_value
101
110
  end
102
111
 
112
+ def auto_paused_retry
113
+ error_klass = Aws::RDSDataService::Errors::BadRequestException
114
+ error_msg = /last packet sent successfully to the server was/
115
+ retry_msg = 'Aurora auto paused, retrying...'
116
+ on_retry = Proc.new { sleep(1) ; ::Rails.logger.info(retry_msg) }
117
+ Retriable.retriable({
118
+ on: { error_klass => error_msg },
119
+ on_retry: on_retry,
120
+ tries: auto_paused_retry_count
121
+ }) { yield }
122
+ end
123
+
124
+ def auto_paused_retry_count
125
+ 10
126
+ end
127
+
103
128
  def debug_transactions(name, id = 'NOID')
104
129
  return unless @debug_transactions
105
130
  ActiveRecord::Base.logger.debug " \e[36m#{name} #{id} #{object_id}\e[0m"
@@ -33,33 +33,32 @@ module ActiveRecord
33
33
 
34
34
  # Abstract Mysql Adapter
35
35
 
36
- def translate_exception(exception, message:, sql:, binds:)
37
- msg = exception.message
38
- case msg
36
+ def translate_exception(exception, message)
37
+ case message
39
38
  when /Duplicate entry/
40
- RecordNotUnique.new(msg, sql: sql, binds: binds)
39
+ RecordNotUnique.new(message)
41
40
  when /foreign key constraint fails/
42
- InvalidForeignKey.new(msg, sql: sql, binds: binds)
41
+ InvalidForeignKey.new(message)
43
42
  when /Cannot add foreign key constraint/,
44
43
  /referenced column .* in foreign key constraint .* are incompatible/
45
- mismatched_foreign_key(msg, sql: sql, binds: binds)
44
+ mismatched_foreign_key(message)
46
45
  when /Data too long for column/
47
- ValueTooLong.new(msg, sql: sql, binds: binds)
46
+ ValueTooLong.new(message)
48
47
  when /Out of range value for column/
49
- RangeError.new(msg, sql: sql, binds: binds)
48
+ RangeError.new(message)
50
49
  when /Column .* cannot be null/,
51
50
  /Field .* doesn't have a default value/
52
- NotNullViolation.new(msg, sql: sql, binds: binds)
51
+ NotNullViolation.new(message)
53
52
  when /Deadlock found when trying to get lock/
54
- Deadlocked.new(msg, sql: sql, binds: binds)
53
+ Deadlocked.new(message)
55
54
  when /Lock wait timeout exceeded/
56
- LockWaitTimeout.new(msg, sql: sql, binds: binds)
55
+ LockWaitTimeout.new(message)
57
56
  when /max_statement_time exceeded/, /Sort aborted/
58
- StatementTimeout.new(msg, sql: sql, binds: binds)
57
+ StatementTimeout.new(message)
59
58
  when /Query execution was interrupted/
60
- QueryCanceled.new(msg, sql: sql, binds: binds)
59
+ QueryCanceled.new(message)
61
60
  else
62
- ActiveRecord::StatementInvalid.new(msg, sql: sql, binds: binds)
61
+ ActiveRecord::StatementInvalid.new(message)
63
62
  end
64
63
  end
65
64
 
@@ -63,6 +63,10 @@ module ActiveRecord
63
63
  nil
64
64
  end
65
65
 
66
+ def more_results?
67
+ false
68
+ end
69
+
66
70
  end
67
71
  end
68
72
  AuroraServerless::Client.include AuroraServerless::Mysql2::Client
@@ -1,7 +1,7 @@
1
1
  module ActiveRecord
2
2
  module ConnectionAdapters
3
3
  module AuroraServerless
4
- VERSION = "1.0.0"
4
+ VERSION = "5.2.2"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,163 @@
1
+ ENV['AASA_ENV'] = 'test'
2
+ require 'bundler/setup'
3
+ Bundler.require :default, :development
4
+ Dotenv.load('.env')
5
+ require 'minitest/spec'
6
+ require 'minitest/autorun'
7
+ require 'minitest/retry'
8
+ require 'minitest/reporters'
9
+ require_relative 'support/aasa_mysqlpatch'
10
+ require 'cases/helper' unless ENV['TEST_FILES'] || ENV['ONLY_AASA']
11
+ require_relative 'support/aasa_coerceable'
12
+ require_relative 'support/aasa_env'
13
+ require_relative 'support/aasa_fixtures'
14
+ require_relative 'support/aasa_minitest'
15
+ Rails.backtrace_cleaner.remove_silencers! if ENV['REMOVE_SILENCERS']
16
+
17
+ module ActiveRecord
18
+ module ConnectionAdapters
19
+ module AuroraServerless
20
+ class TestCase < Minitest::Spec
21
+
22
+ before { setup_table }
23
+ after { drop_table }
24
+
25
+ private
26
+
27
+ def client
28
+ @client ||= AuroraServerless::Client.new(
29
+ 'activerecord_unittest',
30
+ ENV['AASA_RESOURCE_ARN'],
31
+ ENV['AASA_SECRET_ARN']
32
+ )
33
+ end
34
+
35
+ def execute(sql)
36
+ r = client.execute_statement(sql)
37
+ # TODO: [PG] Make this a conditional result wrapper.
38
+ AuroraServerless::Mysql2::Result.new(r)
39
+ end
40
+
41
+ def setup_table
42
+ # TODO: [PG] Make this a conditional for constant SQL.
43
+ execute MYSQL_CREATE_TABLE_SQL
44
+ execute MYSQL_INSERT_SQL
45
+ end
46
+
47
+ def drop_table
48
+ execute 'DROP TABLE IF EXISTS aurora_test'
49
+ end
50
+
51
+ MYSQL_CREATE_TABLE_SQL = %[
52
+ CREATE TABLE IF NOT EXISTS aurora_test (
53
+ id int NOT NULL AUTO_INCREMENT,
54
+ PRIMARY KEY (id),
55
+ null_test VARCHAR(10),
56
+ bit_test BIT,
57
+ tiny_int_test TINYINT,
58
+ small_int_test SMALLINT,
59
+ medium_int_test MEDIUMINT,
60
+ int_test INT,
61
+ big_int_test BIGINT,
62
+ float_test FLOAT(10,3),
63
+ float_zero_test FLOAT(10,3),
64
+ double_test DOUBLE(10,3),
65
+ decimal_test DECIMAL(10,3),
66
+ decimal_zero_test DECIMAL(10,3),
67
+ date_test DATE,
68
+ date_time_test DATETIME,
69
+ timestamp_test TIMESTAMP,
70
+ time_test TIME,
71
+ year_test YEAR(4),
72
+ char_test CHAR(10),
73
+ varchar_test VARCHAR(10),
74
+ binary_test BINARY(10),
75
+ varbinary_test VARBINARY(10),
76
+ tiny_blob_test TINYBLOB,
77
+ tiny_text_test TINYTEXT,
78
+ blob_test BLOB,
79
+ text_test TEXT,
80
+ medium_blob_test MEDIUMBLOB,
81
+ medium_text_test MEDIUMTEXT,
82
+ long_blob_test LONGBLOB,
83
+ long_text_test LONGTEXT,
84
+ enum_test ENUM('val1', 'val2'),
85
+ set_test SET('val1', 'val2')
86
+ ) DEFAULT CHARSET=utf8
87
+ ]
88
+
89
+ MYSQL_INSERT_SQL = %[
90
+ INSERT INTO aurora_test (
91
+ null_test,
92
+ bit_test,
93
+ tiny_int_test,
94
+ small_int_test,
95
+ medium_int_test,
96
+ int_test,
97
+ big_int_test,
98
+ float_test,
99
+ float_zero_test,
100
+ double_test,
101
+ decimal_test,
102
+ decimal_zero_test,
103
+ date_test,
104
+ date_time_test,
105
+ timestamp_test,
106
+ time_test,
107
+ year_test,
108
+ char_test,
109
+ varchar_test,
110
+ binary_test,
111
+ varbinary_test,
112
+ tiny_blob_test,
113
+ tiny_text_test,
114
+ blob_test,
115
+ text_test,
116
+ medium_blob_test,
117
+ medium_text_test,
118
+ long_blob_test,
119
+ long_text_test,
120
+ enum_test,
121
+ set_test
122
+ )
123
+ VALUES (
124
+ NULL,
125
+ 1,
126
+ 5,
127
+ 32766,
128
+ 8388606,
129
+ 2147483646,
130
+ 9223372036854775806,
131
+ 156.68449197860963,
132
+ 0.0,
133
+ 606682.8877005348,
134
+ 676254.5454545454,
135
+ 0,
136
+ '2010-4-4',
137
+ '2010-4-4 11:44:00',
138
+ '2010-4-4 11:44:00',
139
+ '11:44:00',
140
+ 2019,
141
+ 'abcdefg',
142
+ 'abcdefg',
143
+ 'abcdefg',
144
+ 'abcdefg',
145
+ 'abcdefg',
146
+ 'abcdefg',
147
+ 'abcdefg',
148
+ 'abcdefg',
149
+ 'abcdefg',
150
+ 'abcdefg',
151
+ 'abcdefg',
152
+ 'abcdefg',
153
+ 'val1',
154
+ 'val1,val2'
155
+ )
156
+ ]
157
+
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ require "mocha/setup"