postfix_admin 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ ---
2
+ database: 'sqlite::memory:'
3
+ aliases: 30
4
+ mailboxes: 30
5
+ maxquota: 100
@@ -0,0 +1,250 @@
1
+ -- phpMyAdmin SQL Dump
2
+ -- version 3.4.7
3
+ -- http://www.phpmyadmin.net
4
+ --
5
+ -- ホスト: localhost
6
+ -- 生成時間: 2012 年 9 月 25 日 23:12
7
+ -- サーバのバージョン: 5.5.15
8
+ -- PHP のバージョン: 5.3.15
9
+
10
+ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
11
+ SET time_zone = "+00:00";
12
+
13
+
14
+ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
15
+ /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
16
+ /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
17
+ /*!40101 SET NAMES utf8 */;
18
+
19
+ --
20
+ -- データベース: `postfix_test`
21
+ --
22
+
23
+ -- --------------------------------------------------------
24
+
25
+ --
26
+ -- テーブルの構造 `admin`
27
+ --
28
+
29
+ CREATE TABLE IF NOT EXISTS `admin` (
30
+ `username` varchar(255) NOT NULL DEFAULT '',
31
+ `password` varchar(255) NOT NULL DEFAULT '',
32
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
33
+ `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
34
+ `active` tinyint(1) NOT NULL DEFAULT '1',
35
+ PRIMARY KEY (`username`)
36
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Admins';
37
+
38
+ --
39
+ -- テーブルのデータをダンプしています `admin`
40
+ --
41
+
42
+ INSERT INTO `admin` (`username`, `password`, `created`, `modified`, `active`) VALUES
43
+ ('all@example.com', 'password', '2012-08-31 15:39:02', '2012-08-31 15:39:19', 1),
44
+ ('admin@example.com', 'password', '2012-08-31 10:27:58', '2012-08-31 10:28:16', 1);
45
+
46
+ -- --------------------------------------------------------
47
+
48
+ --
49
+ -- テーブルの構造 `alias`
50
+ --
51
+
52
+ CREATE TABLE IF NOT EXISTS `alias` (
53
+ `address` varchar(255) NOT NULL DEFAULT '',
54
+ `goto` text NOT NULL,
55
+ `domain` varchar(255) NOT NULL DEFAULT '',
56
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
57
+ `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
58
+ `active` tinyint(1) NOT NULL DEFAULT '1',
59
+ PRIMARY KEY (`address`)
60
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Aliases';
61
+
62
+ --
63
+ -- テーブルのデータをダンプしています `alias`
64
+ --
65
+
66
+ INSERT INTO `alias` (`address`, `goto`, `domain`, `created`, `modified`, `active`) VALUES
67
+ ('user@example.com', 'user@example.com', 'example.com', '2012-08-31 10:24:12', '2012-08-31 10:24:12', 1);
68
+
69
+ -- --------------------------------------------------------
70
+
71
+ --
72
+ -- テーブルの構造 `config`
73
+ --
74
+
75
+ CREATE TABLE IF NOT EXISTS `config` (
76
+ `id` int(11) NOT NULL AUTO_INCREMENT,
77
+ `name` varchar(20) CHARACTER SET latin1 NOT NULL DEFAULT '',
78
+ `value` varchar(20) CHARACTER SET latin1 NOT NULL DEFAULT '',
79
+ PRIMARY KEY (`id`),
80
+ UNIQUE KEY `name` (`name`)
81
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='PostfixAdmin settings' AUTO_INCREMENT=2 ;
82
+
83
+ --
84
+ -- テーブルのデータをダンプしています `config`
85
+ --
86
+
87
+ INSERT INTO `config` (`id`, `name`, `value`) VALUES
88
+ (1, 'version', '352');
89
+
90
+ -- --------------------------------------------------------
91
+
92
+ --
93
+ -- テーブルの構造 `domain`
94
+ --
95
+
96
+ CREATE TABLE IF NOT EXISTS `domain` (
97
+ `domain` varchar(255) NOT NULL DEFAULT '',
98
+ `description` varchar(255) NOT NULL DEFAULT '',
99
+ `aliases` int(10) NOT NULL DEFAULT '0',
100
+ `mailboxes` int(10) NOT NULL DEFAULT '0',
101
+ `maxquota` bigint(20) NOT NULL DEFAULT '0',
102
+ `quota` bigint(20) NOT NULL DEFAULT '0',
103
+ `transport` varchar(255) DEFAULT NULL,
104
+ `backupmx` tinyint(1) NOT NULL DEFAULT '0',
105
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
106
+ `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
107
+ `active` tinyint(1) NOT NULL DEFAULT '1',
108
+ PRIMARY KEY (`domain`)
109
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Domains';
110
+
111
+ --
112
+ -- テーブルのデータをダンプしています `domain`
113
+ --
114
+
115
+ INSERT INTO `domain` (`domain`, `description`, `aliases`, `mailboxes`, `maxquota`, `quota`, `transport`, `backupmx`, `created`, `modified`, `active`) VALUES
116
+ ('ALL', '', 0, 0, 0, 0, NULL, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1),
117
+ ('example.com', '', 100, 100, 100, 0, 'virtual', 0, '2012-08-31 10:21:49', '2012-08-31 10:21:49', 1);
118
+
119
+ -- --------------------------------------------------------
120
+
121
+ --
122
+ -- テーブルの構造 `domain_admins`
123
+ --
124
+
125
+ CREATE TABLE IF NOT EXISTS `domain_admins` (
126
+ `username` varchar(255) NOT NULL DEFAULT '',
127
+ `domain` varchar(255) NOT NULL DEFAULT '',
128
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
129
+ `active` tinyint(1) NOT NULL DEFAULT '1',
130
+ KEY `username` (`username`)
131
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Domain Admins';
132
+
133
+ --
134
+ -- テーブルのデータをダンプしています `domain_admins`
135
+ --
136
+
137
+ INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`) VALUES
138
+ ('all@example.com', 'ALL', '2012-08-31 15:39:19', 1),
139
+ ('admin@example.com', 'example.com', '2012-08-31 10:28:16', 1);
140
+
141
+ -- --------------------------------------------------------
142
+
143
+ --
144
+ -- テーブルの構造 `fetchmail`
145
+ --
146
+
147
+ CREATE TABLE IF NOT EXISTS `fetchmail` (
148
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
149
+ `mailbox` varchar(255) NOT NULL DEFAULT '',
150
+ `src_server` varchar(255) NOT NULL DEFAULT '',
151
+ `src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') DEFAULT NULL,
152
+ `src_user` varchar(255) NOT NULL DEFAULT '',
153
+ `src_password` varchar(255) NOT NULL DEFAULT '',
154
+ `src_folder` varchar(255) NOT NULL DEFAULT '',
155
+ `poll_time` int(11) unsigned NOT NULL DEFAULT '10',
156
+ `fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0',
157
+ `keep` tinyint(1) unsigned NOT NULL DEFAULT '0',
158
+ `protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') DEFAULT NULL,
159
+ `extra_options` text,
160
+ `returned_text` text,
161
+ `mda` varchar(255) NOT NULL DEFAULT '',
162
+ `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
163
+ PRIMARY KEY (`id`)
164
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
165
+
166
+ -- --------------------------------------------------------
167
+
168
+ --
169
+ -- テーブルの構造 `log`
170
+ --
171
+
172
+ CREATE TABLE IF NOT EXISTS `log` (
173
+ `timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
174
+ `username` varchar(255) NOT NULL DEFAULT '',
175
+ `domain` varchar(255) NOT NULL DEFAULT '',
176
+ `action` varchar(255) NOT NULL DEFAULT '',
177
+ `data` varchar(255) NOT NULL DEFAULT '',
178
+ KEY `timestamp` (`timestamp`)
179
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Log';
180
+
181
+ -- --------------------------------------------------------
182
+
183
+ --
184
+ -- テーブルの構造 `mailbox`
185
+ --
186
+
187
+ CREATE TABLE IF NOT EXISTS `mailbox` (
188
+ `username` varchar(255) NOT NULL DEFAULT '',
189
+ `password` varchar(255) NOT NULL DEFAULT '',
190
+ `name` varchar(255) NOT NULL DEFAULT '',
191
+ `maildir` varchar(255) NOT NULL DEFAULT '',
192
+ `quota` bigint(20) NOT NULL DEFAULT '0',
193
+ `domain` varchar(255) NOT NULL DEFAULT '',
194
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
195
+ `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
196
+ `active` tinyint(1) NOT NULL DEFAULT '1',
197
+ PRIMARY KEY (`username`)
198
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Mailboxes';
199
+
200
+ --
201
+ -- テーブルのデータをダンプしています `mailbox`
202
+ --
203
+
204
+ INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `domain`, `created`, `modified`, `active`) VALUES
205
+ ('user@example.com', 'password', '', 'example.com/user@example.com/', 102400000, 'example.com', '2012-08-31 10:24:12', '2012-08-31 10:24:12', 1);
206
+
207
+ -- --------------------------------------------------------
208
+
209
+ --
210
+ -- テーブルの構造 `vacation`
211
+ --
212
+
213
+ CREATE TABLE IF NOT EXISTS `vacation` (
214
+ `email` varchar(255) NOT NULL,
215
+ `subject` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
216
+ `body` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
217
+ `cache` text NOT NULL,
218
+ `domain` varchar(255) NOT NULL,
219
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
220
+ `active` tinyint(1) NOT NULL DEFAULT '1',
221
+ PRIMARY KEY (`email`),
222
+ KEY `email` (`email`)
223
+ ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation';
224
+
225
+ -- --------------------------------------------------------
226
+
227
+ --
228
+ -- テーブルの構造 `vacation_notification`
229
+ --
230
+
231
+ CREATE TABLE IF NOT EXISTS `vacation_notification` (
232
+ `on_vacation` varchar(255) NOT NULL,
233
+ `notified` varchar(255) NOT NULL,
234
+ `notified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
235
+ PRIMARY KEY (`on_vacation`,`notified`)
236
+ ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation Notifications';
237
+
238
+ --
239
+ -- ダンプしたテーブルの制約
240
+ --
241
+
242
+ --
243
+ -- テーブルの制約 `vacation_notification`
244
+ --
245
+ ALTER TABLE `vacation_notification`
246
+ ADD CONSTRAINT `vacation_notification_pkey` FOREIGN KEY (`on_vacation`) REFERENCES `vacation` (`email`) ON DELETE CASCADE;
247
+
248
+ /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
249
+ /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
250
+ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
@@ -0,0 +1,144 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
2
+ require 'postfix_admin/runner'
3
+
4
+ describe PostfixAdmin::Runner do
5
+ before do
6
+ db_initialize
7
+ end
8
+
9
+ it "version" do
10
+ capture(:stdout){ Runner.start(["version"]) }.should =~ /postfix_admin \d+\.\d+\.\d/
11
+ end
12
+
13
+ it "summary" do
14
+ capture(:stdout){ Runner.start(["summary"]) }.should =~ /\[Summary\]/
15
+ capture(:stdout){ Runner.start(["summary", "example.com"]) }.should =~ /\[Summary of example.com\]/
16
+ end
17
+
18
+ describe "show" do
19
+ it "shows information of example.com" do
20
+ capture(:stdout){ Runner.start(["show"]) }.should =~ /example.com\s+1\s+\/\s+30\s+1\s+\/\s+30\s+100/
21
+ end
22
+
23
+ it "shows information of admin@example.com" do
24
+ capture(:stdout){ Runner.start(["show"]) }.should =~ /admin@example.com\s+1\s+password/
25
+ end
26
+
27
+ it "show the detail of example.com" do
28
+ capture(:stdout){ Runner.start(["show", "example.com"]) }.should =~ /user@example.com\s+100.0\s+password/
29
+ end
30
+
31
+ it "when no admins, no aliases and no addresses" do
32
+ Admin.find('all@example.com').super_admin = false
33
+ out = capture(:stdout){ Runner.start(["show", "example.org"]) }
34
+ out.should =~ /No admins/
35
+ out.should =~ /No addresses/
36
+ out.should =~ /No aliases/
37
+ end
38
+
39
+ it "when no domains" do
40
+ capture(:stdout){ Runner.start(['delete_domain', 'example.com']) }.should =~ EX_DELETED
41
+ capture(:stdout){ Runner.start(['delete_domain', 'example.org']) }.should =~ EX_DELETED
42
+ capture(:stdout){ Runner.start(["show"]) }.should =~ /No domains/
43
+ end
44
+ end
45
+
46
+ it "setup" do
47
+ capture(:stdout){ Runner.start(['setup', 'example.net', 'password']) }.should =~ EX_REGISTERED
48
+ capture(:stdout){ Runner.start(['delete_domain', 'example.net']) }.should =~ EX_DELETED
49
+ end
50
+
51
+ describe "super_admin" do
52
+ it "can enable super admin flag of an admin" do
53
+ capture(:stdout){ Runner.start(['super', 'admin@example.com']) }.should =~ /Successfully enabled/
54
+ end
55
+
56
+ it "can disable super admin flag of an admin (--disable)" do
57
+ capture(:stdout){ Runner.start(['super', 'admin@example.com', '--disable']) }.should =~ /Successfully disabled/
58
+ end
59
+
60
+ it "can use -d option as --disable" do
61
+ capture(:stdout){ Runner.start(['super', 'admin@example.com', '-d']) }.should =~ /Successfully disabled/
62
+ end
63
+ end
64
+
65
+ describe "admin_passwd" do
66
+ it "can change password of an admin" do
67
+ capture(:stdout){ Runner.start(['admin_passwd', 'admin@example.com', 'new_password']) }.should =~ /successfully changed/
68
+ end
69
+
70
+ it "can not use too short password (< 5)" do
71
+ capture(:stderr){ Runner.start(['admin_passwd', 'admin@example.com', '124']) }.should =~ /too short/
72
+ end
73
+
74
+ it "can not use for unknown admin" do
75
+ capture(:stderr){ Runner.start(['admin_passwd', 'unknown@example.com', 'new_password']) }.should =~ /Could not find/
76
+ end
77
+ end
78
+
79
+ describe "account_passwd" do
80
+ it "can change password of an account" do
81
+ capture(:stdout){ Runner.start(['account_passwd', 'user@example.com', 'new_password']) }.should =~ /successfully changed/
82
+ end
83
+
84
+ it "can not use too short password (< 5)" do
85
+ capture(:stderr){ Runner.start(['account_passwd', 'user@example.com', '1234']) }.should =~ /too short/
86
+ end
87
+
88
+ it "can not use for unknown account" do
89
+ capture(:stderr){ Runner.start(['account_passwd', 'unknown@example.com', 'new_password']) }.should =~ /Could not find/
90
+ end
91
+ end
92
+
93
+ describe "add_alias and delete_alias" do
94
+ it "can add and delete an new alias." do
95
+ capture(:stdout){ Runner.start(['add_alias', 'new_alias@example.com', 'goto@example.jp']) }.should =~ EX_REGISTERED
96
+ capture(:stdout){ Runner.start(['delete_alias', 'new_alias@example.com']) }.should =~ EX_DELETED
97
+ end
98
+
99
+ it "can not delete mailbox alias." do
100
+ capture(:stderr){ Runner.start(['delete_alias', 'user@example.com']) }.should =~ /Can not delete mailbox/
101
+ end
102
+
103
+ it "can not add an alias for existed mailbox" do
104
+ capture(:stderr){ Runner.start(['add_alias', 'user@example.com', 'goto@example.jp']) }.should =~ /mailbox user@example.com is already registered!/
105
+ end
106
+ end
107
+
108
+ describe "add_admin" do
109
+ it "can add an new admin" do
110
+ capture(:stdout){ Runner.start(['add_admin', 'admin@example.jp', 'password']) }.should =~ EX_REGISTERED
111
+ end
112
+
113
+ it "--super option" do
114
+ capture(:stdout){ Runner.start(['add_admin', 'admin@example.jp', 'password', '--super']) }.should =~ /registered as a super admin/
115
+ end
116
+
117
+ it "-s (--super) option" do
118
+ capture(:stdout){ Runner.start(['add_admin', 'admin@example.jp', 'password', '-s']) }.should =~ /registered as a super admin/
119
+ end
120
+ end
121
+
122
+ it "add_admin_domain" do
123
+ capture(:stdout){ Runner.start(['add_admin_domain', 'admin@example.com', 'example.org']) }.should =~ EX_REGISTERED
124
+ end
125
+
126
+ it "delete_admin" do
127
+ capture(:stdout){ Runner.start(['delete_admin', 'admin@example.com']) }.should =~ EX_DELETED
128
+ end
129
+
130
+ it "add_account and delete_account" do
131
+ capture(:stdout){ Runner.start(['add_account', 'user2@example.com', 'password']) }.should =~ EX_REGISTERED
132
+ capture(:stdout){ Runner.start(['delete_account', 'user2@example.com']) }.should =~ EX_DELETED
133
+ end
134
+
135
+ it "add and delete methods" do
136
+ lambda { Runner.start(['add_domain', 'example.net']) }.should_not raise_error
137
+ Runner.start(['add_admin', 'admin@example.net', 'password'])
138
+ Runner.start(['add_admin_domain', 'admin@example.net', 'example.net'])
139
+
140
+ lambda { Runner.start(['add_account', 'user1@example.net', 'password']) }.should_not raise_error
141
+ lambda { Runner.start(['add_account', 'user2@example.net', 'password']) }.should_not raise_error
142
+ lambda { Runner.start(['delete_domain', 'example.net']) }.should_not raise_error
143
+ end
144
+ end
@@ -0,0 +1,160 @@
1
+
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+
4
+ require 'postfix_admin'
5
+
6
+ module PostfixAdmin
7
+ class CLI
8
+ def config_file
9
+ File.join(File.dirname(__FILE__) , 'postfix_admin.conf')
10
+ end
11
+ end
12
+ end
13
+
14
+ include PostfixAdmin
15
+
16
+ # [fixtures]
17
+ # Domain:
18
+ # ALL
19
+ # example.com
20
+ # example.org
21
+ #
22
+ # Admin:
23
+ # all@example.com Super Admin
24
+ # admin@example.com
25
+ #
26
+ # Mailbox, Alias:
27
+ # user@example.com
28
+ #
29
+ # Alias:
30
+ # alias@example.com
31
+
32
+ def db_clear
33
+ DomainAdmin.all.destroy
34
+ Mailbox.all.destroy
35
+ Alias.all.destroy
36
+ Domain.all.destroy
37
+ Admin.all.destroy
38
+ end
39
+
40
+ def create_domain(domain_name)
41
+ domain = Domain.new
42
+ domain.attributes = {
43
+ :domain_name => domain_name,
44
+ :description => domain_name,
45
+ :maxaliases => 30,
46
+ :maxmailboxes => 30,
47
+ :maxquota => 100,
48
+ }
49
+ domain.save
50
+ end
51
+
52
+ def db_initialize
53
+ db_clear
54
+
55
+ create_domain('ALL')
56
+ create_domain('example.com')
57
+ create_domain('example.org')
58
+
59
+ username = "admin@example.com"
60
+ admin = Admin.new
61
+ admin.attributes = {
62
+ :username => username,
63
+ :password => 'password',
64
+ }
65
+ admin.save
66
+
67
+ domain = Domain.find('example.com')
68
+ domain.admins << admin
69
+ domain.save
70
+
71
+ all_admin = Admin.new
72
+ all_admin.attributes = {
73
+ :username => 'all@example.com',
74
+ :password => 'password',
75
+ }
76
+ all_admin.save
77
+
78
+ all_domain = Domain.find('ALL')
79
+ all_domain.admins << all_admin
80
+ all_domain.save
81
+
82
+ address = "user@example.com"
83
+ mail_alias = Alias.new
84
+ mail_alias.attributes = {
85
+ :address => address,
86
+ :goto => address,
87
+ }
88
+ domain.aliases << mail_alias
89
+
90
+ forward = Alias.new
91
+ forward.attributes = {
92
+ :address => 'alias@example.com',
93
+ :goto => 'example.jp',
94
+ }
95
+ domain.aliases << forward
96
+
97
+ domain.save
98
+
99
+ path = "example.com/user@example.com/"
100
+ mailbox = Mailbox.new
101
+ mailbox.attributes = {
102
+ :username => address,
103
+ :password => 'password',
104
+ :name => '',
105
+ :maildir => path,
106
+ :quota => 100 * 1024 * 1000,
107
+ # :local_part => user,
108
+ }
109
+ domain.mailboxes << mailbox
110
+ domain.save
111
+ end
112
+
113
+ DataMapper.setup(:default, 'sqlite::memory:')
114
+ DataMapper.finalize
115
+ DataMapper.auto_migrate!
116
+ db_initialize
117
+
118
+ module PostfixAdmin
119
+ class Base
120
+
121
+ # without DataMapper setup
122
+ def db_setup(database)
123
+ unless database
124
+ raise ArgumentError
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ EX_DELETED = /successfully deleted/
131
+ EX_REGISTERED = /successfully registered/
132
+
133
+ RSpec.configure do |config|
134
+ config.before do
135
+ ARGV.replace []
136
+ end
137
+
138
+ def capture(stream)
139
+ begin
140
+ stream = stream.to_s
141
+ eval "$#{stream} = StringIO.new"
142
+ yield
143
+ result = eval("$#{stream}").string
144
+ ensure
145
+ eval("$#{stream} = #{stream.upcase}")
146
+ end
147
+
148
+ result
149
+ end
150
+
151
+ def source_root
152
+ File.join(File.dirname(__FILE__), 'fixtures')
153
+ end
154
+
155
+ def destination_root
156
+ File.join(File.dirname(__FILE__), 'sandbox')
157
+ end
158
+
159
+ alias :silence :capture
160
+ end