rework, rephrase, refactor tests
authorLunar <lunar@anargeek.net>
Wed, 8 Sep 2010 10:48:17 +0000 (12:48 +0200)
committerLunar <lunar@anargeek.net>
Wed, 8 Sep 2010 10:48:17 +0000 (12:48 +0200)
test_coquelicot.rb

index 6268d5b..ce1929a 100644 (file)
@@ -47,32 +47,73 @@ describe 'Coquelicot' do
     (doc/"form#upload").should have(1).items
   end
 
-  it "should allow retrieval of an uploaded file" do
-    url = upload
-    get url
-    last_response.should be_ok
-    last_response['Content-Type'].should eql('text/x-script.ruby')
-    last_response.body.should eql(File.new(__FILE__).read)
-  end
+  context "after a successful upload" do
+    before(:each) do
+      @url = upload
+    end
 
-  it "should refuse an empty file" do
-    empty_file = Tempfile.new('empty')
-    begin
-      url = upload :file => Rack::Test::UploadedFile.new(empty_file.path, 'text/plain')
-      url.should be_nil
-      last_response.redirect?.should be_false
-    ensure
-      empty_file.close true
+    it "should not store the file in cleartext" do
+      files = Dir.glob("#{Coquelicot.depot.path}/*")
+      files.should have(1).items
+      File.new(files[0]).read().should_not include('should not store an uploaded file')
+    end
+
+    it "should generate a random URL to download the file" do
+      @url.should_not include(File.basename(__FILE__))
+    end
+
+    it "should store the file with a different name than the one in URL" do
+      url_name = @url.split('/')[-1]
+      files = Dir.glob("#{Coquelicot.depot.path}/*")
+      files.should have(1).items
+      url_name.should_not eql(File.basename(files[0]))
+    end
+
+    it "should encode the encryption key in URL as no password has been specified" do
+      url_name = @url.split('/')[-1]
+      url_name.split('-').should have(2).items
+    end
+
+    it "should download when using extra Base32 characters in URL" do
+      splitted = @url.split('/')
+      name = splitted[-1].upcase.gsub(/O/, '0').gsub(/L/, '1')
+      get "#{splitted[0..-2].join '/'}/#{name}"
+      last_response.should be_ok
+      last_response['Content-Type'].should eql('text/x-script.ruby')
+    end
+
+    context "when the file has been downloaded" do
+      before(:each) do
+        get @url
+      end
+
+      it "should be the same file as the uploaded" do
+        last_response.should be_ok
+        last_response['Content-Type'].should eql('text/x-script.ruby')
+        last_response.body.should eql(File.new(__FILE__).read)
+      end
+
+      it "should always has the same Last-Modified header" do
+        last_modified = last_response['Last-Modified']
+        last_modified.should_not be_nil
+        get @url
+        last_response['Last-Modified'].should eql(last_modified)
+      end
     end
   end
 
-  it "should correctly set Last-Modified header when downloading" do
-    url = upload
-    get url
-    last_modified = last_response['Last-Modified']
-    last_modified.should_not be_nil
-    get url
-    last_response['Last-Modified'].should eql(last_modified)
+  context "given an empty file" do
+    before do
+      @empty_file = Tempfile.new('empty')
+    end
+    it "should not be accepted when uploaded" do
+      url = upload :file => Rack::Test::UploadedFile.new(@empty_file.path, 'text/plain')
+      url.should be_nil
+      last_response.should_not be_redirect
+    end
+    after do
+      @empty_file.close true
+    end
   end
 
   it "should prevent upload without a password" do
@@ -99,38 +140,6 @@ describe 'Coquelicot' do
     last_response.status.should eql(403)
   end
 
