From 2ce668b9ea914c64b87c9d2803c77b6d34031f75 Mon Sep 17 00:00:00 2001 From: Brandon Robins Date: Sun, 11 Mar 2018 16:38:50 -0500 Subject: [PATCH] Improve testing setup --- spec/dummy/config/routes.rb | 4 +- spec/rails_helper.rb | 4 +- spec/requests/mkcol_spec.rb | 60 +++++++-------- spec/requests/options_spec.rb | 73 +++++++++++-------- spec/requests/propfind_spec.rb | 21 +++--- spec/resource/resource_spec.rb | 14 ++++ .../calligraphy_resource_routes_spec.rb | 10 +++ spec/support/request_helpers.rb | 4 + spec/support/resource_helpers.rb | 49 +++++++++++++ 9 files changed, 163 insertions(+), 76 deletions(-) create mode 100644 spec/support/resource_helpers.rb diff --git a/spec/dummy/config/routes.rb b/spec/dummy/config/routes.rb index 45d8836..feaee24 100644 --- a/spec/dummy/config/routes.rb +++ b/spec/dummy/config/routes.rb @@ -1,4 +1,6 @@ Rails.application.routes.draw do calligraphy_resource :test - calligraphy_resource :webdav, resource_class: Calligraphy::FileResource, resource_root_path: File.expand_path('../../../../tmp/webdav', __FILE__) + calligraphy_resource :webdav, + resource_class: Calligraphy::FileResource, + resource_root_path: File.expand_path('../../../../tmp/webdav', __FILE__) end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index d00b547..a92a0cc 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -22,7 +22,7 @@ require 'rspec/rails' # directory. Alternatively, in the individual `*_spec.rb` files, manually # require only the support files necessary. # -Dir[Rails.root.join('../support/**/*.rb')].each { |f| require f } +# Dir[Rails.root.join('../support/**/*.rb')].each { |f| require f } # Checks for pending migrations and applies them before tests are run. # If you are not using ActiveRecord, you can remove this line. @@ -57,3 +57,5 @@ RSpec.configure do |config| # arbitrary gems may also be filtered via: # config.filter_gems_from_backtrace("gem name") end + +require 'support/resource_helpers' diff --git a/spec/requests/mkcol_spec.rb b/spec/requests/mkcol_spec.rb index 6cdd8ea..1271474 100644 --- a/spec/requests/mkcol_spec.rb +++ b/spec/requests/mkcol_spec.rb @@ -5,47 +5,47 @@ require 'support/request_helpers' require 'support/examples/ext_mkcol' RSpec.describe 'mkcol', type: :request do - before(:all) do - tmp_dir = Rails.root.join('../../tmp').to_path - Dir.mkdir tmp_dir unless File.exist? tmp_dir - - webdav_dir = Rails.root.join('../../tmp/webdav').to_path - FileUtils.rm_r webdav_dir if File.exist? webdav_dir - Dir.mkdir webdav_dir + before(:context) do + Calligraphy::FileResource.setup end before(:each) do - allow(Calligraphy).to receive(:enable_digest_authentication) - .and_return(false) + skip_authentication end - it 'creates a collection with additional properties' do - allow_any_instance_of(Calligraphy::FileResource).to receive( - :valid_resourcetypes - ).and_return(%w[collection special-resource]) - - expect(Dir).to receive(:mkdir).and_call_original - expect_any_instance_of(Calligraphy::FileResource).to receive( - :proppatch - ) - - mkcol '/webdav/special', headers: { - RAW_POST_DATA: Support::Examples::ExtMkcol.rfc5689_3_4 - } - - expect(response.body.empty?).to eq(true) - expect(response.status).to eq(201) + after(:context) do + Calligraphy::FileResource.cleanup end - context 'with an invalid resource type' do - it 'returns an error response' do + context "for #{Calligraphy::FileResource}" do + it 'creates a collection with additional properties' do + allow_any_instance_of(Calligraphy::FileResource).to receive( + :valid_resourcetypes + ).and_return(%w[collection special-resource]) + + expect(Dir).to receive(:mkdir).and_call_original + expect_any_instance_of(Calligraphy::FileResource).to receive( + :proppatch + ) + mkcol '/webdav/special', headers: { RAW_POST_DATA: Support::Examples::ExtMkcol.rfc5689_3_4 } - expect(response.status).to eq(403) - expect(response.body).to include('mkcol-response') - expect(response.body).to include('valid-resourcetype') + expect(response.body.empty?).to eq(true) + expect(response.status).to eq(201) + end + + context 'with an invalid resource type' do + it 'returns an error response' do + mkcol '/webdav/special', headers: { + RAW_POST_DATA: Support::Examples::ExtMkcol.rfc5689_3_4 + } + + expect(response.status).to eq(403) + expect(response.body).to include('mkcol-response') + expect(response.body).to include('valid-resourcetype') + end end end end diff --git a/spec/requests/options_spec.rb b/spec/requests/options_spec.rb index 04b7812..2d44cd8 100644 --- a/spec/requests/options_spec.rb +++ b/spec/requests/options_spec.rb @@ -4,48 +4,57 @@ require 'rails_helper' require 'support/request_helpers' RSpec.describe 'OPTIONS', type: :request do + before(:context) do + Calligraphy::FileResource.setup + end + before(:each) do - allow(Calligraphy).to receive(:enable_digest_authentication) - .and_return(false) + skip_authentication end - context 'when not using extended MKCOL support' do - before(:each) do - allow_any_instance_of(Calligraphy::FileResource).to receive( - :enable_extended_mkcol? - ).and_return(false) - end - - it 'advertises support for all 3 WebDAV classes' do - options '/webdav/special' - - %w[1 2 3].each { |c| expect(response.headers['DAV']).to include(c) } - end - - it 'does not advertise support for extended-mkcol' do - options '/webdav/special' - - expect(response.headers['DAV']).to_not include('extended-mkcol') - end + after(:context) do + Calligraphy::FileResource.cleanup end - context 'when using extended MKCOL support' do - before(:each) do - allow_any_instance_of(Calligraphy::FileResource).to receive( - :enable_extended_mkcol? - ).and_return(true) + context "for #{Calligraphy::FileResource}" do + context 'when not using extended MKCOL support' do + before(:each) do + allow_any_instance_of(Calligraphy::FileResource).to receive( + :enable_extended_mkcol? + ).and_return(false) + end + + it 'advertises support for all 3 WebDAV classes' do + options '/webdav/special' + + %w[1 2 3].each { |c| expect(response.headers['DAV']).to include(c) } + end + + it 'does not advertise support for extended-mkcol' do + options '/webdav/special' + + expect(response.headers['DAV']).to_not include('extended-mkcol') + end end - it 'advertises support for all 3 WebDAV classes' do - options '/webdav/special' + context 'when using extended MKCOL support' do + before(:each) do + allow_any_instance_of(Calligraphy::FileResource).to receive( + :enable_extended_mkcol? + ).and_return(true) + end - %w[1 2 3].each { |c| expect(response.headers['DAV']).to include(c) } - end + it 'advertises support for all 3 WebDAV classes' do + options '/webdav/special' - it 'advertises support for extended-mkcol' do - options '/webdav/special' + %w[1 2 3].each { |c| expect(response.headers['DAV']).to include(c) } + end - expect(response.headers['DAV']).to include('extended-mkcol') + it 'advertises support for extended-mkcol' do + options '/webdav/special' + + expect(response.headers['DAV']).to include('extended-mkcol') + end end end end diff --git a/spec/requests/propfind_spec.rb b/spec/requests/propfind_spec.rb index 1778bc6..4fca5c2 100644 --- a/spec/requests/propfind_spec.rb +++ b/spec/requests/propfind_spec.rb @@ -6,25 +6,22 @@ require 'support/examples/propfind' require 'support/examples/proppatch' RSpec.describe 'PROPFIND', type: :request do - before(:all) do - tmp_dir = Rails.root.join('../../tmp').to_path - Dir.mkdir tmp_dir unless File.exist? tmp_dir - - webdav_dir = Rails.root.join('../../tmp/webdav').to_path - FileUtils.rm_r webdav_dir if File.exist? webdav_dir - Dir.mkdir webdav_dir + before(:context) do + Calligraphy::FileResource.setup end before(:each) do - allow(Calligraphy).to receive(:enable_digest_authentication) - .and_return(false) + skip_authentication + end + + after(:context) do + Calligraphy::FileResource.cleanup end context 'with xml defintiion' do before(:each) do - put '/webdav/bar.html', headers: { - RAW_POST_DATA: 'hello world' - } + Calligraphy::FileResource.create resource: 'bar.html' + proppatch '/webdav/bar.html', headers: { RAW_POST_DATA: Support::Examples::Proppatch.rfc4918_9_2_2 } diff --git a/spec/resource/resource_spec.rb b/spec/resource/resource_spec.rb index 4568b8a..843c9b9 100644 --- a/spec/resource/resource_spec.rb +++ b/spec/resource/resource_spec.rb @@ -46,5 +46,19 @@ RSpec.describe 'Resource' do expect(resource.dav_compliance).to eq('1, 2, 3') end end + + describe '#enable_extended_mkcol?' do + it 'is not enabled by default' do + resource = Calligraphy::Resource.new + expect(resource.enable_extended_mkcol?).to eq(false) + end + end + + describe '#valid_resourcetypes' do + it 'returns only a collection resourcetype by default' do + resource = Calligraphy::Resource.new + expect(resource.valid_resourcetypes).to match_array(['collection']) + end + end end end diff --git a/spec/routing/calligraphy_resource_routes_spec.rb b/spec/routing/calligraphy_resource_routes_spec.rb index dcdaa5e..b7f2cc4 100644 --- a/spec/routing/calligraphy_resource_routes_spec.rb +++ b/spec/routing/calligraphy_resource_routes_spec.rb @@ -113,5 +113,15 @@ RSpec.describe 'calligraphy_resource', type: :routing do ) end end + + context 'for HEAD requests' do + it do + expect(head: '/test/twelve').to route_to( + controller: 'calligraphy/rails/web_dav_requests', + action: 'invoke_method', + resource: 'twelve' + ) + end + end end end diff --git a/spec/support/request_helpers.rb b/spec/support/request_helpers.rb index dad6d7a..770ff97 100644 --- a/spec/support/request_helpers.rb +++ b/spec/support/request_helpers.rb @@ -15,3 +15,7 @@ module ActionDispatch end end end + +def skip_authentication + allow(Calligraphy).to receive(:enable_digest_authentication).and_return(false) +end diff --git a/spec/support/resource_helpers.rb b/spec/support/resource_helpers.rb new file mode 100644 index 0000000..a561c90 --- /dev/null +++ b/spec/support/resource_helpers.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +RESOURCES_TO_TEST_AGAINST = [ + Calligraphy::FileResource +].freeze + +module RSpecMethods + def setup; end + + def cleanup; end + + def create(resource:, content: 'Hi hi!'); end +end + +module FileResourceHelpers + def setup + tmp_dir = Rails.root.join('../../tmp').to_path + Dir.mkdir tmp_dir unless File.exist? tmp_dir + + FileUtils.rm_r resource_root if File.exist? resource_root + Dir.mkdir resource_root + end + + def cleanup + FileUtils.rm_r resource_root if File.exist? resource_root + end + + def create(resource:, content: 'Hello world') + resource = Calligraphy::FileResource.new( + resource: resource, + root_dir: resource_root + ) + resource.write content + end + + def resource_root + Rails.root.join('../../tmp/webdav').to_path + end +end + +RESOURCES_TO_TEST_AGAINST.each do |resource_class| + resource_class.send :extend, RSpecMethods +end + +module Calligraphy + class FileResource + extend FileResourceHelpers + end +end