gritano 0.5.3 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +24 -24
- data/README.rdoc +7 -7
- data/TODO +1 -1
- data/VERSION +1 -1
- data/features/data/remote_help.txt +13 -0
- data/features/step_definitions/install_step.rb +2 -2
- data/gritano.gemspec +12 -5
- data/lib/gritano/console/base.rb +5 -1
- data/lib/gritano/console/gritano.rb +1 -1
- data/lib/gritano/console/installer.rb +21 -5
- data/lib/gritano/console/remote.rb +21 -11
- data/spec/cli_spec.rb +21 -0
- data/spec/console_base_spec.rb +61 -0
- data/spec/console_executor_spec.rb +168 -0
- data/spec/console_gritano_spec.rb +121 -0
- data/spec/console_installer_spec.rb +28 -0
- data/spec/console_remote_spec.rb +70 -0
- data/spec/console_spec.rb +23 -0
- data/spec/data/help_command_name.txt +7 -0
- data/spec/model_key_spec.rb +35 -15
- data/spec/model_permission_spec.rb +72 -0
- data/spec/model_repository_spec.rb +52 -19
- data/spec/model_user_spec.rb +93 -65
- metadata +13 -6
- data/spec/executor_spec.rb +0 -100
- data/spec/gritano_spec.rb +0 -20
- data/spec/installer_spec.rb +0 -23
data/Gemfile.lock
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activemodel (3.2.
|
5
|
-
activesupport (= 3.2.
|
4
|
+
activemodel (3.2.11)
|
5
|
+
activesupport (= 3.2.11)
|
6
6
|
builder (~> 3.0.0)
|
7
|
-
activerecord (3.2.
|
8
|
-
activemodel (= 3.2.
|
9
|
-
activesupport (= 3.2.
|
7
|
+
activerecord (3.2.11)
|
8
|
+
activemodel (= 3.2.11)
|
9
|
+
activesupport (= 3.2.11)
|
10
10
|
arel (~> 3.0.2)
|
11
11
|
tzinfo (~> 0.3.29)
|
12
|
-
activesupport (3.2.
|
12
|
+
activesupport (3.2.11)
|
13
13
|
i18n (~> 0.6)
|
14
14
|
multi_json (~> 1.0)
|
15
15
|
arel (3.0.2)
|
16
|
-
builder (3.0.
|
16
|
+
builder (3.0.4)
|
17
17
|
cucumber (1.2.1)
|
18
18
|
builder (>= 2.1.2)
|
19
19
|
diff-lcs (>= 1.1.3)
|
20
20
|
gherkin (~> 2.11.0)
|
21
21
|
json (>= 1.4.6)
|
22
|
-
database_cleaner (0.
|
22
|
+
database_cleaner (0.9.1)
|
23
23
|
diff-lcs (1.1.3)
|
24
|
-
gherkin (2.11.
|
24
|
+
gherkin (2.11.5)
|
25
25
|
json (>= 1.4.6)
|
26
26
|
git (1.2.5)
|
27
27
|
grit (2.5.0)
|
@@ -34,28 +34,28 @@ GEM
|
|
34
34
|
git (>= 1.2.5)
|
35
35
|
rake
|
36
36
|
rdoc
|
37
|
-
json (1.7.
|
37
|
+
json (1.7.6)
|
38
38
|
mime-types (1.19)
|
39
|
-
multi_json (1.
|
39
|
+
multi_json (1.5.0)
|
40
40
|
posix-spawn (0.3.6)
|
41
|
-
rake (0.
|
41
|
+
rake (10.0.3)
|
42
42
|
rdoc (3.12)
|
43
43
|
json (~> 1.4)
|
44
|
-
rspec (2.
|
45
|
-
rspec-core (~> 2.
|
46
|
-
rspec-expectations (~> 2.
|
47
|
-
rspec-mocks (~> 2.
|
48
|
-
rspec-core (2.
|
49
|
-
rspec-expectations (2.
|
44
|
+
rspec (2.12.0)
|
45
|
+
rspec-core (~> 2.12.0)
|
46
|
+
rspec-expectations (~> 2.12.0)
|
47
|
+
rspec-mocks (~> 2.12.0)
|
48
|
+
rspec-core (2.12.2)
|
49
|
+
rspec-expectations (2.12.1)
|
50
50
|
diff-lcs (~> 1.1.3)
|
51
|
-
rspec-mocks (2.
|
52
|
-
simplecov (0.
|
51
|
+
rspec-mocks (2.12.2)
|
52
|
+
simplecov (0.7.1)
|
53
53
|
multi_json (~> 1.0)
|
54
|
-
simplecov-html (~> 0.
|
55
|
-
simplecov-html (0.
|
56
|
-
sqlite3 (1.3.
|
54
|
+
simplecov-html (~> 0.7.1)
|
55
|
+
simplecov-html (0.7.1)
|
56
|
+
sqlite3 (1.3.7)
|
57
57
|
terminal-table (1.4.5)
|
58
|
-
tzinfo (0.3.
|
58
|
+
tzinfo (0.3.35)
|
59
59
|
|
60
60
|
PLATFORMS
|
61
61
|
ruby
|
data/README.rdoc
CHANGED
@@ -71,19 +71,19 @@ For more information, execute
|
|
71
71
|
|
72
72
|
Starting from Gritano 0.3.0, administrators can execute commands via ssh:
|
73
73
|
|
74
|
-
$ ssh git@
|
74
|
+
$ ssh git@host.com admin:user:add username
|
75
75
|
|
76
|
-
$ ssh git@
|
76
|
+
$ ssh git@host.com admin:user:rm username
|
77
77
|
|
78
|
-
$ ssh git@
|
78
|
+
$ ssh git@host.com admin:user:key:add username keyname < key.pub
|
79
79
|
|
80
|
-
$ ssh git@
|
80
|
+
$ ssh git@host.com admin:user:key:rm username keyname
|
81
81
|
|
82
|
-
$ ssh git@
|
82
|
+
$ ssh git@host.com admin:repo:add reponame.git
|
83
83
|
|
84
|
-
$ ssh git@
|
84
|
+
$ ssh git@host.com admin:repo:rm reponame.git
|
85
85
|
|
86
|
-
$ ssh git@
|
86
|
+
$ ssh git@host.com admin:repo:list
|
87
87
|
|
88
88
|
== For more Information
|
89
89
|
|
data/TODO
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.4
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Given /^I start the gritano console but gritano is not installed$/ do
|
2
2
|
stdin = double()
|
3
3
|
stdin.stub(:read).and_return("Your SSHKEY here...")
|
4
|
-
FileUtils.rm_rf('tmp
|
4
|
+
FileUtils.rm_rf('tmp/.gritano')
|
5
5
|
@home_dir = 'tmp'
|
6
6
|
@repo_dir = 'tmp'
|
7
7
|
@console = Gritano::CLI
|
@@ -21,7 +21,7 @@ When /^I install it$/ do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
Then /^I should see that gritano was successful (installed|updated)$/ do |opt|
|
24
|
-
@prepare_output.should be == 'configuration has been generated' if opt == 'installed'
|
24
|
+
@prepare_output.should be == "Gritano's configuration has been generated.\nIf you want to customize it, check your '#{File.join(@home_dir, '.gritano')}' directory." if opt == 'installed'
|
25
25
|
@install_output.should be == 'gritano has been installed'
|
26
26
|
end
|
27
27
|
|
data/gritano.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "gritano"
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Igor Bonadio"]
|
12
|
-
s.date = "2013-01-
|
12
|
+
s.date = "2013-01-28"
|
13
13
|
s.description = "Gritano is the simplest way to configure your git server over ssh. You can create repositories and manage user access."
|
14
14
|
s.email = "igorbonadio@gmail.com"
|
15
15
|
s.executables = ["gritano", "gritano-remote"]
|
@@ -170,6 +170,7 @@ Gem::Specification.new do |s|
|
|
170
170
|
"features/data/remote_commands/repo_list_jessicaeto.txt",
|
171
171
|
"features/data/remote_commands/version_igorbonadio.txt",
|
172
172
|
"features/data/remote_commands/version_jessicaeto.txt",
|
173
|
+
"features/data/remote_help.txt",
|
173
174
|
"features/install.feature",
|
174
175
|
"features/local.feature",
|
175
176
|
"features/remote.feature",
|
@@ -193,10 +194,16 @@ Gem::Specification.new do |s|
|
|
193
194
|
"lib/gritano/models/permission.rb",
|
194
195
|
"lib/gritano/models/repository.rb",
|
195
196
|
"lib/gritano/models/user.rb",
|
196
|
-
"spec/
|
197
|
-
"spec/
|
198
|
-
"spec/
|
197
|
+
"spec/cli_spec.rb",
|
198
|
+
"spec/console_base_spec.rb",
|
199
|
+
"spec/console_executor_spec.rb",
|
200
|
+
"spec/console_gritano_spec.rb",
|
201
|
+
"spec/console_installer_spec.rb",
|
202
|
+
"spec/console_remote_spec.rb",
|
203
|
+
"spec/console_spec.rb",
|
204
|
+
"spec/data/help_command_name.txt",
|
199
205
|
"spec/model_key_spec.rb",
|
206
|
+
"spec/model_permission_spec.rb",
|
200
207
|
"spec/model_repository_spec.rb",
|
201
208
|
"spec/model_user_spec.rb",
|
202
209
|
"spec/spec_helper.rb"
|
data/lib/gritano/console/base.rb
CHANGED
@@ -61,11 +61,15 @@ module Gritano
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def check_git
|
64
|
-
if
|
64
|
+
if unknown_command('git')
|
65
65
|
puts "Error: git must be installed on the local system"
|
66
66
|
exit
|
67
67
|
end
|
68
68
|
end
|
69
|
+
|
70
|
+
def unknown_command(command)
|
71
|
+
`which #{command}` == ""
|
72
|
+
end
|
69
73
|
|
70
74
|
def before_each_command_filter
|
71
75
|
end
|
@@ -23,7 +23,7 @@ module Gritano
|
|
23
23
|
def method_missing(meth, *args, &block)
|
24
24
|
params = [meth.to_s.gsub("_", ":")] + args[0]
|
25
25
|
begin
|
26
|
-
installer = Installer.new
|
26
|
+
installer = Installer.new(@stdin, @home_dir)
|
27
27
|
installer.execute(params)
|
28
28
|
rescue
|
29
29
|
executor = Executor.new(@stdin, @home_dir, @repo_path)
|
@@ -13,25 +13,41 @@ module Gritano
|
|
13
13
|
check_git
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
def create_gritano_dirs
|
17
17
|
Dir.mkdir(File.join(@home_dir, '.gritano')) unless File.exist?(File.join(@home_dir, '.gritano'))
|
18
18
|
Dir.mkdir(File.join(@home_dir, '.ssh')) unless File.exist?(File.join(@home_dir, '.ssh'))
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_sqlite_config
|
19
22
|
File.open(File.join(@home_dir, '.gritano', 'database.yml'), "w") do |f|
|
20
23
|
f.write("adapter: sqlite3\ndatabase: #{File.join(Etc.getpwuid.dir, '.gritano', 'database.db')}\n")
|
21
24
|
end
|
22
25
|
if File.exist?(File.join(@home_dir, '.gritano', 'database.db'))
|
23
26
|
FileUtils.rm(File.join(@home_dir, '.gritano', 'database.db'))
|
24
27
|
end
|
25
|
-
|
28
|
+
end
|
29
|
+
|
30
|
+
add_command "setup:prepare" do |argv|
|
31
|
+
create_gritano_dirs
|
32
|
+
create_sqlite_config
|
33
|
+
return [true, "Gritano's configuration has been generated.\nIf you want to customize it, check your '#{File.join(@home_dir, '.gritano')}' directory."]
|
26
34
|
end
|
27
35
|
|
28
|
-
|
29
|
-
|
30
|
-
|
36
|
+
def create_database
|
37
|
+
db_config = YAML::load(File.open(File.join(@home_dir, '.gritano', 'database.yml')))
|
38
|
+
ActiveRecord::Base.establish_connection(db_config)
|
31
39
|
ActiveRecord::Migrator.migrate(
|
32
40
|
File.join(File.dirname(__FILE__),'..', '..', '..', 'db/migrate'),
|
33
41
|
ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
|
42
|
+
end
|
43
|
+
|
44
|
+
def create_authorization_keys
|
34
45
|
File.open(File.join(@ssh_path, 'authorized_keys'), 'w').write(Key.authorized_keys)
|
46
|
+
end
|
47
|
+
|
48
|
+
add_command "setup:install" do |argv|
|
49
|
+
create_database
|
50
|
+
create_authorization_keys
|
35
51
|
[true, "gritano has been installed"]
|
36
52
|
end
|
37
53
|
end
|
@@ -52,28 +52,38 @@ module Gritano
|
|
52
52
|
gritano.execute(["help"])
|
53
53
|
end
|
54
54
|
|
55
|
+
def admin_command(meth, params)
|
56
|
+
@executor.execute([meth] + params)
|
57
|
+
end
|
58
|
+
|
59
|
+
def git_receive_pack(repo, login)
|
60
|
+
user = ::Gritano::User.find_by_login(login)
|
61
|
+
if user
|
62
|
+
Kernel.exec "git-receive-pack #{repo(repo).full_path}" if user.check_access(repo(repo), :read)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def git_upload_pack(repo, login)
|
67
|
+
user = ::Gritano::User.find_by_login(login)
|
68
|
+
if user
|
69
|
+
Kernel.exec "git-upload-pack #{repo(repo).full_path}" if user.check_access(repo(repo), :write)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
55
73
|
def method_missing(meth, *args, &block)
|
56
74
|
if meth.to_s =~ /^admin/
|
57
75
|
user = ::Gritano::User.find_by_login(args[0][-1])
|
58
76
|
if user.admin?
|
59
|
-
meth
|
60
|
-
params = args[0][0..-2]
|
61
|
-
@executor.execute([meth] + params)
|
77
|
+
admin_command(meth.to_s[6..-1], args[0][0..-2])
|
62
78
|
else
|
63
79
|
[false, "access denied"]
|
64
80
|
end
|
65
81
|
elsif meth.to_s =~ /^git-receive-pack/
|
66
82
|
repo, login = args[0]
|
67
|
-
|
68
|
-
if user
|
69
|
-
Kernel.exec "git-receive-pack #{repo(repo).full_path}" if user.check_access(repo(repo), :read)
|
70
|
-
end
|
83
|
+
git_receive_pack(repo, login)
|
71
84
|
elsif meth.to_s =~ /^git-upload-pack/
|
72
85
|
repo, login = args[0]
|
73
|
-
|
74
|
-
if user
|
75
|
-
Kernel.exec "git-upload-pack #{repo(repo).full_path}" if user.check_access(repo(repo), :write)
|
76
|
-
end
|
86
|
+
git_upload_pack(repo, login)
|
77
87
|
else
|
78
88
|
super
|
79
89
|
end
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
module Gritano
|
4
|
+
describe CLI do
|
5
|
+
it "should execute local commands" do
|
6
|
+
console = double()
|
7
|
+
console.should_receive(:execute).and_return([true, "ok"])
|
8
|
+
Gritano::Console.should_receive(:remote_console).with(false)
|
9
|
+
Gritano::Console::Gritano.should_receive(:new).and_return(console)
|
10
|
+
CLI.execute(["user:list"])
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should execute remote commands" do
|
14
|
+
console = double()
|
15
|
+
console.should_receive(:execute).and_return([true, "ok"])
|
16
|
+
Gritano::Console.should_receive(:remote_console).with(true)
|
17
|
+
Gritano::Console::Remote.should_receive(:new).and_return(console)
|
18
|
+
CLI.check(["repo:list"], "login")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
module Gritano
|
4
|
+
module Console
|
5
|
+
describe Base do
|
6
|
+
def create_base(home)
|
7
|
+
stdin = double()
|
8
|
+
stdin.stub(:read).and_return("Your SSHKEY here...")
|
9
|
+
Base.new(stdin, home)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should define commands" do
|
13
|
+
Base.should_receive(:define_method).with("command_name")
|
14
|
+
Base.add_command "command:name", "parameters" do end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should execute commands" do
|
18
|
+
Base.add_command "command:name", "parameters" do end
|
19
|
+
base = create_base('.')
|
20
|
+
base.should_receive('command_name')
|
21
|
+
base.execute(['command:name'])
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should show a help message" do
|
25
|
+
Base.add_command "command:name", "parameters" do end
|
26
|
+
Base.help.should == File.open("spec/data/help_command_name.txt").readlines.join.
|
27
|
+
gsub('{{VERSION}}', File.open("VERSION").readlines.join)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should check if gritano is not installed" do
|
31
|
+
FileUtils.rm_rf('tmp\.gritano')
|
32
|
+
base = create_base('tmp')
|
33
|
+
lambda { base.check_gritano }.should raise_error SystemExit
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should check if gritano is installed" do
|
37
|
+
base = create_base('.')
|
38
|
+
lambda { base.check_gritano }.should_not raise_error SystemExit
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should check if git is not installed" do
|
42
|
+
base = create_base('.')
|
43
|
+
base.stub(:unknown_command).and_return(true)
|
44
|
+
lambda { base.check_git }.should raise_error SystemExit
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should check if git is installed" do
|
48
|
+
base = create_base('.')
|
49
|
+
base.stub(:unknown_command).and_return(false)
|
50
|
+
lambda { base.check_git }.should_not raise_error SystemExit
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should check if a command exists" do
|
54
|
+
base = create_base('.')
|
55
|
+
base.unknown_command('ls').should be_false
|
56
|
+
base.unknown_command('qwertyuioplkjhgfdsa').should be_true
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
module Gritano
|
4
|
+
module Console
|
5
|
+
describe Executor do
|
6
|
+
def create_executor(home, repo_dir)
|
7
|
+
stdin = double()
|
8
|
+
stdin.stub(:read).and_return("Your SSHKEY here...")
|
9
|
+
Executor.new(stdin, home, repo_dir)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should list users" do
|
13
|
+
User.should_receive(:all).and_return([])
|
14
|
+
create_executor('.', 'tmp').execute(["user:list"])
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should list users' keys" do
|
18
|
+
user = double()
|
19
|
+
user.should_receive(:keys).and_return([])
|
20
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
21
|
+
create_executor('.', 'tmp').execute(["user:key:list", "login"])
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should list users' repos" do
|
25
|
+
user = double()
|
26
|
+
user.should_receive(:repositories).and_return([])
|
27
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
28
|
+
create_executor('.', 'tmp').execute(["user:repo:list", "login"])
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should add users" do
|
32
|
+
user = double()
|
33
|
+
user.should_receive(:save).and_return(true)
|
34
|
+
User.should_receive(:new).with(login: "login").and_return(user)
|
35
|
+
create_executor('.', 'tmp').execute(["user:add", "login"])
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should remove users" do
|
39
|
+
user = double()
|
40
|
+
user.should_receive(:destroy).and_return(true)
|
41
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
42
|
+
create_executor('.', 'tmp').execute(["user:rm", "login"])
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should add users' keys" do
|
46
|
+
user = double()
|
47
|
+
keys = double()
|
48
|
+
key = double()
|
49
|
+
key.should_receive(:valid?).and_return(true)
|
50
|
+
keys.should_receive(:create).with(name: "keyname", key: "Your SSHKEY here...").and_return(key)
|
51
|
+
user.should_receive(:keys).and_return(keys)
|
52
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
53
|
+
create_executor('.', 'tmp').execute(["user:key:add", "login", "keyname"])
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should remove users' keys" do
|
57
|
+
keys = double()
|
58
|
+
users = double()
|
59
|
+
limit = double()
|
60
|
+
key = double()
|
61
|
+
key.should_receive(:destroy).and_return(true)
|
62
|
+
limit.should_receive(:limit).with(1).and_return([key])
|
63
|
+
users.should_receive(:where).with("users.login" => "login").and_return(limit)
|
64
|
+
keys.should_receive(:includes).with(:user).and_return(users)
|
65
|
+
Key.should_receive(:where).with(name: "keyname").and_return(keys)
|
66
|
+
create_executor('.', 'tmp').execute(["user:key:rm", "login", "keyname"])
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should add admin rights to user" do
|
70
|
+
user = double()
|
71
|
+
user.should_receive(:admin=).with(true)
|
72
|
+
user.should_receive(:save).and_return(true)
|
73
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
74
|
+
create_executor('.', 'tmp').execute(["user:admin:add", "login"])
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should remove admin rights from users" do
|
78
|
+
user = double()
|
79
|
+
user.should_receive(:admin=).with(false)
|
80
|
+
user.should_receive(:save).and_return(true)
|
81
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
82
|
+
create_executor('.', 'tmp').execute(["user:admin:rm", "login"])
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should list repos" do
|
86
|
+
Repository.should_receive(:all).and_return([])
|
87
|
+
create_executor('.', 'tmp').execute(["repo:list"])
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should create repos" do
|
91
|
+
repo = double()
|
92
|
+
repo.should_receive(:save).and_return(true)
|
93
|
+
Repository.should_receive(:new).with(name: "repo.git", path: "tmp").and_return(repo)
|
94
|
+
create_executor('.', 'tmp').execute(["repo:add", "repo.git"])
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should create repos and add a user" do
|
98
|
+
repo = double()
|
99
|
+
repo.should_receive(:save).and_return(true)
|
100
|
+
Repository.should_receive(:new).with(name: "repo.git", path: "tmp").and_return(repo)
|
101
|
+
|
102
|
+
user = double()
|
103
|
+
user.should_receive(:add_access).twice
|
104
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
105
|
+
|
106
|
+
create_executor('.', 'tmp').execute(["repo:add", "repo.git", "login"])
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should list repos' users" do
|
110
|
+
repo = double()
|
111
|
+
repo.should_receive(:users).and_return([])
|
112
|
+
Repository.should_receive(:find_by_name).with("repo.git").and_return(repo)
|
113
|
+
create_executor('.', 'tmp').execute(["repo:user:list", "repo.git"])
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should remove repos" do
|
117
|
+
repo = double()
|
118
|
+
repo.should_receive(:destroy).and_return(true)
|
119
|
+
Repository.should_receive(:find_by_name).with("repo.git").and_return(repo)
|
120
|
+
create_executor('.', 'tmp').execute(["repo:rm", "repo.git"])
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should allow user to read a repo" do
|
124
|
+
repo = double()
|
125
|
+
Repository.should_receive(:find_by_name).with("repo.git").and_return(repo)
|
126
|
+
|
127
|
+
user = double()
|
128
|
+
user.should_receive(:add_access).with(repo, :read).and_return(true)
|
129
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
130
|
+
|
131
|
+
create_executor('.', 'tmp').execute(["repo:read:add", "repo.git", "login"])
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should allow user to write to a repo" do
|
135
|
+
repo = double()
|
136
|
+
Repository.should_receive(:find_by_name).with("repo.git").and_return(repo)
|
137
|
+
|
138
|
+
user = double()
|
139
|
+
user.should_receive(:add_access).with(repo, :write).and_return(true)
|
140
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
141
|
+
|
142
|
+
create_executor('.', 'tmp').execute(["repo:write:add", "repo.git", "login"])
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should deny user to read a repo" do
|
146
|
+
repo = double()
|
147
|
+
Repository.should_receive(:find_by_name).with("repo.git").and_return(repo)
|
148
|
+
|
149
|
+
user = double()
|
150
|
+
user.should_receive(:remove_access).with(repo, :read).and_return(true)
|
151
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
152
|
+
|
153
|
+
create_executor('.', 'tmp').execute(["repo:read:rm", "repo.git", "login"])
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should deny user to write to a repo"do
|
157
|
+
repo = double()
|
158
|
+
Repository.should_receive(:find_by_name).with("repo.git").and_return(repo)
|
159
|
+
|
160
|
+
user = double()
|
161
|
+
user.should_receive(:remove_access).with(repo, :write).and_return(true)
|
162
|
+
User.should_receive(:find_by_login).with("login").and_return(user)
|
163
|
+
|
164
|
+
create_executor('.', 'tmp').execute(["repo:write:rm", "repo.git", "login"])
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|