-  it "should not store an uploaded file in cleartext" do
-    upload
-    files = Dir.glob("#{Coquelicot.depot.path}/*")
-    files.should have(1).items
-    File.new(files[0]).read().should_not include('should not store an uploaded file')
-  end
-
-  it "should generate a random URL to retrieve a file" do
-    url = upload
-    url.should_not include(File.basename(__FILE__))
-  end
-
-  it "should store files with a different name than then one in URL" do
-    url = upload
-    url_name = url.split('/')[-1]
-    files = Dir.glob("#{Coquelicot.depot.path}/*")
-    files.should have(1).items
-    url_name.should_not eql(File.basename(files[0]))
-  end
-
-  it "should encode the encryption key in URL when no password has been specified" do
-    url = upload
-    url_name = url.split('/')[-1]
-    url_name.split('-').should have(2).items
-  end
-
-  it "should not encode the encryption key in URL when a password has been specified" do
-    url = upload :file_key => 'somethingSecret'
-    url_name = url.split('/')[-1]
-    url_name.split('-').should have(1).items
-  end
-
   context "when a 'one time download' has been retrieved" do
     before(:each) do
       @url = upload :one_time => true
@@ -155,44 +164,59 @@ describe 'Coquelicot' do
     end
   end
 
-  it "should allow retrieval of a password protected file" do
-    url = upload :file_key => 'somethingSecret'
-    get url
-    last_response.should be_ok
-    doc = Hpricot(last_response.body)
-    (doc/'input#file_key').should have(1).items
-    url = (doc/'form')[0].attributes['action']
-    post url, :file_key => 'somethingSecret'
-    last_response.should be_ok
-    last_response['Content-Type'].should eql('text/x-script.ruby')
-    last_response.body.should eql(File.new(__FILE__).read)
-  end
+  context "after a password protected upload" do
+    before(:each) do
+      @url = upload :file_key => 'somethingSecret'
+    end
 
-  it "should not allow retrieval of a password protected file without the password" do
-    url = upload :file_key => 'somethingSecret'
-    get url
-    last_response.should be_ok
-    last_response['Content-Type'].should_not eql('text/x-script.ruby')
-    post url
-    last_response.status.should eql(403)
-  end
+    it "should not return an URL with the encryption key" do
+      url_name = @url.split('/')[-1]
+      url_name.split('-').should have(1).items
+    end
 
-  it "should not allow retrieval of a password protected file with a wrong password" do
-    url = upload :file_key => 'somethingSecret'
-    post url, :file_key => 'BAD'
-    last_response.status.should eql(403)
+    it "should offer a password form before download" do
+      get @url
+      last_response.should be_ok
+      last_response['Content-Type'].should eql('text/html')
+      doc = Hpricot(last_response.body)
+      (doc/'input#file_key').should have(1).items
+    end
+
+    context "when given the correct password" do
+      it "should download the same file" do
+        post @url, :file_key => 'somethingSecret'
+        last_response.should be_ok
+        last_response['Content-Type'].should eql('text/x-script.ruby')
+        last_response.body.should eql(File.new(__FILE__).read)
+      end
+    end
+
+    it "should prevent download without a password" do
+      post @url
+      last_response.status.should eql(403)
+    end
+
+    it "should prevent download with a wrong password" do
+      post @url, :file_key => 'BAD'
+      last_response.status.should eql(403)
+    end
   end
 
-  it "should not allow retrieval after the time limit has expired" do
-    url = upload :expire => 60 # 1 hour
-    # let's be tomorrow
-    Timecop.travel(Date.today + 1) do
-      get url
-      last_response.status.should eql(410)
+  context "after an upload with a time limit" do
+    before(:each) do
+      @url = upload :expire => 60 # 1 hour
+    end
+
+    it "should prevent download after the time limit has expired" do
+      # let's be tomorrow
+      Timecop.travel(Date.today + 1) do
+        get @url
+        last_response.status.should eql(410)
+      end
     end
   end
 
-  it "should not allow an expiration time longer than the maximum" do
+  it "should refuse an expiration time longer than the maximum" do
     upload :expire => 60 * 24 * 31 * 12 # 1 year
     last_response.status.should eql(403)
   end
@@ -216,13 +240,4 @@ describe 'Coquelicot' do
       Coquelicot.depot.get_file(url_name).should be_nil
     end
   end
-
-  it "should map extra base32 characters to filenames" do
-    url = upload :expire => 60 # 1 hour
-    splitted = url.split('/')
-    name = splitted[-1].upcase.gsub(/O/, '0').gsub(/L/, '1')
-    get "#{splitted[0..-2].join '/'}/#{name}"
-    last_response.should be_ok
-    last_response['Content-Type'].should eql('text/x-script.ruby')
-  end
 end