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

Undefined method size on 0.8.2 #214

Closed
GeekOnCoffee opened this issue Dec 20, 2017 · 19 comments
Closed

Undefined method size on 0.8.2 #214

GeekOnCoffee opened this issue Dec 20, 2017 · 19 comments

Comments

@GeekOnCoffee
Copy link

GeekOnCoffee commented Dec 20, 2017

We upgraded from 0.7.0 to 0.8.2 and we're seeing the undefined method size error on form submissions without an attachment field but no file attached. The same form works fine if a file is attached.
We're using shrine for uploads, not sure if that's relevant.

Related to: #210

@GeekOnCoffee
Copy link
Author

We're locking to 0.7.0 for now, but I'll be happy to provide more information and/or help test a fix.

@perlun
Copy link
Contributor

perlun commented Dec 27, 2017

Thanks for the report @GeekOnCoffee, much appreciated. Could you include a stack trace also? (We have one in #149, just wanted to double check that this is indeed the same issue, and that one is closed anyway so it's better to have it here.)

@NARKOZ
Copy link

NARKOZ commented Dec 29, 2017

I confirm that stacktrace is the same as in #149 (comment)

@ollieh-m
Copy link

@GeekOnCoffee
See #215
Bottom line is updating Capybara to 2.17 fixed this for me.

@aledustet
Copy link

Confirming the same issue @ollieh-m suggestion worked for me

@Schwad
Copy link

Schwad commented Feb 21, 2018

Hey guys! Got the same issue when I was moving along to Rails 5.2.0.rc1. Just downgraded to 0.7.0 again, may try the other fix another time.

Came from this issue: rspec/rspec-rails#1915

Here's a backtrace if you want though....

["/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/uploaded_file.rb:47:in `public_send'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/uploaded_file.rb:47:in `method_missing'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/utils.rb:136:in `build_file_part'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/utils.rb:101:in `block in get_parts'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/utils.rb:92:in `each'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/utils.rb:92:in `map'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/utils.rb:92:in `get_parts'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/utils.rb:87:in `build_parts'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test/utils.rb:77:in `build_multipart'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test.rb:231:in `env_for'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test.rb:128:in `custom_request'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rack-test-0.8.2/lib/rack/test.rb:66:in `post'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/rack_test/browser.rb:69:in `process'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/rack_test/browser.rb:41:in `process_and_follow_redirects'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/rack_test/browser.rb:32:in `submit'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/rack_test/form.rb:78:in `submit'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/rack_test/node.rb:64:in `click'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/node/element.rb:143:in `block in click'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/node/base.rb:85:in `synchronize'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/node/element.rb:143:in `click'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/node/actions.rb:25:in `click_link_or_button'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/session.rb:776:in `block (2 levels) in <class:Session>'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/capybara-2.15.1/lib/capybara/dsl.rb:50:in `block (2 levels) in <module:DSL>'",
 "/Users/nickschwaderer/Documents/webapps/heroku_publi/smnopublicform/spec/features/new_registrations/create_a_new_registration_spec.rb:68:in `block (2 levels) in <top (required)>'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:254:in `instance_exec'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:254:in `block in run'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:500:in `block in with_around_and_singleton_context_hooks'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:457:in `block in with_around_example_hooks'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:464:in `block in run'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:604:in `block in run_around_example_hooks_for'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:342:in `call'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-rails-3.6.1/lib/rspec/rails/adapters.rb:127:in `block (2 levels) in <module:MinitestLifecycleAdapter>'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:447:in `instance_exec'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:447:in `instance_exec'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:375:in `execute_with'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:606:in `block (2 levels) in run_around_example_hooks_for'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:342:in `call'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:607:in `run_around_example_hooks_for'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/hooks.rb:464:in `run'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:457:in `with_around_example_hooks'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:500:in `with_around_and_singleton_context_hooks'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example.rb:251:in `run'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:627:in `block in run_examples'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:623:in `map'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:623:in `run_examples'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/example_group.rb:589:in `run'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:118:in `block (3 levels) in run_specs'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:118:in `map'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:118:in `block (2 levels) in run_specs'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/configuration.rb:1894:in `with_suite_hooks'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:113:in `block in run_specs'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/reporter.rb:79:in `report'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:112:in `run_specs'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:87:in `run'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:71:in `run'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/lib/rspec/core/runner.rb:45:in `invoke'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/gems/rspec-core-3.6.0/exe/rspec:4:in `<top (required)>'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/bin/rspec:23:in `load'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/bin/rspec:23:in `<main>'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/bin/ruby_executable_hooks:15:in `eval'",
 "/Users/nickschwaderer/.rvm/gems/ruby-2.3.6/bin/ruby_executable_hooks:15:in `<main>'"]

@Schwad
Copy link

Schwad commented Feb 22, 2018

Next week or so I'll try @ollieh-m 's approach as well

@perlun
Copy link
Contributor

perlun commented Feb 27, 2018

No feedback received from @GeekOnCoffee since a long time. If someone feels the original problem remains, please speak up - closing for now, but will reopen if it turns out to still be a problem with v0.8.3.

@perlun perlun closed this as completed Feb 27, 2018
@voxik
Copy link
Contributor

voxik commented Mar 2, 2018

Well, this is not resolved IMO. Capybara 2.14.3 test suite fails with these kind of errors:

  1) Capybara::Session DSL #attach_file with multipart form should set a file path by id
     Failure/Error: send(method, new_uri.to_s, attributes, env.merge(options[:headers] || {}))
     NoMethodError:
       undefined method `size' for nil:NilClass
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/uploaded_file.rb:47:in `public_send'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/uploaded_file.rb:47:in `method_missing'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/utils.rb:136:in `build_file_part'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/utils.rb:101:in `block in get_parts'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/utils.rb:92:in `each'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/utils.rb:92:in `map'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/utils.rb:92:in `get_parts'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/utils.rb:87:in `build_parts'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test/utils.rb:77:in `build_multipart'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test.rb:233:in `env_for'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test.rb:128:in `custom_request'
     # /usr/share/gems/gems/rack-test-0.8.3/lib/rack/test.rb:66:in `post'
     # ./lib/capybara/rack_test/browser.rb:64:in `process'
     # ./lib/capybara/rack_test/browser.rb:36:in `process_and_follow_redirects'
     # ./lib/capybara/rack_test/browser.rb:27:in `submit'
     # ./lib/capybara/rack_test/form.rb:79:in `submit'
     # ./lib/capybara/rack_test/node.rb:64:in `click'
     # ./lib/capybara/node/element.rb:143:in `block in click'
     # ./lib/capybara/node/base.rb:85:in `synchronize'
     # ./lib/capybara/node/element.rb:143:in `click'
     # ./lib/capybara/node/actions.rb:61:in `click_button'
     # ./lib/capybara/session.rb:784:in `block (2 levels) in <class:Session>'
     # ./lib/capybara/dsl.rb:50:in `block (2 levels) in <module:DSL>'
     # ./lib/capybara/spec/session/attach_file_spec.rb:33:in `block (3 levels) in <top (required)>'

The full log is here:

https://apps.fedoraproject.org/koschei/package/rubygem-capybara
https://kojipkgs.fedoraproject.org/work/tasks/6657/25396657/build.log

@perlun perlun reopened this Mar 2, 2018
@perlun
Copy link
Contributor

perlun commented Mar 2, 2018

Thanks for the info @voxik. I looked into this but am having a bit of a hard time understanding why this happens. This is the failing code (from utils.rb):

      def build_file_part(parameter_name, uploaded_file)
        uploaded_file.set_encoding(Encoding::BINARY) if uploaded_file.respond_to?(:set_encoding)
        <<-EOF
--#{MULTIPART_BOUNDARY}\r
Content-Disposition: form-data; name="#{parameter_name}"; filename="#{escape(uploaded_file.original_filename)}"\r
Content-Type: #{uploaded_file.content_type}\r
Content-Length: #{uploaded_file.size}\r
\r
#{uploaded_file.read}\r
EOF
      end

The uploaded_file.size is the thing that breaks it.

Do you have a repo that reproduces this? Like a branch in your gem's repo or so? It would help immensely when trying to understand why this happens now. Thanks in advance.

@voxik
Copy link
Contributor

voxik commented Mar 2, 2018

It seem that derived classes does not call rack-test initialize method and therefore the tempfile is uninitialized.

Interesting, I fail to create test case which would prove this. But I am pretty sure that the UploadedFile#initialize method is not called in this case.

@voxik
Copy link
Contributor

voxik commented Mar 2, 2018

Isn't the uploaded_file serialized somewhere?

@voxik
Copy link
Contributor

voxik commented Mar 2, 2018

So I got to Rack::Test::Session#post and it seems that there already is the uninitialized UploadedFile object. Going deeper to Capybara.

@voxik
Copy link
Contributor

voxik commented Mar 2, 2018

I reached this point:

https://github.com/teamcapybara/capybara/blob/2.14.3/lib/capybara/rack_test/form.rb#L43

And this call simply does not call UploadedFile#initialize although it should IMO. Not really sure why.

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [i386-linux]

@perlun
Copy link
Contributor

perlun commented Mar 2, 2018

These lines probably have the clue: https://github.com/teamcapybara/capybara/blob/2.14.3/lib/capybara/rack_test/form.rb#L3-L16

Subclassing UploadedFile, overriding its constructor but not calling the base class constructor? That's some incredibly weird code there, to be honest. 😄

This commit has the details: teamcapybara/capybara@95a297e#diff-c88a9acbdd8b694a0468c4e3839bbbb6

@voxik Is it critical for you to have this working with this (outdated) version of capybara? The latest version is 2.18.0 according to rubygems.org.

So I'm inclined to close this as "known broken". The combination rack-test >= 0.71 and capybara < 2.17 is simply a no-go, because of the slightly edgy way capybara uses rack-test internals. Do you agree?

@voxik
Copy link
Contributor

voxik commented Mar 5, 2018

Unfortunately I am stuck with old Capybara, because newer Capybara has new dependencies, which are not in Fedora yet.

Anyway, I took the commit from Capybara, which workaround the issue and I submitted the teamcapybara/capybara#1981, which changes Capybara to call the #initialize method of parent class.

Please feel free to close this issue. There is probably nothing else what could be done here (although documenting the incompatibility might help, but who would read it, right? 😉 )

@perlun
Copy link
Contributor

perlun commented Mar 6, 2018

There is probably nothing else what could be done here (although documenting the incompatibility might help, but who would read it, right? 😉

Unfortunately, this is quite true. But I will add a note in the README anyway. Thanks for your feedback!

@perlun perlun closed this as completed Mar 6, 2018
@Schwad
Copy link

Schwad commented Apr 19, 2018

Howdy all! Just pinging to remind myself that I got this again. (On rack test 1.0.0 I think?) Bumping down to 0.7.0 solved it for me! :)

@perlun
Copy link
Contributor

perlun commented Apr 19, 2018

@Schwad Interesting. If you can make a reproducible test case, we can give it a look. Closing so we don't keep this old issue alive (it's better to open up a new one for 1.0.0)

@rack rack locked as resolved and limited conversation to collaborators Apr 19, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants