rainforest-cli 1.6.5 → 1.7.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 +4 -4
 - data/.rubocop.yml +3 -0
 - data/CHANGELOG.md +8 -0
 - data/README.md +42 -7
 - data/bin/rainforest +1 -1
 - data/lib/{rainforest/cli.rb → rainforest_cli.rb} +23 -15
 - data/lib/{rainforest/cli → rainforest_cli}/constants.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/csv_importer.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/deleter.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/exporter.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/git_trigger.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/http_client.rb +5 -4
 - data/lib/rainforest_cli/junit_outputter.rb +69 -0
 - data/lib/{rainforest/cli → rainforest_cli}/options.rb +40 -1
 - data/lib/{rainforest/cli → rainforest_cli}/remote_tests.rb +0 -0
 - data/lib/rainforest_cli/reporter.rb +64 -0
 - data/lib/{rainforest/cli → rainforest_cli}/resources.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/runner.rb +20 -6
 - data/lib/{rainforest/cli → rainforest_cli}/test_files.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/test_parser.rb +4 -65
 - data/lib/rainforest_cli/test_parser/embedded_test.rb +14 -0
 - data/lib/rainforest_cli/test_parser/step.rb +24 -0
 - data/lib/rainforest_cli/test_parser/test.rb +40 -0
 - data/lib/{rainforest/cli → rainforest_cli}/uploader.rb +32 -27
 - data/lib/rainforest_cli/uploader/multi_form_post_request.rb +50 -0
 - data/lib/rainforest_cli/uploader/uploadable_parser.rb +143 -0
 - data/lib/{rainforest/cli → rainforest_cli}/validator.rb +0 -0
 - data/lib/{rainforest/cli → rainforest_cli}/version.rb +1 -1
 - data/rainforest-cli.gemspec +3 -1
 - data/spec/fixtures/failed_test_response.json +29 -0
 - data/spec/fixtures/runs_response.json +275 -0
 - data/spec/fixtures/tests_response.json +130 -0
 - data/spec/{csv_importer_spec.rb → rainforest_cli/csv_importer_spec.rb} +7 -14
 - data/spec/{deleter_spec.rb → rainforest_cli/deleter_spec.rb} +0 -0
 - data/spec/{exporter_spec.rb → rainforest_cli/exporter_spec.rb} +0 -0
 - data/spec/{git_trigger_spec.rb → rainforest_cli/git_trigger_spec.rb} +0 -0
 - data/spec/{http_client_spec.rb → rainforest_cli/http_client_spec.rb} +23 -0
 - data/spec/rainforest_cli/junit_outputter_spec.rb +32 -0
 - data/spec/{options_spec.rb → rainforest_cli/options_spec.rb} +33 -0
 - data/spec/{remote_tests_spec.rb → rainforest_cli/remote_tests_spec.rb} +0 -0
 - data/spec/rainforest_cli/reporter_spec.rb +51 -0
 - data/spec/{resources_spec.rb → rainforest_cli/resources_spec.rb} +0 -0
 - data/spec/{runner_spec.rb → rainforest_cli/runner_spec.rb} +0 -0
 - data/spec/{test_files_spec.rb → rainforest_cli/test_files_spec.rb} +1 -1
 - data/spec/rainforest_cli/test_parser/step_spec.rb +53 -0
 - data/spec/rainforest_cli/test_parser_spec.rb +15 -0
 - data/spec/rainforest_cli/uploader/uploadable_parser_spec.rb +84 -0
 - data/spec/{uploader_spec.rb → rainforest_cli/uploader_spec.rb} +2 -2
 - data/spec/{validator_spec.rb → rainforest_cli/validator_spec.rb} +6 -7
 - data/spec/{cli_spec.rb → rainforest_cli_spec.rb} +5 -5
 - data/spec/spec_helper.rb +4 -1
 - metadata +95 -47
 - data/.rvmrc +0 -1
 - data/spec/test_parser_spec.rb +0 -95
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: e73f6818b72f61f2b152943bc46f066b95c43630
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: a5a82d24cf2b5d5d4be4fafe0c3a0ebab1cca626
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: add946c11dd743c5fb9796d00a12526c87a7453bfe52341a28272d22ae0fb05458b95bf2cb52080623a67d17bc1318a09db75a2c96c9d94ec4041b0724e48da5
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 712af1181c2892308dd5396c63653f0e61e5944ad74044788589326258e74b3075cf40a93a672e5c19dabe7d38fba7328d43fe85b7630683c2ee9542dad183e2
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,5 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Rainforest CLI Changelog
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## 1.7.0 - 8th August 2016
         
     | 
| 
      
 4 
     | 
    
         
            +
            - New run flag: `--wait` for hooking into existing run instead of starting a new one.
         
     | 
| 
      
 5 
     | 
    
         
            +
            (77df41bf79b8635fb8c2d8a93968f975db092c69, @shosti)
         
     | 
