netzke-testing 0.12.1 → 0.12.2
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/Gemfile +19 -0
- data/README.md +50 -2
- data/app/assets/javascripts/netzke/testing/helpers/actions.js.coffee +39 -10
- data/app/assets/javascripts/netzke/testing/helpers/expectations.js.coffee +4 -0
- data/app/assets/javascripts/netzke/testing/helpers/grid.js.coffee +42 -9
- data/app/assets/javascripts/netzke/testing.js +1 -0
- data/app/views/layouts/netzke/testing.html.erb +9 -5
- data/config/routes.rb +0 -2
- data/lib/netzke/testing/engine.rb +1 -0
- data/lib/netzke/testing/helpers.rb +7 -10
- data/lib/netzke/testing/version.rb +1 -1
- data/lib/netzke/testing.rb +4 -0
- data/netzke-testing.gemspec +0 -8
- data/spec/rails_app/config/application.rb +1 -1
- data/spec/rails_app/config/boot.rb +1 -2
- data/spec/rails_app/config/initializers/netzke_testing.rb +0 -1
- data/spec/rails_app/log/development.log +1509 -0
- data/spec/rails_app/log/test.log +411 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/1ec8d2bd73a25dacc03b06d7e561bab0 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/20a089c0481b352f5ba6b7b8746b7213 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/28b9c9af951daba56bcdc86b45c3b7ed +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/3055607d4a01c24bb30f86d38b66be76 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/364f56c42953643bff73d0d14051f406 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/48d1d24065c75bfe3bbf00f303e233d0 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/4d2a90e455a595f51101e7e94572384e +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/5da2225b8b1ca6c070d06b98bbb94452 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/71ff3ab765090b6daa27969f6eb56fd0 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/7250cf6654022ff231aed2eaa0ce7b5f +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/78fe20223c36898325a9c4b2c5b9523f +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/83ea57e5cb665b7643248a9129870519 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/8411ea481fc20d345affc9abebbea601 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/89f9660384238597a59e787c66e0b2cd +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/8aac9881e31c9e101aee1d7b926c9b5d +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/8ffe76c9f2babb34fe924c4bc1fb9b58 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/91bc8d8ad6e413fa5ab8aba410a129a3 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/9ae207cbf1388d2848f50413af97e3ca +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/9b26c4899cfc5eefc7ae82ccf78e667d +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/9e77b3a6bf069240e43173f9cc6e8e8a +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/a9e045ed0da1e7aeec42ecbaa004f374 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/b0991ffa51c1c366941a555c3643078a +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/b7732372d38c46ae99328022e1fd86c3 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/b854cd4c2fe6f12b39294cec2718c44f +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/cc3e6fbec60851d530af0cb3927ae723 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/d1f64ebeb7f5b9680c8c563659247872 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/ddf4385a5814c1c034410ffd071fbac4 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/e032da315be18f628acb87d4f469e052 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/e3c7e415a4520993c2e0029aedbf4890 +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/ea8bddcc0e2b1aa79353e4a5d62928fb +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/ec52d415f445c961a4df7880d52d434b +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/f3d58f13d1651ab6ed838874cbf4bfbe +0 -0
- data/spec/rails_app/tmp/cache/assets/development/sprockets/f64fddc03d06a4d713666e938bf06633 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/22a1b9d5fc1414cd13555c248420966d +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/3055607d4a01c24bb30f86d38b66be76 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/4d2a90e455a595f51101e7e94572384e +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/71ff3ab765090b6daa27969f6eb56fd0 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/7250cf6654022ff231aed2eaa0ce7b5f +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/8aac9881e31c9e101aee1d7b926c9b5d +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/8ffe76c9f2babb34fe924c4bc1fb9b58 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/91bc8d8ad6e413fa5ab8aba410a129a3 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/a4418907621c16e75d7854a32069f4e4 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/b7732372d38c46ae99328022e1fd86c3 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/e3c7e415a4520993c2e0029aedbf4890 +0 -0
- data/spec/rails_app/tmp/cache/assets/test/sprockets/e7f9fbccbb808aa76a460587409e9a23 +0 -0
- data/spec/rails_app/{app/assets/javascripts/custom.js → tmp/restart.txt} +0 -0
- data/spec/testing_controller_spec.rb +0 -5
- metadata +77 -118
- data/spec/rails_app/Gemfile +0 -51
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9feeff744c3cbc74c198deb51319964fb2e0651e
         | 
