Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

routes test with a id is not worked. #602

Closed
zw963 opened this issue Oct 24, 2014 · 16 comments
Closed

routes test with a id is not worked. #602

zw963 opened this issue Oct 24, 2014 · 16 comments

Comments

@zw963
Copy link

zw963 commented Oct 24, 2014

spec is following:

it { should route(:get, '/api/v1/promotions/1').to(:controller => 'promotin/commons', :action => :show, id: 1) }

test failed with:

Promotion::CommonsController should route GET /api/v1/promotions/1 to/from {:controller=>"promotin/commons", :action=>"show", :id=>"1"}
     Failure/Error: it { should route(:get, '/api/v1/promotions/1').to(:controller => 'promotin/commons', :action => :show, id: 1) }
       The recognized options <{"action"=>"show", "controller"=>"promotion/commons", "id"=>"1"}> did not match <{"controller"=>"promotin/commons", "action"=>"show", "id"=>"1"}>, difference:.
       --- expected
       +++ actual
       @@ -1 +1 @@
       -{"controller"=>"promotin/commons", "action"=>"show", "id"=>"1"}
       +{"action"=>"show", "controller"=>"promotion/commons", "id"=>"1"}

spec no :id args is worked.

@zw963
Copy link
Author

zw963 commented Oct 24, 2014

rspec: 3.1.7
rails: 4.1.0
ruby: 2.1.3p242

@zw963
Copy link
Author

zw963 commented Oct 24, 2014

shoulda: 2.7

@mcmire
Copy link
Collaborator

mcmire commented Oct 24, 2014

@zw963 It looks like you have a typo: :controller => 'promotin/commons' should be :controller => 'promotion/commons', perhaps?

@zw963
Copy link
Author

zw963 commented Oct 26, 2014

Yes, I have a typo, when I write issues.

in my own code, I have wrote like this:

  it { should route(:get, '/api/v1/promotions').to('promotion/commons#index') }
  it { should route(:get, '/api/v1/promotions/new').to('promotion/commons#new') }
  it { should route(:get, '/api/v1/promotions/1').to('promotion/commons#show', id: 1) }

first and second is worked, but, third is not worked.
if I change to:

it { should route(:get, '/api/v1/promotions/1').to(controller: 'promotion/commons', action: :show, id: 1) }

it worked OK.

Should you tell me how to write with the first way? no way ?
perhaps if provide id with hashs, we must use :controller and :action like this?

I think it should be easy to support like .to('promotion/commons#show', id: 1) } ?

@zw963
Copy link
Author

zw963 commented Oct 26, 2014

a found a comments in source code:

      #     route(:get, '/posts/1').to('posts#show', id: 1)

seem like shoulda support this form, But I use a nest controller, it not worked~

here is all backtrace in spec:

  1) Promotion::CommonsController should route GET /api/v1/promotions/1 to/from {:id=>1, :controller=>"promotion/commons", :action=>"show"}
     Failure/Error: it { should route(:get, '/api/v1/promotions/1').to('promotion/commons#show', id: 1) }
       The recognized options <{"action"=>"show", "controller"=>"promotion/commons", "id"=>"1"}> did not match <{"id"=>1, "controller"=>"promotion/commons", "action"=>"show"}>, difference:.
       --- expected
       +++ actual
       @@ -1 +1 @@
       -{"id"=>1, "controller"=>"promotion/commons", "action"=>"show"}
       +{"action"=>"show", "controller"=>"promotion/commons", "id"=>"1"}
     # ./test/controllers/promotion/commons_controller_test.rb:18:in `block (2 levels) in <top (required)>'
     # /home/zw963/.rvm/gems/ruby-2.1.3@neil-rails-app/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `load'
     # /home/zw963/.rvm/gems/ruby-2.1.3@neil-rails-app/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `block in load'
     # /home/zw963/.rvm/gems/ruby-2.1.3@neil-rails-app/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:232:in `load_dependency'
     # /home/zw963/.rvm/gems/ruby-2.1.3@neil-rails-app/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `load'
     # -e:1:in `<main>

@mcmire
Copy link
Collaborator

mcmire commented Oct 26, 2014

