git-ds 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +795 -0
- data/doc/Examples.rdoc +36 -0
- data/doc/examples/key_value/kv_get.rb +29 -0
- data/doc/examples/key_value/kv_init.rb +20 -0
- data/doc/examples/key_value/kv_list.rb +28 -0
- data/doc/examples/key_value/kv_remove.rb +29 -0
- data/doc/examples/key_value/kv_set.rb +39 -0
- data/doc/examples/key_value/model.rb +156 -0
- data/doc/examples/key_value/test.rb +50 -0
- data/doc/examples/test_suite/model.rb +503 -0
- data/doc/examples/test_suite/test.rb +173 -0
- data/doc/examples/test_suite/ts_add_bug.rb +65 -0
- data/doc/examples/test_suite/ts_add_module.rb +74 -0
- data/doc/examples/test_suite/ts_add_module_to_test.rb +78 -0
- data/doc/examples/test_suite/ts_add_test.rb +77 -0
- data/doc/examples/test_suite/ts_add_test_suite.rb +65 -0
- data/doc/examples/test_suite/ts_add_test_to_bug.rb +76 -0
- data/doc/examples/test_suite/ts_init.rb +20 -0
- data/doc/examples/test_suite/ts_list.rb +118 -0
- data/doc/examples/test_suite/ts_perform_test.rb +104 -0
- data/doc/examples/test_suite/ts_update_bugs.rb +58 -0
- data/doc/examples/user_group/model.rb +265 -0
- data/doc/examples/user_group/test.rb +64 -0
- data/doc/examples/user_group/ug_add_group.rb +39 -0
- data/doc/examples/user_group/ug_add_group_user.rb +36 -0
- data/doc/examples/user_group/ug_add_user.rb +39 -0
- data/doc/examples/user_group/ug_init.rb +20 -0
- data/doc/examples/user_group/ug_list.rb +32 -0
- data/lib/git-ds.rb +14 -0
- data/lib/git-ds/config.rb +53 -0
- data/lib/git-ds/database.rb +289 -0
- data/lib/git-ds/exec_cmd.rb +107 -0
- data/lib/git-ds/index.rb +205 -0
- data/lib/git-ds/model.rb +136 -0
- data/lib/git-ds/model/db_item.rb +42 -0
- data/lib/git-ds/model/fs_item.rb +51 -0
- data/lib/git-ds/model/item.rb +428 -0
- data/lib/git-ds/model/item_list.rb +97 -0
- data/lib/git-ds/model/item_proxy.rb +128 -0
- data/lib/git-ds/model/property.rb +144 -0
- data/lib/git-ds/model/root.rb +46 -0
- data/lib/git-ds/repo.rb +455 -0
- data/lib/git-ds/shared.rb +17 -0
- data/lib/git-ds/transaction.rb +77 -0
- data/tests/ut_database.rb +304 -0
- data/tests/ut_git_grit_equiv.rb +195 -0
- data/tests/ut_index.rb +203 -0
- data/tests/ut_model.rb +360 -0
- data/tests/ut_repo.rb +260 -0
- data/tests/ut_user_group_model.rb +316 -0
- metadata +142 -0
data/tests/ut_repo.rb
ADDED
@@ -0,0 +1,260 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright 2010 Thoughtgang <http://www.thoughtgang.org>
|
3
|
+
# Unit test for Git-DS Repo class
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
require 'git-ds/repo'
|
9
|
+
|
10
|
+
class TC_GitRepoTest < Test::Unit::TestCase
|
11
|
+
TMP = File.dirname(__FILE__) + File::SEPARATOR + 'tmp'
|
12
|
+
|
13
|
+
attr_reader :repo
|
14
|
+
|
15
|
+
def setup
|
16
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
17
|
+
Dir.mkdir(TMP)
|
18
|
+
|
19
|
+
path = TMP + File::SEPARATOR + 'test'
|
20
|
+
@repo = GitDS::Repo.create(path)
|
21
|
+
|
22
|
+
# add basic structure to repo
|
23
|
+
idx = @repo.index
|
24
|
+
idx.add( 'class a/instance a/prop a', 'aaaaaaaaaa' )
|
25
|
+
idx.add( 'class a/instance a/prop b', 'bbbbbbbbbb' )
|
26
|
+
idx.add( 'class a/instance b/prop a', 'AAAAAAAAAA' )
|
27
|
+
idx.add( 'class a/instance b/prop b', 'BBBBBBBBBB' )
|
28
|
+
idx.add( 'class b/instance a/prop a', '1111111111' )
|
29
|
+
idx.add( 'class b/instance a/prop b', '2222222222' )
|
30
|
+
idx.add( 'class c/instance a/prop a', 'zzzzzzzzzz' )
|
31
|
+
idx.add( 'class c/instance a/prop b', 'xxxxxxxxxx' )
|
32
|
+
idx.add( 'class c/instance a/class d/prop 1', '-_-_-_-_-_' )
|
33
|
+
idx.add( 'class c/instance a/class d/prop 2', '=+=+=+=+=+' )
|
34
|
+
|
35
|
+
idx.commit('initial import')
|
36
|
+
@repo.staging = nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def teardown
|
40
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_create
|
44
|
+
path = TMP + File::SEPARATOR + 'test_create'
|
45
|
+
repo = GitDS::Repo.create(path)
|
46
|
+
|
47
|
+
assert(File.exist?(path + File::SEPARATOR + '.git'),
|
48
|
+
"Repo #{path} not created!")
|
49
|
+
assert_equal(path, repo.top_level, 'Repo#top_level returned wrong value')
|
50
|
+
|
51
|
+
repo.exec_in_git_dir {
|
52
|
+
assert( File.exist?('.git'), 'Repo#exec_in_git_dir failed' )
|
53
|
+
}
|
54
|
+
# TODO: repo.exec_git_cmd()
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_list
|
58
|
+
dir = 'class c/instance a/class d'
|
59
|
+
path, data = "#{dir}/prop 1", '-_-_-_-_-_'
|
60
|
+
|
61
|
+
# test include
|
62
|
+
assert( @repo.include?(dir), 'Repo#include? does not include path' )
|
63
|
+
assert( @repo.include?(path), 'Repo#include? does not include path' )
|
64
|
+
|
65
|
+
assert_nil( @repo.object_data(dir), 'blob data returned for path' )
|
66
|
+
assert_equal( data, @repo.path_to_object(path).data,
|
67
|
+
'Repo#path_to_object#data returned wrong data for blob' )
|
68
|
+
assert_equal( data, @repo.object_data(path),
|
69
|
+
'Repo#object_data returned wrong data for blob' )
|
70
|
+
|
71
|
+
# Test listing of tree contents
|
72
|
+
assert_equal( 3, @repo.tree_contents(@repo.tree).keys.count,
|
73
|
+
'Repo#list returns wrong contents for root tree' )
|
74
|
+
assert_equal( 3, @repo.tree_contents(@repo.tree(@repo.root_sha)).keys.count,
|
75
|
+
'Repo#list returns wrong contents for root_sha' )
|
76
|
+
assert_equal( ['class a', 'class b', 'class c'], @repo.list.keys.sort,
|
77
|
+
'Repo#list returns wrong contents for root' )
|
78
|
+
assert_equal( ['instance a', 'instance b'], @repo.list('class a').keys.sort,
|
79
|
+
'Repo#list returns wrong contents for "class a"' )
|
80
|
+
|
81
|
+
# Test listing of only Blobs or only Trees
|
82
|
+
assert_equal(0, @repo.list_blobs().count, 'List Blobs has wrong root count')
|
83
|
+
assert_equal(3, @repo.list_trees().count, 'List Trees has wrong root count')
|
84
|
+
assert_equal(2, @repo.list_blobs('class c/instance a').count,
|
85
|
+
'List Blobs has wrong count')
|
86
|
+
assert_equal(1, @repo.list_trees('class c/instance a').count,
|
87
|
+
'List Trees has wrong count')
|
88
|
+
|
89
|
+
# Test recursive raw-tree generation
|
90
|
+
output = @repo.raw_tree('class c')
|
91
|
+
assert_equal(1, output.split("\n").count, 'Incorrect count for raw_tree')
|
92
|
+
output = @repo.raw_tree('class c', true)
|
93
|
+
assert_equal(4, output.split("\n").count, 'Incorrect count for raw_tree')
|
94
|
+
|
95
|
+
# Make sure that '' gets us a root Tree object
|
96
|
+
output = @repo.raw_tree('')
|
97
|
+
assert_equal(3, output.split("\n").count, 'Incorrect count for raw_tree')
|
98
|
+
output = @repo.raw_tree('', true)
|
99
|
+
assert_equal(10, output.split("\n").count, 'Incorrect count for raw_tree')
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_index
|
103
|
+
idx = @repo.index_new
|
104
|
+
assert_equal(GitDS::Index, idx.class, 'Repo#index_new returns wrong class')
|
105
|
+
idx = @repo.index
|
106
|
+
assert_equal(GitDS::StageIndex, idx.class, 'Repo#index returns wrong class')
|
107
|
+
|
108
|
+
assert( @repo.staging?(), 'Repo#staging returned FALSE' )
|
109
|
+
|
110
|
+
path, data = 'class c/instance a/prop b', 'XXXXXXXXXX'
|
111
|
+
@repo.stage { |idx|
|
112
|
+
idx.add( path, data )
|
113
|
+
}
|
114
|
+
|
115
|
+
assert_equal(data, @repo.object_data(path), 'Stage did not write data')
|
116
|
+
|
117
|
+
@repo.staging = nil
|
118
|
+
assert( (not @repo.staging?), 'Repo#staging returned TRUE' )
|
119
|
+
|
120
|
+
msg = 'this is a test'
|
121
|
+
@repo.stage_and_commit(msg) { |idx|
|
122
|
+
idx.add( path, data )
|
123
|
+
}
|
124
|
+
|
125
|
+
# ensure this doesn't screw up repo
|
126
|
+
output = @repo.raw_tree('')
|
127
|
+
assert_equal(3, output.split("\n").count, 'Incorrect count for raw_tree')
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_branch_and_tag
|
131
|
+
assert_equal(0, @repo.tags.count, 'Expected initial tag count of 0')
|
132
|
+
assert_equal('1_2_3_4_5_6_7_8_9_0_',
|
133
|
+
@repo.clean_tag('1!2@3#4$5%6^7&8*9(0)'),
|
134
|
+
'clean_tag did not clean')
|
135
|
+
|
136
|
+
# Tag a commit
|
137
|
+
sha = @repo.commits.first.id
|
138
|
+
name = 'the tag is'
|
139
|
+
@repo.tag_object(name, sha)
|
140
|
+
assert_equal(1, @repo.tags.count, 'Tag did not get added')
|
141
|
+
assert_equal('the_tag_is', @repo.tags.first.name, 'Tag name did not match')
|
142
|
+
assert_equal(1,
|
143
|
+
@repo.tags.select{|t| t.name == @repo.clean_tag(name)}.count,
|
144
|
+
'Tag did not get added with right name')
|
145
|
+
|
146
|
+
assert_equal('0.0.0', @repo.last_branch_tag, 'invalid initial tag value')
|
147
|
+
assert_equal('0.0.1', @repo.next_branch_tag, 'next_branch_tag failed')
|
148
|
+
|
149
|
+
assert_equal(GitDS::Repo::DEFAULT_BRANCH, @repo.current_branch,
|
150
|
+
'Current branch is not default branch')
|
151
|
+
assert_equal(GitDS::Repo::DEFAULT_BRANCH, @repo.branch.name,
|
152
|
+
'Current branch is not default branch')
|
153
|
+
|
154
|
+
# create new branch
|
155
|
+
assert_equal(1, @repo.branches.count, '> 1 branches exist on init')
|
156
|
+
new_branch = @repo.create_branch( 'v01' )
|
157
|
+
assert_equal(2, @repo.branches.count, 'new branch not added')
|
158
|
+
|
159
|
+
# switch to new branch
|
160
|
+
@repo.set_branch(new_branch)
|
161
|
+
assert_equal(new_branch, @repo.current_branch, 'Curr branch != new branch')
|
162
|
+
assert_equal(new_branch, @repo.branch.name, 'Current branch != new branch')
|
163
|
+
|
164
|
+
# switch back
|
165
|
+
@repo.set_branch(GitDS::Repo::DEFAULT_BRANCH)
|
166
|
+
assert_equal(GitDS::Repo::DEFAULT_BRANCH, @repo.branch.name,
|
167
|
+
'Current branch is not default branch')
|
168
|
+
|
169
|
+
# create new branch with auto-tag name of 0.0.2
|
170
|
+
v2 = @repo.create_branch
|
171
|
+
assert_equal('0.0.2', v2, 'New branch did not get assigned 0.0.2 name')
|
172
|
+
assert_equal(3, @repo.branches.count, 'new branch not added')
|
173
|
+
|
174
|
+
# switch to new branch and change data
|
175
|
+
@repo.set_branch(new_branch)
|
176
|
+
path, data = 'class c/instance a/prop b', '~~~~~~~~~~'
|
177
|
+
@repo.stage_and_commit('test commit for merge') { |idx|
|
178
|
+
idx.add( path, data )
|
179
|
+
}
|
180
|
+
assert_equal(data, @repo.object_data(path), 'Stage did not write data')
|
181
|
+
|
182
|
+
# test that staging index gets preserved
|
183
|
+
b_stage = @repo.staging
|
184
|
+
@repo.set_branch(GitDS::Repo::DEFAULT_BRANCH)
|
185
|
+
assert( (not @repo.staging?), 'Staging index not cleared on branch' )
|
186
|
+
@repo.set_branch(new_branch)
|
187
|
+
assert( (@repo.staging?), 'Staging index not restored on branch' )
|
188
|
+
assert_equal(b_stage, @repo.staging, 'Staging index not saved on branch')
|
189
|
+
|
190
|
+
# merge new branch to master
|
191
|
+
@repo.merge_branch
|
192
|
+
assert_equal(GitDS::Repo::DEFAULT_BRANCH, @repo.branch.name,
|
193
|
+
'Current branch is not default branch')
|
194
|
+
assert_equal(data, @repo.object_data(path), 'Merge did not write data')
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_index_mod_and_list
|
198
|
+
path, data = 'class e/prop_1', '.:.:.:.:.'
|
199
|
+
|
200
|
+
# list top-level should have 3 entries
|
201
|
+
assert_equal( 3, @repo.tree_contents(@repo.tree).keys.count,
|
202
|
+
'Repo#list returns wrong contents for root tree' )
|
203
|
+
|
204
|
+
@repo.add( path, data )
|
205
|
+
assert_equal( data, @repo.object_data(path),
|
206
|
+
'Repo#object_data returned wrong data for blob' )
|
207
|
+
|
208
|
+
# list top-level should have 4 entries
|
209
|
+
assert_equal( 4, @repo.tree_contents(@repo.tree).keys.count,
|
210
|
+
'Repo#list returns wrong contents for root tree' )
|
211
|
+
|
212
|
+
# Discard staging index
|
213
|
+
@repo.unstage
|
214
|
+
|
215
|
+
# list top-level should have 3 entries again
|
216
|
+
assert_equal( 3, @repo.tree_contents(@repo.tree).keys.count,
|
217
|
+
'Repo#list returns wrong contents for root tree' )
|
218
|
+
|
219
|
+
@repo.add( path, data )
|
220
|
+
assert_equal( data, @repo.object_data(path),
|
221
|
+
'Repo#object_data returned wrong data for blob' )
|
222
|
+
|
223
|
+
@repo.delete('class e/')
|
224
|
+
|
225
|
+
# list top-level should have 3 entries again
|
226
|
+
assert_equal( 3, @repo.tree_contents(@repo.tree).keys.count,
|
227
|
+
'Repo#list returns wrong contents for root tree' )
|
228
|
+
@repo.staging=nil
|
229
|
+
|
230
|
+
# TODO: modification while index is active.
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_add_fs
|
234
|
+
path, data = 'test-fs', 'trtrtrtrt'
|
235
|
+
@repo.add(path, data, true)
|
236
|
+
assert_equal( 4, @repo.tree_contents(@repo.tree).keys.count,
|
237
|
+
'Repo#list returns wrong contents for root tree' )
|
238
|
+
|
239
|
+
@repo.exec_in_git_dir {
|
240
|
+
assert( ::File.exist?(path), 'File not exist after repo-fs-add' )
|
241
|
+
}
|
242
|
+
|
243
|
+
@repo.unstage
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_add_db
|
247
|
+
path, data = 'test-db', 'bdbdbdbdb'
|
248
|
+
@repo.add(path, data)
|
249
|
+
assert_equal( 4, @repo.tree_contents(@repo.tree).keys.count,
|
250
|
+
'Repo#list returns wrong contents for root tree' )
|
251
|
+
|
252
|
+
@repo.exec_in_git_dir {
|
253
|
+
assert( (not ::File.exist? path), 'File exists after repo-db-add' )
|
254
|
+
}
|
255
|
+
|
256
|
+
@repo.unstage
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
@@ -0,0 +1,316 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright 2011 Thoughtgang <http://www.thoughtgang.org>
|
3
|
+
# Unit test for Git-DS Model class API
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
require 'git-ds/database'
|
9
|
+
require 'git-ds/model'
|
10
|
+
|
11
|
+
# =============================================================================
|
12
|
+
# Test database model:
|
13
|
+
# user/ : FsModelItemClass
|
14
|
+
# user/$NAME/ : FsModelItem
|
15
|
+
# user/$NAME/id : Property
|
16
|
+
# user/$NAME/role/ : DbModelItemClass
|
17
|
+
# user/$NAME/role/$NAME/ : DbModelItem
|
18
|
+
# user/$NAME/role/$NAME/auth : Property
|
19
|
+
#
|
20
|
+
# group/ : FsModelItemClass
|
21
|
+
# group/$NAME/ : FsModelItem
|
22
|
+
# group/$NAME/id : Property
|
23
|
+
|
24
|
+
# ----------------------------------------------------------------------
|
25
|
+
# User Role. This is an in-DB item.
|
26
|
+
class UserRoleModelItem
|
27
|
+
include GitDS::DbModelItemObject
|
28
|
+
extend GitDS::DbModelItemClass
|
29
|
+
|
30
|
+
name 'role'
|
31
|
+
|
32
|
+
property(:auth, 127) { |p| p.to_s.to_i == p && p >= 0 && p < 1024 }
|
33
|
+
|
34
|
+
def auth
|
35
|
+
integer_property(:auth)
|
36
|
+
end
|
37
|
+
|
38
|
+
def auth=(val)
|
39
|
+
set_property(:auth, val)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# ----------------------------------------------------------------------
|
44
|
+
class UserModelItem
|
45
|
+
include GitDS::FsModelItemObject
|
46
|
+
extend GitDS::FsModelItemClass
|
47
|
+
|
48
|
+
name 'user'
|
49
|
+
|
50
|
+
# properties
|
51
|
+
property(:id, 0) { |p| p.to_s.to_i == p }
|
52
|
+
|
53
|
+
def initialize(model, path)
|
54
|
+
super
|
55
|
+
@roles = GitDS::ModelItemList.new(UserRoleModelItem, model, path)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Use :username entry in Hash as primary key
|
59
|
+
def self.ident_key
|
60
|
+
:username
|
61
|
+
end
|
62
|
+
|
63
|
+
# Override default fill method to set non-Property children
|
64
|
+
def self.fill(model, item_path, args)
|
65
|
+
super
|
66
|
+
|
67
|
+
# create user role
|
68
|
+
args[:roles].each do |role|
|
69
|
+
UserRoleModelItem.create_in_path(model, item_path, role)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
alias :username :ident
|
74
|
+
|
75
|
+
def id
|
76
|
+
integer_property(:id)
|
77
|
+
end
|
78
|
+
|
79
|
+
def id=(val)
|
80
|
+
set_property(:id, val)
|
81
|
+
end
|
82
|
+
|
83
|
+
def roles
|
84
|
+
ensure_valid
|
85
|
+
@roles.keys
|
86
|
+
end
|
87
|
+
|
88
|
+
def role(name)
|
89
|
+
ensure_valid
|
90
|
+
@roles[name]
|
91
|
+
end
|
92
|
+
|
93
|
+
def add_role(ident, auth)
|
94
|
+
@roles.add(self, {:ident => ident, :auth => auth})
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
# ----------------------------------------------------------------------
|
100
|
+
class GroupModelItem
|
101
|
+
include GitDS::FsModelItemObject
|
102
|
+
extend GitDS::FsModelItemClass
|
103
|
+
|
104
|
+
name 'group'
|
105
|
+
|
106
|
+
# properties
|
107
|
+
property(:id, 0) { |p| p.to_s.to_i == p }
|
108
|
+
link_property(:owner, UserModelItem)
|
109
|
+
|
110
|
+
def initialize(model, path)
|
111
|
+
super
|
112
|
+
@users = GitDS::ProxyItemList.new(UserModelItem, model, path)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Use :name entry in Hash as primary key
|
116
|
+
# NOTE: This tests overriding of ident() instead of ident_key()
|
117
|
+
def self.ident(args)
|
118
|
+
args[:name]
|
119
|
+
end
|
120
|
+
|
121
|
+
alias :name :ident
|
122
|
+
|
123
|
+
def id
|
124
|
+
integer_property(:id)
|
125
|
+
end
|
126
|
+
|
127
|
+
def id=(val)
|
128
|
+
set_property(:id, val)
|
129
|
+
end
|
130
|
+
|
131
|
+
def owner
|
132
|
+
get_property(:owner)
|
133
|
+
end
|
134
|
+
|
135
|
+
def owner=(u)
|
136
|
+
set_property(:owner, u)
|
137
|
+
end
|
138
|
+
|
139
|
+
def users
|
140
|
+
ensure_valid
|
141
|
+
@users.keys
|
142
|
+
end
|
143
|
+
|
144
|
+
def user(name)
|
145
|
+
ensure_valid
|
146
|
+
@users[name]
|
147
|
+
end
|
148
|
+
|
149
|
+
def add_user(u)
|
150
|
+
@users.add(self, u, true)
|
151
|
+
end
|
152
|
+
|
153
|
+
def del_user(name)
|
154
|
+
@users.delete(name)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
# =============================================================================
|
160
|
+
class TC_GitUserGroupModelTest < Test::Unit::TestCase
|
161
|
+
TMP = File.dirname(__FILE__) + File::SEPARATOR + 'tmp'
|
162
|
+
|
163
|
+
attr_reader :db, :model
|
164
|
+
|
165
|
+
def setup
|
166
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
167
|
+
Dir.mkdir(TMP)
|
168
|
+
path = TMP + File::SEPARATOR + 'ug_model_test'
|
169
|
+
@db = GitDS::Database.new(path)
|
170
|
+
@model = GitDS::Model.new(@db)
|
171
|
+
end
|
172
|
+
|
173
|
+
def teardown
|
174
|
+
FileUtils.remove_dir(TMP) if File.exist?(TMP)
|
175
|
+
end
|
176
|
+
|
177
|
+
# ----------------------------------------------------------------------
|
178
|
+
def test_user_item
|
179
|
+
assert_equal(0, UserModelItem.list(@model.root).count, 'init # Users not 0')
|
180
|
+
|
181
|
+
args = { :username => 'admin', :id => 1,
|
182
|
+
:roles => [ {:ident => 'sysadmin', :auth => 255},
|
183
|
+
{:ident => 'operator'} ]
|
184
|
+
}
|
185
|
+
path = UserModelItem.create(@model.root, args)
|
186
|
+
assert_equal(1, UserModelItem.list(@model.root).count, 'User not created')
|
187
|
+
|
188
|
+
# User should exist on filesystem
|
189
|
+
@db.exec_in_git_dir {
|
190
|
+
assert(::File.exist?(path), 'UserModelItem.create failed')
|
191
|
+
}
|
192
|
+
|
193
|
+
assert( @model.exist?(path), 'User not created in object database' )
|
194
|
+
assert_equal(2, @model.list_children(path).count, 'User prop not created')
|
195
|
+
assert_equal(1, UserModelItem.list(@model.root).count, '>1 Users exist')
|
196
|
+
|
197
|
+
# Role should exist in database
|
198
|
+
role_path = path + File::SEPARATOR + 'role'
|
199
|
+
assert_equal(2, @model.list_children(role_path).count)
|
200
|
+
|
201
|
+
auth_path = role_path + File::SEPARATOR + 'sysadmin' + File::SEPARATOR +
|
202
|
+
'auth'
|
203
|
+
assert( @model.exist?(auth_path) )
|
204
|
+
|
205
|
+
u = UserModelItem.new(@model, path)
|
206
|
+
assert_equal(args[:username], u.ident, 'User ident was not set')
|
207
|
+
assert_equal(args[:username], u.username, 'User username was not set')
|
208
|
+
assert_equal(args[:id], u.id, 'User property id was not set')
|
209
|
+
# try again after cache
|
210
|
+
assert_equal(args[:id], u.id, 'User property id was not cached')
|
211
|
+
assert_equal(args[:id], u.property_cache[:id], 'Cached property is wrong')
|
212
|
+
|
213
|
+
u.id = 5
|
214
|
+
assert_equal(5, u.id, 'User property id was not changed')
|
215
|
+
assert_equal(5, u.property_cache[:id], 'User property id was not changed')
|
216
|
+
|
217
|
+
# Verify that role accessor works
|
218
|
+
assert_equal(2, u.roles.count, 'Incorrect number of User roles')
|
219
|
+
assert_equal(['operator', 'sysadmin'], u.roles, 'Incorrect User roles')
|
220
|
+
assert_equal('operator', u.role('operator').ident, 'Incorrect role ident')
|
221
|
+
assert_equal(255, u.role('sysadmin').auth, 'Incorrect role auth')
|
222
|
+
|
223
|
+
u.role('operator').auth = 6
|
224
|
+
assert_equal(6, u.role('operator').auth, 'Role auth did not get set')
|
225
|
+
|
226
|
+
u.add_role('sucker', 7)
|
227
|
+
assert_equal(3, u.roles.count, 'User role did not get added')
|
228
|
+
assert_equal(['operator', 'sucker', 'sysadmin'], u.roles,
|
229
|
+
'Incorrect User roles after add')
|
230
|
+
assert_equal(7, u.role('sucker').auth, 'Role auth did not get set on add')
|
231
|
+
|
232
|
+
u.role('sucker').delete
|
233
|
+
assert_equal(2, u.roles.count, 'User role did not get deleted')
|
234
|
+
assert_equal(['operator', 'sysadmin'], u.roles, 'Incorrect User roles')
|
235
|
+
|
236
|
+
u.delete
|
237
|
+
assert( (not @model.exist? path) )
|
238
|
+
assert_equal(0, UserModelItem.list(@model.root).count, '>0 Users exist')
|
239
|
+
|
240
|
+
assert_raises(GitDS::InvalidModelItemError, 'Deleted item still usable') {
|
241
|
+
u.id
|
242
|
+
}
|
243
|
+
assert_raises(GitDS::InvalidModelItemError, 'Deleted item still usable') {
|
244
|
+
u.username
|
245
|
+
}
|
246
|
+
assert_raises(GitDS::InvalidModelItemError, 'Deleted item still usable') {
|
247
|
+
u.delete
|
248
|
+
}
|
249
|
+
end
|
250
|
+
|
251
|
+
# ----------------------------------------------------------------------
|
252
|
+
def test_group
|
253
|
+
assert_equal(0, GroupModelItem.list(@model.root).count, 'init # Groups > 0')
|
254
|
+
|
255
|
+
args = { :name => 'staff', :id => 1000 }
|
256
|
+
path = GroupModelItem.create(@model.root, args)
|
257
|
+
assert_equal(1, GroupModelItem.list(@model.root).count, 'Group not created')
|
258
|
+
|
259
|
+
# Group should exist on filesystem
|
260
|
+
@db.exec_in_git_dir {
|
261
|
+
assert(::File.exist?(path), 'GroupModelItem.create failed')
|
262
|
+
}
|
263
|
+
|
264
|
+
assert( @model.exist?(path), 'Group not created in object database' )
|
265
|
+
assert_equal(1, @model.list_children(path).count, 'Group prop not created')
|
266
|
+
assert_equal(1, GroupModelItem.list(@model.root).count, '>1 Groups exist')
|
267
|
+
|
268
|
+
g = GroupModelItem.new(@model, path)
|
269
|
+
|
270
|
+
assert_equal(0, g.users.count, 'User count > 0 in new group')
|
271
|
+
|
272
|
+
user_defs = [
|
273
|
+
{ :username => 'admin', :id => 1,
|
274
|
+
:roles => [{:ident => 'sysadmin', :auth => 255}, {:ident => 'operator'}]
|
275
|
+
},
|
276
|
+
{ :username => 'bob', :id => 2,
|
277
|
+
:roles => [{:ident => 'sysadmin', :auth => 1}, {:ident => 'operator'}]
|
278
|
+
},
|
279
|
+
{ :username => 'bill', :id => 3,
|
280
|
+
:roles => [{:ident => 'sysadmin', :auth => 127}, {:ident => 'operator'}]
|
281
|
+
},
|
282
|
+
{ :username => 'jane', :id => 4,
|
283
|
+
:roles => [{:ident => 'sysadmin', :auth => 15}, {:ident => 'operator'}]
|
284
|
+
}
|
285
|
+
]
|
286
|
+
user_defs.each do |u|
|
287
|
+
u[:path] = UserModelItem.create(@model.root, u)
|
288
|
+
u[:obj] = UserModelItem.new(@model, u[:path])
|
289
|
+
g.add_user(u[:obj])
|
290
|
+
end
|
291
|
+
|
292
|
+
assert_equal(user_defs.count, g.users.count, 'Bad User count new group')
|
293
|
+
|
294
|
+
assert_equal(user_defs.inject([]){ |arr, u| arr << u[:username] }.sort,
|
295
|
+
g.users, 'Group user list does not match')
|
296
|
+
|
297
|
+
g.del_user('jane')
|
298
|
+
assert_equal(user_defs.count - 1, g.users.count, 'User not deleted!')
|
299
|
+
|
300
|
+
# cleanup
|
301
|
+
user_defs.each { |u| u[:obj].delete }
|
302
|
+
|
303
|
+
g.delete
|
304
|
+
assert( (not @model.exist? path) )
|
305
|
+
assert_equal(0, GroupModelItem.list(@model.root).count, '>0 Groups exist')
|
306
|
+
|
307
|
+
assert_raises(GitDS::InvalidModelItemError, 'Deleted item still usable') {
|
308
|
+
g.id
|
309
|
+
}
|
310
|
+
assert_raises(GitDS::InvalidModelItemError, 'Deleted item still usable') {
|
311
|
+
g.delete
|
312
|
+
}
|
313
|
+
end
|
314
|
+
|
315
|
+
end
|
316
|
+
|