Fix name-typo in NEWS
[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-2015 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 # Set a default time zone. Otherwise tests using Timecop fail when
30 # activesupport is loaded.
31 require 'active_support/time'
32 Time.zone = 'UTC'
33
34 require 'coquelicot'
35
36 shared_context 'with Coquelicot::Application' do
37   def app
38     Coquelicot::Application
39   end
40
41   before do
42     app.set :environment, :test
43   end
44
45   around(:each) do |example|
46     path = Dir.mktmpdir('coquelicot')
47     begin
48       @depot_path = File.join(path, 'depot')
49       FileUtils.mkdir(@depot_path)
50       app.set :depot_path, @depot_path
51       @cache_path = File.join(path, 'cache')
52       FileUtils.mkdir(@cache_path)
53       app.set :cache_path, @cache_path
54       example.run
55     ensure
56       FileUtils.remove_entry_secure path
57     end
58   end
59 end
60
61 module StoredFileHelpers
62   FIXTURES = { 'LICENSE-secret-1.0' => '1.0',
63                'small-secret-1.0' => 'small 1.0',
64                'LICENSE-secret-2.0' => '2.0'
65              }
66
67   shared_context 'with a StoredFile fixture' do |name|
68     let(:stored_file_path) {
69       File.expand_path("../fixtures/#{name}/stored_file", __FILE__)
70     }
71     let(:stored_file) { Coquelicot::StoredFile.open(stored_file_path, 'secret') }
72     let(:reference) {
73       YAML.load_file(File.expand_path("../fixtures/#{name}/reference", __FILE__))
74     }
75   end
76
77   def for_all_file_versions(&block)
78     FIXTURES.each_pair do |name, description|
79       context "with a #{description} file" do
80         include_context 'with a StoredFile fixture', name
81         instance_eval &block
82       end
83     end
84   end
85 end
86
87 module CoquelicotSpecHelpers
88   # written by cash on
89   # http://rails-bestpractices.com/questions/1-test-stdin-stdout-in-rspec
90   def capture(*streams)
91     streams.map! { |stream| stream.to_s }
92     begin
93       result = StringIO.new
94       streams.each { |stream| eval "$#{stream} = result" }
95       yield
96     ensure
97       streams.each { |stream| eval("$#{stream} = #{stream.upcase}") }
98     end
99     result.string
100   end
101
102   if defined? Encoding
103     def slurp(path)
104       File.read(path, :encoding => 'binary')
105     end
106   else
107     def slurp(path)
108       File.read(path)
109     end
110   end
111
112   # borrowed from https://gist.github.com/cyx/1325708
113   def xhr(path, params = {})
114     verb = params.delete(:as) || :get
115     send(verb, path, params, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest')
116   end
117 end
118
119 ::RSpec.configure do |c|
120   c.extend StoredFileHelpers
121   c.include CoquelicotSpecHelpers
122
123   c.expect_with :rspec do |e|
124     e.syntax = :expect
125   end
126 end