rainforest-cli 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
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: