diff options
| -rw-r--r-- | common_dependencies.rb | 7 | ||||
| -rw-r--r-- | test/test_helper.rb | 32 | ||||
| m--------- | users/app/assets/javascripts/srp | 0 | ||||
| -rw-r--r-- | users/app/assets/javascripts/users.js | 4 | ||||
| -rw-r--r-- | users/app/models/token.rb | 2 | ||||
| -rw-r--r-- | users/leap_web_users.gemspec | 2 | ||||
| -rw-r--r-- | users/lib/warden/strategies/secure_remote_password.rb | 4 | ||||
| -rw-r--r-- | users/test/integration/api/account_flow_test.rb | 6 | ||||
| -rw-r--r-- | users/test/integration/api/rack_test.rb | 3 | ||||
| -rw-r--r-- | users/test/integration/browser/account_test.rb | 23 | 
10 files changed, 71 insertions, 12 deletions
| diff --git a/common_dependencies.rb b/common_dependencies.rb index 63c3710..085a898 100644 --- a/common_dependencies.rb +++ b/common_dependencies.rb @@ -1,7 +1,14 @@  source "http://rubygems.org"  group :test do +  # moching and stubing    gem 'mocha', '~> 0.13.0', :require => false +  # integration testing +  gem 'capybara' +  # headless js integration testing +  gem 'poltergeist' +  # required for save_and_open_page in integration tests +  # gem 'launchy'  end  group :test, :development do diff --git a/test/test_helper.rb b/test/test_helper.rb index 0016771..26b99f4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -10,3 +10,35 @@ Dir["#{File.dirname(__FILE__)}/../*/test/support/**/*.rb"].each { |f| require f  class ActiveSupport::TestCase    # Add more helper methods to be used by all tests here...  end + +require 'capybara/poltergeist' + +CONFIG_RU = (Rails.root + 'config.ru').to_s +OUTER_APP = Rack::Builder.parse_file(CONFIG_RU).first + +Capybara.register_driver :rack_test do |app| +  Capybara::RackTest::Driver.new(app) +end + +Capybara.register_driver :poltergeist do |app| +  Capybara::Poltergeist::Driver.new(app) +end + +# this is integration testing. So let's make the whole +# rack stack available... +Capybara.app = OUTER_APP +Capybara.run_server = true +Capybara.app_host = 'http://lvh.me:3003' +Capybara.server_port = 3003 +Capybara.javascript_driver = :poltergeist +Capybara.default_wait_time = 5 + +class BrowserIntegrationTest < ActionDispatch::IntegrationTest +  # Make the Capybara DSL available +  include Capybara::DSL + +  teardown do +    Capybara.reset_sessions!    # Forget the (simulated) browser state +    Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver +  end +end diff --git a/users/app/assets/javascripts/srp b/users/app/assets/javascripts/srp -Subproject 926a5d5960db51903e33c8496487da59f9f4124 +Subproject 9c61d52f1f975ec0eefe5b4a0b71ac529300cbe diff --git a/users/app/assets/javascripts/users.js b/users/app/assets/javascripts/users.js index 65bed4f..4c9b510 100644 --- a/users/app/assets/javascripts/users.js +++ b/users/app/assets/javascripts/users.js @@ -49,12 +49,12 @@        for (field in message.errors) {          if (field == 'base') {            alert_message(message.errors[field]); -          next; +          continue;          }          error = message.errors[field];          element = $('form input[name$="[' + field + ']"]');          if (!element) { -          next; +          continue;          }          element.trigger('element:validate:fail.ClientSideValidations', error).data('valid', false);        } diff --git a/users/app/models/token.rb b/users/app/models/token.rb index 44a6dfe..cc62778 100644 --- a/users/app/models/token.rb +++ b/users/app/models/token.rb @@ -8,7 +8,7 @@ class Token < CouchRest::Model::Base    def initialize(*args)      super -    self.id = SecureRandom.urlsafe_base64(32) +    self.id = SecureRandom.urlsafe_base64(32).gsub(/^_*/, '')    end    design do diff --git a/users/leap_web_users.gemspec b/users/leap_web_users.gemspec index 2f4b10c..d33328a 100644 --- a/users/leap_web_users.gemspec +++ b/users/leap_web_users.gemspec @@ -17,6 +17,6 @@ Gem::Specification.new do |s|    s.add_dependency "leap_web_core", LeapWeb::VERSION -  s.add_dependency "ruby-srp", "~> 0.1.7" +  s.add_dependency "ruby-srp", "~> 0.2.0"    s.add_dependency "rails_warden"  end diff --git a/users/lib/warden/strategies/secure_remote_password.rb b/users/lib/warden/strategies/secure_remote_password.rb index a97e795..2c681be 100644 --- a/users/lib/warden/strategies/secure_remote_password.rb +++ b/users/lib/warden/strategies/secure_remote_password.rb @@ -36,7 +36,7 @@ module Warden        end        def validate -        session[:handshake].authenticate(params['client_auth'].hex) +        session[:handshake].authenticate(params['client_auth'])        end        def initialize! @@ -44,7 +44,7 @@ module Warden            client = SRP::Client.new user.username,              :verifier => user.verifier,              :salt => user.salt -          session[:handshake] = SRP::Session.new(client, params['A'].hex) +          session[:handshake] = SRP::Session.new(client, params['A'])            custom! json_response(session[:handshake])          else            fail! :base => 'invalid_user_pass' diff --git a/users/test/integration/api/account_flow_test.rb b/users/test/integration/api/account_flow_test.rb index f5cb0b1..4c94389 100644 --- a/users/test/integration/api/account_flow_test.rb +++ b/users/test/integration/api/account_flow_test.rb @@ -26,19 +26,19 @@ class AccountFlowTest < RackTest    def handshake(login, aa)      post "http://api.lvh.me:3000/1/sessions.json",        :login => login, -      'A' => aa.to_s(16), +      'A' => aa,        :format => :json      response = JSON.parse(last_response.body)      if response['errors']        raise RECORD_NOT_FOUND.new(response['errors'])      else -      return response['B'].hex +      return response['B']      end    end    def validate(m)      put "http://api.lvh.me:3000/1/sessions/" + @login + '.json', -      :client_auth => m.to_s(16), +      :client_auth => m,        :format => :json      return JSON.parse(last_response.body)    end diff --git a/users/test/integration/api/rack_test.rb b/users/test/integration/api/rack_test.rb index da960f2..9a69f52 100644 --- a/users/test/integration/api/rack_test.rb +++ b/users/test/integration/api/rack_test.rb @@ -1,6 +1,3 @@ -CONFIG_RU = (Rails.root + 'config.ru').to_s -OUTER_APP = Rack::Builder.parse_file(CONFIG_RU).first -  class RackTest < ActiveSupport::TestCase    include Rack::Test::Methods    include Warden::Test::Helpers diff --git a/users/test/integration/browser/account_test.rb b/users/test/integration/browser/account_test.rb new file mode 100644 index 0000000..ce63baf --- /dev/null +++ b/users/test/integration/browser/account_test.rb @@ -0,0 +1,23 @@ +require 'test_helper' + +class AccountTest < BrowserIntegrationTest + +  setup do +    Capybara.current_driver = Capybara.javascript_driver +  end + +  test "normal account workflow" do +    username = "test_#{SecureRandom.urlsafe_base64}".downcase +    password = SecureRandom.base64 +    visit '/users/new' +    fill_in 'Username', with: username +    fill_in 'Password', with: password +    fill_in 'Password confirmation', with: password +    click_on 'Sign Up' +    assert page.has_content?("Welcome #{username}") +    click_on 'Logout' +    assert page.has_content?("Sign Up") +    assert_equal '/', current_path +  end + +end | 
