Protect uploads with a password
[coquelicot.git] / test_coquelicot.rb
1 $:.unshift File.join(File.dirname(__FILE__), '../rack-test/lib')
2
3 require 'coquelicot'
4 require 'spec'
5 require 'rack/test'
6 require 'hpricot'
7
8 UPLOAD_PASSWORD = 'secret'
9
10 set :environment, :test
11 set :upload_password, Digest::SHA1.hexdigest(UPLOAD_PASSWORD)
12
13 describe 'Coquelicot' do
14   include Rack::Test::Methods
15
16   def app
17     Sinatra::Application
18   end
19
20   it "should offer an upload form" do
21     get '/'
22     last_response.should be_ok
23     doc = Hpricot(last_response.body)
24     (doc/"form#upload").should have(1).items
25   end
26
27   it "should accept an uploaded file" do
28     post '/upload', 'file' => Rack::Test::UploadedFile.new(__FILE__, 'text/x-script.ruby'),
29                     'upload_password' => UPLOAD_PASSWORD
30     last_response.redirect?.should be_true
31     last_response['Location'].should eql("ready/#{File.basename(__FILE__)}")
32   end
33
34   it "should allow retrieval of an uploaded file" do
35     post '/upload', 'file' => Rack::Test::UploadedFile.new(__FILE__, 'text/x-script.ruby'),
36                     'upload_password' => UPLOAD_PASSWORD
37     follow_redirect!
38     last_response.should be_ok
39     doc = Hpricot(last_response.body)
40     url = (doc/'a').collect { |a| a.attributes['href'] }.
41       select { |h| h.start_with? "http://#{last_request.host}/" }[0]
42     get url
43     last_response.should be_ok
44     last_response['Content-Type'].should eql('text/x-script.ruby')
45     last_response.body.should eql(File.new(__FILE__).read)
46   end
47
48   it "should prevent upload without a password" do
49     post '/upload', 'file' => Rack::Test::UploadedFile.new(__FILE__, 'text/x-script.ruby')
50     last_response.status.should eql(403)
51   end
52
53   it "should prevent upload with a wrong password" do
54     post '/upload', 'file' => Rack::Test::UploadedFile.new(__FILE__, 'text/x-script.ruby'),
55                     'upload_password' => "bad"
56     last_response.status.should eql(403)
57   end
58
59   it "should not store an uploaded file in cleartext"
60
61   it "should generate a random URL to retrieve a file"
62
63   it "should store files with a different name than then one in URL"
64
65   it "should encode the encryption key in URL when no password has been specified"
66
67   it "should not encode the encryption key in URL when no password has been specified"
68
69   it "should give a random password when asked"
70
71   it "should allow retrieval of a password protected file"
72
73   it "should not allow retrieval of a password protected file without the password"
74
75   it "should not allow retrieval after the time limit has expired"
76
77   it "should cleanup expired files"
78 end