rainforest-cli 1.2.0 → 1.2.1

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +5 -0
  5. data/.ruby-version +1 -0
  6. data/CHANGELOG.md +8 -0
  7. data/Gemfile +7 -1
  8. data/README.md +2 -0
  9. data/Rakefile +6 -4
  10. data/circle.yml +3 -0
  11. data/lib/rainforest/cli.rb +20 -16
  12. data/lib/rainforest/cli/constants.rb +4 -0
  13. data/lib/rainforest/cli/csv_importer.rb +6 -6
  14. data/lib/rainforest/cli/git_trigger.rb +2 -1
  15. data/lib/rainforest/cli/http_client.rb +50 -13
  16. data/lib/rainforest/cli/options.rb +71 -39
  17. data/lib/rainforest/cli/remote_tests.rb +49 -0
  18. data/lib/rainforest/cli/runner.rb +19 -17
  19. data/lib/rainforest/cli/test_files.rb +32 -14
  20. data/lib/rainforest/cli/test_importer.rb +35 -155
  21. data/lib/rainforest/cli/test_parser.rb +38 -14
  22. data/lib/rainforest/cli/uploader.rb +107 -0
  23. data/lib/rainforest/cli/validator.rb +158 -0
  24. data/lib/rainforest/cli/version.rb +2 -1
  25. data/rainforest-cli.gemspec +14 -12
  26. data/spec/cli_spec.rb +84 -90
  27. data/spec/csv_importer_spec.rb +13 -8
  28. data/spec/git_trigger_spec.rb +28 -15
  29. data/spec/http_client_spec.rb +57 -0
  30. data/spec/options_spec.rb +72 -70
  31. data/spec/rainforest-example/example_test.rfml +2 -1
  32. data/spec/remote_tests_spec.rb +22 -0
  33. data/spec/runner_spec.rb +17 -16
  34. data/spec/spec_helper.rb +16 -9
  35. data/spec/test_files_spec.rb +20 -24
  36. data/spec/uploader_spec.rb +54 -0
  37. data/spec/validation-examples/circular_embeds/test1.rfml +5 -0
  38. data/spec/validation-examples/circular_embeds/test2.rfml +5 -0
  39. data/spec/validation-examples/correct_embeds/embedded_test.rfml +6 -0
  40. data/spec/validation-examples/correct_embeds/test_with_embedded.rfml +8 -0
  41. data/spec/validation-examples/missing_embeds/correct_test.rfml +8 -0
  42. data/spec/validation-examples/missing_embeds/incorrect_test.rfml +8 -0
  43. data/spec/validation-examples/parse_errors/no_parse_errors.rfml +6 -0
  44. data/spec/validation-examples/parse_errors/no_question.rfml +5 -0
  45. data/spec/validation-examples/parse_errors/no_question_mark.rfml +6 -0
  46. data/spec/validation-examples/parse_errors/no_rfml_id.rfml +5 -0
  47. data/spec/validator_spec.rb +119 -0
  48. metadata +96 -16
data/spec/spec_helper.rb CHANGED
@@ -1,16 +1,11 @@
1
- # This file was generated by the `rspec --init` command. Conventionally, all
2
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
- # Require this file using `require "spec_helper"` to ensure that it is only
4
- # loaded once.
5
- #
6
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
-
8
- require "rainforest/cli"
1
+ # frozen_string_literal: true
2
+ require 'rspec/its'
3
+ require 'byebug'
4
+ require 'rainforest/cli'
9
5
 
10
6
  RainforestCli.logger = Logger.new(StringIO.new)
11
7
 
12
8
  RSpec.configure do |config|
13
- config.treat_symbols_as_metadata_keys_with_true_values = true
14
9
  config.run_all_when_everything_filtered = true
15
10
  config.filter_run :focus
16
11
 
@@ -20,3 +15,15 @@ RSpec.configure do |config|
20
15
  # --seed 1234
21
16
  config.order = 'random'
22
17
  end
18
+
19
+ RSpec::Matchers.define :test_with_file_name do |expected_name|
20
+ match do |actual|
21
+ actual.file_name == expected_name
22
+ end
23
+ end
24
+
25
+ RSpec::Matchers.define :array_excluding do |expected_exclusion|
26
+ match do |actual|
27
+ !actual.include?(expected_exclusion)
28
+ end
29
+ end
@@ -1,36 +1,32 @@
1
+ # frozen_string_literal: true
1
2
  describe RainforestCli::TestFiles do
2
- let(:test_folder) { File.dirname(__FILE__) + '/rainforest-example' }
3
- subject { described_class.new(test_folder) }
3
+ describe '#test_data' do
4
+ let(:test_folder) { File.dirname(__FILE__) + '/rainforest-example' }
5
+ subject { described_class.new(test_folder) }
4
6
 
5
- let(:rfml_test) { subject.test_data.first }
6
- let(:text_file) { File.read(test_folder + '/example_test.rfml') }
7
+ let(:rfml_test) { subject.test_data.first }
8
+ let(:text_file) { File.read(test_folder + '/example_test.rfml') }
7
9
 
8
- describe '#initialize' do
9
- before do
10
- allow(Dir).to receive(:mkdir)
10
+ it 'parses all available tests on initialization' do
11
+ expect(rfml_test.title).to eq(text_file.match(/^# title: (.+)$/)[1])
12
+ expect(rfml_test.rfml_id).to eq(text_file.match(/^#! (.+?)($| .+?$)/)[1])
11
13
  end
14
+ end
12
15
 
13
- context 'when test folder name is not supplied' do
14
- it 'uses the default file folder' do
15
- expect(described_class.new.test_folder).to eq(described_class::DEFAULT_TEST_FOLDER)
16
- end
17
- end
16
+ describe '#test_dictionary' do
17
+ Test = Struct.new(:rfml_id, :id)
18
18
 
19
- context 'when test folder name is supplied' do
20
- let(:folder_name) { './foo' }
19
+ subject { described_class.new }
20
+ let(:tests) { [Test.new('foo', 123), Test.new('bar', 456), Test.new('baz', 789)] }
21
21
 
22
- it 'creates the supplied folder if file does not exist' do
23
- expect(Dir).to receive(:mkdir).with(folder_name).once
24
- described_class.new(folder_name)
25
- end
22
+ before do
23
+ allow(FileUtils).to receive(:mkdir_p)
24
+ allow_any_instance_of(described_class).to receive(:test_data)
25
+ .and_return(tests)
26
26
  end
27
27
 
28
- end
29
-
30
- describe '#test_data' do
31
- it 'parses all available tests on initialization' do
32
- expect(rfml_test.title).to eq(text_file.match(/^# title: (.+)$/)[1])
33
- expect(rfml_test.rfml_id).to eq(text_file.match(/^#! (.+?)($| .+?$)/)[1])
28
+ it "correctly formats the dictionary's keys and values" do
29
+ expect(subject.test_dictionary).to include({})
34
30
  end
35
31
  end
36
32
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ describe RainforestCli::Uploader do
3
+ let(:options) { instance_double('RainforestCli::Options', token: 'foo', test_folder: test_directory) }
4
+ let(:progress_bar_double) { double('ProgressBar') }
5
+ subject { described_class.new(options) }
6
+
7
+ before do
8
+ allow(ProgressBar).to receive(:create).and_return(progress_bar_double)
9
+ allow(progress_bar_double).to receive(:increment)
10
+ allow_any_instance_of(RainforestCli::Validator).to receive(:validate_with_exception!)
11
+ allow_any_instance_of(RainforestCli::RemoteTests).to receive(:primary_key_dictionary)
12
+ .and_return({})
13
+ end
14
+
15
+ describe '#upload' do
16
+ context 'with new tests' do
17
+ let(:test_directory) { File.expand_path(File.join(__FILE__, '../validation-examples/correct_embeds')) }
18
+ let(:rf_test_double) { instance_double('Rainforest::Test', id: 123) }
19
+
20
+ before do
21
+ allow(subject).to receive(:upload_test)
22
+ end
23
+
24
+ it 'creates uploads the new tests with no steps' do
25
+ expect(Rainforest::Test).to receive(:create).with(hash_including(:title, :start_uri, :rfml_id))
26
+ .and_return(rf_test_double).twice
27
+ subject.upload
28
+ end
29
+ end
30
+ end
31
+
32
+ describe 'uploaded test object' do
33
+ let(:test_directory) { File.expand_path(File.join(__FILE__, '../rainforest-example')) }
34
+ let(:test_double) { instance_double('Rainforest::Test', id: 123) }
35
+
36
+ before do
37
+ allow(Rainforest::Test).to receive(:create).and_return(test_double)
38
+ end
39
+
40
+ it 'contains the correct attributes' do
41
+ expect(Rainforest::Test).to receive(:update) do |_id, test_attrs|
42
+ expect(test_attrs).to include({
43
+ start_uri: '/start_uri',
44
+ title: 'Example Test',
45
+ source: 'rainforest-cli',
46
+ tags: ['foo', 'bar', 'baz'],
47
+ rfml_id: 'example_test'
48
+ })
49
+ end
50
+
51
+ subject.upload
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,5 @@
1
+ #! test1
2
+ # title: Test 1
3
+ # start_uri: /
4
+
5
+ - test2
@@ -0,0 +1,5 @@
1
+ #! test2
2
+ # title: Test 2
3
+ # start_uri: /
4
+
5
+ - test1
@@ -0,0 +1,6 @@
1
+ #! embedded_test
2
+ # title: Embedded Test
3
+ # start_uri: /
4
+
5
+ Embedded action
6
+ Embedded question?
@@ -0,0 +1,8 @@
1
+ #! 08751893-89af-4235-9a1a-1b1a809d05c8
2
+ # title: Test with Embedded
3
+ # start_uri: /
4
+
5
+ - embedded_test
6
+
7
+ Parent test
8
+ Parent test?
@@ -0,0 +1,8 @@
1
+ #! correct_test
2
+ # title: New Test 2
3
+ # start_uri: /
4
+
5
+ Action
6
+ Question?
7
+
8
+ - parent
@@ -0,0 +1,8 @@
1
+ #! parent
2
+ # title: New test
3
+ # start_uri: /
4
+
5
+ Action
6
+ Question?
7
+
8
+ - non_existent_embed
@@ -0,0 +1,6 @@
1
+ #! no_parse_errors
2
+ # title: No Parse Errors Test
3
+ # start_uri: /
4
+
5
+ Nothing wrong with this action!
6
+ Nothing wrong with this question?
@@ -0,0 +1,5 @@
1
+ #! no_question_test
2
+ # title: No Question Test
3
+ # start_uri: /
4
+
5
+ This is an action without a question.
@@ -0,0 +1,6 @@
1
+ #! no_question_mark_test
2
+ # title: No Question Mark Test
3
+ # start_uri: /
4
+
5
+ This is an action with a question.
6
+ This is a question without a question mark
@@ -0,0 +1,5 @@
1
+ # title: No RFML ID Test
2
+ # start_uri: /
3
+
4
+ This is an action.
5
+ This is a question.
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe RainforestCli::Validator do
4
+ let(:rfml_id_regex) { /^#! (.+?)($| .+?$)/ }
5
+ let(:file_path) { File.join(test_directory, correct_file_name) }
6
+
7
+ def notifies_with_correct_file_name
8
+ expect(subject).to receive(notification_method)
9
+ .with(array_including(test_with_file_name(file_path)))
10
+ .and_call_original
11
+
12
+ if raises_error
13
+ expect { subject.public_send(tested_method) }.to raise_error(SystemExit)
14
+ else
15
+ expect { subject.public_send(tested_method) }.to_not raise_error
16
+ end
17
+ end
18
+
19
+ def does_not_notify_for_wrong_file_names
20
+ expect(subject).to receive(notification_method)
21
+ .with(array_excluding(test_with_file_name(file_path)))
22
+ .and_call_original
23
+
24
+ if raises_error
25
+ expect { subject.public_send(tested_method) }.to raise_error(SystemExit)
26
+ else
27
+ expect { subject.public_send(tested_method) }.to_not raise_error
28
+ end
29
+ end
30
+
31
+ shared_examples 'it detects all the correct errors' do
32
+ let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, token: 'api_token') }
33
+ subject { described_class.new(options) }
34
+
35
+ before do
36
+ allow(Rainforest::Test).to receive(:all).and_return([])
37
+ end
38
+
39
+ context 'with parsing errors' do
40
+ let(:notification_method) { :parsing_error_notification }
41
+ let(:test_directory) { File.expand_path(File.join(__FILE__, '../validation-examples/parse_errors')) }
42
+
43
+ context 'no rfml id' do
44
+ let(:correct_file_name) { 'no_rfml_id.rfml' }
45
+ it { notifies_with_correct_file_name }
46
+ end
47
+
48
+ context 'no question' do
49
+ let(:correct_file_name) { 'no_rfml_id.rfml' }
50
+ it { notifies_with_correct_file_name }
51
+ end
52
+
53
+ context 'no question mark' do
54
+ let(:correct_file_name) { 'no_question_mark.rfml' }
55
+ it { notifies_with_correct_file_name }
56
+ end
57
+
58
+ context 'no parse errors' do
59
+ let(:correct_file_name) { 'no_question_mark.rfml' }
60
+ it { does_not_notify_for_wrong_file_names }
61
+ end
62
+ end
63
+
64
+ context 'with a incorrect embedded RFML ID' do
65
+ let(:notification_method) { :nonexisting_embedded_id_notification }
66
+ let(:test_directory) { File.expand_path(File.join(__FILE__, '../validation-examples/missing_embeds')) }
67
+
68
+ context 'the file containing in the incorrect id' do
69
+ let(:correct_file_name) { 'incorrect_test.rfml' }
70
+ it { notifies_with_correct_file_name }
71
+ end
72
+
73
+ context 'the file with the correct id' do
74
+ let(:correct_file_name) { 'correct_test.rfml' }
75
+ it { does_not_notify_for_wrong_file_names }
76
+ end
77
+ end
78
+
79
+ context 'with circular embeds' do
80
+ let(:test_directory) { File.expand_path(File.join(__FILE__, '../validation-examples/circular_embeds')) }
81
+ let(:file_name_a) { File.join(test_directory, 'test1.rfml') }
82
+ let(:file_name_b) { File.join(test_directory, 'test2.rfml') }
83
+
84
+ it 'raises a CircularEmbeds error for both tests' do
85
+ expect(subject).to receive(:circular_dependencies_notification) do |a, b|
86
+ expect([a, b] - [file_name_a, file_name_b]).to be_empty
87
+ end.and_call_original
88
+
89
+ expect { subject.validate_with_exception! }.to raise_error(SystemExit)
90
+ end
91
+ end
92
+ end
93
+
94
+ describe '#validate' do
95
+ let(:tested_method) { :validate }
96
+ let(:raises_error) { false }
97
+
98
+ it_behaves_like 'it detects all the correct errors'
99
+ end
100
+
101
+ describe '#validate_with_exception!' do
102
+ let(:tested_method) { :validate_with_exception! }
103
+ let(:raises_error) { true }
104
+
105
+ it_behaves_like 'it detects all the correct errors'
106
+
107
+ context 'without a token option' do
108
+ let(:test_directory) { File.expand_path(File.join(__FILE__, '../validation-examples')) }
109
+ let(:options) { instance_double('RainforestCli::Options', test_folder: test_directory, token: nil) }
110
+ subject { described_class.new(options) }
111
+
112
+ it 'validates locally and tells the user to include a token to valid with server tests as well' do
113
+ expect_any_instance_of(Logger).to receive(:error).with(described_class::API_TOKEN_ERROR)
114
+
115
+ expect { subject.validate_with_exception! }.to raise_error(SystemExit)
116
+ end
117
+ end
118
+ end
119
+ end
metadata CHANGED
@@ -1,72 +1,110 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rainforest-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
- - Simon Mathieu
8
7
  - Russell Smith
8
+ - Edward Paulet
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-09 00:00:00.000000000 Z
12
+ date: 2016-03-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">="
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '0'
20
+ version: 0.13.7
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ">="
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '0'
27
+ version: 0.13.7
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: parallel
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.6'
32
35
  - - ">="
33
36
  - !ruby/object:Gem::Version
34
- version: '0'
37
+ version: 1.6.1
35
38
  type: :runtime
36
39
  prerelease: false
37
40
  version_requirements: !ruby/object:Gem::Requirement
38
41
  requirements:
42
+ - - "~>"
43
+ - !ruby/object:Gem::Version
44
+ version: '1.6'
39
45
  - - ">="
40
46
  - !ruby/object:Gem::Version
41
- version: '0'
47
+ version: 1.6.1
42
48
  - !ruby/object:Gem::Dependency
43
49
  name: ruby-progressbar
44
50
  requirement: !ruby/object:Gem::Requirement
45
51
  requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
46
55
  - - ">="
47
56
  - !ruby/object:Gem::Version
48
- version: '0'
57
+ version: 1.7.5
49
58
  type: :runtime
50
59
  prerelease: false
51
60
  version_requirements: !ruby/object:Gem::Requirement
52
61
  requirements:
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '1.7'
53
65
  - - ">="
54
66
  - !ruby/object:Gem::Version
55
- version: '0'
67
+ version: 1.7.5
56
68
  - !ruby/object:Gem::Dependency
57
69
  name: rainforest
58
70
  requirement: !ruby/object:Gem::Requirement
59
71
  requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.1'
60
75
  - - ">="
61
76
  - !ruby/object:Gem::Version
62
- version: '0'
77
+ version: 2.1.0
63
78
  type: :runtime
64
79
  prerelease: false
65
80
  version_requirements: !ruby/object:Gem::Requirement
66
81
  requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '2.1'
67
85
  - - ">="
68
86
  - !ruby/object:Gem::Version
69
- version: '0'
87
+ version: 2.1.0
88
+ - !ruby/object:Gem::Dependency
89
+ name: http-exceptions
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0.0'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 0.0.4
98
+ type: :runtime
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.0'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 0.0.4
70
108
  - !ruby/object:Gem::Dependency
71
109
  name: bundler
72
110
  requirement: !ruby/object:Gem::Requirement
@@ -85,20 +123,26 @@ dependencies:
85
123
  name: rake
86
124
  requirement: !ruby/object:Gem::Requirement
87
125
  requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '10.4'
88
129
  - - ">="
89
130
  - !ruby/object:Gem::Version
90
- version: '0'
131
+ version: 10.4.2
91
132
  type: :development
92
133
  prerelease: false
93
134
  version_requirements: !ruby/object:Gem::Requirement
94
135
  requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '10.4'
95
139
  - - ">="
96
140
  - !ruby/object:Gem::Version
97
- version: '0'
141
+ version: 10.4.2
98
142
  description: Command line utility for Rainforest QA
99
143
  email:
100
- - simon@rainforestqa.com
101
144
  - russ@rainforestqa.com
145
+ - edward@rainforestqa.com
102
146
  executables:
103
147
  - rainforest
104
148
  extensions: []
@@ -107,6 +151,8 @@ files:
107
151
  - ".gitignore"
108
152
  - ".gitmodules"
109
153
  - ".rspec"
154
+ - ".rubocop.yml"
155
+ - ".ruby-version"
110
156
  - ".rvmrc"
111
157
  - ".travis.yml"
112
158
  - CHANGELOG.md
@@ -115,26 +161,45 @@ files:
115
161
  - README.md
116
162
  - Rakefile
117
163
  - bin/rainforest
164
+ - circle.yml
118
165
  - lib/rainforest/cli.rb
166
+ - lib/rainforest/cli/constants.rb
119
167
  - lib/rainforest/cli/csv_importer.rb
120
168
  - lib/rainforest/cli/git_trigger.rb
121
169
  - lib/rainforest/cli/http_client.rb
122
170
  - lib/rainforest/cli/options.rb
171
+ - lib/rainforest/cli/remote_tests.rb
123
172
  - lib/rainforest/cli/runner.rb
124
173
  - lib/rainforest/cli/test_files.rb
125
174
  - lib/rainforest/cli/test_importer.rb
126
175
  - lib/rainforest/cli/test_parser.rb
176
+ - lib/rainforest/cli/uploader.rb
177
+ - lib/rainforest/cli/validator.rb
127
178
  - lib/rainforest/cli/version.rb
128
179
  - rainforest-cli.gemspec
129
180
  - spec/cli_spec.rb
130
181
  - spec/csv_importer_spec.rb
131
182
  - spec/fixtures/variables.txt
132
183
  - spec/git_trigger_spec.rb
184
+ - spec/http_client_spec.rb
133
185
  - spec/options_spec.rb
134
186
  - spec/rainforest-example/example_test.rfml
187
+ - spec/remote_tests_spec.rb
135
188
  - spec/runner_spec.rb
136
189
  - spec/spec_helper.rb
137
190
  - spec/test_files_spec.rb
191
+ - spec/uploader_spec.rb
192
+ - spec/validation-examples/circular_embeds/test1.rfml
193
+ - spec/validation-examples/circular_embeds/test2.rfml
194
+ - spec/validation-examples/correct_embeds/embedded_test.rfml
195
+ - spec/validation-examples/correct_embeds/test_with_embedded.rfml
196
+ - spec/validation-examples/missing_embeds/correct_test.rfml
197
+ - spec/validation-examples/missing_embeds/incorrect_test.rfml
198
+ - spec/validation-examples/parse_errors/no_parse_errors.rfml
199
+ - spec/validation-examples/parse_errors/no_question.rfml
200
+ - spec/validation-examples/parse_errors/no_question_mark.rfml
201
+ - spec/validation-examples/parse_errors/no_rfml_id.rfml
202
+ - spec/validator_spec.rb
138
203
  homepage: https://www.rainforestqa.com/
139
204
  licenses:
140
205
  - MIT
@@ -164,8 +229,23 @@ test_files:
164
229
  - spec/csv_importer_spec.rb
165
230
  - spec/fixtures/variables.txt
166
231
  - spec/git_trigger_spec.rb
232
+ - spec/http_client_spec.rb
167
233
  - spec/options_spec.rb
168
234
  - spec/rainforest-example/example_test.rfml
235
+ - spec/remote_tests_spec.rb
169
236
  - spec/runner_spec.rb
170
237
  - spec/spec_helper.rb
171
238
  - spec/test_files_spec.rb
239
+ - spec/uploader_spec.rb
240
+ - spec/validation-examples/circular_embeds/test1.rfml
241
+ - spec/validation-examples/circular_embeds/test2.rfml
242
+ - spec/validation-examples/correct_embeds/embedded_test.rfml
243
+ - spec/validation-examples/correct_embeds/test_with_embedded.rfml
244
+ - spec/validation-examples/missing_embeds/correct_test.rfml
245
+ - spec/validation-examples/missing_embeds/incorrect_test.rfml
246
+ - spec/validation-examples/parse_errors/no_parse_errors.rfml
247
+ - spec/validation-examples/parse_errors/no_question.rfml
248
+ - spec/validation-examples/parse_errors/no_question_mark.rfml
249
+ - spec/validation-examples/parse_errors/no_rfml_id.rfml
250
+ - spec/validator_spec.rb
251
+ has_rdoc: