working to get the tests back online. deprecated zipruby to make selenium work, need to refactor zip code

This commit is contained in:
Kyle Drake 2023-12-31 00:58:53 -06:00
parent 10ff8a7cc7
commit ed02178289
16 changed files with 174 additions and 309 deletions

View file

@ -15,7 +15,6 @@ gem 'tilt'
gem 'erubis'
gem 'stripe' #, source: 'https://code.stripe.com/'
gem 'terrapin'
gem 'zipruby'
gem 'sass', require: nil
gem 'dav4rack', git: 'https://github.com/neocities/dav4rack.git', ref: '3ecde122a0b8bcc1d85581dc85ef3a7120b6a8f0'
gem 'filesize'
@ -82,6 +81,7 @@ group :test do
gem 'mocha', require: nil
gem 'rake', '>= 12.3.3', require: nil
gem 'capybara', require: nil #, '2.10.1', require: nil
gem 'selenium-webdriver'
gem 'rack_session_access', require: nil
gem 'webmock', require: nil
gem 'stripe-ruby-mock', '~> 3.1.0.rc3', require: 'stripe_mock'
@ -89,5 +89,4 @@ group :test do
gem 'mock_redis'
gem 'simplecov', require: nil
gem 'm'
gem 'apparition', github: 'twalpole/apparition', ref: 'ca86be4d54af835d531dbcd2b86e7b2c77f85f34'
end

View file

