rspec-hive 0.1.0 → 0.2.0

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -1
  3. data/.rubocop.yml +13 -1
  4. data/.rubocop_u2i.yml +9 -1
  5. data/.travis.yml +19 -0
  6. data/Guardfile +12 -1
  7. data/README.md +3 -1
  8. data/Rakefile +11 -2
  9. data/examples/{query.rb → lib/query.rb} +2 -5
  10. data/examples/{hive_tests_config.yml.example → rspec-hive.yml.example} +0 -0
  11. data/examples/spec/query_spec.rb +103 -0
  12. data/examples/spec/spec_helper.rb +22 -0
  13. data/lib/rspec/hive.rb +7 -2
  14. data/lib/rspec/hive/connection_delegator.rb +17 -5
  15. data/lib/rspec/hive/connector.rb +0 -1
  16. data/lib/rspec/hive/exponential_backoff.rb +15 -0
  17. data/lib/rspec/hive/matchers.rb +29 -0
  18. data/lib/rspec/hive/query_builder.rb +83 -0
  19. data/lib/rspec/hive/query_builder/null_strategy.rb +11 -0
  20. data/lib/rspec/hive/query_builder/row_transformer.rb +63 -0
  21. data/lib/rspec/hive/query_builder/type_faker.rb +36 -0
  22. data/lib/rspec/hive/query_builder/value_by_type_strategy.rb +13 -0
  23. data/lib/rspec/hive/query_builder_helper.rb +24 -0
  24. data/lib/rspec/{rake_tasks → hive}/railtie.rb +2 -2
  25. data/lib/rspec/{rake_tasks → hive/rake_tasks}/docker.rake +0 -0
  26. data/lib/rspec/hive/version.rb +1 -1
  27. data/lib/rspec/hive/with_hive_connection.rb +16 -10
  28. data/rspec-hive.gemspec +6 -4
  29. data/spec/.rubocop.yml +4 -0
  30. data/spec/lib/rspec/hive/configuration_spec.rb +9 -6
  31. data/spec/lib/rspec/hive/connection_delegator_spec.rb +1 -1
  32. data/spec/lib/rspec/hive/connector_spec.rb +1 -1
  33. data/spec/lib/rspec/hive/db_name_spec.rb +1 -1
  34. data/spec/lib/rspec/hive/matchers_spec.rb +94 -0
  35. data/spec/lib/rspec/hive/query_builder/row_transformer_spec.rb +37 -0
  36. data/spec/lib/rspec/hive/query_builder_spec.rb +143 -0
  37. data/spec/lib/rspec/hive_spec.rb +1 -1
  38. data/spec/spec_helper.rb +2 -62
  39. metadata +68 -24
  40. data/examples/config_helper.rb +0 -1
  41. data/examples/query_spec.rb +0 -41
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RSpec::Hive::QueryBuilder do
4
+ let(:connection) { instance_double(RBHive::TCLIConnection) }
5
+ let(:connection_delegator) { RSpec::Hive::ConnectionDelegator.new(connection, {}) }
6
+ let(:query_builder) { described_class.new(schema, connection_delegator) }
7
+
8
+ describe '#execute' do
9
+ subject { builder.execute }
10
+
11
+ context 'when has no partition' do
12
+ before do
13
+ expect(connection_delegator).to receive(:load_into_table).with(schema, expected_rows)
14
+ end
15
+
16
+ let(:partition) { nil }
17
+ let(:schema) do
18
+ RBHive::TableSchema.new('table_name', nil) do
19
+ column :col1, :string
20
+ column :col2, :int
21
+ end
22
+ end
23
+
24
+ context 'when no data stubbing' do
25
+ context 'when single row is passed' do
26
+ let(:builder) { query_builder.insert(row1) }
27
+ let(:row1) { ['col1', 343] }
28
+ let(:expected_rows) { [row1] }
29
+
30
+ it 'loads single row' do
31
+ subject
32
+ end
33
+ end
34
+
35
+ context 'when single incomplete row is passed' do
36
+ let(:builder) { query_builder.insert(row1) }
37
+ let(:row1) { ['col1'] }
38
+ let(:expected_rows) { [row1 << '\N'] }
39
+
40
+ it 'fills missing columns with \N' do
41
+ subject
42
+ end
43
+ end
44
+
45
+ context 'when multiple rows are passed' do
46
+ let(:builder) { query_builder.insert(row1, row2) }
47
+ let(:row1) { ['col1', 343] }
48
+ let(:row2) { ['col1', 123] }
49
+ let(:expected_rows) { [row1, row2] }
50
+
51
+ it 'loads multiple rows' do
52
+ subject
53
+ end
54
+ end
55
+
56
+ context 'when row with single column is passed' do
57
+ let(:builder) { query_builder.insert(row1) }
58
+ let(:row1) { {col1: 'col1'} }
59
+ let(:expected_rows) { [['col1', '\N']] }
60
+
61
+ it 'fills missing columns with \N' do
62
+ subject
63
+ end
64
+ end
65
+
66
+ context 'when multiple rows with single columns are passed' do
67
+ let(:builder) { query_builder.insert(row1, row2) }
68
+ let(:row1) { {col1: 'col1'} }
69
+ let(:row2) { {col2: 345} }
70
+ let(:expected_rows) { [['col1', '\N'], ['\N', 345]] }
71
+
72
+ it 'fills missing columns with \N for each row' do
73
+ subject
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'when has data stubbing' do
79
+ context 'when single row is passed' do
80
+ let(:builder) { query_builder.with_stubbing.insert(row1) }
81
+ let(:row1) { ['col1', 343] }
82
+ let(:expected_rows) { [row1] }
83
+
84
+ it 'loads single row' do
85
+ subject
86
+ end
87
+ end
88
+
89
+ context 'when single incomplete row is passed' do
90
+ let(:builder) { query_builder.insert(row1) }
91
+ let(:row1) { ['col1'] }
92
+ let(:expected_rows) { [row1 << a_string_matching(/\d+/)] }
93
+
94
+ it 'fills missing column with data matching column type' do
95
+ subject
96
+ end
97
+ end
98
+
99
+ context 'when multiple rows are passed' do
100
+ let(:builder) { query_builder.with_stubbing.insert(row1, row2) }
101
+ let(:row1) { ['col1', 343] }
102
+ let(:row2) { ['col1', 123] }
103
+ let(:expected_rows) { [row1, row2] }
104
+
105
+ it 'loads multiple rows' do
106
+ subject
107
+ end
108
+ end
109
+
110
+ context 'when row with single column is passed' do
111
+ let(:builder) { query_builder.with_stubbing.insert(row1) }
112
+ let(:row1) { {col1: 'col1'} }
113
+ let(:expected_rows) { [['col1', a_string_matching(/\d+/)]] }
114
+
115
+ it 'fills missing columns with data matching column type' do
116
+ subject
117
+ end
118
+ end
119
+
120
+ context 'when multiple rows with single columns are passed' do
121
+ let(:builder) { query_builder.with_stubbing.insert(row1, row2) }
122
+ let(:row1) { {col1: 'col1'} }
123
+ let(:row2) { {col2: 345} }
124
+ let(:expected_rows) { [['col1', a_string_matching(/\d+/)], [a_string_matching(/\S+/), 345]] }
125
+
126
+ it 'fills missing columns with data matching column type for each row' do
127
+ subject
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ context 'when has no partition' do
134
+ let(:schema) do
135
+ RBHive::TableSchema.new('table_name', nil) do
136
+ column :col1, :string
137
+ column :col2, :integer
138
+ partition :dt, :int
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe RSpec::Hive do
3
+ RSpec.describe RSpec::Hive do
4
4
  describe 'configure' do
