update TOOD entry in README about gemification
[coquelicot.git] / spec / spec_helper.rb
1 # -*- coding: UTF-8 -*-
2 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
3 # Copyright © 2010-2013 potager.org <jardiniers@potager.org>
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License as
7 # published by the Free Software Foundation, either version 3 of the
8 # License, or (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU Affero General Public License for more details.
14 #
15 # You should have received a copy of the GNU Affero General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 ENV['RACK_ENV'] = 'test'
19
20 require 'rubygems'
21 require 'bundler'
22 Bundler.require(:default, :development)
23 Bundler.setup
24
25 require 'rack/test'
26 require 'rspec'
27 require 'stringio'
28
29 require 'coquelicot'
30
31 shared_context 'with Coquelicot::Application' do
32   def app
33     Coquelicot::Application
34   end
35
36   before do
37     app.set :environment, :test
38   end
39
40   around(:each) do |example|
41     path = Dir.mktmpdir('coquelicot')
42     begin
43       @depot_path = path
44       app.set :depot_path, path
45       example.run
46     ensure
47       FileUtils.remove_entry_secure path
48     end
49   end
50 end
51
52 module StoredFileHelpers
53   FIXTURES = { 'LICENSE-secret-1.0' => '1.0',
54                'small-secret-1.0' => 'small 1.0',
55                'LICENSE-secret-2.0' => '2.0'
56              }
57
58   shared_context 'with a StoredFile fixture' do |name|
59     let(:stored_file_path) {
60       File.expand_path("../fixtures/#{name}/stored_file", __FILE__)
61     }
62     let(:stored_file) { Coquelicot::StoredFile.open(stored_file_path, 'secret') }
63     let(:reference) {
64       YAML.load_file(File.expand_path("../fixtures/#{name}/reference", __FILE__))
65     }
66   end
67
68   def for_all_file_versions(&block)
69     FIXTURES.each_pair do |name, description|
70       context "with a #{description} file" do
71         include_context 'with a StoredFile fixture', name
72         instance_eval &block
73       end
74     end
75   end
76 end
77
78 module CoquelicotSpecHelpers
79   # written by cash on
80   # http://rails-bestpractices.com/questions/1-test-stdin-stdout-in-rspec
81   def capture(*streams)
82     streams.map! { |stream| stream.to_s }
83     begin
84       result = StringIO.new
85       streams.each { |stream| eval "$#{stream} = result" }
86       yield
87     ensure
88       streams.each { |stream| eval("$#{stream} = #{stream.upcase}") }
89     end
90     result.string
91   end
92
93   if defined? Encoding
94     def slurp(path)
95       File.read(path, :encoding => 'binary')
96     end
97   else
98     def slurp(path)
99       File.read(path)
100     end
101   end
102 end
103
104 ::RSpec.configure do |c|
105   c.extend StoredFileHelpers
106   c.include CoquelicotSpecHelpers
107 end