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.
Files changed (124) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +42 -0
  4. data/LICENSE +20 -0
  5. data/README +155 -0
  6. data/Rakefile +25 -0
  7. data/TODO.txt +9 -0
  8. data/authorize.gemspec +25 -0
  9. data/generators/authorize/USAGE +8 -0
  10. data/generators/authorize/authorize_generator.rb +7 -0
  11. data/generators/authorize/templates/migrate/create_authorizations.rb +26 -0
  12. data/install.rb +1 -0
  13. data/lib/authorize.rb +2 -0
  14. data/lib/authorize/action_controller.rb +59 -0
  15. data/lib/authorize/action_view.rb +4 -0
  16. data/lib/authorize/active_record.rb +37 -0
  17. data/lib/authorize/bitmask.rb +84 -0
  18. data/lib/authorize/exceptions.rb +30 -0
  19. data/lib/authorize/graph.rb +4 -0
  20. data/lib/authorize/graph/directed_acyclic_graph.rb +10 -0
  21. data/lib/authorize/graph/directed_acyclic_graph_reverse_traverser.rb +27 -0
  22. data/lib/authorize/graph/directed_acyclic_graph_traverser.rb +30 -0
  23. data/lib/authorize/graph/directed_graph.rb +27 -0
  24. data/lib/authorize/graph/edge.rb +58 -0
  25. data/lib/authorize/graph/factory.rb +39 -0
  26. data/lib/authorize/graph/fixtures.rb +33 -0
  27. data/lib/authorize/graph/graph.rb +55 -0
  28. data/lib/authorize/graph/traverser.rb +89 -0
  29. data/lib/authorize/graph/undirected_graph.rb +14 -0
  30. data/lib/authorize/graph/vertex.rb +53 -0
  31. data/lib/authorize/permission.rb +97 -0
  32. data/lib/authorize/redis.rb +2 -0
  33. data/lib/authorize/redis/array.rb +36 -0
  34. data/lib/authorize/redis/base.rb +165 -0
  35. data/lib/authorize/redis/connection_manager.rb +88 -0
  36. data/lib/authorize/redis/connection_specification.rb +16 -0
  37. data/lib/authorize/redis/factory.rb +64 -0
  38. data/lib/authorize/redis/fixtures.rb +22 -0
  39. data/lib/authorize/redis/hash.rb +34 -0
  40. data/lib/authorize/redis/model_reference.rb +21 -0
  41. data/lib/authorize/redis/model_set.rb +19 -0
  42. data/lib/authorize/redis/set.rb +42 -0
  43. data/lib/authorize/redis/string.rb +17 -0
  44. data/lib/authorize/resource.rb +4 -0
  45. data/lib/authorize/resource_pool.rb +87 -0
  46. data/lib/authorize/role.rb +115 -0
  47. data/lib/authorize/test_helper.rb +42 -0
  48. data/lib/authorize/trustee.rb +4 -0
  49. data/lib/authorize/version.rb +3 -0
  50. data/rails/init.rb +5 -0
  51. data/tasks/authorize_tasks.rake +4 -0
  52. data/test/Rakefile +7 -0
  53. data/test/app/controllers/application_controller.rb +5 -0
  54. data/test/app/controllers/thingy_controller.rb +11 -0
  55. data/test/app/controllers/widgets_controller.rb +2 -0
  56. data/test/app/models/public.rb +14 -0
  57. data/test/app/models/user.rb +8 -0
  58. data/test/app/models/widget.rb +7 -0
  59. data/test/config/boot.rb +109 -0
  60. data/test/config/database.yml +25 -0
  61. data/test/config/environment.rb +28 -0
  62. data/test/config/environments/development.rb +4 -0
  63. data/test/config/environments/test.rb +0 -0
  64. data/test/config/initializers/mask.rb +1 -0
  65. data/test/config/initializers/redis.rb +8 -0
  66. data/test/config/routes.rb +5 -0
  67. data/test/db/.gitignore +1 -0
  68. data/test/db/schema.rb +26 -0
  69. data/test/log/.gitignore +2 -0
  70. data/test/public/javascripts/application.js +2 -0
  71. data/test/public/javascripts/controls.js +963 -0
  72. data/test/public/javascripts/dragdrop.js +972 -0
  73. data/test/public/javascripts/effects.js +1120 -0
  74. data/test/public/javascripts/prototype.js +4225 -0
  75. data/test/script/about +3 -0
  76. data/test/script/console +3 -0
  77. data/test/script/dbconsole +3 -0
  78. data/test/script/destroy +3 -0
  79. data/test/script/generate +3 -0
  80. data/test/script/performance/benchmarker +3 -0
  81. data/test/script/performance/profiler +3 -0
  82. data/test/script/performance/request +3 -0
  83. data/test/script/plugin +3 -0
  84. data/test/script/process/inspector +3 -0
  85. data/test/script/process/reaper +3 -0
  86. data/test/script/process/spawner +3 -0
  87. data/test/script/runner +3 -0
  88. data/test/script/server +3 -0
  89. data/test/test/fixtures/authorize/role_graph.yml +11 -0
  90. data/test/test/fixtures/permissions.yml +27 -0
  91. data/test/test/fixtures/redis/redis.yml +8 -0
  92. data/test/test/fixtures/redis/role_graph.yml +29 -0
  93. data/test/test/fixtures/roles.yml +28 -0
  94. data/test/test/fixtures/users.yml +12 -0
  95. data/test/test/fixtures/widgets.yml +12 -0
  96. data/test/test/functional/controller_class_test.rb +36 -0
  97. data/test/test/functional/controller_test.rb +46 -0
  98. data/test/test/test_helper.rb +35 -0
  99. data/test/test/unit/bitmask_test.rb +112 -0
  100. data/test/test/unit/fixture_test.rb +59 -0
  101. data/test/test/unit/graph_directed_acyclic_graph_reverse_traverser_test.rb +43 -0
  102. data/test/test/unit/graph_directed_acyclic_graph_traverser_test.rb +57 -0
  103. data/test/test/unit/graph_directed_graph_test.rb +66 -0
  104. data/test/test/unit/graph_edge_test.rb +53 -0
  105. data/test/test/unit/graph_graph_test.rb +50 -0
  106. data/test/test/unit/graph_traverser_test.rb +43 -0
  107. data/test/test/unit/graph_vertex_test.rb +57 -0
  108. data/test/test/unit/permission_test.rb +123 -0
  109. data/test/test/unit/redis_array_test.rb +60 -0
  110. data/test/test/unit/redis_connection_manager_test.rb +54 -0
  111. data/test/test/unit/redis_factory_test.rb +85 -0
  112. data/test/test/unit/redis_fixture_test.rb +18 -0
  113. data/test/test/unit/redis_hash_test.rb +43 -0
  114. data/test/test/unit/redis_model_reference_test.rb +39 -0
  115. data/test/test/unit/redis_set_test.rb +68 -0
  116. data/test/test/unit/redis_string_test.rb +25 -0
  117. data/test/test/unit/redis_test.rb +121 -0
  118. data/test/test/unit/resource_pool_test.rb +93 -0
  119. data/test/test/unit/resource_test.rb +33 -0
  120. data/test/test/unit/role_test.rb +143 -0
  121. data/test/test/unit/trustee_test.rb +35 -0
  122. data/test/tmp/.gitignore +2 -0
  123. data/uninstall.rb +1 -0
  124. 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