rainforest-cli 1.8.1 → 1.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ebce969390e9bd4edb7ec29c60e7d632b25ca21
4
- data.tar.gz: 8fc2642b449ffc4a6c1ed1bf1380e7d114b41336
3
+ metadata.gz: 36eb7257778cfda59e340fea593c2b9662390949
4
+ data.tar.gz: 0c9d06828b51075a1ccd95b2710200ad94e6e5ac
5
5
  SHA512:
6
- metadata.gz: 701e04c3ef84d559860924808585871b7fa4d92a99aec76467e57a695efd253dd2ea69cb0aad7872a1db3bf8f48ea7dd04191c9e178c5efa671aaaca88b7b298
7
- data.tar.gz: e70f3c87c281024b2d6e97f3e618cd3b1a4f3fb77452600625adef6e686c3eeb620591cf4819493287499840ca9062b4a2383851846e5fce00d8076de8b12198
6
+ metadata.gz: ccddbb99af989e0d96f9761c67ed2a2a2dc9d1731264890d78adb8adb16170c51da4b17ca168c3cb602e21a793feb324307b4adf4d7195d78f27c45773b00cf5
7
+ data.tar.gz: 417541f667b2485f05f1b9528822832b19ac083489bff2fd93d79d90ff5a7c80a4dca3282f902fe61a9da291e1efe129b9dfcba838d6d80a9be35b6ba33725cd
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Rainforest CLI Changelog
2
2
 
3
+ ## 1.9.0 - 14th September 2016
4
+ - Add `upload-csv` command for updating tabular variables without starting a new run.
5
+ (069e943cd94cbb08e6f00347ab6c8327372897ce, @epaulet)
6
+ - Add ability to filter uploads with `tag` and `site-id` and to upload specific test by file path.
7
+ (1d6e0a39d664e4c2d2135fa654571c28aaaac031, @epaulet)
8
+
3
9
  ## 1.8.1 - 19th August 2016
4
10
  - Fix a bug that prevent uploading tests as a result from 1.8.0.
5
11
  (651514ae94df6857c43e820fff60cdf8034f534d, @epaulet)
data/README.md CHANGED
@@ -88,6 +88,12 @@ Upload tests to Rainforest
88
88
  rainforest upload
89
89
  ```
90
90
 
91
+ Upload a specific test to Rainforest
92
+
93
+ ```bash
94
+ rainforest upload /path/to/test/file.rfml
95
+ ```
96
+
91
97
  Remove RFML file and remove test from Rainforest test suite.
92
98
 
93
99
  ```bash
@@ -128,6 +134,13 @@ To generate a junit xml report for a test run which has already completed
128
134
  rainforest report --run-id <run-id> --junit-file rainforest.xml
129
135
  ```
130
136
 
137
+ #### Updating Tabular Variables
138
+
139
+ Upload a CSV file to update your tabular variables
140
+ ```bash
141
+ rainforest csv-upload --import-variable-csv-file PATH/TO/CSV.csv --import-variable-name my_variable
142
+ ```
143
+
131
144
  ## Options
132
145
 
133
146
  ### General
@@ -41,6 +41,7 @@ module RainforestCli
41
41
  when 'upload' then Uploader.new(options).upload
42
42
  when 'rm' then Deleter.new(options).delete
43
43
  when 'export' then Exporter.new(options).export
44
+ when 'csv-upload' then CSVImporter.new(options).import
44
45
  when 'report' then Reporter.new(options).report
45
46
  when 'sites', 'folders', 'browsers'
46
47
  Resources.new(options).public_send(options.command)
@@ -6,12 +6,9 @@ require 'ruby-progressbar'
6
6
 
7
7
  module RainforestCli
8
8
  class CSVImporter
9
- attr_reader :client
10
-
11
- def initialize name, file, token
12
- @generator_name = name
13
- @file = file
14
- @client = HttpClient.new token: token
9
+ def initialize(options)
10
+ @generator_name = options.import_name
11
+ @file = options.import_file_name
15
12
  end
16
13
 
17
14
  def row_data columns, values
@@ -31,7 +28,7 @@ module RainforestCli
31
28
  raise 'Invalid schema in CSV. You must include headers in first row.' if !columns
32
29
 
33
30
  print 'Creating custom step variable'
34
- response = client.post '/generators', { name: @generator_name, description: @generator_name, columns: columns }
31
+ response = http_client.post '/generators', { name: @generator_name, description: @generator_name, columns: columns }
35
32
  raise "Error creating custom step variable: #{response['error']}" if response['error']
36
33
  puts "\t[OK]"
37
34
 
@@ -43,9 +40,15 @@ module RainforestCli
43
40
 
44
41
  # Insert the data
45
42
  Parallel.each(rows, in_threads: 16, finish: lambda { |_item, _i, _result| p.increment }) do |row|
46
- response = client.post("/generators/#{@generator_id}/rows", {data: row_data(@columns, row)})
43
+ response = http_client.post("/generators/#{@generator_id}/rows", {data: row_data(@columns, row)})
47
44
  raise response['error'] if response['error']
48
45
  end
49
46
  end
47
+
48
+ private
49
+
50
+ def http_client
51
+ RainforestCli.http_client
52
+ end
50
53
  end
51
54
  end
@@ -135,7 +135,7 @@ module RainforestCli
135
135
 
136
136
  @command = @args.shift
137
137
 
138
- if ['new', 'rm'].include?(@command)
138
+ if ['new', 'rm', 'upload'].include?(@command)
139
139
  @file_name = @args.shift
140
140
 
141
141
  if @file_name && @command == 'rm'
@@ -187,6 +187,8 @@ module RainforestCli
187
187
  end
188
188
  elsif import_file_name || import_name
189
189
  raise ValidationError, 'You must pass both --import-variable-csv-file and --import-variable-name'
190
+ elsif command == 'csv-upload'
191
+ raise ValidationError, 'You must pass both --import-variable-csv-file and --import-variable-name with the csv-upload command'
190
192
  end
191
193
 
192
194
  if command == 'rm' && file_name.nil?
@@ -16,7 +16,7 @@ module RainforestCli
16
16
 
17
17
  if options.import_file_name && options.import_name
18
18
  delete_generator(options.import_name)
19
- CSVImporter.new(options.import_name, options.import_file_name, options.token).import
19
+ CSVImporter.new(options).import
20
20
  end
21
21
 
22
22
  post_opts = make_create_run_options
@@ -39,15 +39,7 @@ EOF
39
39
  end
40
40
 
41
41
  def test_data
42
- if @test_data.nil?
43
- @test_data = []
44
- if Dir.exist?(@test_folder)
45
- Dir.glob(test_paths) do |file_name|
46
- @test_data << RainforestCli::TestParser::Parser.new(file_name).process
47
- end
48
- end
49
- end
50
- @test_data
42
+ @test_data ||= get_test_data
51
43
  end
52
44
 
53
45
  def file_extension
@@ -94,6 +86,28 @@ EOF
94
86
 
95
87
  private
96
88
 
89
+ def get_test_data
90
+ if @options.file_name
91
+ [RainforestCli::TestParser::Parser.new(@options.file_name).process]
92
+ else
93
+ data = []
94
+ if Dir.exist?(@test_folder)
95
+ Dir.glob(test_paths) do |file_name|
96
+ data << RainforestCli::TestParser::Parser.new(file_name).process
97
+ end
98
+ end
99
+ filter_tests(data)
100
+ end
101
+ end
102
+
103
+ def filter_tests(tests)
104
+ tests.select do |test|
105
+ pass_tag_filter = (@options.tags - test.tags).empty?
106
+ pass_site_filter = @options.site_id.nil? || @options.site_id == test.site_id
107
+ pass_tag_filter || pass_site_filter
108
+ end
109
+ end
110
+
97
111
  def unique_path(file_path)
98
112
  path = file_path[0...-file_extension.length]
99
113
  identifier = 0
@@ -15,10 +15,28 @@ class RainforestCli::TestParser::Step < Struct.new(:action, :response, :redirect
15
15
  end
16
16
 
17
17
  def uploadable_in_action
18
- action.scan(UPLOADABLE_REGEX)
18
+ action.scan(UPLOADABLE_REGEX).select do |match|
19
+ needs_parameterization?(match)
20
+ end
19
21
  end
20
22
 
21
23
  def uploadable_in_response
22
- response.scan(UPLOADABLE_REGEX)
24
+ response.scan(UPLOADABLE_REGEX).select do |match|
25
+ needs_parameterization?(match)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def needs_parameterization?(match)
32
+ argument = match[1]
33
+ parameters = argument.split(',').map(&:strip)
34
+ if parameters.length >= 2
35
+ has_file_id = parameters[0].to_i > 0
36
+ has_file_sig = parameters[1].length == 6
37
+ !(has_file_id && has_file_sig)
38
+ else
39
+ true
40
+ end
23
41
  end
24
42
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module RainforestCli
3
- VERSION = '1.8.1'
3
+ VERSION = '1.9.0'
4
4
  end
@@ -0,0 +1,8 @@
1
+ #! example_test (Test ID - only edit if this test has not yet been uploaded)
2
+ # title: Example Test
3
+ # tags: foo,bar,baz
4
+ # site_id: 456
5
+ # start_uri: /start_uri
6
+
7
+ This is a step action.
8
+ This is a question?
@@ -0,0 +1,6 @@
1
+ #! example_test (Test ID - only edit if this test has not yet been uploaded)
2
+ # title: Example Test 2
3
+ # start_uri: /start_uri
4
+
5
+ This is step action #2.
6
+ This is question #2?
@@ -1,9 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
  describe RainforestCli::CSVImporter do
3
3
  let(:csv_file) { "#{File.dirname(__FILE__)}/../fixtures/variables.txt" }
4
+ let(:http_client) { instance_double('RainforestCli::HttpClient') }
5
+
6
+ before do
7
+ allow(RainforestCli).to receive(:http_client).and_return(http_client)
8
+ end
4
9
 
5
10
  describe '.import' do
6
- subject { described_class.new('variables', csv_file, 'abc123') }
11
+ let(:options) { instance_double('RainforestCli::Options', import_name: 'variables', import_file_name: csv_file) }
12
+ subject { described_class.new(options) }
7
13
  let(:columns) { %w(email pass) }
8
14
 
9
15
  let(:success_response) do
@@ -14,7 +20,7 @@ describe RainforestCli::CSVImporter do
14
20
  end
15
21
 
16
22
  it 'should post the schema to the generators API' do
17
- expect_any_instance_of(RainforestCli::HttpClient).to receive(:post)
23
+ expect(http_client).to receive(:post)
18
24
  .with('/generators', {
19
25
  name: 'variables',
20
26
  description: 'variables',
@@ -22,7 +28,7 @@ describe RainforestCli::CSVImporter do
22
28
  })
23
29
  .and_return success_response
24
30
 
25
- expect_any_instance_of(RainforestCli::HttpClient).to receive(:post)
31
+ expect(http_client).to receive(:post)
26
32
  .with('/generators/12345/rows', {
27
33
  data: {
28
34
  0 => 'russ@rainforestqa.com',
@@ -30,7 +36,7 @@ describe RainforestCli::CSVImporter do
30
36
  },
31
37
  }).and_return({})
32
38
 
33
- expect_any_instance_of(RainforestCli::HttpClient).to receive(:post)
39
+ expect(http_client).to receive(:post)
34
40
  .with('/generators/12345/rows', {
35
41
  data: {
36
42
  0 => 'bob@example.com',
@@ -5,7 +5,7 @@ describe RainforestCli::TestFiles do
5
5
 
6
6
  describe '#test_data' do
7
7
  let(:test_directory) { File.dirname(__FILE__) + '/../rainforest-example' }
8
- let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, command: nil) }
8
+ let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, command: nil, file_name: nil, tags: [], site_id: nil) }
9
9
 
10
10
  let(:rfml_test) { subject.test_data.first }
11
11
  let(:text_file) { File.read(test_directory + '/example_test.rfml') }
@@ -14,6 +14,15 @@ describe RainforestCli::TestFiles do
14
14
  expect(rfml_test.title).to eq(text_file.match(/^# title: (.+)$/)[1])
15
15
  expect(rfml_test.rfml_id).to eq(text_file.match(/^#! (.+?)($| .+?$)/)[1])
16
16
  end
17
+
18
+ context 'when filtering by file name' do
19
+ let(:file_name) { File.join(File.dirname(__FILE__), '../multiple-rainforest-examples/example_test.rfml') }
20
+ let(:options) { instance_double('RainforestCli::Options', test_folder: nil, command: nil, file_name: file_name, tags: [], site_id: nil) }
21
+
22
+ it 'only parses that file' do
23
+ expect(subject.test_data.length).to eq(1)
24
+ end
25
+ end
17
26
  end
18
27
 
19
28
  describe '#test_dictionary' do
@@ -9,6 +9,14 @@ describe RainforestCli::TestParser::Step do
9
9
  'Download 1: {{ file.download(./foo) }}. Download 2: {{file.download(bar/baz) }}'
10
10
  end
11
11
 
12
+ let(:parameterized_screenshot_string) do
13
+ 'Picture 1: {{ file.screenshot(./foo) }}. Picture 2: {{file.screenshot(123, signat) }}'
14
+ end
15
+
16
+ let(:parameterized_download_string) do
17
+ 'Download 1: {{ file.download(./foo) }}. Download 2: {{file.download(123, signat, baz.txt) }}'
18
+ end
19
+
12
20
  shared_examples 'a method that detects step variables' do |att|
13
21
  it 'correctly detects a screenshot step variable' do
14
22
  subject[att] = screenshot_string
@@ -16,11 +24,23 @@ describe RainforestCli::TestParser::Step do
16
24
  .to eq([['screenshot', './foo'], ['screenshot', 'bar/baz']])
17
25
  end
18
26
 
19
- it 'correctly detects the download step variable' do
27
+ it 'correctly detects a download step variable' do
20
28
  subject[att] = download_string
21
29
  expect(subject.send(:"uploadable_in_#{att}"))
22
30
  .to eq([['download', './foo'], ['download', 'bar/baz']])
23
31
  end
32
+
33
+ it 'does not detect a parameterized screenshot step variable' do
34
+ subject[att] = parameterized_screenshot_string
35
+ expect(subject.send(:"uploadable_in_#{att}"))
36
+ .to eq([['screenshot', './foo']])
37
+ end
38
+
39
+ it 'does not detect a parameterized download step variable' do
40
+ subject[att] = parameterized_download_string
41
+ expect(subject.send(:"uploadable_in_#{att}"))
42
+ .to eq([['download', './foo']])
43
+ end
24
44
  end
25
45
 
26
46
  describe '#uploadable_in_action' do
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  describe RainforestCli::Uploader do
3
- let(:options) { instance_double('RainforestCli::Options', token: 'foo', test_folder: test_directory, command: '') }
3
+ let(:options) { instance_double('RainforestCli::Options', token: 'foo', test_folder: test_directory, command: '', file_name: nil, tags: [], site_id: nil) }
4
4
  subject { described_class.new(options) }
5
5
 
6
6
  before do
@@ -26,7 +26,7 @@ describe RainforestCli::Validator do
26
26
 
27
27
  shared_examples 'it detects all the correct errors' do
28
28
  let(:tested_method) { :validate }
29
- let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, token: 'api_token', command: '', tags: [], folder: nil, site_id: nil) }
29
+ let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, token: 'api_token', command: '', tags: [], folder: nil, site_id: nil, file_name: nil) }
30
30
  subject { described_class.new(options) }
31
31
 
32
32
  before do
@@ -93,7 +93,7 @@ describe RainforestCli::Validator do
93
93
 
94
94
  context 'when multiple tests have the same rfml_ids' do
95
95
  let(:test_directory) { File.expand_path(File.dirname(__FILE__) + '/../validation-examples/duplicate_rfml_ids') }
96
- let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, token: 'api_token', command: '') }
96
+ let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, token: 'api_token', command: '', file_name: nil, tags: [], site_id: nil) }
97
97
 
98
98
  subject { described_class.new(options) }
99
99
 
@@ -130,7 +130,7 @@ describe RainforestCli::Validator do
130
130
 
131
131
  context 'without a token option' do
132
132
  let(:test_directory) { File.expand_path(File.dirname(__FILE__) + '/../validation-examples') }
133
- let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, command: '') }
133
+ let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, command: '', file_name: nil, tags: [], site_id: nil) }
134
134
  let(:http_client) { instance_double('RainforestCli::HttpClient', api_token_set?: false) }
135
135
  subject { described_class.new(options) }
136
136
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rainforest-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Russell Smith
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-08-20 00:00:00.000000000 Z
12
+ date: 2016-09-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -217,6 +217,8 @@ files:
217
217
  - spec/fixtures/runs_response.json
218
218
  - spec/fixtures/tests_response.json
219
219
  - spec/fixtures/variables.txt
220
+ - spec/multiple-rainforest-examples/example_test.rfml
221
+ - spec/multiple-rainforest-examples/example_test_2.rfml
220
222
  - spec/rainforest-example/example_test.rfml
221
223
  - spec/rainforest_cli/csv_importer_spec.rb
222
224
  - spec/rainforest_cli/deleter_spec.rb
@@ -285,6 +287,8 @@ test_files:
285
287
  - spec/fixtures/runs_response.json
286
288
  - spec/fixtures/tests_response.json
287
289
  - spec/fixtures/variables.txt
290
+ - spec/multiple-rainforest-examples/example_test.rfml
291
+ - spec/multiple-rainforest-examples/example_test_2.rfml
288
292
  - spec/rainforest-example/example_test.rfml
289
293
  - spec/rainforest_cli/csv_importer_spec.rb
290
294
  - spec/rainforest_cli/deleter_spec.rb