authorize 0.0.1
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/.gitignore +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +42 -0
- data/LICENSE +20 -0
- data/README +155 -0
- data/Rakefile +25 -0
- data/TODO.txt +9 -0
- data/authorize.gemspec +25 -0
- data/generators/authorize/USAGE +8 -0
- data/generators/authorize/authorize_generator.rb +7 -0
- data/generators/authorize/templates/migrate/create_authorizations.rb +26 -0
- data/install.rb +1 -0
- data/lib/authorize.rb +2 -0
- data/lib/authorize/action_controller.rb +59 -0
- data/lib/authorize/action_view.rb +4 -0
- data/lib/authorize/active_record.rb +37 -0
- data/lib/authorize/bitmask.rb +84 -0
- data/lib/authorize/exceptions.rb +30 -0
- data/lib/authorize/graph.rb +4 -0
- data/lib/authorize/graph/directed_acyclic_graph.rb +10 -0
- data/lib/authorize/graph/directed_acyclic_graph_reverse_traverser.rb +27 -0
- data/lib/authorize/graph/directed_acyclic_graph_traverser.rb +30 -0
- data/lib/authorize/graph/directed_graph.rb +27 -0
- data/lib/authorize/graph/edge.rb +58 -0
- data/lib/authorize/graph/factory.rb +39 -0
- data/lib/authorize/graph/fixtures.rb +33 -0
- data/lib/authorize/graph/graph.rb +55 -0
- data/lib/authorize/graph/traverser.rb +89 -0
- data/lib/authorize/graph/undirected_graph.rb +14 -0
- data/lib/authorize/graph/vertex.rb +53 -0
- data/lib/authorize/permission.rb +97 -0
- data/lib/authorize/redis.rb +2 -0
- data/lib/authorize/redis/array.rb +36 -0
- data/lib/authorize/redis/base.rb +165 -0
- data/lib/authorize/redis/connection_manager.rb +88 -0
- data/lib/authorize/redis/connection_specification.rb +16 -0
- data/lib/authorize/redis/factory.rb +64 -0
- data/lib/authorize/redis/fixtures.rb +22 -0
- data/lib/authorize/redis/hash.rb +34 -0
- data/lib/authorize/redis/model_reference.rb +21 -0
- data/lib/authorize/redis/model_set.rb +19 -0
- data/lib/authorize/redis/set.rb +42 -0
- data/lib/authorize/redis/string.rb +17 -0
- data/lib/authorize/resource.rb +4 -0
- data/lib/authorize/resource_pool.rb +87 -0
- data/lib/authorize/role.rb +115 -0
- data/lib/authorize/test_helper.rb +42 -0
- data/lib/authorize/trustee.rb +4 -0
- data/lib/authorize/version.rb +3 -0
- data/rails/init.rb +5 -0
- data/tasks/authorize_tasks.rake +4 -0
- data/test/Rakefile +7 -0
- data/test/app/controllers/application_controller.rb +5 -0
- data/test/app/controllers/thingy_controller.rb +11 -0
- data/test/app/controllers/widgets_controller.rb +2 -0
- data/test/app/models/public.rb +14 -0
- data/test/app/models/user.rb +8 -0
- data/test/app/models/widget.rb +7 -0
- data/test/config/boot.rb +109 -0
- data/test/config/database.yml +25 -0
- data/test/config/environment.rb +28 -0
- data/test/config/environments/development.rb +4 -0
- data/test/config/environments/test.rb +0 -0
- data/test/config/initializers/mask.rb +1 -0
- data/test/config/initializers/redis.rb +8 -0
- data/test/config/routes.rb +5 -0
- data/test/db/.gitignore +1 -0
- data/test/db/schema.rb +26 -0
- data/test/log/.gitignore +2 -0
- data/test/public/javascripts/application.js +2 -0
- data/test/public/javascripts/controls.js +963 -0
- data/test/public/javascripts/dragdrop.js +972 -0
- data/test/public/javascripts/effects.js +1120 -0
- data/test/public/javascripts/prototype.js +4225 -0
- data/test/script/about +3 -0
- data/test/script/console +3 -0
- data/test/script/dbconsole +3 -0
- data/test/script/destroy +3 -0
- data/test/script/generate +3 -0
- data/test/script/performance/benchmarker +3 -0
- data/test/script/performance/profiler +3 -0
- data/test/script/performance/request +3 -0
- data/test/script/plugin +3 -0
- data/test/script/process/inspector +3 -0
- data/test/script/process/reaper +3 -0
- data/test/script/process/spawner +3 -0
- data/test/script/runner +3 -0
- data/test/script/server +3 -0
- data/test/test/fixtures/authorize/role_graph.yml +11 -0
- data/test/test/fixtures/permissions.yml +27 -0
- data/test/test/fixtures/redis/redis.yml +8 -0
- data/test/test/fixtures/redis/role_graph.yml +29 -0
- data/test/test/fixtures/roles.yml +28 -0
- data/test/test/fixtures/users.yml +12 -0
- data/test/test/fixtures/widgets.yml +12 -0
- data/test/test/functional/controller_class_test.rb +36 -0
- data/test/test/functional/controller_test.rb +46 -0
- data/test/test/test_helper.rb +35 -0
- data/test/test/unit/bitmask_test.rb +112 -0
- data/test/test/unit/fixture_test.rb +59 -0
- data/test/test/unit/graph_directed_acyclic_graph_reverse_traverser_test.rb +43 -0
- data/test/test/unit/graph_directed_acyclic_graph_traverser_test.rb +57 -0
- data/test/test/unit/graph_directed_graph_test.rb +66 -0
- data/test/test/unit/graph_edge_test.rb +53 -0
- data/test/test/unit/graph_graph_test.rb +50 -0
- data/test/test/unit/graph_traverser_test.rb +43 -0
- data/test/test/unit/graph_vertex_test.rb +57 -0
- data/test/test/unit/permission_test.rb +123 -0
- data/test/test/unit/redis_array_test.rb +60 -0
- data/test/test/unit/redis_connection_manager_test.rb +54 -0
- data/test/test/unit/redis_factory_test.rb +85 -0
- data/test/test/unit/redis_fixture_test.rb +18 -0
- data/test/test/unit/redis_hash_test.rb +43 -0
- data/test/test/unit/redis_model_reference_test.rb +39 -0
- data/test/test/unit/redis_set_test.rb +68 -0
- data/test/test/unit/redis_string_test.rb +25 -0
- data/test/test/unit/redis_test.rb +121 -0
- data/test/test/unit/resource_pool_test.rb +93 -0
- data/test/test/unit/resource_test.rb +33 -0
- data/test/test/unit/role_test.rb +143 -0
- data/test/test/unit/trustee_test.rb +35 -0
- data/test/tmp/.gitignore +2 -0
- data/uninstall.rb +1 -0
- metadata +319 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RedisArrayTest < ActiveSupport::TestCase
|
4
|
+
def setup
|
5
|
+
Authorize::Redis::Array.index.clear
|
6
|
+
@factory = Authorize::Redis::Factory.new
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'push element' do
|
10
|
+
aid, element = 'array_id', 'element'
|
11
|
+
Authorize::Redis::Array.db.expects(:rpush).with(aid, element)
|
12
|
+
s = Authorize::Redis::Array.load(aid)
|
13
|
+
s.push(element)
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'delete element' do
|
17
|
+
aid, element = 'array_id', 'element'
|
18
|
+
Authorize::Redis::Array.db.expects(:rpop).with(aid)
|
19
|
+
s = Authorize::Redis::Array.load(aid)
|
20
|
+
s.pop
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'index' do
|
24
|
+
a = @factory.array('test', %w(ant bear cat))
|
25
|
+
assert_equal "cat", a[2]
|
26
|
+
end
|
27
|
+
|
28
|
+
test 'range index' do
|
29
|
+
a = @factory.array('test', %w(ant bear cat))
|
30
|
+
assert_equal %w(bear cat), a[1..2]
|
31
|
+
end
|
32
|
+
|
33
|
+
test 'to_a' do
|
34
|
+
a = @factory.array('test', %w(ant bear cat))
|
35
|
+
assert_equal %w(ant bear cat), a.to_a
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'load proxy from store' do
|
39
|
+
aid, element = 'array_id', 'element'
|
40
|
+
Authorize::Redis::Array.db.expects(:lrange).with(aid, 0, -1).returns([element])
|
41
|
+
s = Authorize::Redis::Array.load(aid)
|
42
|
+
assert_equal 1, s.length
|
43
|
+
end
|
44
|
+
|
45
|
+
test 'enumerable' do
|
46
|
+
s = Authorize::Redis::Array.new
|
47
|
+
s.push(23);s.push(27)
|
48
|
+
assert_equal "2327", s.inject{|m, e| m + e}
|
49
|
+
end
|
50
|
+
|
51
|
+
test 'valid' do
|
52
|
+
a = @factory.array('a', ['a'])
|
53
|
+
assert a.valid?
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'valid when empty' do
|
57
|
+
a = Authorize::Redis::Array.new
|
58
|
+
assert a.valid?
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RedisConnectionManagerTest < ActiveSupport::TestCase
|
4
|
+
extend Authorize::Redis
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@connection = stub('connection')
|
8
|
+
@specification = stub('specification')
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'acquire_connection connects' do
|
12
|
+
manager = Authorize::Redis::ConnectionManager.new(@specification, :size => 1)
|
13
|
+
@specification.expects(:connect! => @connection)
|
14
|
+
assert_same @connection, manager.acquire_connection
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'acquire_connection is idempotent for a given thread' do
|
18
|
+
manager = Authorize::Redis::ConnectionManager.new(@specification, :size => 1)
|
19
|
+
@specification.expects(:connect!).once.returns(@connection)
|
20
|
+
c0 = manager.acquire_connection
|
21
|
+
c1 = manager.acquire_connection
|
22
|
+
assert_same c0, c1
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'acquire connection blocks when full' do
|
26
|
+
begin
|
27
|
+
manager = Authorize::Redis::ConnectionManager.new(@specification, :size => 1)
|
28
|
+
@specification.expects(:connect! => @connection)
|
29
|
+
c = manager.acquire_connection
|
30
|
+
t = Thread.new(manager) {|m| m.acquire_connection}
|
31
|
+
t.run
|
32
|
+
assert_equal 'sleep', t.status
|
33
|
+
manager.release_connection
|
34
|
+
t.run
|
35
|
+
assert_equal false, t.status # Thread has run to completion.
|
36
|
+
ensure
|
37
|
+
t.exit
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
test 'release connection' do
|
42
|
+
manager = Authorize::Redis::ConnectionManager.new(@specification, :size => 1)
|
43
|
+
@specification.expects(:connect! => @connection)
|
44
|
+
c = manager.acquire_connection
|
45
|
+
manager.release_connection
|
46
|
+
assert manager.pool.include?(c)
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'connection is unique per thread' do
|
50
|
+
manager = Authorize::Redis::ConnectionManager.new(@specification)
|
51
|
+
@specification.expects(:connect!).once.returns(@connection)
|
52
|
+
2.times { manager.connection }
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'authorize/redis/factory'
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
class RedisFactoryTest < ActiveSupport::TestCase
|
6
|
+
test 'string factory' do
|
7
|
+
key, value = 'key', 'value'
|
8
|
+
Authorize::Redis::Base.db.expects(:set).with(key, value)
|
9
|
+
obj = Authorize::Redis::Factory.new.string(key, value)
|
10
|
+
assert_kind_of Authorize::Redis::String, obj
|
11
|
+
assert_equal key, obj.id
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'set factory' do
|
15
|
+
key, value = 'key', Set['value0', 'value1']
|
16
|
+
elements = value.to_a
|
17
|
+
Authorize::Redis::Base.db.expects(:sadd).with(key, elements.first)
|
18
|
+
Authorize::Redis::Base.db.expects(:sadd).with(key, elements.last)
|
19
|
+
obj = Authorize::Redis::Factory.new.set(key, value)
|
20
|
+
assert_kind_of Authorize::Redis::Set, obj
|
21
|
+
assert_equal key, obj.id
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'hash factory' do
|
25
|
+
key, value = 'key', {'key0' => 'value0', 'key1' => 'value1'}
|
26
|
+
keys = value.keys
|
27
|
+
Authorize::Redis::Base.db.expects(:hset).with(key, keys.first, value[keys.first])
|
28
|
+
Authorize::Redis::Base.db.expects(:hset).with(key, keys.last, value[keys.last])
|
29
|
+
obj = Authorize::Redis::Factory.new.hash(key, value)
|
30
|
+
assert_kind_of Authorize::Redis::Hash, obj
|
31
|
+
assert_equal key, obj.id
|
32
|
+
end
|
33
|
+
|
34
|
+
test 'array factory' do
|
35
|
+
key, value = 'key', ['value0', 'value1']
|
36
|
+
Authorize::Redis::Base.db.expects(:rpush).with(key, value.first).in_sequence
|
37
|
+
Authorize::Redis::Base.db.expects(:rpush).with(key, value.last).in_sequence
|
38
|
+
obj = Authorize::Redis::Factory.new.array(key, value)
|
39
|
+
assert_kind_of Authorize::Redis::Array, obj
|
40
|
+
assert_equal key, obj.id
|
41
|
+
end
|
42
|
+
|
43
|
+
test 'build with block' do
|
44
|
+
namespace, key, value = :namespace, 'key', 'value'
|
45
|
+
Authorize::Redis::Base.db.expects(:set).with([namespace, key].join('::'), value)
|
46
|
+
Authorize::Redis::Factory.build(namespace){string(key, value)}
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'factory with nested namespace' do
|
50
|
+
outer_namespace, inner_namespace, key, value = :outer_namespace, :inner_namespace, 'key', {'key0' => 'value0', 'key1' => 'value1'}
|
51
|
+
keys = value.keys
|
52
|
+
fullkey = [outer_namespace, inner_namespace, key].join('::')
|
53
|
+
Authorize::Redis::Base.db.expects(:hset).with(fullkey, keys.first, value[keys.first])
|
54
|
+
Authorize::Redis::Base.db.expects(:hset).with(fullkey, keys.last, value[keys.last])
|
55
|
+
Authorize::Redis::Factory.build(outer_namespace){namespace(inner_namespace){hash(key, value)}}
|
56
|
+
end
|
57
|
+
|
58
|
+
test 'factory with colliding key and namespace' do
|
59
|
+
namespace, ckey, key, value1, value2 = :namespace, 'kns', 'key', 'value1', Set['member0', 'member1']
|
60
|
+
elements = value2.to_a
|
61
|
+
Authorize::Redis::Base.db.expects(:set).with([namespace, ckey].join('::'), value1)
|
62
|
+
Authorize::Redis::Base.db.expects(:sadd).with([namespace, ckey, key].join('::'), elements.first)
|
63
|
+
Authorize::Redis::Base.db.expects(:sadd).with([namespace, ckey, key].join('::'), elements.last)
|
64
|
+
Authorize::Redis::Factory.build(namespace){string(ckey, value1){set(key, value2)}}
|
65
|
+
end
|
66
|
+
|
67
|
+
test 'factory restores namespace after block' do
|
68
|
+
ns, key1, value1, key2, value2 = 'namespace', 'key1', 'value1', 'key2', 'value2'
|
69
|
+
Authorize::Redis::Base.db.expects(:set).with([ns, key1].join('::'), value1)
|
70
|
+
Authorize::Redis::Base.db.expects(:set).with(key2, value2)
|
71
|
+
f = Authorize::Redis::Factory.build
|
72
|
+
f.namespace(ns){string(key1, value1)}
|
73
|
+
f.string(key2, value2)
|
74
|
+
end
|
75
|
+
|
76
|
+
test 'returned object has namespaced id' do
|
77
|
+
namespace, key, value = :namespace, 'key', 'value'
|
78
|
+
fqk = [namespace, key].join('::')
|
79
|
+
Authorize::Redis::Base.db.expects(:set).with(fqk, value)
|
80
|
+
f = Authorize::Redis::Factory.build(namespace)
|
81
|
+
obj = f.string(key, value)
|
82
|
+
assert_kind_of Authorize::Redis::String, obj
|
83
|
+
assert_equal fqk, obj.id
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'authorize/redis/fixtures'
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
class RedisFixtureTest < ActiveSupport::TestCase
|
6
|
+
def setup
|
7
|
+
Authorize::Redis::String.index.clear # Clear the cache
|
8
|
+
Authorize::Redis::Set.index.clear
|
9
|
+
Authorize::Redis::Hash.index.clear
|
10
|
+
end
|
11
|
+
|
12
|
+
test 'fixtures' do
|
13
|
+
Authorize::Redis::Fixtures.create_fixtures(Authorize::Redis::Base.db, Pathname.new(fixture_path).join('redis', 'redis.yml'))
|
14
|
+
assert_equal 'x', Authorize::Redis::String.new('string').__getobj__
|
15
|
+
assert_equal %w(1 2).to_set, Authorize::Redis::Set.new("set").__getobj__
|
16
|
+
assert_equal({"a" => "1", "b" => "2"}, Authorize::Redis::Hash.new("hash").__getobj__)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'authorize/redis/factory'
|
3
|
+
|
4
|
+
class RedisHashTest < ActiveSupport::TestCase
|
5
|
+
def setup
|
6
|
+
Authorize::Redis::Hash.index.clear
|
7
|
+
@factory = Authorize::Redis::Factory.new
|
8
|
+
end
|
9
|
+
|
10
|
+
test 'hash keys are stringified' do
|
11
|
+
h = Authorize::Redis::Hash.new
|
12
|
+
h.set("", 'empty')
|
13
|
+
h.set(nil, 'nil')
|
14
|
+
assert_equal 'nil', h.get(nil)
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'merge' do
|
18
|
+
h = @factory.hash('h', {'key' => 'a'})
|
19
|
+
h.merge('key' => 'A')
|
20
|
+
assert_equal 'A', h['key']
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'merge with empty hash' do
|
24
|
+
h = @factory.hash('h', {'key' => 'a'})
|
25
|
+
h.merge({})
|
26
|
+
assert_equal 'a', h['key']
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'index getter' do
|
30
|
+
h = @factory.hash('h', {'key' => 'a'})
|
31
|
+
assert_equal h['key'], 'a'
|
32
|
+
end
|
33
|
+
|
34
|
+
test 'valid' do
|
35
|
+
h = @factory.hash('h', {'key' => 'a'})
|
36
|
+
assert h.valid?
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'valid when empty' do
|
40
|
+
h = Authorize::Redis::Hash.new
|
41
|
+
assert h.valid?
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'authorize/redis/model_reference'
|
3
|
+
|
4
|
+
class RedisModelReferenceTest < ActiveSupport::TestCase
|
5
|
+
include Authorize::Redis
|
6
|
+
|
7
|
+
def setup
|
8
|
+
Authorize::Redis::String.index.clear # Clear the cache
|
9
|
+
Authorize::Redis::Set.index.clear
|
10
|
+
Authorize::Redis::Hash.index.clear
|
11
|
+
Authorize::Redis::Factory.build('X') do
|
12
|
+
string('reference1', subordinate_key('target'))
|
13
|
+
hash('target', {'key' => 'value'})
|
14
|
+
string('reference2', subordinate_key('missingtarget'))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'set reference' do
|
19
|
+
key = 'X::reference0'
|
20
|
+
h = Authorize::Redis::Hash.load('X::target')
|
21
|
+
Authorize::Redis::String.db.expects(:set).with(key, h.id).returns(h.id)
|
22
|
+
assert ModelReference.set_reference(key, h)
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'set reference with nil' do
|
26
|
+
key = 'X::reference0'
|
27
|
+
h = Authorize::Redis::Hash.load('X::target')
|
28
|
+
Authorize::Redis::String.db.expects(:del).with(key).returns('0')
|
29
|
+
assert_nil ModelReference.set_reference(key, nil)
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'load reference' do
|
33
|
+
assert_kind_of Authorize::Redis::Hash, ModelReference.load_reference('X::reference1', Authorize::Redis::Hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
test 'load reference with invalid reference' do
|
37
|
+
assert_nil ModelReference.load_reference('X::missing_reference', Authorize::Redis::Hash)
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RedisSetTest < ActiveSupport::TestCase
|
4
|
+
def setup
|
5
|
+
Authorize::Redis::String.index.clear # Clear the cache
|
6
|
+
Authorize::Redis::Set.index.clear
|
7
|
+
Authorize::Redis::Hash.index.clear
|
8
|
+
@factory = Authorize::Redis::Factory.new
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'add member' do
|
12
|
+
sid, member = 'set_id', 'member'
|
13
|
+
Authorize::Redis::Set.db.expects(:sadd).with(sid, member)
|
14
|
+
s = Authorize::Redis::Set.load(sid)
|
15
|
+
s.add(member)
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'delete member' do
|
19
|
+
sid, member = 'set_id', 'member'
|
20
|
+
Authorize::Redis::Set.db.expects(:srem).with(sid, member)
|
21
|
+
s = Authorize::Redis::Set.load(sid)
|
22
|
+
s.delete(member)
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'load proxy from store' do
|
26
|
+
sid, member = 'set_id', 'member'
|
27
|
+
Authorize::Redis::Set.db.expects(:smembers).with(sid).returns([member])
|
28
|
+
s = Authorize::Redis::Set.load(sid)
|
29
|
+
assert_equal 1, s.length
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'enumerable' do
|
33
|
+
s = Authorize::Redis::Set.new
|
34
|
+
s.add(23);s.add(27)
|
35
|
+
assert_equal "2327", s.inject{|m, e| m + e}
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'valid' do
|
39
|
+
s = @factory.set('h', Set['a'])
|
40
|
+
assert s.valid?
|
41
|
+
end
|
42
|
+
|
43
|
+
test 'valid when empty' do
|
44
|
+
s = Authorize::Redis::Set.new
|
45
|
+
assert s.valid?
|
46
|
+
end
|
47
|
+
|
48
|
+
test 'include' do
|
49
|
+
s = @factory.set('h', Set['a'])
|
50
|
+
assert s.include?('a')
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'sample single' do
|
54
|
+
s = @factory.set('h', Set['a', 'b'])
|
55
|
+
assert s.sample
|
56
|
+
end
|
57
|
+
|
58
|
+
test 'sample multiple' do
|
59
|
+
# depends on Ruby 1.9
|
60
|
+
# s = @factory.set('h', Set['a', 'b'])
|
61
|
+
# assert_equal Set['a', 'b'], s.sample(3)
|
62
|
+
end
|
63
|
+
|
64
|
+
test 'first multiple' do
|
65
|
+
s = @factory.set('h', Set['a', 'b'])
|
66
|
+
assert_equal ['a', 'b'].to_set, s.first(3).to_set
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'authorize/redis/factory'
|
3
|
+
|
4
|
+
class RedisStringTest < ActiveSupport::TestCase
|
5
|
+
def setup
|
6
|
+
Authorize::Redis::String.index.clear
|
7
|
+
@factory = Authorize::Redis::Factory.new
|
8
|
+
end
|
9
|
+
|
10
|
+
test 'valid' do
|
11
|
+
s = @factory.string('key', 'value')
|
12
|
+
assert s.valid?
|
13
|
+
end
|
14
|
+
|
15
|
+
test 'valid when empty' do
|
16
|
+
s = Authorize::Redis::String.new
|
17
|
+
assert s.valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'invalid when key references wrong type' do
|
21
|
+
@factory.hash('h', {'key' => 'value'})
|
22
|
+
s = Authorize::Redis::String.new('h')
|
23
|
+
assert !s.valid?
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RedisTest < ActiveSupport::TestCase
|
4
|
+
def setup
|
5
|
+
Authorize::Redis::Base.index.clear # Clear the cache
|
6
|
+
Authorize::Redis::String.index.clear # Clear the cache
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'identity' do
|
10
|
+
assert o0 = Authorize::Redis::Base.new('A')
|
11
|
+
assert o1 = Authorize::Redis::Base.new('B')
|
12
|
+
assert_not_same o0, o1
|
13
|
+
end
|
14
|
+
|
15
|
+
test 'equality by class and id' do
|
16
|
+
assert o0 = Authorize::Redis::Base.new('A')
|
17
|
+
assert o1 = Authorize::Redis::Base.new('A')
|
18
|
+
assert_equal o0, o1
|
19
|
+
end
|
20
|
+
|
21
|
+
test 'inequality by id' do
|
22
|
+
o0 = Authorize::Redis::Base.new('A')
|
23
|
+
o1 = Authorize::Redis::Base.new('B')
|
24
|
+
assert_not_equal o0, o1
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'inequality by class' do
|
28
|
+
c0 = Class.new(Authorize::Redis::Base)
|
29
|
+
c1 = Class.new(Authorize::Redis::Base)
|
30
|
+
o0 = c0.new('A')
|
31
|
+
o1 = c1.new('B')
|
32
|
+
assert_not_equal o0, o1
|
33
|
+
end
|
34
|
+
|
35
|
+
# This test ensures that different object instances mapping to the same database value(s) are
|
36
|
+
# considered identical in the context of membership within a collection (Hash, Set, Array, etc.).
|
37
|
+
test 'hash equality' do
|
38
|
+
assert o0 = Authorize::Redis::Base.new('A')
|
39
|
+
assert o1 = Authorize::Redis::Base.new('A')
|
40
|
+
assert o0.eql?(o1)
|
41
|
+
assert_equal o0.hash, o1.hash
|
42
|
+
end
|
43
|
+
|
44
|
+
test 'initialize semantics' do
|
45
|
+
Authorize::Redis::Base.any_instance.expects(:initialize).once
|
46
|
+
Authorize::Redis::Base.any_instance.expects(:reload).never
|
47
|
+
Authorize::Redis::Base.new('x') # Even with an existing key...
|
48
|
+
end
|
49
|
+
|
50
|
+
test 'reload semantics' do
|
51
|
+
Authorize::Redis::Base.any_instance.expects(:reload)
|
52
|
+
Authorize::Redis::Base.any_instance.expects(:initialize).never
|
53
|
+
assert val1 = Authorize::Redis::Base.load('new_key') # Even with a new key
|
54
|
+
end
|
55
|
+
|
56
|
+
# Can Redis objects be serialized according to conventional Marshal contracts?
|
57
|
+
test 'serializability with Marshal' do
|
58
|
+
v0 = Authorize::Redis::String.new
|
59
|
+
v0.set("Hi Mom")
|
60
|
+
assert_instance_of String, s = Marshal.dump(v0)
|
61
|
+
assert_instance_of Authorize::Redis::String, v1 = Marshal.load(s)
|
62
|
+
assert_equal v0, v1
|
63
|
+
end
|
64
|
+
|
65
|
+
# Can Redis objects be serialized according to conventional YAML contracts?
|
66
|
+
test 'serializability with YAML' do
|
67
|
+
v0 = Authorize::Redis::String.new
|
68
|
+
v0.set("Hi Mom")
|
69
|
+
assert_instance_of String, s = YAML.dump(v0)
|
70
|
+
assert_instance_of Authorize::Redis::String, v1 = YAML.load(s)
|
71
|
+
assert_equal v0, v1
|
72
|
+
end
|
73
|
+
|
74
|
+
# Can Redis objects be serialized according to conventional YAML contracts?
|
75
|
+
test 'serializability with YAML as set' do
|
76
|
+
v0 = Authorize::Graph::Vertex.new
|
77
|
+
set0 = Set[v0]
|
78
|
+
assert_instance_of String, s = YAML.dump(set0)
|
79
|
+
assert_instance_of Set, set1 = YAML.load(s)
|
80
|
+
assert_instance_of Authorize::Graph::Vertex, v1 = set1.first
|
81
|
+
assert_equal v0, v1
|
82
|
+
end
|
83
|
+
|
84
|
+
# Do serialized and re-hyrdrated Redis objects honor the strict identity contract?
|
85
|
+
test 'serialization' do
|
86
|
+
v0 = Authorize::Redis::String.new
|
87
|
+
v0.set("Hi Mom")
|
88
|
+
v1 = Marshal.load(Marshal.dump(v0))
|
89
|
+
assert v0.eql?(v1)
|
90
|
+
assert_equal v0, v1
|
91
|
+
end
|
92
|
+
|
93
|
+
test 'exist' do
|
94
|
+
assert !Authorize::Redis::String.exists?('newkey')
|
95
|
+
Authorize::Redis::String.new("newkey").set(1)
|
96
|
+
assert Authorize::Redis::String.exists?('newkey')
|
97
|
+
end
|
98
|
+
|
99
|
+
test 'destroy' do
|
100
|
+
obj = Authorize::Redis::String.new
|
101
|
+
obj.set("Hi Mom")
|
102
|
+
obj.destroy
|
103
|
+
assert obj.frozen?
|
104
|
+
assert !Authorize::Redis::String.index.include?(obj.id)
|
105
|
+
end
|
106
|
+
|
107
|
+
# --String-------------------------------------------------------------------
|
108
|
+
test 'proxy to native String' do
|
109
|
+
v = Authorize::Redis::String.new
|
110
|
+
v.set(23)
|
111
|
+
assert_equal "232", v + "2"
|
112
|
+
end
|
113
|
+
|
114
|
+
test 'proxy is frozen' do
|
115
|
+
v = Authorize::Redis::String.new
|
116
|
+
v.set("ABC")
|
117
|
+
assert_raises TypeError do
|
118
|
+
v << "DEF"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|