@zw963 Thanks for the update. So it looks like the difference is that you're passing an integer in for id but apparently when it interprets the path the id ends up being a string. This is odd because we have a test for this: https://github.com/thoughtbot/shoulda-matchers/blob/master/spec/shoulda/matchers/action_controller/route_matcher_spec.rb#L35. It isn't exactly the same though, so maybe there's something small that's affecting this. Can you clone the repo and add a failing test for this and see if you can reproduce it that way?

@zw963
Copy link
Author

zw963 commented Oct 27, 2014

#603

@zw963
Copy link
Author

zw963 commented Oct 27, 2014

Another problem, When I run spec, found Gemfile missing some gem, e.g. jquery-rails, sass-rails, etc..

Should I add a new issue for this ?

@mcmire
Copy link
Collaborator

mcmire commented Oct 27, 2014

Did you run bundle and appraisal install first?

@zw963
Copy link
Author

zw963 commented Oct 27, 2014

What I did is just run bundle install in a new gemset, and then rspec, it not worked, missing some gems,

in `block in retrying': Command 'bundle install --local' failed: (RuntimeError)
Resolving dependencies...
Could not find gem 'jquery-rails (>= 0) ruby' in the gems available on this machine.

add I add following missing gem to Gemfile, it can worked now.

gem 'jquery-rails'
gem 'coffee-rails'
gem 'sass-rails'
gem 'uglifier'

@zw963
Copy link
Author

zw963 commented Oct 27, 2014

@mcmire , Cool, I does not run appraisal install. it solved!
though, this name is too complex for non-english language.

@mcmire
Copy link
Collaborator

mcmire commented Oct 27, 2014

Haha, yeah, appraisal is kind of a funny name.

@zw963
Copy link
Author

zw963 commented Nov 6, 2014

Cool~ hope to fixed soon.

@mcmire
Copy link
Collaborator

mcmire commented Nov 6, 2014

@zw963 If you could take a look at #603, I made some comments there about the test you wrote. If you could fix that up and confirm you're getting the same error as you did before, that would help a bunch. Thanks.

@zw963
Copy link
Author

zw963 commented Nov 9, 2014

@mcmire , Hi, I add more spec for reproduce my case, hope it could help.

@mcmire
Copy link
Collaborator

mcmire commented Nov 19, 2014

Fixed in abb087e.

@mcmire mcmire closed this as completed Nov 19, 2014
jsonn pushed a commit to jsonn/pkgsrc that referenced this issue Jun 12, 2015
pkgsrc change: allow build on Ruby 2.2.

# 2.8.0

### Deprecations

* `ensure_length_of` has been renamed to `validate_length_of`.
  `ensure_length_of` is deprecated and will be removed in 3.0.0.

* `set_the_flash` has been renamed to `set_flash`. `set_the_flash` is
  deprecated and will be removed in 3.0.0.

* `set_session(:foo)` is deprecated in favor of `set_session[:foo]`.
  `set_session(:foo)` will be invalid syntax in 3.0.0.

* Using `should set_session[:key].to(nil)` to assert that that a value has not
  been set is deprecated. Please use `should_not set_session[:key]` instead.
  In 3.0.0, `should set_session[:key].to(nil)` will only pass if the value is
  truly nil.

### Bug fixes

* Fix `delegate_method` so that it works again with shoulda-context. ([#591])

* Fix `validate_uniqueness_of` when used with `scoped_to` so that when one of
  the scope attributes is a polymorphic `*_type` attribute and the model has
  another validation on the same attribute, the matcher does not fail with an
  error. ([#592])

* Fix `has_many` used with `through` so that when the association does not
  exist, and the matcher fails, it does not raise an error when producing the
  failure message. ([#588])

* Fix `have_and_belong_to_many` used with `join_table` so that it does not fail
  when `foreign_key` and/or `association_foreign_key` was specified on the
  association as a symbol instead of a string. ([#584])

* Fix `allow_value` when an i18n translation key is passed to `with_message` and
  the `:against` option is used to specify an alternate attribute. A bug here
  also happened to affect `validate_confirmation_of` when an i18n translation
  key is passed to `with_message`. ([#593])

* Fix `class_name` qualifier for association matchers so that if the model being
  referenced is namespaced, the matcher will correctly resolve the class before
  checking it against the association's `class_name`. ([#537])

* Fix `validate_inclusion_of` used with `with_message` so that it fails if given
  a message that does not match the message on the validation. ([#598])

* Fix `route` matcher so that when controller and action are specified in hash
  notation (e.g. `posts#show`), route parameters such as `id` do not need to be
  specified as a string but may be specified as a number as well. ([#602])

* Fix `allow_value`, `validate_numericality_of` and `validate_inclusion_of` so
  that they handle RangeErrors emitted from ActiveRecord 4.2. These exceptions
  arise whenever we attempt to set an attribute using a value that lies outside
  the range of the column (assuming the column is an integer). RangeError is now
  treated specially, failing the test instead of bubbling up as an error.
  ([#634], [#637], [#642])

### Features

* Add ability to test `:primary_key` option on associations. ([#597])

* Add `allow_blank` qualifier to `validate_uniqueness_of` to complement
  the `allow_blank` option. ([#543])

* Change `set_session` so that #[] and #to qualifiers are optional, similar to
  `set_flash`. That is, you can now say `should set_session` to assert that any
  flash value has been set, or `should set_session.to('value')` to assert that
  any value in the session is 'value'.

* Change `set_session` so that its #to qualifier supports regexps, similar to
  `set_flash`.

* Add `with_prefix` qualifier to `delegate_method` to correspond to the `prefix`
  option for Rails's `delegate` macro. ([#622])

* Add support for Rails 4.2, especially fixing `serialize` matcher to remove
  warning about `serialized_attributes` being deprecated. ([#627])

* Update `dependent` qualifier on association matchers to support `:destroy`,
  `:delete`, `:nullify`, `:restrict`, `:restrict_with_exception`, and
  `:restrict_with_error`. You can also pass `true` or `false` to assert that
  the association has (or has not) been declared with *any* dependent option.
  ([#631])

### Improvements

* Tweak `allow_value` failure message so that it reads a bit nicer when listing
  existing errors.

[#591]: thoughtbot/shoulda-matchers#591
[#592]: thoughtbot/shoulda-matchers#592
[#588]: thoughtbot/shoulda-matchers#588
[#584]: thoughtbot/shoulda-matchers#584
[#593]: thoughtbot/shoulda-matchers#593
[#597]: thoughtbot/shoulda-matchers#597
[#537]: thoughtbot/shoulda-matchers#537
[#598]: thoughtbot/shoulda-matchers#598
[#602]: thoughtbot/shoulda-matchers#602
[#543]: thoughtbot/shoulda-matchers#543
[#622]: thoughtbot/shoulda-matchers#622
[#627]: thoughtbot/shoulda-matchers#627
[#631]: thoughtbot/shoulda-matchers#631
[#634]: thoughtbot/shoulda-matchers#634
[#637]: thoughtbot/shoulda-matchers#637
[#642]: thoughtbot/shoulda-matchers#642

# 2.7.0

### Deprecations

* `ensure_inclusion_of` has been renamed to `validate_inclusion_of`.
  `ensure_inclusion_of` is deprecated and will be removed in 3.0.0.

* `ensure_exclusion_of` has been renamed to `validate_exclusion_of`.
  `ensure_exclusion_of` is deprecated and will be removed in 3.0.0.

### Bug fixes

* Fix `delegate_method` so that it does not raise an error if the method that
  returns the delegate object is private.

* Warn when `ensure_inclusion_of` is chained with `.in_array([false, true])`
  as well as with `.in_array([true, false])`.

* Fix `set_session` so that the `to` qualifier if given nil checks that the
  session variable in question was set to nil (previously this actually did
  nothing).

* Fix `filter_param` so that it works when `config.filter_parameters` contains
  regexes.

* Fix `delegate_method` so that it can be required independent of Active
  Support.

* Fix `validate_uniqueness_of`. When used against an unpersisted record whose
  model contained a non-nullable column other than the one being validated, the
  matcher would break. Even if the test set that column to a value beforehand,
  the record had to be persisted in order for the matcher to work. Now this is
  no longer the case and the record can remain unpersisted.

* Fix `validate_absence_of`: it required that a string be passed as the
  attribute name rather than a symbol (which is the usual and documented usage).

### Improvements

* `have_and_belongs_to_many` now checks to make sure that the join table
  contains the correct columns for the left- and right-hand side of the
  association.

* Reword failure message for `delegate_method` so that it's a little more
  helpful.

### Features

* Add new matcher `define_enum_for` to test usage of the `enum` macro introduced
  in Rails 4.1.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants