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