git-ds 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|