| 
      
 6 
     | 
    
         
            +
            - New run flag: `--junit-file` for exporting run results into JUnit format.
         
     | 
| 
      
 7 
     | 
    
         
            +
            (349f2b1f5c8b423766875751c7cafed692fc2bed, @briancolby)
         
     | 
| 
      
 8 
     | 
    
         
            +
            - New feature: Embed screenshots and file download links in your RFML tests.
         
     | 
| 
      
 9 
     | 
    
         
            +
            (e081072c591c810b8bc3edce6d2e507d12a1a18e, @epaulet)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       3 
11 
     | 
    
         
             
            ## 1.6.5 - 13th June 2016
         
     | 
| 
       4 
12 
     | 
    
         
             
            - Exit with non-zero status code when `validate` fails. (8db1d38be39aa50d2afcdef817f78c654b3108b6,
         
     | 
| 
       5 
13 
     | 
    
         
             
            @DyerSituation)
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -32,9 +32,9 @@ You can customize the amount of threads to use when making HTTP requests by sett 
     | 
|
| 
       32 
32 
     | 
    
         
             
            API errors when fetching or updating multiple tests, lowering this value can help.
         
     | 
| 
       33 
33 
     | 
    
         
             
            The default value is `16`.
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 35 
     | 
    
         
            +
            ## Options
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
      
 37 
     | 
    
         
            +
            #### Running Tests
         
     | 
| 
       38 
38 
     | 
    
         | 
| 
       39 
39 
     | 
    
         
             
            Run all tests.
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
         @@ -54,7 +54,13 @@ Run all tests with tag 'run-me' and abort previous in-progress runs. 
     | 
|
| 
       54 
54 
     | 
    
         
             
            rainforest run --tag run-me --fg --conflict abort
         
     | 
| 
       55 
55 
     | 
    
         
             
            ```
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
      
 57 
     | 
    
         
            +
            Run all in the foreground and generate a junit xml report.
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 60 
     | 
    
         
            +
            rainforest run all --fg --junit-file rainforest.xml
         
     | 
| 
      
 61 
     | 
    
         
            +
            ```
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            #### Creating and Managing Tests
         
     | 
| 
       58 
64 
     | 
    
         | 
| 
       59 
65 
     | 
    
         
             
            Create new Rainforest test in RFML format (Rainforest Markup Language).
         
     | 
| 
       60 
66 
     | 
    
         | 
| 
         @@ -82,12 +88,19 @@ Upload tests to Rainforest 
     | 
|
| 
       82 
88 
     | 
    
         
             
            rainforest upload
         
     | 
| 
       83 
89 
     | 
    
         
             
            ```
         
     | 
| 
       84 
90 
     | 
    
         | 
| 
      
 91 
     | 
    
         
            +
            Remove RFML file and remove test from Rainforest test suite.
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 94 
     | 
    
         
            +
            rainforest rm /path/to/test/file.rfml
         
     | 
| 
      
 95 
     | 
    
         
            +
            ```
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
       85 
97 
     | 
    
         
             
            Export all tests from Rainforest
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
       86 
99 
     | 
    
         
             
            ```bash
         
     | 
| 
       87 
100 
     | 
    
         
             
            rainforest export
         
     | 
| 
       88 
101 
     | 
    
         
             
            ```
         
     | 
| 
       89 
102 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
      
 103 
     | 
    
         
            +
            #### Viewing Account Specific Information
         
     | 
| 
       91 
104 
     | 
    
         | 
| 
       92 
105 
     | 
    
         
             
            See a list of all of your sites and their IDs
         
     | 
| 
       93 
106 
     | 
    
         
             
            ```bash
         
     | 
| 
         @@ -104,6 +117,11 @@ See a list of all of your browsers and their IDs 
     | 
|
| 
       104 
117 
     | 
    
         
             
            rainforest browsers
         
     | 
| 
       105 
118 
     | 
    
         
             
            ```
         
     | 
| 
       106 
119 
     | 
    
         | 
| 
      
 120 
     | 
    
         
            +
            To generate a junit xml report for a test run which has already completed
         
     | 
| 
      
 121 
     | 
    
         
            +
            ```bash
         
     | 
| 
      
 122 
     | 
    
         
            +
            rainforest report --run-id <run-id> --junit-file rainforest.xml
         
     | 
| 
      
 123 
     | 
    
         
            +
            ```
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
       107 
125 
     | 
    
         
             
            ## Options
         
     | 
| 
       108 
126 
     | 
    
         | 
| 
       109 
127 
     | 
    
         
             
            ### General
         
     | 
| 
         @@ -128,8 +146,11 @@ Rainforest Tests written using RFML have the following format 
     | 
|
| 
       128 
146 
     | 
    
         
             
            # redirect: [REDIRECT FLAG]
         
     | 
| 
       129 
147 
     | 
    
         
             
            - [EMBEDDED TEST RFML ID]
         
     | 
| 
       130 
148 
     | 
    
         | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
      
 149 
     | 
    
         
            +
            Action with an embedded screenshot: {{ file.screenshot(./relative/path/to/screenshot.jpg) }}
         
     | 
| 
      
 150 
     | 
    
         
            +
            Response with an embedded file download: {{ file.download(./relative/path/to/file.txt) }}
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
            [ACTION 3]
         
     | 
| 
      
 153 
     | 
    
         
            +
            [QUESTION 3]
         
     | 
| 
       133 
154 
     | 
    
         | 
| 
       134 
155 
     | 
    
         
             
            ... etc.
         
     | 
| 
       135 
156 
     | 
    
         
             
            ```
         
     | 
| 
         @@ -161,6 +182,13 @@ tests and the first step of a test. 
     | 
|
| 
       161 
182 
     | 
    
         
             
            - `EMBEDDED TEST RFML ID` - Embed the steps of another test within the current test
         
     | 
| 
       162 
183 
     | 
    
         
             
            using the embedded test's RFML ID.
         
     | 
| 
       163 
184 
     | 
    
         | 
| 
      
 185 
     | 
    
         
            +
            Embedding Screenshots and Downloadable Files:
         
     | 
| 
      
 186 
     | 
    
         
            +
            - Your embedded files must be checked into version control with along your RFML tests.
         
     | 
| 
      
 187 
     | 
    
         
            +
            - `{{ file.screenshot(RELATIVE_PATH) }}` will embed screenshot found at RELATIVE_PATH
         
     | 
| 
      
 188 
     | 
    
         
            +
            which is a path to the screenshot relative to the RFML file.
         
     | 
| 
      
 189 
     | 
    
         
            +
            - `{{ file.download(RELATIVE_PATH) }}` will embed downloadable file link found at RELATIVE_PATH
         
     | 
| 
      
 190 
     | 
    
         
            +
            which is a path to the downloadable file relative to the RFML file.
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
       164 
192 
     | 
    
         
             
            For more information on test writing, please visit our [documentation](http://support.rainforestqa.com/hc/en-us/sections/200585603-Writing-Tests).
         
     | 
| 
       165 
193 
     | 
    
         | 
| 
       166 
194 
     | 
    
         
             
            ### Command Line Options
         
     | 
| 
         @@ -173,6 +201,7 @@ Popular command line options are: 
     | 
|
| 
       173 
201 
     | 
    
         
             
            - `--environment-id` - run your tests using this environment. Otherwise it will use your default environment
         
     | 
| 
       174 
202 
     | 
    
         
             
            - `--conflict OPTION` - use the `abort` option to abort any runs in progress in the same environment as your new run. use the `abort-all` option to abort all runs in progress.
         
     | 
| 
       175 
203 
     | 
    
         
             
            - `--fg` - results in the foreground - rainforest-cli will not return until the run is complete. This is what you want to make the build pass / fail dependent on rainforest results
         
     | 
| 
      
 204 
     | 
    
         
            +
            - `--wait RUN_ID` - wait for an existing run to finish instead of starting a new one, and exit with a non-0 code if the run fails. rainforest-cli will exit immediately if the run is already complete.
         
     | 
| 
       176 
205 
     | 
    
         
             
            - `--fail-fast` - fail the build as soon as the first failed result comes in. If you don't pass this it will wait until 100% of the run is done. Use with `--fg`.
         
     | 
| 
       177 
206 
     | 
    
         
             
            - `--custom-url` - use a custom url for this run. Example use case: an ad-hoc QA environment with [Fourchette](https://github.com/rainforestapp/fourchette). You will need to specify a `site_id` too for this to work. Note that we will be creating a new environment for this particular run.
         
     | 
| 
       178 
207 
     | 
    
         
             
            - `--git-trigger` - only trigger a run when the last commit (for a git repo in the current working directory) has contains `@rainforest` and a list of one or more tags. E.g. "Fix checkout process. @rainforest #checkout" would trigger a run for everything tagged `checkout`. This over-rides `--tag` and any tests specified. If no `@rainforest` is detected it will exit 0.
         
     | 
| 
         @@ -180,6 +209,12 @@ Popular command line options are: 
     | 
|
| 
       180 
209 
     | 
    
         
             
            - `--embed-tests` - Use with `rainforest export` to export your tests without extracting the
         
     | 
| 
       181 
210 
     | 
    
         
             
            steps of an embedded test.
         
     | 
| 
       182 
211 
     | 
    
         
             
            - `--test-folder /path/to/directory` - Use with `rainforest [new, upload, export]`. If this option is not provided, rainforest-cli will, in the case of 'new' create a directory, or in the case of 'upload' and 'export' use the directory, at the default path `./spec/rainforest/`.
         
     | 
| 
      
 212 
     | 
    
         
            +
            - `--junit-file` - Create a junit xml report file with the specified name.  Must be run in foreground mode, or with the report command. Uses the rainforest
         
     | 
| 
      
 213 
     | 
    
         
            +
            api to construct a junit report.  This is useful to track tests in CI such as Jenkins or Bamboo.
         
     | 
| 
      
 214 
     | 
    
         
            +
            - `--run-id` - Only used with the report command.  Specify a past rainforest run by ID number to generate a report for.
         
     | 
| 
      
 215 
     | 
    
         
            +
            - `--import-variable-csv-file /path/to/csv/file.csv` - Use with `run` and `--import-variable-name` to upload new tabular variable values before your run to specify the path to your CSV file.
         
     | 
| 
      
 216 
     | 
    
         
            +
            - `--import-variable-name NAME` - Use with `run` and `import-variable-csv-file` to upload
         
     | 
| 
      
 217 
     | 
    
         
            +
            new tabular variable values before your run to specify the name of your tabular variable.
         
     | 
| 
       183 
218 
     | 
    
         | 
| 
       184 
219 
     | 
    
         | 
| 
       185 
220 
     | 
    
         
             
            #### Specifying Test IDs
         
     | 
| 
         @@ -192,7 +227,7 @@ test IDs taken from the Rainforest dashboard. ie: 
     | 
|
| 
       192 
227 
     | 
    
         
             
            All other argument types should be specified as seen above.
         
     | 
| 
       193 
228 
     | 
    
         | 
| 
       194 
229 
     | 
    
         | 
| 
       195 
     | 
    
         
            -
            More detailed info on options can be [found here](https://github.com/rainforestapp/rainforest-cli/blob/master/lib/ 
     | 
| 
      
 230 
     | 
    
         
            +
            More detailed info on options can be [found here](https://github.com/rainforestapp/rainforest-cli/blob/master/lib/rainforest_cli/options.rb#L23-L74).
         
     | 
| 
       196 
231 
     | 
    
         | 
| 
       197 
232 
     | 
    
         
             
            ## Support
         
     | 
| 
       198 
233 
     | 
    
         | 
    
        data/bin/rainforest
    CHANGED
    
    
| 
         @@ -2,25 +2,28 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            require 'erb'
         
     | 
| 
       3 
3 
     | 
    
         
             
            require 'json'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'logger'
         
     | 
| 
       5 
     | 
    
         
            -
            require ' 
     | 
| 
       6 
     | 
    
         
            -
            require ' 
     | 
| 
       7 
     | 
    
         
            -
            require ' 
     | 
| 
       8 
     | 
    
         
            -
            require ' 
     | 
| 
       9 
     | 
    
         
            -
            require ' 
     | 
| 
       10 
     | 
    
         
            -
            require ' 
     | 
| 
       11 
     | 
    
         
            -
            require ' 
     | 
| 
       12 
     | 
    
         
            -
            require ' 
     | 
| 
       13 
     | 
    
         
            -
            require ' 
     | 
| 
       14 
     | 
    
         
            -
            require ' 
     | 
| 
       15 
     | 
    
         
            -
            require ' 
     | 
| 
       16 
     | 
    
         
            -
            require ' 
     | 
| 
       17 
     | 
    
         
            -
            require ' 
     | 
| 
       18 
     | 
    
         
            -
            require ' 
     | 
| 
       19 
     | 
    
         
            -
            require ' 
     | 
| 
      
 5 
     | 
    
         
            +
            require 'rainforest_cli/version'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'rainforest_cli/constants'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'rainforest_cli/options'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'rainforest_cli/runner'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'rainforest_cli/http_client'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'rainforest_cli/git_trigger'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'rainforest_cli/csv_importer'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require 'rainforest_cli/test_parser'
         
     | 
| 
      
 13 
     | 
    
         
            +
            require 'rainforest_cli/test_files'
         
     | 
| 
      
 14 
     | 
    
         
            +
            require 'rainforest_cli/remote_tests'
         
     | 
| 
      
 15 
     | 
    
         
            +
            require 'rainforest_cli/validator'
         
     | 
| 
      
 16 
     | 
    
         
            +
            require 'rainforest_cli/exporter'
         
     | 
| 
      
 17 
     | 
    
         
            +
            require 'rainforest_cli/deleter'
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'rainforest_cli/uploader'
         
     | 
| 
      
 19 
     | 
    
         
            +
            require 'rainforest_cli/resources'
         
     | 
| 
      
 20 
     | 
    
         
            +
            require 'rainforest_cli/junit_outputter'
         
     | 
| 
      
 21 
     | 
    
         
            +
            require 'rainforest_cli/reporter'
         
     | 
| 
       20 
22 
     | 
    
         | 
| 
       21 
23 
     | 
    
         
             
            module RainforestCli
         
     | 
| 
       22 
24 
     | 
    
         
             
              def self.start(args)
         
     | 
| 
       23 
25 
     | 
    
         
             
                options = OptionParser.new(args)
         
     | 
| 
      
 26 
     | 
    
         
            +
                @http_client = HttpClient.new(token: options.token)
         
     | 
| 
       24 
27 
     | 
    
         
             
                OptionParser.new(['--help']) if args.size == 0
         
     | 
| 
       25 
28 
     | 
    
         | 
| 
       26 
29 
     | 
    
         
             
                begin
         
     | 
| 
         @@ -37,6 +40,7 @@ module RainforestCli 
     | 
|
| 
       37 
40 
     | 
    
         
             
                when 'upload' then Uploader.new(options).upload
         
     | 
| 
       38 
41 
     | 
    
         
             
                when 'rm' then Deleter.new(options).delete
         
     | 
| 
       39 
42 
     | 
    
         
             
                when 'export' then Exporter.new(options).export
         
     | 
| 
      
 43 
     | 
    
         
            +
                when 'report' then Reporter.new(options).report
         
     | 
| 
       40 
44 
     | 
    
         
             
                when 'sites', 'folders', 'browsers'
         
     | 
| 
       41 
45 
     | 
    
         
             
                  Resources.new(options).public_send(options.command)
         
     | 
| 
       42 
46 
     | 
    
         
             
                else
         
     | 
| 
         @@ -54,4 +58,8 @@ module RainforestCli 
     | 
|
| 
       54 
58 
     | 
    
         
             
              def self.logger=(logger)
         
     | 
| 
       55 
59 
     | 
    
         
             
                @logger = logger
         
     | 
| 
       56 
60 
     | 
    
         
             
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
              def self.http_client
         
     | 
| 
      
 63 
     | 
    
         
            +
                @http_client
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
       57 
65 
     | 
    
         
             
            end
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         @@ -17,7 +17,7 @@ module RainforestCli 
     | 
|
| 
       17 
17 
     | 
    
         
             
                  response = HTTParty.delete make_url(url), {
         
     | 
| 
       18 
18 
     | 
    
         
             
                    body: body,
         
     | 
| 
       19 
19 
     | 
    
         
             
                    headers: headers,
         
     | 
| 
       20 
     | 
    
         
            -
                    verify: false
         
     | 
| 
      
 20 
     | 
    
         
            +
                    verify: false,
         
     | 
| 
       21 
21 
     | 
    
         
             
                  }
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                  JSON.parse(response.body)
         
     | 
| 
         @@ -28,7 +28,7 @@ module RainforestCli 
     | 
|
| 
       28 
28 
     | 
    
         
             
                    response = HTTParty.post make_url(url), {
         
     | 
| 
       29 
29 
     | 
    
         
             
                      body: body,
         
     | 
| 
       30 
30 
     | 
    
         
             
                      headers: headers,
         
     | 
| 
       31 
     | 
    
         
            -
                      verify: false
         
     | 
| 
      
 31 
     | 
    
         
            +
                      verify: false,
         
     | 
| 
       32 
32 
     | 
    
         
             
                    }
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                    return JSON.parse(response.body)
         
     | 
| 
         @@ -40,12 +40,13 @@ module RainforestCli 
     | 
|
| 
       40 
40 
     | 
    
         
             
                    response = HTTParty.get make_url(url), {
         
     | 
| 
       41 
41 
     | 
    
         
             
                      body: body,
         
     | 
| 
       42 
42 
     | 
    
         
             
                      headers: headers,
         
     | 
| 
       43 
     | 
    
         
            -
                      verify: false
         
     | 
| 
      
 43 
     | 
    
         
            +
                      verify: false,
         
     | 
| 
       44 
44 
     | 
    
         
             
                    }
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
       46 
46 
     | 
    
         
             
                    if response.code == 200
         
     | 
| 
       47 
47 
     | 
    
         
             
                      return JSON.parse(response.body)
         
     | 
| 
       48 
48 
     | 
    
         
             
                    else
         
     | 
| 
      
 49 
     | 
    
         
            +
                      RainforestCli.logger.warn("Status Code: #{response.code}, #{response.body}")
         
     | 
| 
       49 
50 
     | 
    
         
             
                      return nil
         
     | 
| 
       50 
51 
     | 
    
         
             
                    end
         
     | 
| 
       51 
52 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -89,7 +90,7 @@ module RainforestCli 
     | 
|
| 
       89 
90 
     | 
    
         
             
                def headers
         
     | 
| 
       90 
91 
     | 
    
         
             
                  {
         
     | 
| 
       91 
92 
     | 
    
         
             
                    'CLIENT_TOKEN' => @token,
         
     | 
| 
       92 
     | 
    
         
            -
                    'User-Agent' => "Rainforest-cli-#{RainforestCli::VERSION}"
         
     | 
| 
      
 93 
     | 
    
         
            +
                    'User-Agent' => "Rainforest-cli-#{RainforestCli::VERSION}",
         
     | 
| 
       93 
94 
     | 
    
         
             
                  }
         
     | 
| 
       94 
95 
     | 
    
         
             
                end
         
     | 
| 
       95 
96 
     | 
    
         
             
              end
         
     | 
| 
         @@ -0,0 +1,69 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'builder'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'time'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'json'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 6 
     | 
    
         
            +
            module RainforestCli
         
     | 
| 
      
 7 
     | 
    
         
            +
              class JunitOutputter
         
     | 
| 
      
 8 
     | 
    
         
            +
                attr_reader :builder, :client
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize(token, run, tests)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @client = HttpClient.new token: token
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @json_run = run # JSON containing the results of /1/runs/{run_id}.json
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @json_tests = tests # JSON containing the results of /1/runs/{run_id}/tests.json
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @builder = Builder::XmlMarkup.new( :indent => 2)
         
     | 
| 
      
 15 
     | 
    
         
            +
                end # end initialize
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def build_test_suite
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @json_tests.each do | test |
         
     | 
| 
      
 19 
     | 
    
         
            +
                    build_test test
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end # end do
         
     | 
| 
      
 21 
     | 
    
         
            +
                end # end process_run_results
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def build_test(test)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  test_name = test['title']
         
     | 
| 
      
 25 
     | 
    
         
            +
                  execution_time = Time.parse(test['updated_at']) - Time.parse(test['created_at'])
         
     | 
| 
      
 26 
     | 
    
         
            +
                  test_status = test['result']
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @builder.testcase(:name => test_name, :time => execution_time) do
         
     | 
| 
      
 28 
     | 
    
         
            +
                    case test_status
         
     | 
| 
      
 29 
     | 
    
         
            +
                    when "failed"
         
     | 
| 
      
 30 
     | 
    
         
            +
                      build_failed_test test
         
     | 
| 
      
 31 
     | 
    
         
            +
                    end # end case
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end # end do
         
     | 
| 
      
 33 
     | 
    
         
            +
                end # end build_test
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                def build_failed_test(test)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  response = client.get("/runs/#{@json_run['id']}/tests/#{test['id']}.json")
         
     | 
| 
      
 37 
     | 
    
         
            +
                  response['steps'].each do | step |
         
     | 
| 
      
 38 
     | 
    
         
            +
                    step['browsers'].each do | browser |
         
     | 
| 
      
 39 
     | 
    
         
            +
                      browser_name = browser['name']
         
     | 
| 
      
 40 
     | 
    
         
            +
                      browser['feedback'].each do | opinion |
         
     | 
| 
      
 41 
     | 
    
         
            +
                        if opinion['answer_given'] == 'no' and opinion['job_state'] == 'approved'
         
     | 
| 
      
 42 
     | 
    
         
            +
                          if opinion['note'] != ""
         
     | 
| 
      
 43 
     | 
    
         
            +
                            @builder.failure(:type => browser_name, :message => opinion['note'])
         
     | 
| 
      
 44 
     | 
    
         
            +
                          end
         
     | 
| 
      
 45 
     | 
    
         
            +
                        end
         
     | 
| 
      
 46 
     | 
    
         
            +
                      end
         
     | 
| 
      
 47 
     | 
    
         
            +
                    end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
                end # end build_failed_test
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                def parse
         
     | 
| 
      
 52 
     | 
    
         
            +
                  @builder.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
         
     | 
| 
      
 53 
     | 
    
         
            +
                  @builder.testsuite(
         
     | 
| 
      
 54 
     | 
    
         
            +
                    :name => @json_run['description'],
         
     | 
| 
      
 55 
     | 
    
         
            +
                    :errors => @json_run['total_no_result_tests'],
         
     | 
| 
      
 56 
     | 
    
         
            +
                    :failures => @json_run['total_failed_tests'],
         
     | 
| 
      
 57 
     | 
    
         
            +
                    :tests => @json_run['total_tests'],
         
     | 
| 
      
 58 
     | 
    
         
            +
                    :time => Time.parse(@json_run['timestamps']['complete']) - Time.parse(@json_run['timestamps']['created_at']),
         
     | 
| 
      
 59 
     | 
    
         
            +
                    :timestamp => @json_run['created_at']) do
         
     | 
| 
      
 60 
     | 
    
         
            +
                      build_test_suite
         
     | 
| 
      
 61 
     | 
    
         
            +
                    end
         
     | 
| 
      
 62 
     | 
    
         
            +
                end # end parse
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                def output(stream)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  stream.write(@builder.target!)
         
     | 
| 
      
 66 
     | 
    
         
            +
                end #end output
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
              end # end class
         
     | 
| 
      
 69 
     | 
    
         
            +
            end # end module
         
     | 
| 
         @@ -6,7 +6,8 @@ module RainforestCli 
     | 
|
| 
       6 
6 
     | 
    
         
             
                attr_writer :file_name, :tags
         
     | 
| 
       7 
7 
     | 
    
         
             
                attr_reader :command, :token, :tags, :conflict, :browsers, :site_id, :environment_id,
         
     | 
| 
       8 
8 
     | 
    
         
             
                            :import_file_name, :import_name, :custom_url, :description, :folder,
         
     | 
| 
       9 
     | 
    
         
            -
                            :debug, :file_name, :test_folder, :embed_tests, :app_source_url, :crowd
         
     | 
| 
      
 9 
     | 
    
         
            +
                            :debug, :file_name, :test_folder, :embed_tests, :app_source_url, :crowd, :run_id,
         
     | 
| 
      
 10 
     | 
    
         
            +
                            :junit_file
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
                TOKEN_NOT_REQUIRED = %w{new validate}.freeze
         
     | 
| 
       12 
13 
     | 
    
         | 
| 
         @@ -15,6 +16,8 @@ module RainforestCli 
     | 
|
| 
       15 
16 
     | 
    
         
             
                  @tags = []
         
     | 
| 
       16 
17 
     | 
    
         
             
                  @browsers = nil
         
     | 
| 
       17 
18 
     | 
    
         
             
                  @debug = false
         
     | 
| 
      
 19 
     | 
    
         
            +
                  @junit_file = nil
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @run_id = nil
         
     | 
| 
       18 
21 
     | 
    
         
             
                  @token = ENV['RAINFOREST_API_TOKEN']
         
     | 
| 
       19 
22 
     | 
    
         | 
| 
       20 
23 
     | 
    
         
             
                  # NOTE: Disabling line length cop to allow for consistency of syntax
         
     | 
| 
         @@ -55,6 +58,11 @@ module RainforestCli 
     | 
|
| 
       55 
58 
     | 
    
         
             
                      @foreground = value
         
     | 
| 
       56 
59 
     | 
    
         
             
                    end
         
     | 
| 
       57 
60 
     | 
    
         | 
| 
      
 61 
     | 
    
         
            +
                    opts.on('--wait ID', Integer, 'Wait for run #ID to complete') do |value|
         
     | 
| 
      
 62 
     | 
    
         
            +
                      @wait = true
         
     | 
| 
      
 63 
     | 
    
         
            +
                      @run_id = value
         
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
       58 
66 
     | 
    
         
             
                    opts.on('--fail-fast', String, "Fail as soon as there is a failure (don't wait for completion)") do |_value|
         
     | 
| 
       59 
67 
     | 
    
         
             
                      @failfast = true
         
     | 
| 
       60 
68 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -103,6 +111,14 @@ module RainforestCli 
     | 
|
| 
       103 
111 
     | 
    
         
             
                      @app_source_url = value
         
     | 
| 
       104 
112 
     | 
    
         
             
                    end
         
     | 
| 
       105 
113 
     | 
    
         | 
| 
      
 114 
     | 
    
         
            +
                    opts.on('--junit-file FILE', 'Gather the results of a run and create junit output in FILE.xml, must be run with --fg') do |value|
         
     | 
| 
      
 115 
     | 
    
         
            +
                      @junit_file = value
         
     | 
| 
      
 116 
     | 
    
         
            +
                    end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
                    opts.on('--run-id ID', 'Gather the results of a completed run, must be run with export and --junit-file') do |value|
         
     | 
| 
      
 119 
     | 
    
         
            +
                      @run_id = value
         
     | 
| 
      
 120 
     | 
    
         
            +
                    end
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
       106 
122 
     | 
    
         
             
                    opts.on_tail('--help', 'Display help message and exit') do |_value|
         
     | 
| 
       107 
123 
     | 
    
         
             
                      puts opts
         
     | 
| 
       108 
124 
     | 
    
         
             
                      exit 0
         
     | 
| 
         @@ -142,10 +158,18 @@ module RainforestCli 
     | 
|
| 
       142 
158 
     | 
    
         
             
                  @failfast
         
     | 
| 
       143 
159 
     | 
    
         
             
                end
         
     | 
| 
       144 
160 
     | 
    
         | 
| 
      
 161 
     | 
    
         
            +
                def wait?
         
     | 
| 
      
 162 
     | 
    
         
            +
                  !!@wait
         
     | 
| 
      
 163 
     | 
    
         
            +
                end
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
       145 
165 
     | 
    
         
             
                def foreground?
         
     | 
| 
       146 
166 
     | 
    
         
             
                  @foreground
         
     | 
| 
       147 
167 
     | 
    
         
             
                end
         
     | 
| 
       148 
168 
     | 
    
         | 
| 
      
 169 
     | 
    
         
            +
                def junit_file?
         
     | 
| 
      
 170 
     | 
    
         
            +
                  @junit_file
         
     | 
| 
      
 171 
     | 
    
         
            +
                end
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
       149 
173 
     | 
    
         
             
                def validate!
         
     | 
| 
       150 
174 
     | 
    
         
             
                  if !TOKEN_NOT_REQUIRED.include?(command)
         
     | 
| 
       151 
175 
     | 
    
         
             
                    unless token
         
     | 
| 
         @@ -169,6 +193,21 @@ module RainforestCli 
     | 
|
| 
       169 
193 
     | 
    
         
             
                    raise ValidationError, 'You must include a file name'
         
     | 
| 
       170 
194 
     | 
    
         
             
                  end
         
     | 
| 
       171 
195 
     | 
    
         | 
| 
      
 196 
     | 
    
         
            +
                  if command == 'run' && junit_file?
         
     | 
| 
      
 197 
     | 
    
         
            +
                    unless foreground?
         
     | 
| 
      
 198 
     | 
    
         
            +
                      raise ValidationError, 'You can only generate junit test output in foreground mode'
         
     | 
| 
      
 199 
     | 
    
         
            +
                    end
         
     | 
| 
      
 200 
     | 
    
         
            +
                  end
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
      
 202 
     | 
    
         
            +
                  if command == 'report'
         
     | 
| 
      
 203 
     | 
    
         
            +
                    if junit_file.nil?
         
     | 
| 
      
 204 
     | 
    
         
            +
                      raise ValidationError, 'You must specify a junit ouptut filename'
         
     | 
| 
      
 205 
     | 
    
         
            +
                    end
         
     | 
| 
      
 206 
     | 
    
         
            +
                    if run_id.nil?
         
     | 
| 
      
 207 
     | 
    
         
            +
                      raise ValidationError, 'You must specify a run-id to generate a report for'
         
     | 
| 
      
 208 
     | 
    
         
            +
                    end
         
     | 
| 
      
 209 
     | 
    
         
            +
                  end
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
       172 
211 
     | 
    
         
             
                  true
         
     | 
| 
       173 
212 
     | 
    
         
             
                end
         
     | 
| 
       174 
213 
     | 
    
         | 
| 
         
            File without changes
         
     | 
| 
         @@ -0,0 +1,64 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'fileutils'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            #frozen_string_literal: true
         
     | 
| 
      
 4 
     | 
    
         
            +
            module RainforestCli
         
     | 
| 
      
 5 
     | 
    
         
            +
              class Reporter
         
     | 
| 
      
 6 
     | 
    
         
            +
                attr_reader :client
         
     | 
| 
      
 7 
     | 
    
         
            +
                attr_writer :run_id
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def initialize(options)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @options = options
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @client = HttpClient.new token: options.token
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @run_id = options.run_id
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @output_filename = options.junit_file
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                def report
         
     | 
| 
      
 17 
     | 
    
         
            +
                  if @run_id == nil
         
     | 
| 
      
 18 
     | 
    
         
            +
                    logger.fatal "Reporter needs a valid run_id to report on"
         
     | 
| 
      
 19 
     | 
    
         
            +
                  else
         
     | 
| 
      
 20 
     | 
    
         
            +
                    logger.info "Generating JUNIT report for #{@run_id} : #{@output_filename}"
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  run = client.get("/runs/#{@run_id}.json")
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  if run == nil
         
     | 
| 
      
 26 
     | 
    
         
            +
                    logger.fatal "Non 200 code recieved"
         
     | 
| 
      
 27 
     | 
    
         
            +
                    exit 1
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  if run['error']
         
     | 
| 
      
 31 
     | 
    
         
            +
                    logger.fatal "Error retrieving results for your run: #{run['error']}"
         
     | 
| 
      
 32 
     | 
    
         
            +
                    exit 1
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  if run.has_key?('total_tests') and run['total_tests'] != 0
         
     | 
| 
      
 36 
     | 
    
         
            +
                    tests = client.get("/runs/#{@run_id}/tests.json?page_size=#{run['total_tests']}")
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    if tests == nil
         
     | 
| 
      
 39 
     | 
    
         
            +
                      logger.fatal "Non 200 code recieved"
         
     | 
| 
      
 40 
     | 
    
         
            +
                      exit 1
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    if tests.kind_of?(Hash) and tests['error'] # if this had worked tests would be an array
         
     | 
| 
      
 44 
     | 
    
         
            +
                      logger.fatal "Error retrieving test details for your run: #{tests['error']}"
         
     | 
| 
      
 45 
     | 
    
         
            +
                      exit 1
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                    outputter = JunitOutputter.new(@options.token, run, tests)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    outputter.parse
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                  unless File.directory?(File.dirname(@output_filename))
         
     | 
| 
      
 53 
     | 
    
         
            +
                    FileUtils.mkdir_p(File.dirname(@output_filename))
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                  File.open(@output_filename, 'w') { |file| outputter.output(file) }
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                def logger
         
     | 
| 
      
 60 
     | 
    
         
            +
                  RainforestCli.logger
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
            end
         
     |