@ -10,15 +10,6 @@ GIT
rack (>= 1.6)
uuidtools (~> 2.1.1)
GIT
remote: https://github.com/twalpole/apparition.git
revision: ca86be4d54af835d531dbcd2b86e7b2c77f85f34
ref: ca86be4d54af835d531dbcd2b86e7b2c77f85f34
specs:
apparition (0.6.0)
capybara (~> 3.13, < 4)
websocket-driver (>= 0.6.5)
GEM
remote: https://rubygems.org/
specs:
@ -190,7 +181,6 @@ GEM
maxmind-geoip2 (~> 1.2)
simpleidn (~> 0.1, >= 0.1.1)
mini_mime (1.1.5)
mini_portile2 (2.8.5)
minitest (5.20.0)
minitest-reporters (1.6.1)
ansi
@ -221,8 +211,7 @@ GEM
net-protocol
netrc (0.11.0)
nio4r (2.7.0)
nokogiri (1.15.5)
mini_portile2 (~> 2.8.2)
nokogiri (1.16.0-x86_64-linux)
racc (~> 1.4)
ox (2.14.17)
paypal-recurring (1.1.0)
@ -239,7 +228,8 @@ GEM
rack (2.2.8)
rack-cache (1.15.0)
rack (>= 0.4)
rack-protection (3.1.0)
rack-protection (3.2.0)
base64 (>= 0.1.0)
rack (~> 2.2, >= 2.2.4)
rack-test (2.1.0)
rack (>= 1.3)
@ -269,6 +259,7 @@ GEM
rszr (1.3.0)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
sanitize (6.1.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
@ -278,6 +269,10 @@ GEM
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sax-machine (1.3.2)
selenium-webdriver (4.16.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
sequel (5.75.0)
bigdecimal
sequel_pg (1.17.1)
@ -298,10 +293,10 @@ GEM
simplecov_json_formatter (0.1.4)
simpleidn (0.2.1)
unf (~> 0.1.4)
sinatra (3.1.0)
sinatra (3.2.0)
mustermann (~> 3.0)
rack (~> 2.2, >= 2.2.4)
rack-protection (= 3.1.0)
rack-protection (= 3.2.0)
tilt (~> 2.0)
sinatra-flash (0.3.0)
sinatra (>= 1.0.0)
@ -342,16 +337,13 @@ GEM
ffi (>= 1.9.0)
ffi-compiler (>= 0.1.2)
webrick (1.8.1)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
websocket (1.2.10)
will_paginate (4.0.0)
xmlrpc (0.3.3)
webrick
xpath (3.2.0)
nokogiri (~> 1.8)
zip_tricks (5.6.0)
zipruby (0.3.6)
PLATFORMS
x86_64-linux
@ -361,7 +353,6 @@ DEPENDENCIES
activesupport
addressable (>= 2.8.0)
adequate_crypto_address
apparition!
bcrypt
capybara
certified
@ -416,6 +407,7 @@ DEPENDENCIES
rszr
sanitize
sass
selenium-webdriver
sequel
sequel_pg
shotgun
@ -437,7 +429,6 @@ DEPENDENCIES
will_paginate
xmlrpc
zip_tricks
zipruby
BUNDLED WITH
2.3.10

View file

@ -813,33 +813,6 @@ class Site < Sequel::Model
true
end
def files_zip
zip_name = "neocities-#{username}"
tmpfile = Tempfile.new 'neocities-site-zip'
tmpfile.close
begin
Zip::Archive.open(tmpfile.path, Zip::CREATE) do |ar|
ar.add_dir(zip_name)
Dir.glob("#{base_files_path}/**/*").each do |path|
relative_path = path.gsub(base_files_path+'/', '')
if File.directory?(path)
ar.add_dir(zip_name+'/'+relative_path)
else
ar.add_file(zip_name+'/'+relative_path, path) # add_file(<entry name>, <source path>)
end
end
end
rescue => e
tmpfile.unlink
raise e
end
tmpfile.path
end
def move_files_from(oldusername)
FileUtils.mkdir_p self.class.sharding_base_path(username)
FileUtils.mkdir_p self.class.sharding_screenshots_path(username)

View file

@ -2,6 +2,8 @@ require_relative './environment.rb'
describe '/admin' do
include Capybara::DSL
include Capybara::Minitest::Assertions
before do
Capybara.reset_sessions!

View file

@ -2,6 +2,7 @@ require_relative './environment.rb'
describe '/browse' do
include Capybara::DSL
include Capybara::Minitest::Assertions
=begin
describe 'as admin' do

View file

@ -4,8 +4,8 @@ describe 'dashboard' do
describe 'create directory' do
describe 'logged in' do
include Capybara::DSL
include Capybara::Minitest::Assertions
before do
Capybara.reset_sessions!

View file

@ -2,6 +2,7 @@ require_relative './environment.rb'
describe 'signup' do
include Capybara::DSL
include Capybara::Minitest::Assertions
def fill_in_valid
@site = Fabricate.attributes_for(:site)
@ -13,7 +14,7 @@ describe 'signup' do
end
before do
Capybara.default_driver = :apparition
Capybara.default_driver = :selenium_chrome_headless
Capybara.reset_sessions!
visit '/education'
_(page).must_have_content 'Neocities' # Used to force load wait

View file

@ -1,38 +1,17 @@
require_relative '../environment'
require 'capybara'
require 'capybara/minitest'
require 'capybara/minitest/spec'
require 'rack_session_access/capybara'
require 'capybara/apparition'
Capybara.app = Sinatra::Application
include Capybara::Minitest::Assertions
Capybara.default_max_wait_time = 5
#Capybara.register_driver :apparition do |app|
# Capybara::Apparition::Driver.new(app, headless: false)
#end
Capybara.register_driver :selenium_chrome_headless_largewindow do |app|
options = ::Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--window-size=1280,800') # Set your desired window size
=begin
def setup
Capybara.current_driver = :apparition
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
def teardown
Capybara.reset_sessions!
Capybara.use_default_driver
end
=end
=begin
require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'
require 'rack_session_access/capybara'
Capybara.app = Sinatra::Application
def teardown
Capybara.reset_sessions!
end
=end

View file

@ -2,6 +2,7 @@ require_relative './environment.rb'
describe '/' do
include Capybara::DSL
include Capybara::Minitest::Assertions
describe 'news feed' do
before do
@ -21,7 +22,8 @@ describe '/' do
@another_site = Fabricate :site
@followed_site.toggle_follow @another_site
visit '/'
_(find('.news-item', match: :first).text).must_match /#{@followed_site.username} followed #{@another_site.username}/i
_(page).must_have_link(@followed_site.title, href: "/site/#{@followed_site.username}")
#_(find('.news-item', match: :first).text).must_match /#{@followed_site.username} followed #{@another_site.username}/i
end
it 'loads my activities only' do
@ -30,7 +32,7 @@ describe '/' do
@another_site = Fabricate :site
@followed_site.toggle_follow @another_site
visit '/?activity=mine'
_(find('.news-item').text).must_match //i
_(page).must_have_link(@followed_site.title, href: "/site/#{@followed_site.username}")
end
it 'loads a specific event with the id' do

View file

@ -2,6 +2,7 @@ require_relative './environment.rb'
describe '/password_reset' do
include Capybara::DSL
include Capybara::Minitest::Assertions
before do
Capybara.reset_sessions!
@ -67,7 +68,7 @@ describe '/password_reset' do
fill_in 'email', with: @site.email
click_button 'Send Reset Token'
_(body).must_match /send an e-mail to your account with password reset instructions/
_(body).must_match /We sent an e-mail with password reset instructions/
_(@site.reload.password_reset_token.blank?).must_equal false
_(EmailWorker.jobs.first['args'].first['body']).must_match /#{Rack::Utils.build_query(username: @site.username, token: @site.password_reset_token)}/

View file

@ -1,9 +1,10 @@
require_relative '../environment.rb'
describe 'site/settings' do
describe 'email' do
include Capybara::DSL
include Capybara::Minitest::Assertions
describe 'email' do
before do
EmailWorker.jobs.clear
@email = "#{SecureRandom.uuid.gsub('-', '')}@exampleedsdfdsf.com"
@ -84,8 +85,6 @@ describe 'site/settings' do
end
describe 'unsubscribe email' do
include Capybara::DSL
before do
@email = "#{SecureRandom.uuid.gsub('-', '')}@exampleedsdfdsf.com"
@site = Fabricate :site, email: @email
@ -127,8 +126,6 @@ describe 'site/settings' do
end
describe 'change password' do
include Capybara::DSL
before do
EmailWorker.jobs.clear
@site = Fabricate :site, password: 'derpie'

View file

@ -1,88 +1,10 @@
require_relative '../environment.rb'
def generate_ssl_certs(opts={})
# https://github.com/kyledrake/ruby-openssl-cheat-sheet/blob/master/certificate_authority.rb
res = {}
ca_keypair = OpenSSL::PKey::RSA.new(2048)
ca_cert = OpenSSL::X509::Certificate.new
ca_cert.not_before = Time.now
ca_cert.subject = OpenSSL::X509::Name.new([
["C", "US"],
["ST", "Oregon"],
["L", "Portland"],
["CN", "Neocities CA"]
])
ca_cert.issuer = ca_cert.subject
ca_cert.not_after = Time.now + 1000000000 # 40 or so years
ca_cert.serial = 1
ca_cert.public_key = ca_keypair.public_key
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = ca_cert
ef.issuer_certificate = ca_cert
# Read more about the various extensions here: http://www.openssl.org/docs/apps/x509v3_config.html
ca_cert.add_extension(ef.create_extension("basicConstraints", "CA:TRUE", true))
ca_cert.add_extension(ef.create_extension("keyUsage","keyCertSign, cRLSign", true))
ca_cert.add_extension(ef.create_extension("subjectKeyIdentifier", "hash", false))
ca_cert.add_extension(ef.create_extension("authorityKeyIdentifier", "keyid:always", false))
ca_cert.sign(ca_keypair, OpenSSL::Digest::SHA256.new)
res[:ca_cert] = ca_cert
res[:ca_keypair] = ca_keypair
ca_cert = OpenSSL::X509::Certificate.new(res[:ca_cert].to_pem)
our_cert_keypair = OpenSSL::PKey::RSA.new(2048)
our_cert_req = OpenSSL::X509::Request.new
our_cert_req.subject = OpenSSL::X509::Name.new([
["C", "US"],
["ST", "Oregon"],
["L", "Portland"],
["O", "Neocities User"],
["CN", "*.#{opts[:domain]}"]
])
our_cert_req.public_key = our_cert_keypair.public_key
our_cert_req.sign our_cert_keypair, OpenSSL::Digest::SHA1.new
our_cert = OpenSSL::X509::Certificate.new
our_cert.subject = our_cert_req.subject
our_cert.issuer = ca_cert.subject
our_cert.not_before = Time.now
if opts[:expired]
our_cert.not_after = Time.now - 100000000
else
our_cert.not_after = Time.now + 100000000
end
our_cert.serial = 123 # Should be an unique number, the CA probably has a database.
our_cert.public_key = our_cert_req.public_key
# To make the certificate valid for both wildcard and top level domain name, we need an extension.
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = our_cert
ef.issuer_certificate = ca_cert
our_cert.add_extension(ef.create_extension("subjectAltName", "DNS:#{@domain}, DNS:*.#{@domain}", false))
our_cert.sign res[:ca_keypair], OpenSSL::Digest::SHA1.new
our_cert_tmpfile = Tempfile.new 'our_cert'
our_cert_tmpfile.write our_cert.to_pem
our_cert_tmpfile.close
res[:cert_path] = our_cert_tmpfile.path
res[:key_path] = '/tmp/nc_test_our_cert_keypair'
File.write res[:key_path], our_cert_keypair.to_pem
res[:cert_intermediate_path] = '/tmp/nc_test_ca_cert'
File.write res[:cert_intermediate_path], res[:ca_cert].to_pem
res[:combined_cert_path] = '/tmp/nc_test_combined_cert'
File.write res[:combined_cert_path], "#{File.read(res[:cert_path])}\n#{File.read(res[:cert_intermediate_path])}"
res[:bad_combined_cert_path] = '/tmp/nc_test_bad_combined_cert'
File.write res[:bad_combined_cert_path], "#{File.read(res[:cert_intermediate_path])}\n#{File.read(res[:cert_path])}"
res
end
describe 'site/settings' do
describe 'permissions' do
include Capybara::DSL
include Capybara::Minitest::Assertions
describe 'permissions' do
before do
@parent_site = Fabricate :site
@child_site = Fabricate :site, parent_site_id: @parent_site.id
@ -104,8 +26,6 @@ describe 'site/settings' do
end
describe 'changing username' do
include Capybara::DSL
before do
Capybara.reset_sessions!
@site = Fabricate :site
@ -143,11 +63,8 @@ describe 'site/settings' do
_(page).must_have_content /You already have this name/
end
end
end
describe 'api key' do
include Capybara::DSL
describe 'api key' do
before do
Capybara.reset_sessions!
@site = Fabricate :site
@ -172,11 +89,9 @@ describe 'api key' do
click_button 'Generate API Key'
_(@child_site.reload.api_key).wont_equal api_key
end
end
describe 'delete' do
include Capybara::DSL
end
describe 'delete' do
before do
Capybara.reset_sessions!
@site = Fabricate :site
@ -281,4 +196,5 @@ describe 'delete' do
visit "/settings/#{@site.username}#delete"
_(page.body).must_match /You cannot delete the parent site without deleting the children sites first/i
end
end
end

View file

@ -2,6 +2,7 @@ require_relative './environment.rb'
describe 'signin' do
include Capybara::DSL
include Capybara::Minitest::Assertions
def fill_in_valid
@site = Fabricate.attributes_for :site

View file

@ -2,6 +2,7 @@ require_relative './environment.rb'
describe 'signup' do
include Capybara::DSL
include Capybara::Minitest::Assertions
def fill_in_valid
@site = Fabricate.attributes_for(:site)
@ -24,7 +25,7 @@ describe 'signup' do
end
before do
Capybara.default_driver = :apparition
Capybara.default_driver = :selenium_chrome_headless_largewindow
Capybara.reset_sessions!
visit_signup
end
@ -39,7 +40,6 @@ describe 'signup' do
fill_in_valid
click_signup_button
site_created?
click_link 'Continue'
_(page).must_have_content /almost ready!/
fill_in 'token', with: Site[username: @site[:username]].email_confirmation_token

View file

@ -2,6 +2,7 @@ require_relative './environment.rb'
describe 'site page' do
include Capybara::DSL
include Capybara::Minitest::Assertions
after do
Capybara.default_driver = :rack_test

View file

@ -2,9 +2,10 @@ require_relative './environment.rb'
describe '/supporter' do
include Capybara::DSL
include Capybara::Minitest::Assertions
before do
Capybara.default_driver = :apparition
Capybara.default_driver = :selenium_chrome_headless
Capybara.reset_sessions!
@site = Fabricate :site