diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0278121d1..04e06711b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,6 +23,7 @@ jobs: - gemfiles/rails_5_2.gemfile - gemfiles/rails_6_0.gemfile - gemfiles/rails_7_0.gemfile + - gemfiles/rails_7_1.gemfile db: - sqlite - mysql @@ -38,31 +39,43 @@ jobs: devise-token-auth-orm: mongoid - ruby: 2.7 gemfile: gemfiles/rails_7_0.gemfile + - ruby: 2.7 + gemfile: gemfiles/rails_7_1.gemfile - ruby: '3.0' gemfile: gemfiles/rails_7_0.gemfile - ruby: '3.0' gemfile: gemfiles/rails_7_0_mongoid_7.gemfile devise-token-auth-orm: mongoid + - ruby: '3.0' + gemfile: gemfiles/rails_7_1.gemfile - ruby: 3.1 gemfile: gemfiles/rails_7_0.gemfile - ruby: 3.1 gemfile: gemfiles/rails_7_0_mongoid_7.gemfile devise-token-auth-orm: mongoid + - ruby: 3.1 + gemfile: gemfiles/rails_7_1.gemfile - ruby: 3.2 gemfile: gemfiles/rails_7_0.gemfile - ruby: 3.2 gemfile: gemfiles/rails_7_0_mongoid_7.gemfile devise-token-auth-orm: mongoid + - ruby: 3.2 + gemfile: gemfiles/rails_7_1.gemfile - ruby: 3.3 gemfile: gemfiles/rails_7_0.gemfile - ruby: 3.3 gemfile: gemfiles/rails_7_0_mongoid_7.gemfile devise-token-auth-orm: mongoid + - ruby: 3.3 + gemfile: gemfiles/rails_7_1.gemfile - ruby: 3.4 gemfile: gemfiles/rails_7_0.gemfile - ruby: 3.4 gemfile: gemfiles/rails_7_0_mongoid_7.gemfile devise-token-auth-orm: mongoid + - ruby: 3.4 + gemfile: gemfiles/rails_7_1.gemfile exclude: - ruby: 2.7 gemfile: gemfiles/rails_4_2.gemfile diff --git a/devise_token_auth.gemspec b/devise_token_auth.gemspec index f2da71b29..fbe919bc4 100644 --- a/devise_token_auth.gemspec +++ b/devise_token_auth.gemspec @@ -30,6 +30,6 @@ Gem::Specification.new do |s| s.add_development_dependency 'sqlite3', '~> 1.4' s.add_development_dependency 'pg' s.add_development_dependency 'mysql2' - s.add_development_dependency 'mongoid', '>= 4', '< 8' + s.add_development_dependency 'mongoid', '>= 4', '< 9' s.add_development_dependency 'mongoid-locker', '>= 1.0', '< 3.0' end diff --git a/gemfiles/rails_7_1.gemfile b/gemfiles/rails_7_1.gemfile new file mode 100644 index 000000000..7017fa095 --- /dev/null +++ b/gemfiles/rails_7_1.gemfile @@ -0,0 +1,48 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "omniauth" +gem "omniauth-rails_csrf_protection" +gem "rails", "~> 7.1" +gem "sqlite3" +gem "mysql2" +gem "pg" +gem 'concurrent-ruby' + +group :development, :test do + gem "attr_encrypted" + gem "figaro" + gem "omniauth-facebook" + gem "omniauth-github" + gem "omniauth-google-oauth2" + gem 'omniauth-apple' + gem "rack-cors" + gem "thor" + gem "database_cleaner" + gem "factory_bot_rails" + gem "faker" + gem "fuzz_ball" + gem "guard" + gem "guard-minitest" + gem "minitest" + gem "minitest-focus" + gem "minitest-rails" + gem "minitest-reporters" + gem "mocha" + gem "pry" + gem "pry-byebug" + gem "pry-remote" + gem "rubocop", require: false +end + +group :test do + gem "rails-controller-testing" + gem "simplecov", require: false +end + +group :development do + gem "github_changelog_generator" +end + +gemspec path: "../" diff --git a/test/controllers/devise_token_auth/confirmations_controller_test.rb b/test/controllers/devise_token_auth/confirmations_controller_test.rb index 0d4990b1b..a03402428 100644 --- a/test/controllers/devise_token_auth/confirmations_controller_test.rb +++ b/test/controllers/devise_token_auth/confirmations_controller_test.rb @@ -62,8 +62,26 @@ def token_and_client_config_from(body) end test 'redirect url includes token params' do - assert @token_params.all? { |param| response.body.include?(param) } - assert response.body.include?('account_confirmation_success') + puts "\n" + "="*80 + puts "DEBUG: redirect url includes token params test (authenticated)" + puts "Token params: #{@token_params.inspect}" + puts "Response status: #{response.status}" + puts "Response location: #{response.location}" + puts "Response body length: #{response.body.length}" + puts "Response body (first 500 chars):" + puts response.body[0..500] + + # For 302 redirects, check the location header instead of body + redirect_location = response.location || response.body + @token_params.each do |param| + result = redirect_location.include?(param) + puts " Param '#{param}' included: #{result}" + end + puts "account_confirmation_success included: #{redirect_location.include?('account_confirmation_success')}" + puts "="*80 + "\n" + + assert @token_params.all? { |param| redirect_location.include?(param) } + assert redirect_location.include?('account_confirmation_success') end end @@ -86,8 +104,26 @@ def token_and_client_config_from(body) end test 'redirect url does not include token params' do - refute @token_params.any? { |param| response.body.include?(param) } - assert response.body.include?('account_confirmation_success') + puts "\n" + "="*80 + puts "DEBUG: redirect url does not include token params test (unauthenticated)" + puts "Token params: #{@token_params.inspect}" + puts "Response status: #{response.status}" + puts "Response location: #{response.location}" + puts "Response body length: #{response.body.length}" + puts "Response body (first 500 chars):" + puts response.body[0..500] + + # For 302 redirects, check the location header instead of body + redirect_location = response.location || response.body + @token_params.each do |param| + result = redirect_location.include?(param) + puts " Param '#{param}' included: #{result}" + end + puts "account_confirmation_success included: #{redirect_location.include?('account_confirmation_success')}" + puts "="*80 + "\n" + + refute @token_params.any? { |param| redirect_location.include?(param) } + assert redirect_location.include?('account_confirmation_success') end end diff --git a/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb b/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb index e104f017e..3fdac2f92 100644 --- a/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +++ b/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb @@ -17,8 +17,32 @@ class OmniauthTest < ActionDispatch::IntegrationTest end def get_parsed_data_json - encoded_json_data = @response.body.match(/var data \= JSON.parse\(decodeURIComponent\(\'(.+)\'\)\)\;/)[1] - JSON.parse(CGI.unescape(encoded_json_data)) + puts "\n" + "="*80 + puts "DEBUG: get_parsed_data_json called" + puts "Response status: #{@response.status}" + puts "Response content_type: #{@response.content_type}" + puts "Response body length: #{@response.body.length}" + puts "Response body (first 500 chars):" + puts @response.body[0..500] + puts "="*80 + + match_result = @response.body.match(/var data \= JSON.parse\(decodeURIComponent\(\'(.+)\'\)\)\;/) + puts "DEBUG: Regex match result: #{match_result.inspect}" + + if match_result.nil? + puts "ERROR: Could not find 'var data = JSON.parse(decodeURIComponent(...' pattern in response" + puts "Full response body:" + puts @response.body + puts "="*80 + "\n" + return nil + end + + encoded_json_data = match_result[1] + puts "DEBUG: Encoded JSON data (first 200 chars): #{encoded_json_data[0..200]}" + decoded_data = JSON.parse(CGI.unescape(encoded_json_data)) + puts "DEBUG: Decoded data: #{decoded_data.inspect}" + puts "="*80 + "\n" + decoded_data end describe 'success callback' do @@ -35,6 +59,12 @@ def get_parsed_data_json test 'request should pass correct redirect_url' do get_success + puts "\n" + "="*80 + puts "DEBUG: request should pass correct redirect_url" + puts "Expected redirect_url: #{@redirect_url}" + puts "Actual auth_origin_url: #{controller.send(:omniauth_params)['auth_origin_url'].inspect}" + puts "Full omniauth_params: #{controller.send(:omniauth_params).inspect}" + puts "="*80 + "\n" assert_equal @redirect_url, controller.send(:omniauth_params)['auth_origin_url'] end @@ -139,6 +169,12 @@ def get_parsed_data_json end test 'additional attribute was passed' do + puts "\n" + "="*80 + puts "DEBUG: additional attribute was passed" + puts "Expected favorite_color: #{@fav_color.inspect}" + puts "Actual favorite_color: #{@resource.favorite_color.inspect}" + puts "Resource attributes: #{@resource.attributes.inspect}" + puts "="*80 + "\n" assert_equal @fav_color, @resource.favorite_color end @@ -245,6 +281,14 @@ def assert_expected_data_in_new_window # We have been forwarded to a url with all the expected # data in the query params. + puts "\n" + "="*80 + puts "DEBUG: redirects to auth_origin_url with all expected query params (sameWindow)" + puts "Response status: #{response.status}" + puts "Controller params: #{controller.params.inspect}" + puts "uid param: #{controller.params['uid'].inspect}" + puts "Response location: #{response.location.inspect}" + puts "="*80 + "\n" + # Assert that a uid was passed along. We have to assume # that the rest of the values were as well, as we don't # have access to @resource in this test anymore diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb index bdeb0300c..46e8d41c1 100644 --- a/test/dummy/config/environments/test.rb +++ b/test/dummy/config/environments/test.rb @@ -31,6 +31,9 @@ config.consider_all_requests_local = true config.action_controller.perform_caching = false + # Use memory store for cache to ensure sessions persist across redirects in tests + config.cache_store = :memory_store + # Raise exceptions instead of rendering exception templates. if Rails::VERSION::MAJOR >= 7 && Rails::VERSION::MINOR > 0 config.action_dispatch.show_exceptions = :none