| 4 | 
            +
              data.tar.gz: 05ba7c189835a774953f40ff549cd353f2d83b40
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 232d64cd3173aa22ab57527cc4dc42d61c4cd4f1faafb7aebb0918ff265a19c2984c4a1b4f85bb223a7314c17a274ef88316cbe8054950d5fc5986801b2d1748
         | 
| 7 | 
            +
              data.tar.gz: 36149aeed5a102ea7c4841bb67906e689303ca9b4a83feb867bfa354482740bfa76e824c68bda1f9fbc1841070f336050d32d3cf62d37719d08effc1a66633fe
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -1,3 +1,22 @@ | |
| 1 1 | 
             
            source 'https://rubygems.org'
         | 
| 2 2 |  | 
| 3 3 | 
             
            gemspec
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            gem 'rails', '4.2.0'
         | 
| 6 | 
            +
            gem 'sqlite3'
         | 
| 7 | 
            +
            gem 'yard'
         | 
| 8 | 
            +
            gem 'rake'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            group :test do
         | 
| 11 | 
            +
              gem 'rspec'
         | 
| 12 | 
            +
              gem 'rspec-rails'
         | 
| 13 | 
            +
              gem 'capybara'
         | 
| 14 | 
            +
              gem 'selenium-webdriver'
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            group :development, :test do
         | 
| 18 | 
            +
              gem 'byebug'
         | 
| 19 | 
            +
              gem 'web-console', '~> 2.0'
         | 
| 20 | 
            +
              gem 'pry-rails'
         | 
| 21 | 
            +
              gem 'netzke-core', github: 'netzke/netzke-core'
         | 
| 22 | 
            +
            end
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Netzke Testing
         | 
| 1 | 
            +
            # Netzke Testing [](http://badge.fury.io/rb/netzke-testing)
         | 
| 2 2 |  | 
| 3 3 | 
             
            This gem helps with development and testing of Netzke components. In parcticular, it helps you with:
         | 
| 4 4 |  | 
| @@ -75,6 +75,20 @@ code](https://github.com/netzke/netzke-testing/tree/master/app/assets/javascript | |
| 75 75 | 
             
            implemented helpers (TODO: document them). Also, refer to other Netzke gems source code (like netzke-core and
         | 
| 76 76 | 
             
            netzke-basepack) to see examples using the helpers.
         | 
| 77 77 |  | 
| 78 | 
            +
            ## Adding custom spec helpers
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            You may add (or require, by means of Sprockets) additional helpers in `app/assets/javascripts/netzke/testing.js`, which will be included in the testing template *after* the helpers provided by netzke-testing. For example:
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                // in app/assets/javascripts/netzke/testing.js
         | 
| 83 | 
            +
                //= require_tree ./testing
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                # in app/assets/javascripts/netzke/testing/grid.js.coffee
         | 
| 86 | 
            +
                Ext.apply window,
         | 
| 87 | 
            +
                  enableColumnFilter: (column, value) ->
         | 
| 88 | 
            +
                  # ...
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            After this the `enableColumnFilter` helper will be available in your Mocha specs.
         | 
| 91 | 
            +
             | 
| 78 92 | 
             
            ## Testing with selenium webdriver
         | 
| 79 93 |  | 
| 80 94 | 
             
            Generate the `netzke_mocha_spec.rb` file that will automatically run the specs that follow a certain naming convention:
         | 
| @@ -105,10 +119,44 @@ helper provided by the `netzke_testing` gem. Here's an example (in `spec/user_gr | |
| 105 119 |  | 
| 106 120 | 
             
            The `run_mocha_spec` here will run a Mocha spec from `spec/grid_with_destructive_button.js.coffee`.
         | 
| 107 121 |  | 
| 108 | 
            -
            You can explicitely specify a component to run the spec on | 
| 122 | 
            +
            You can explicitely specify a component to run the spec on:
         | 
| 109 123 |  | 
| 110 124 | 
             
                run_mocha_spec 'grid_with_destructive_button', component: 'UserGrid'
         | 
| 111 125 |  | 
| 126 | 
            +
            To investigate the problem in case of a failing Mocha spec, set `stop_on_error` to `true` (this will keep the browser open on the failed spec):
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                run_mocha_spec 'grid_with_destructive_button', stop_on_error: true
         | 
| 129 | 
            +
             | 
| 130 | 
            +
            (in this case you'll have to terminate the specs by pressing `ctrl+c`)
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            ## Setting timeout for longer running JS specs
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            Netzke-testing by default assumes that your specs do not take longer than 5 seconds, and mark them failed if they do. If your spec are as complex as taking longer than that, you can increase this value in an initializer, e.g.:
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                # in config/initializers/netzke.rb
         | 
| 137 | 
            +
                Netzke::Testing.setup do |config|
         | 
| 138 | 
            +
                  config.js_timeout = 10 # seconds
         | 
| 139 | 
            +
                end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            You could also set this in `spec_helper.rb` like this:
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                Netzke::Testing.js_timeout = 10
         | 
| 144 | 
            +
             | 
| 145 | 
            +
            However, keep in mind, that this won't have effect on running specs manually in the browser (by specifying the `spec` URL parameter, as shown above). For this case, you may provide the `timeout` URL paramter (takes precedence over `Netzke::Testing.js_timeout`):
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                http://localhost:3000/netzke/components/UserGrid?spec=user_grid&timeout=10
         | 
| 148 | 
            +
             | 
| 149 | 
            +
            ## Asynchronous helpers
         | 
| 150 | 
            +
             | 
| 151 | 
            +
            Asynchronous helpers like `wait` can either call the provided callback function, or (if none was provided) return a promise, so you can do:
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                wait().
         | 
| 154 | 
            +
                .then ->
         | 
| 155 | 
            +
                  doSomething()
         | 
| 156 | 
            +
                  wait()
         | 
| 157 | 
            +
                .then
         | 
| 158 | 
            +
                  doSomeMore()
         | 
| 159 | 
            +
             | 
| 112 160 | 
             
            ## Requirements
         | 
| 113 161 |  | 
| 114 162 | 
             
            * Ruby >= 2.0.0
         | 
| @@ -6,16 +6,22 @@ Ext.Ajax.on 'requestcomplete', -> | |
| 6 6 | 
             
              Netzke.ajaxCount -= 1
         | 
| 7 7 |  | 
| 8 8 | 
             
            Ext.apply window,
         | 
| 9 | 
            +
              # Waits for all AJAX activity to stop, then calls the optional callback. If no callback was specified, returns a
         | 
| 10 | 
            +
              # promise. The first argument can be a number of milliseconds to wait before starting to listen to the AJAX activity
         | 
| 11 | 
            +
              # (handy when some Ext method implement a fixed delay before doing something, like triggering a column filter after it
         | 
| 12 | 
            +
              # was set).
         | 
| 13 | 
            +
              #
         | 
| 9 14 | 
             
              # Examples:
         | 
| 10 15 | 
             
              #
         | 
| 11 16 | 
             
              #   wait ->
         | 
| 12 17 | 
             
              #     afterAllAjaxActivityIsStopped()
         | 
| 13 18 | 
             
              #
         | 
| 14 | 
            -
              #   wait  | 
| 15 | 
            -
              #      | 
| 19 | 
            +
              #   wait 200, ->
         | 
| 20 | 
            +
              #     waitsAtLeast200MsBeforeCallingThis()
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              #   wait().then -> doSomething()
         | 
| 16 23 | 
             
              wait: () ->
         | 
| 17 | 
            -
                 | 
| 18 | 
            -
                  callback = arguments[0]
         | 
| 24 | 
            +
                waitInCycle = (callback) ->
         | 
| 19 25 | 
             
                  i = 0
         | 
| 20 26 | 
             
                  id = setInterval ->
         | 
| 21 27 | 
             
                    i += 1
         | 
| @@ -26,12 +32,35 @@ Ext.apply window, | |
| 26 32 | 
             
                    # this way we ensure another 20ms cycle before we issue a callback
         | 
| 27 33 | 
             
                    i = 100 if Netzke.ajaxCount == 0
         | 
| 28 34 | 
             
                  , 200
         | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            +
             | 
| 36 | 
            +
                # wait ->
         | 
| 37 | 
            +
                #   callbackAsParameter()
         | 
| 38 | 
            +
                if typeof arguments[0] == 'function'
         | 
| 39 | 
            +
                  return waitInCycle arguments[0]
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                if Ext.isNumber(arguments[0])
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # wait 50, ->
         | 
| 44 | 
            +
                  #   waitAtLeast50Seconds()
         | 
| 45 | 
            +
                  if Ext.isFunction(arguments[1])
         | 
| 46 | 
            +
                    delay = arguments[0]
         | 
| 47 | 
            +
                    callback = arguments[1]
         | 
| 48 | 
            +
                    setInterval ->
         | 
| 49 | 
            +
                      waitInCycle(resolve)
         | 
| 50 | 
            +
                    , delay
         | 
| 51 | 
            +
                    return null
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  # wait(50).then ->
         | 
| 54 | 
            +
                  #   waitAtLeast50ThenResolve()
         | 
| 55 | 
            +
                  else
         | 
| 56 | 
            +
                    console.log("1", 1)
         | 
| 57 | 
            +
                    delay = arguments[0]
         | 
| 58 | 
            +
                    return new Promise (resolve, reject) ->
         | 
| 59 | 
            +
                      setInterval ->
         | 
| 60 | 
            +
                        waitInCycle(resolve)
         | 
| 61 | 
            +
                      , delay
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                return new Promise (resolve, reject) -> waitInCycle resolve
         | 
| 35 64 |  | 
| 36 65 | 
             
              click: (cmp) ->
         | 
| 37 66 | 
             
                if Ext.isString(cmp)
         | 
| @@ -10,6 +10,10 @@ Ext.apply window, | |
| 10 10 | 
             
                throw cmp + " not found" if Ext.isString(cmp)
         | 
| 11 11 | 
             
                expect(cmp.isDisabled()).to.be(true)
         | 
| 12 12 |  | 
| 13 | 
            +
              expectEnabled: (cmp) ->
         | 
| 14 | 
            +
                throw cmp + " not found" if Ext.isString(cmp)
         | 
| 15 | 
            +
                expect(cmp.isDisabled()).to.be(false)
         | 
| 16 | 
            +
             | 
| 13 17 | 
             
              expectInvisibleBodyOf: (cmp) ->
         | 
| 14 18 | 
             
                throw cmp + " not found" if Ext.isString(cmp)
         | 
| 15 19 | 
             
                expect(cmp.body.isVisible()).to.be false
         | 
| @@ -1,9 +1,16 @@ | |
| 1 1 | 
             
            Ext.apply window,
         | 
| 2 | 
            -
              grid: ( | 
| 3 | 
            -
                 | 
| 4 | 
            -
             | 
| 2 | 
            +
              grid: (value, lookup) ->
         | 
| 3 | 
            +
                # default to query by title for backwards compatibility
         | 
| 4 | 
            +
                lookup = lookup || 'title'
         | 
| 5 | 
            +
                if value && lookup == 'title'
         | 
| 6 | 
            +
                  Ext.ComponentQuery.query('grid[title="'+value+'"]')[0] ||
         | 
| 7 | 
            +
                  Ext.ComponentQuery.query('treepanel[title="'+value+'"]')[0]
         | 
| 8 | 
            +
                else if value && lookup == 'name'
         | 
| 9 | 
            +
                  Ext.ComponentQuery.query('grid[name="'+value+'"]')[0] ||
         | 
| 10 | 
            +
                  Ext.ComponentQuery.query('treepanel[name="'+value+'"]')[0]
         | 
| 5 11 | 
             
                else
         | 
| 6 | 
            -
                  Ext.ComponentQuery.query('grid{isVisible(true)}')[0]
         | 
| 12 | 
            +
                  Ext.ComponentQuery.query('grid{isVisible(true)}')[0] ||
         | 
| 13 | 
            +
                  Ext.ComponentQuery.query('treepanel{isVisible(true)}')[0]
         | 
| 7 14 |  | 
| 8 15 | 
             
              expandRowCombo: (field, params) ->
         | 
| 9 16 | 
             
                g = g || this.grid()
         | 
| @@ -36,11 +43,17 @@ Ext.apply window, | |
| 36 43 | 
             
                  record.set(key, value)
         | 
| 37 44 |  | 
| 38 45 | 
             
              selectAssociation: (attr, value, callback) ->
         | 
| 39 | 
            -
                 | 
| 40 | 
            -
             | 
| 41 | 
            -
                   | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 46 | 
            +
                action = (cb) ->
         | 
| 47 | 
            +
                  expandRowCombo attr
         | 
| 48 | 
            +
                  wait ->
         | 
| 49 | 
            +
                    select value, in: combobox(attr)
         | 
| 50 | 
            +
                    cb()
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                if callback
         | 
| 53 | 
            +
                  action(callback)
         | 
| 54 | 
            +
                else
         | 
| 55 | 
            +
                  new Promise (resolve, reject) ->
         | 
| 56 | 
            +
                    action(resolve)
         | 
| 44 57 |  | 
| 45 58 | 
             
              valuesInColumn: (name, params) ->
         | 
| 46 59 | 
             
                params ?= {}
         | 
| @@ -51,6 +64,16 @@ Ext.apply window, | |
| 51 64 | 
             
                  out.push(if assocValue then assocValue else r.get(name))
         | 
| 52 65 | 
             
                out
         | 
| 53 66 |  | 
| 67 | 
            +
              # Example:
         | 
| 68 | 
            +
              # valueInCell 'author__name', 2
         | 
| 69 | 
            +
              valueInCell: (column, row, params) ->
         | 
| 70 | 
            +
                params ?= {}
         | 
| 71 | 
            +
                grid = params.in || this.grid()
         | 
| 72 | 
            +
                r = grid.getStore().getAt(row)
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                assocValue = r.get('meta').associationValues[column]
         | 
| 75 | 
            +
                if assocValue then assocValue else r.get(column)
         | 
| 76 | 
            +
             | 
| 54 77 | 
             
              selectAllRows: (params) ->
         | 
| 55 78 | 
             
                params ?= {}
         | 
| 56 79 | 
             
                grid = params.in || this.grid()
         | 
| @@ -76,6 +99,7 @@ Ext.apply window, | |
| 76 99 | 
             
                    cell.innerHTML
         | 
| 77 100 | 
             
                )
         | 
| 78 101 |  | 
| 102 | 
            +
              # Examples:
         | 
| 79 103 | 
             
              # selectLastRow()
         | 
| 80 104 | 
             
              # selectLastRow in: grid('Book')
         | 
| 81 105 | 
             
              selectLastRow: (params) ->
         | 
| @@ -83,6 +107,7 @@ Ext.apply window, | |
| 83 107 | 
             
                grid = params.in || this.grid()
         | 
| 84 108 | 
             
                grid.getSelectionModel().select(grid.getStore().last())
         | 
| 85 109 |  | 
| 110 | 
            +
              # Examples:
         | 
| 86 111 | 
             
              # selectFirstRow()
         | 
| 87 112 | 
             
              # selectFirstRow in: grid('Book')
         | 
| 88 113 | 
             
              selectFirstRow: (params) ->
         | 
| @@ -90,6 +115,14 @@ Ext.apply window, | |
| 90 115 | 
             
                grid = params.in || this.grid()
         | 
| 91 116 | 
             
                grid.getSelectionModel().select(grid.getStore().first())
         | 
| 92 117 |  | 
| 118 | 
            +
              # Examples:
         | 
| 119 | 
            +
              # selectRow 5
         | 
| 120 | 
            +
              # selectRow 5, in: grid('Book')
         | 
| 121 | 
            +
              selectRow: (n, params) ->
         | 
| 122 | 
            +
                params ?= {}
         | 
| 123 | 
            +
                grid = params.in || this.grid()
         | 
| 124 | 
            +
                grid.getSelectionModel().select(n)
         | 
| 125 | 
            +
             | 
| 93 126 | 
             
              # Example:
         | 
| 94 127 | 
             
              # editLastRow {title: 'Foo', exemplars: 10}
         | 
| 95 128 | 
             
              editLastRow: ->
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            // placeholder
         | 
| @@ -2,20 +2,24 @@ | |
| 2 2 | 
             
            <html>
         | 
| 3 3 | 
             
            <head>
         | 
| 4 4 | 
             
              <title>Netzke Testing</title>
         | 
| 5 | 
            -
              <%= csrf_meta_tag %>
         | 
| 6 5 | 
             
              <%= load_netzke(minified: false) %>
         | 
| 7 6 |  | 
| 8 7 | 
             
              <% if params[:spec] %>
         | 
| 8 | 
            +
                <%# dependencies %>
         | 
| 9 9 | 
             
                <%= javascript_include_tag "netzke/testing/expect/expect.js" %>
         | 
| 10 10 | 
             
                <%= javascript_include_tag "netzke/testing/mocha/mocha.js" %>
         | 
| 11 11 | 
             
                <%= stylesheet_link_tag "netzke/testing/mocha/mocha.css" %>
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                <%# mocha config %>
         | 
| 12 14 | 
             
                <script>
         | 
| 13 15 | 
             
                  mocha.setup('bdd');
         | 
| 14 | 
            -
                  mocha.setup({ignoreLeaks: true, slow: 500, timeout:  | 
| 16 | 
            +
                  mocha.setup({ignoreLeaks: true, slow: 500, timeout: <%= (params[:timeout].to_i || Netzke::Testing.js_timeout) * 1000 %>});
         | 
| 15 17 | 
             
                  Ext.onReady(function(){
         | 
| 16 18 | 
             
                    Netzke.mochaRunner = mocha.run(function(){Netzke.mochaDone = true;});
         | 
| 17 19 | 
             
                  });
         | 
| 18 20 | 
             
                </script>
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                <%# netzke-testing helpers %>
         | 
| 19 23 | 
             
                <% if !params["no-helpers"] %>
         | 
| 20 24 | 
             
                  <%= javascript_include_tag "netzke/testing/helpers/actions" %>
         | 
| 21 25 | 
             
                  <%= javascript_include_tag "netzke/testing/helpers/queries" %>
         | 
| @@ -24,10 +28,10 @@ | |
| 24 28 | 
             
                  <%= javascript_include_tag "netzke/testing/helpers/form" %>
         | 
| 25 29 | 
             
                <% end %>
         | 
| 26 30 |  | 
| 27 | 
            -
                 | 
| 28 | 
            -
             | 
| 29 | 
            -
                <% end %>
         | 
| 31 | 
            +
                <%# custom JS (e.g. additional helpers) %>
         | 
| 32 | 
            +
                <%= javascript_include_tag "netzke/testing" %>
         | 
| 30 33 |  | 
| 34 | 
            +
                <%# actual spec %>
         | 
| 31 35 | 
             
                <%= javascript_include_tag "/netzke/specs/#{params[:spec]}" %>
         | 
| 32 36 | 
             
              <% end %>
         | 
| 33 37 |  | 
    
        data/config/routes.rb
    CHANGED
    
    | @@ -1,6 +1,4 @@ | |
| 1 1 | 
             
            Rails.application.routes.draw do
         | 
| 2 | 
            -
              # get "netzke_testing/components/:component", controller: :netzke_testing, action: :components
         | 
| 3 | 
            -
              # get "netzke_testing/specs"
         | 
| 4 2 | 
             
              if Rails.env.test? || Rails.env.development?
         | 
| 5 3 | 
             
                get 'netzke/components/:class' => 'netzke/testing#components', as: :netzke_components
         | 
| 6 4 | 
             
                get 'netzke/specs/*name' => 'netzke/testing#specs', as: :netzke_specs
         | 
| @@ -7,13 +7,12 @@ module Netzke::Testing::Helpers | |
| 7 7 |  | 
| 8 8 | 
             
                visit url
         | 
| 9 9 |  | 
| 10 | 
            -
                 | 
| 11 | 
            -
                wait_for_javascript
         | 
| 10 | 
            +
                wait_for_javascript(options[:stop_on_error])
         | 
| 12 11 |  | 
| 13 | 
            -
                assert_mocha_results
         | 
| 12 | 
            +
                assert_mocha_results(options[:stop_on_error])
         | 
| 14 13 | 
             
              end
         | 
| 15 14 |  | 
| 16 | 
            -
              def wait_for_javascript
         | 
| 15 | 
            +
              def wait_for_javascript(stop_on_error = false)
         | 
| 17 16 | 
             
                start = Time.now
         | 
| 18 17 | 
             
                loop do
         | 
| 19 18 | 
             
                  page.execute_script("return Netzke.mochaDone;") ? break : sleep(0.1)
         | 
| @@ -23,13 +22,11 @@ module Netzke::Testing::Helpers | |
| 23 22 | 
             
                end
         | 
| 24 23 |  | 
| 25 24 | 
             
              rescue Selenium::WebDriver::Error::JavascriptError => e
         | 
| 26 | 
            -
                 | 
| 27 | 
            -
                # sleep 5
         | 
| 28 | 
            -
             | 
| 25 | 
            +
                sleep 1.year if stop_on_error
         | 
| 29 26 | 
             
                raise e
         | 
| 30 27 | 
             
              end
         | 
| 31 28 |  | 
| 32 | 
            -
              def assert_mocha_results
         | 
| 29 | 
            +
              def assert_mocha_results(stop_on_error = false)
         | 
| 33 30 | 
             
                result = page.execute_script(<<-JS)
         | 
| 34 31 | 
             
                  var runner = Netzke.mochaRunner;
         | 
| 35 32 | 
             
                  var errors = [];
         | 
| @@ -43,14 +40,14 @@ module Netzke::Testing::Helpers | |
| 43 40 | 
             
                JS
         | 
| 44 41 |  | 
| 45 42 | 
             
                if !result["success"]
         | 
| 46 | 
            -
                   | 
| 47 | 
            -
                  # sleep 500
         | 
| 43 | 
            +
                  sleep 1.year if stop_on_error
         | 
| 48 44 |  | 
| 49 45 | 
             
                  errors = result["errors"].each_with_index.map do |(title, error), i|
         | 
| 50 46 | 
             
                    "#{i+1}) #{title}\n#{error}\n\n"
         | 
| 51 47 | 
             
                  end
         | 
| 52 48 |  | 
| 53 49 | 
             
                  raise "Failures:\n#{errors.join}"
         | 
| 50 | 
            +
                  raise "Test failed: #{result["test"]}\n#{result["error"]}"
         | 
| 54 51 | 
             
                end
         | 
| 55 52 | 
             
              end
         | 
| 56 53 | 
             
            end
         | 
    
        data/lib/netzke/testing.rb
    CHANGED
    
    | @@ -15,6 +15,10 @@ module Netzke | |
| 15 15 | 
             
                mattr_accessor :custom_js
         | 
| 16 16 | 
             
                @@custom_js = []
         | 
| 17 17 |  | 
| 18 | 
            +
                # Timeout (seconds) for JS spec execution
         | 
| 19 | 
            +
                mattr_accessor :js_timeout
         | 
| 20 | 
            +
                @@js_timeout = 5
         | 
| 21 | 
            +
             | 
| 18 22 | 
             
                def self.rspec_init(rspec_config)
         | 
| 19 23 | 
             
                  @@spec_root = Pathname.new(caller.first).join("../..")
         | 
| 20 24 | 
             
                  rspec_config.include(Netzke::Testing::Helpers)
         | 
    
        data/netzke-testing.gemspec
    CHANGED
    
    | @@ -18,12 +18,4 @@ Gem::Specification.new do |spec| | |
| 18 18 | 
             
              spec.require_paths = ["lib"]
         | 
| 19 19 |  | 
| 20 20 | 
             
              spec.add_dependency "coffee-script"
         | 
| 21 | 
            -
              spec.add_development_dependency "bundler", "~> 1.3"
         | 
| 22 | 
            -
              spec.add_development_dependency "rake"
         | 
| 23 | 
            -
              spec.add_development_dependency "rails", "~> 4.2.0"
         | 
| 24 | 
            -
              spec.add_development_dependency "sqlite3"
         | 
| 25 | 
            -
              spec.add_development_dependency 'capybara'
         | 
| 26 | 
            -
              spec.add_development_dependency 'selenium-webdriver'
         | 
| 27 | 
            -
              spec.add_development_dependency "rspec-rails"
         | 
| 28 | 
            -
              spec.add_development_dependency 'netzke-core', '~> 0.12.0'
         | 
| 29 21 | 
             
            end
         | 
| @@ -1,5 +1,4 @@ | |
| 1 | 
            -
            ENV['BUNDLE_GEMFILE'] ||= File.expand_path(' | 
| 2 | 
            -
             | 
| 1 | 
            +
            ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
         | 
| 3 2 | 
             
            require 'bundler/setup' # Set up gems listed in the Gemfile.
         | 
| 4 3 |  | 
| 5 4 | 
             
            $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
         |