5
5
  let(:expected_host) { '127.0.0.1' }
6
6
  let(:expected_port) { '10000' }
data/spec/spec_helper.rb CHANGED
@@ -20,6 +20,8 @@
20
20
  if ENV['COVERAGE']
21
21
  require 'codeclimate-test-reporter'
22
22
  CodeClimate::TestReporter.start
23
+ require 'simplecov'
24
+ SimpleCov.start
23
25
  end
24
26
 
25
27
  RSpec.configure do |config|
@@ -29,76 +31,14 @@ RSpec.configure do |config|
29
31
  # assertion/expectation library such as wrong or the stdlib/minitest
30
32
  # assertions if you prefer.
31
33
  config.expect_with :rspec do |expectations|
32
- # This option will default to `true` in RSpec 4. It makes the `description`
33
- # and `failure_message` of custom matchers include text for helper methods
34
- # defined using `chain`, e.g.:
35
- # be_bigger_than(2).and_smaller_than(4).description
36
- # # => "be bigger than 2 and smaller than 4"
37
- # ...rather than:
38
- # # => "be bigger than 2"
39
34
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
40
35
  end
41
36
 
42
- # rspec-mocks config goes here. You can use an alternate test double
43
- # library (such as bogus or mocha) by changing the `mock_with` option here.
44
37
  config.mock_with :rspec do |mocks|
45
- # Prevents you from mocking or stubbing a method that does not exist on
46
- # a real object. This is generally recommended, and will default to
47
- # `true` in RSpec 4.
48
38
  mocks.verify_partial_doubles = true
49
39
  end
50
40
 
51
- # The settings below are suggested to provide a good initial experience
52
- # with RSpec, but feel free to customize to your heart's content.
53
- =begin
54
- # These two settings work together to allow you to limit a spec run
55
- # to individual examples or groups you care about by tagging them with
56
- # `:focus` metadata. When nothing is tagged with `:focus`, all examples
57
- # get run.
58
- config.filter_run :focus
59
- config.run_all_when_everything_filtered = true
60
-
61
- # Allows RSpec to persist some state between runs in order to support
62
- # the `--only-failures` and `--next-failure` CLI options. We recommend
63
- # you configure your source control system to ignore this file.
64
- config.example_status_persistence_file_path = "spec/examples.txt"
65
-
66
- # Limits the available syntax to the non-monkey patched syntax that is
67
- # recommended. For more details, see:
68
- # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
69
- # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
70
- # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
71
41
  config.disable_monkey_patching!
72
-
73
- # This setting enables warnings. It's recommended, but in some cases may
74
- # be too noisy due to issues in dependencies.
75
- config.warnings = true
76
-
77
- # Many RSpec users commonly either run the entire suite or an individual
78
- # file, and it's useful to allow more verbose output when running an
79
- # individual spec file.
80
- if config.files_to_run.one?
81
- # Use the documentation formatter for detailed output,
82
- # unless a formatter has already been configured
83
- # (e.g. via a command-line flag).
84
- config.default_formatter = 'doc'
85
- end
86
-
87
- # Print the 10 slowest examples and example groups at the
88
- # end of the spec run, to help surface which specs are running
89
- # particularly slow.
90
- config.profile_examples = 10
91
-
92
- # Run specs in random order to surface order dependencies. If you find an
93
- # order dependency and want to debug it, you can fix the order by providing
94
- # the seed, which is printed after each run.
95
- # --seed 1234
96
42
  config.order = :random
97
-
98
- # Seed global randomization in this process using the `--seed` CLI option.
99
- # Setting this allows you to use `--seed` to deterministically reproduce
100
- # test failures related to randomization by passing the same `--seed` value
101
- # as the one that triggered the failure.
102
43
  Kernel.srand config.seed
103
- =end
104
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-hive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wojtek Mielczarek
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-04-05 00:00:00.000000000 Z
12
+ date: 2016-05-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -40,19 +40,33 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0.7'
42
42
  - !ruby/object:Gem::Dependency
43
- name: bundler
43
+ name: faker
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '1.7'
49
- type: :development
48
+ version: '1.6'
49
+ type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '1.7'
55
+ version: '1.6'
56
+ - !ruby/object:Gem::Dependency
57
+ name: retryable
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 2.0.3
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 2.0.3
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: rspec
58
72
  requirement: !ruby/object:Gem::Requirement
@@ -60,7 +74,7 @@ dependencies:
60
74
  - - "~>"
61
75
  - !ruby/object:Gem::Version
62
76
  version: '3.4'
63
- type: :development
77
+ type: :runtime
64
78
  prerelease: false
65
79
  version_requirements: !ruby/object:Gem::Requirement
66
80
  requirements:
@@ -68,61 +82,75 @@ dependencies:
68
82
  - !ruby/object:Gem::Version
69
83
  version: '3.4'
70
84
  - !ruby/object:Gem::Dependency
71
- name: rspec-its
85
+ name: rbhive-u2i
72
86
  requirement: !ruby/object:Gem::Requirement
73
87
  requirements:
74
88
  - - "~>"
75
89
  - !ruby/object:Gem::Version
76
- version: '1.2'
90
+ version: 1.0.0
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 1.0.0
98
+ - !ruby/object:Gem::Dependency
99
+ name: bundler
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.7'
77
105
  type: :development
78
106
  prerelease: false
79
107
  version_requirements: !ruby/object:Gem::Requirement
80
108
  requirements:
81
109
  - - "~>"
82
110
  - !ruby/object:Gem::Version
83
- version: '1.2'
111
+ version: '1.7'
84
112
  - !ruby/object:Gem::Dependency
85
- name: rbhive
113
+ name: rspec-its
86
114
  requirement: !ruby/object:Gem::Requirement
87
115
  requirements:
88
116
  - - "~>"
89
117
  - !ruby/object:Gem::Version
90
- version: 0.6.0
118
+ version: '1.2'
91
119
  type: :development
92
120
  prerelease: false
93
121
  version_requirements: !ruby/object:Gem::Requirement
94
122
  requirements:
95
123
  - - "~>"
96
124
  - !ruby/object:Gem::Version
97
- version: 0.6.0
125
+ version: '1.2'
98
126
  - !ruby/object:Gem::Dependency
99
127
  name: rubocop
100
128
  requirement: !ruby/object:Gem::Requirement
101
129
  requirements:
102
130
  - - "~>"
103
131
  - !ruby/object:Gem::Version
104
- version: '0.34'
132
+ version: '0.39'
105
133
  type: :development
106
134
  prerelease: false
107
135
  version_requirements: !ruby/object:Gem::Requirement
108
136
  requirements:
109
137
  - - "~>"
110
138
  - !ruby/object:Gem::Version
111
- version: '0.34'
139
+ version: '0.39'
112
140
  - !ruby/object:Gem::Dependency
113
141
  name: rubocop-rspec
114
142
  requirement: !ruby/object:Gem::Requirement
115
143
  requirements:
116
144
  - - "~>"
117
145
  - !ruby/object:Gem::Version
118
- version: '1.3'
146
+ version: '1.4'
119
147
  type: :development
120
148
  prerelease: false
121
149
  version_requirements: !ruby/object:Gem::Requirement
122
150
  requirements:
123
151
  - - "~>"
124
152
  - !ruby/object:Gem::Version
125
- version: '1.3'
153
+ version: '1.4'
126
154
  - !ruby/object:Gem::Dependency
127
155
  name: guard
128
156
  requirement: !ruby/object:Gem::Requirement
@@ -223,6 +251,7 @@ files:
223
251
  - ".rubocop.yml"
224
252
  - ".rubocop_u2i.yml"
225
253
  - ".ruby-version"
254
+ - ".travis.yml"
226
255
  - Gemfile
227
256
  - Gemfile.lock
228
257
  - Guardfile
@@ -230,24 +259,36 @@ files:
230
259
  - README.md
231
260
  - Rakefile
232
261
  - docker/Dockerfile
233
- - examples/config_helper.rb
234
- - examples/hive_tests_config.yml.example
235
- - examples/query.rb
236
- - examples/query_spec.rb
262
+ - examples/lib/query.rb
263
+ - examples/rspec-hive.yml.example
264
+ - examples/spec/query_spec.rb
265
+ - examples/spec/spec_helper.rb
237
266
  - lib/rspec/hive.rb
238
267
  - lib/rspec/hive/configuration.rb
239
268
  - lib/rspec/hive/connection_delegator.rb
240
269
  - lib/rspec/hive/connector.rb
241
270
  - lib/rspec/hive/db_name.rb
271
+ - lib/rspec/hive/exponential_backoff.rb
272
+ - lib/rspec/hive/matchers.rb
273
+ - lib/rspec/hive/query_builder.rb
274
+ - lib/rspec/hive/query_builder/null_strategy.rb
275
+ - lib/rspec/hive/query_builder/row_transformer.rb
276
+ - lib/rspec/hive/query_builder/type_faker.rb
277
+ - lib/rspec/hive/query_builder/value_by_type_strategy.rb
278
+ - lib/rspec/hive/query_builder_helper.rb
279
+ - lib/rspec/hive/railtie.rb
280
+ - lib/rspec/hive/rake_tasks/docker.rake
242
281
  - lib/rspec/hive/version.rb
243
282
  - lib/rspec/hive/with_hive_connection.rb
244
- - lib/rspec/rake_tasks/docker.rake
245
- - lib/rspec/rake_tasks/railtie.rb
246
283
  - rspec-hive.gemspec
284
+ - spec/.rubocop.yml
247
285
  - spec/lib/rspec/hive/configuration_spec.rb
248
286
  - spec/lib/rspec/hive/connection_delegator_spec.rb
249
287
  - spec/lib/rspec/hive/connector_spec.rb
250
288
  - spec/lib/rspec/hive/db_name_spec.rb
289
+ - spec/lib/rspec/hive/matchers_spec.rb
290
+ - spec/lib/rspec/hive/query_builder/row_transformer_spec.rb
291
+ - spec/lib/rspec/hive/query_builder_spec.rb
251
292
  - spec/lib/rspec/hive_spec.rb
252
293
  - spec/spec_helper.rb
253
294
  homepage: https://github.com/u2i/ns-rspec-hive
@@ -275,10 +316,13 @@ signing_key:
275
316
  specification_version: 4
276
317
  summary: RSpec addition to test hive queries
277
318
  test_files:
319
+ - spec/.rubocop.yml
278
320
  - spec/lib/rspec/hive/configuration_spec.rb
279
321
  - spec/lib/rspec/hive/connection_delegator_spec.rb
280
322
  - spec/lib/rspec/hive/connector_spec.rb
281
323
  - spec/lib/rspec/hive/db_name_spec.rb
324
+ - spec/lib/rspec/hive/matchers_spec.rb
325
+ - spec/lib/rspec/hive/query_builder/row_transformer_spec.rb
326
+ - spec/lib/rspec/hive/query_builder_spec.rb
282
327
  - spec/lib/rspec/hive_spec.rb
283
328
  - spec/spec_helper.rb
284
- has_rdoc: