rainforest-cli 1.2.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module RainforestCli::TestParser
3
- class EmbeddedTest < Struct.new(:rfml_id)
3
+ class EmbeddedTest < Struct.new(:rfml_id, :redirect)
4
4
  def type
5
5
  :test
6
6
  end
@@ -9,10 +9,14 @@ module RainforestCli::TestParser
9
9
  "--> embed: #{rfml_id}"
10
10
  end
11
11
 
12
+ def redirection
13
+ redirect || 'true'
14
+ end
15
+
12
16
  def to_element(primary_key_id)
13
17
  {
14
18
  type: 'test',
15
- redirection: true,
19
+ redirection: redirection,
16
20
  element: {
17
21
  id: primary_key_id
18
22
  }
@@ -20,11 +24,15 @@ module RainforestCli::TestParser
20
24
  end
21
25
  end
22
26
 
23
- class Step < Struct.new(:action, :response)
27
+ class Step < Struct.new(:action, :response, :redirect)
24
28
  def type
25
29
  :step
26
30
  end
27
31
 
32
+ def redirection
33
+ redirect || 'true'
34
+ end
35
+
28
36
  def to_s
29
37
  "#{action} --> #{response}"
30
38
  end
@@ -32,7 +40,7 @@ module RainforestCli::TestParser
32
40
  def to_element
33
41
  {
34
42
  type: 'step',
35
- redirection: true,
43
+ redirection: redirection,
36
44
  element: {
37
45
  action: action,
38
46
  response: response
@@ -41,7 +49,18 @@ module RainforestCli::TestParser
41
49
  end
42
50
  end
43
51
 
44
- class Test < Struct.new(:file_name, :rfml_id, :description, :title, :start_uri, :steps, :errors, :tags, :browsers)
52
+ class Test < Struct.new(
53
+ :file_name,
54
+ :rfml_id,
55
+ :description,
56
+ :title,
57
+ :start_uri,
58
+ :site_id,
59
+ :steps,
60
+ :errors,
61
+ :tags,
62
+ :browsers
63
+ )
45
64
  def embedded_ids
46
65
  steps.inject([]) { |embeds, step| step.type == :test ? embeds + [step.rfml_id] : embeds }
47
66
  end
@@ -68,11 +87,13 @@ module RainforestCli::TestParser
68
87
  @test.browsers = []
69
88
  end
70
89
 
71
- TEXT_FIELDS = [:start_uri, :title, :tags].freeze
90
+ TEST_DATA_FIELDS = [:start_uri, :title, :tags, :site_id].freeze
91
+ STEP_DATA_FIELDS = [:redirect].freeze
72
92
  CSV_FIELDS = [:tags, :browsers].freeze
73
93
 
74
94
  def process
75
- scratch = []
95
+ step_scratch = []
96
+ step_settings_scratch = {}
76
97
 
77
98
  text.lines.each_with_index do |line, line_no|
78
99
  line = line.chomp
@@ -85,7 +106,16 @@ module RainforestCli::TestParser
85
106
  # comment, store in description
86
107
  @test.description += line[1..-1] + "\n"
87
108
 
88
- (CSV_FIELDS + TEXT_FIELDS).each do |field|
109
+ if line[1..-1].strip[0..8] == 'redirect:'
110
+ value = line[1..-1].split(' ')[1..-1].join(' ').strip
111
+ if %(true false).include?(value)
112
+ step_settings_scratch[:redirect] = value
113
+ else
114
+ @test.errors[line_no] = Error.new(line_no, 'Redirection value must be true or false')
115
+ end
116
+ end
117
+
118
+ (CSV_FIELDS + TEST_DATA_FIELDS).each do |field|
89
119
  next unless line[1..-1].strip[0..(field.length)] == "#{field}:"
90
120
 
91
121
  # extract just the text of the field
@@ -97,31 +127,35 @@ module RainforestCli::TestParser
97
127
  end
98
128
  end
99
129
 
100
- elsif scratch.count == 0 && line.strip != ''
130
+ elsif step_scratch.count == 0 && line.strip != ''
101
131
  if line[0] == '-'
102
- @test.steps << EmbeddedTest.new(line[1..-1].strip)
132
+ @test.steps << EmbeddedTest.new(line[1..-1].strip, step_settings_scratch[:redirect])
133
+ step_settings_scratch = {}
103
134
  else
104
- scratch << line.strip
135
+ step_scratch << line.strip
105
136
  end
106
137
 
107
- elsif scratch.count == 1
138
+ elsif step_scratch.count == 1
108
139
  if line.strip == ''
109
140
  @test.errors[line_no] = Error.new(line_no, 'Missing question')
110
141
  elsif !line.include?('?')
111
142
  @test.errors[line_no] = Error.new(line_no, 'Missing ?')
112
143
  else
113
- scratch << line.strip
144
+ step_scratch << line.strip
114
145
  end
115
146
 
147
+ elsif line.strip.empty? && step_settings_scratch.any?
148
+ @test.errors[line_no] = Error.new(line_no, 'Extra space between step attributes and step content.')
116
149
  end
117
150
 
118
151
  if @test.errors.has_key?(line_no)
119
- scratch = []
152
+ step_scratch = []
120
153
  end
121
154
 
122
- if scratch.count == 2
123
- @test.steps << Step.new(scratch[0], scratch[1])
124
- scratch = []
155
+ if step_scratch.count == 2
156
+ @test.steps << Step.new(step_scratch[0], step_scratch[1], step_settings_scratch[:redirect])
157
+ step_scratch = []
158
+ step_settings_scratch = {}
125
159
  end
126
160
  end
127
161
 
@@ -7,7 +7,7 @@ class RainforestCli::Uploader
7
7
  attr_reader :test_files, :remote_tests, :validator
8
8
 
9
9
  def initialize(options)
10
- @test_files = RainforestCli::TestFiles.new(options.test_folder)
10
+ @test_files = RainforestCli::TestFiles.new(options)
11
11
  @remote_tests = RainforestCli::RemoteTests.new(options.token)
12
12
  @validator = RainforestCli::Validator.new(options, test_files, remote_tests)
13
13
  end
@@ -51,7 +51,8 @@ class RainforestCli::Uploader
51
51
  test_obj = {
52
52
  title: rfml_test.title,
53
53
  start_uri: rfml_test.start_uri,
54
- rfml_id: rfml_test.rfml_id
54
+ rfml_id: rfml_test.rfml_id,
55
+ source: 'rainforest-cli'
55
56
  }
56
57
  rf_test = Rainforest::Test.create(test_obj)
57
58
 
@@ -82,6 +83,7 @@ class RainforestCli::Uploader
82
83
  test_obj = {
83
84
  start_uri: rfml_test.start_uri || '/',
84
85
  title: rfml_test.title,
86
+ site_id: rfml_test.site_id,
85
87
  description: rfml_test.description,
86
88
  source: 'rainforest-cli',
87
89
  tags: rfml_test.tags.uniq,
@@ -7,7 +7,7 @@ class RainforestCli::Validator
7
7
  attr_reader :local_tests, :remote_tests
8
8
 
9
9
  def initialize(options, local_tests = nil, remote_tests = nil)
10
- @local_tests = local_tests || RainforestCli::TestFiles.new(options.test_folder)
10
+ @local_tests = local_tests || RainforestCli::TestFiles.new(options)
11
11
  @remote_tests = remote_tests || RainforestCli::RemoteTests.new(options.token)
12
12
  end
13
13
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module RainforestCli
3
- VERSION = '1.2.2'
3
+ VERSION = '1.3.0'
4
4
  end
data/spec/cli_spec.rb CHANGED
@@ -173,6 +173,19 @@ describe RainforestCli do
173
173
  end
174
174
  end
175
175
 
176
+ context 'with token from env' do
177
+ let(:params) { %w(run) }
178
+
179
+ it 'starts the run without error' do
180
+ expect_any_instance_of(http_client).to receive(:post).with(
181
+ '/runs',
182
+ { tests: [] }
183
+ ).and_return({})
184
+ allow(ENV).to receive(:[]).with('RAINFOREST_API_TOKEN').and_return('x')
185
+ described_class.start(params)
186
+ end
187
+ end
188
+
176
189
  context 'a simple run' do
177
190
  before do
178
191
  allow_any_instance_of(http_client).to receive(:post).and_return('id' => 1)
@@ -4,14 +4,11 @@ describe RainforestCli::CSVImporter do
4
4
 
5
5
  describe '.import' do
6
6
  subject { described_class.new('variables', csv_file, 'abc123') }
7
- let(:progressbar_mock) { double('ProgressBar') }
8
7
 
9
8
  before do
10
9
  # suppress output in terminal
11
10
  allow_any_instance_of(described_class).to receive(:print)
12
11
  allow_any_instance_of(described_class).to receive(:puts)
13
- allow(ProgressBar).to receive(:create).and_return(progressbar_mock)
14
- allow(progressbar_mock).to receive(:increment)
15
12
  end
16
13
 
17
14
  let(:columns) { %w(email pass) }
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+ describe RainforestCli::Exporter do
3
+ let(:options) do
4
+ instance_double('RainforestCli::Options', token: nil, test_folder: nil, debug: nil, embed_tests: nil, tests: [])
5
+ end
6
+ subject { described_class.new(options) }
7
+
8
+ describe '#export' do
9
+ # Collect everything printed to file in an array-like file double object
10
+ class FileDouble < Array
11
+ alias_method :puts, :push
12
+ end
13
+
14
+ let(:file) { FileDouble.new }
15
+ let(:tests) { [Rainforest::Test.new(id: 123, title: 'Test title')] }
16
+ let(:embedded_rfml_id) { 'embedded_test_rfml_id' }
17
+ let(:embedded_test) do
18
+ {
19
+ rfml_id: embedded_rfml_id,
20
+ elements: [
21
+ {
22
+ type: 'step',
23
+ element: {
24
+ action: 'Embedded Action',
25
+ response: 'Embedded Response'
26
+ }
27
+ }
28
+ ]
29
+ }
30
+ end
31
+ let(:single_test) do
32
+ Rainforest::Test.new(
33
+ {
34
+ id: 123,
35
+ title: 'Test title',
36
+ start_uri: '/uri',
37
+ tags: ['foo', 'bar'],
38
+ browsers: [
39
+ {
40
+ name: 'chrome',
41
+ state: 'enabled'
42
+ },
43
+ {
44
+ name: 'safari',
45
+ state: 'enabled'
46
+ },
47
+ {
48
+ name: 'firefox',
49
+ state: 'disabled'
50
+ }
51
+ ],
52
+ elements: [
53
+ {
54
+ type: 'step',
55
+ element: {
56
+ action: 'Step Action',
57
+ response: 'Step Response'
58
+ }
59
+ },
60
+ {
61
+ type: 'test',
62
+ element: embedded_test
63
+ }
64
+ ]
65
+ }
66
+ )
67
+ end
68
+
69
+ before do
70
+ allow(File).to receive(:open) do |_file_name, _, &blk|
71
+ blk.call(file)
72
+ end
73
+
74
+ allow_any_instance_of(RainforestCli::TestFiles).to receive(:create_file).and_return('file_name')
75
+ allow(File).to receive(:truncate)
76
+
77
+ allow(Rainforest::Test).to receive(:all).and_return(tests)
78
+ allow(Rainforest::Test).to receive(:retrieve).and_return(single_test)
79
+
80
+ subject.export
81
+ end
82
+
83
+ it 'prints an action and response for a step' do
84
+ expect(file).to include('Step Action')
85
+ expect(file).to include('Step Response')
86
+ end
87
+
88
+ it 'prints embedded steps' do
89
+ expect(file).to include('Embedded Action')
90
+ expect(file).to include('Embedded Response')
91
+ expect(file).to_not include("- #{embedded_rfml_id}")
92
+ end
93
+
94
+ it 'print enabled browsers only' do
95
+ comments = file[0]
96
+ expect(comments).to include('chrome')
97
+ expect(comments).to include('safari')
98
+ expect(comments).to_not include('firefox')
99
+ end
100
+
101
+ context 'with embed-tests flag' do
102
+ let(:options) do
103
+ instance_double(
104
+ 'RainforestCli::Options',
105
+ token: nil, test_folder: nil,
106
+ debug: nil, embed_tests: true, tests: []
107
+ )
108
+ end
109
+
110
+ it 'prints an embedded test rfml id rather than the steps' do
111
+ expect(file).to include("- #{embedded_rfml_id}")
112
+ expect(file).to_not include('Embedded Action')
113
+ expect(file).to_not include('Embedded Response')
114
+ end
115
+ end
116
+
117
+ context 'with specific tests' do
118
+ let(:tests) { (123..127).to_a }
119
+ let(:options) do
120
+ instance_double(
121
+ 'RainforestCli::Options',
122
+ token: nil, test_folder: nil, debug: nil,
123
+ embed_tests: nil, tests: tests
124
+ )
125
+ end
126
+
127
+ it 'gets specific tests instead of all' do
128
+ expect(Rainforest::Test).to receive(:retrieve).exactly(tests.length).times
129
+ expect(Rainforest::Test).to receive(:all).exactly(0).times
130
+ subject.export
131
+ end
132
+
133
+ it 'opens correct number of files' do
134
+ expect(File).to receive(:open).exactly(tests.length).times
135
+ expect_any_instance_of(RainforestCli::TestFiles).to receive(:create_file).exactly(tests.length).times
136
+ subject.export
137
+ end
138
+ end
139
+ end
140
+ end
data/spec/options_spec.rb CHANGED
@@ -19,6 +19,11 @@ describe RainforestCli::OptionParser do
19
19
  its(:import_name) { should == 'some_name' }
20
20
  end
21
21
 
22
+ context 'app_source_url' do
23
+ let(:args) { ['--app-source-url', 'some_app'] }
24
+ its(:app_source_url) { should == 'some_app' }
25
+ end
26
+
22
27
  context 'run all tests' do
23
28
  let(:args) { ['run', 'all'] }
24
29
  its(:tests) { should == ['all']}
@@ -1,6 +1,7 @@
1
1
  #! example_test (Test ID - only edit if this test has not yet been uploaded)
2
2
  # title: Example Test
3
3
  # tags: foo,bar,baz
4
+ # site_id: 456
4
5
  # start_uri: /start_uri
5
6
 
6
7
  This is a step action.
@@ -0,0 +1,10 @@
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
+ # start_uri: /start_uri
5
+
6
+ - another_test
7
+
8
+ # redirect: false
9
+ This is a step action.
10
+ This is a question?
@@ -0,0 +1,10 @@
1
+ #! example_test
2
+ # title: Example Test
3
+ # tags: foo,bar,baz
4
+ # start_uri: /start_uri
5
+
6
+ This is a step action.
7
+ This is a question?
8
+
9
+ # redirect: false
10
+ - another_test
@@ -0,0 +1,10 @@
1
+ #! example_test
2
+ # title: Example Test
3
+ # tags: foo,bar,baz
4
+ # start_uri: /start_uri
5
+
6
+ - another_test
7
+
8
+ # redirect: true
9
+ This is a step action.
10
+ This is a question?
@@ -0,0 +1,10 @@
1
+ #! example_test
2
+ # title: Example Test
3
+ # tags: foo,bar,baz
4
+ # start_uri: /start_uri
5
+
6
+ This is a step action.
7
+ This is a question?
8
+
9
+ # redirect: true
10
+ - another_test
@@ -0,0 +1,10 @@
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
+ # start_uri: /start_uri
5
+
6
+ - another_test
7
+
8
+ # redirect: foo
9
+ This is a step action.
10
+ This is a question?