cassandra_object_rails 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.
- checksums.yaml +15 -0
- data/.gitignore +3 -0
- data/.travis.yml +7 -0
- data/CHANGELOG +5 -0
- data/Gemfile +8 -0
- data/LICENSE +13 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +97 -0
- data/Rakefile +12 -0
- data/cassandra_object_rails.gemspec +26 -0
- data/lib/cassandra_object/attribute_methods.rb +87 -0
- data/lib/cassandra_object/attribute_methods/definition.rb +19 -0
- data/lib/cassandra_object/attribute_methods/dirty.rb +44 -0
- data/lib/cassandra_object/attribute_methods/primary_key.rb +25 -0
- data/lib/cassandra_object/attribute_methods/typecasting.rb +59 -0
- data/lib/cassandra_object/base.rb +69 -0
- data/lib/cassandra_object/belongs_to.rb +63 -0
- data/lib/cassandra_object/belongs_to/association.rb +48 -0
- data/lib/cassandra_object/belongs_to/builder.rb +40 -0
- data/lib/cassandra_object/belongs_to/reflection.rb +30 -0
- data/lib/cassandra_object/callbacks.rb +29 -0
- data/lib/cassandra_object/config.rb +15 -0
- data/lib/cassandra_object/connection.rb +36 -0
- data/lib/cassandra_object/consistency.rb +18 -0
- data/lib/cassandra_object/core.rb +59 -0
- data/lib/cassandra_object/errors.rb +6 -0
- data/lib/cassandra_object/identity.rb +24 -0
- data/lib/cassandra_object/inspect.rb +25 -0
- data/lib/cassandra_object/log_subscriber.rb +29 -0
- data/lib/cassandra_object/persistence.rb +169 -0
- data/lib/cassandra_object/rails_initializer.rb +19 -0
- data/lib/cassandra_object/railtie.rb +11 -0
- data/lib/cassandra_object/savepoints.rb +79 -0
- data/lib/cassandra_object/schema.rb +78 -0
- data/lib/cassandra_object/schema/tasks.rb +48 -0
- data/lib/cassandra_object/scope.rb +48 -0
- data/lib/cassandra_object/scope/batches.rb +32 -0
- data/lib/cassandra_object/scope/finder_methods.rb +47 -0
- data/lib/cassandra_object/scope/query_methods.rb +111 -0
- data/lib/cassandra_object/scoping.rb +19 -0
- data/lib/cassandra_object/serialization.rb +6 -0
- data/lib/cassandra_object/tasks/cassandra.rake +53 -0
- data/lib/cassandra_object/timestamps.rb +19 -0
- data/lib/cassandra_object/type.rb +16 -0
- data/lib/cassandra_object/types.rb +8 -0
- data/lib/cassandra_object/types/array_type.rb +76 -0
- data/lib/cassandra_object/types/base_type.rb +26 -0
- data/lib/cassandra_object/types/boolean_type.rb +20 -0
- data/lib/cassandra_object/types/date_type.rb +17 -0
- data/lib/cassandra_object/types/float_type.rb +16 -0
- data/lib/cassandra_object/types/integer_type.rb +16 -0
- data/lib/cassandra_object/types/json_type.rb +52 -0
- data/lib/cassandra_object/types/string_type.rb +15 -0
- data/lib/cassandra_object/types/time_type.rb +16 -0
- data/lib/cassandra_object/validations.rb +44 -0
- data/lib/cassandra_object_rails.rb +64 -0
- data/test/support/connect.rb +17 -0
- data/test/support/issue.rb +5 -0
- data/test/support/teardown.rb +24 -0
- data/test/test_helper.rb +34 -0
- data/test/unit/active_model_test.rb +18 -0
- data/test/unit/attribute_methods/definition_test.rb +13 -0
- data/test/unit/attribute_methods/dirty_test.rb +71 -0
- data/test/unit/attribute_methods/primary_key_test.rb +26 -0
- data/test/unit/attribute_methods/typecasting_test.rb +112 -0
- data/test/unit/attribute_methods_test.rb +39 -0
- data/test/unit/base_test.rb +20 -0
- data/test/unit/belongs_to/reflection_test.rb +12 -0
- data/test/unit/belongs_to_test.rb +62 -0
- data/test/unit/callbacks_test.rb +46 -0
- data/test/unit/config_test.rb +23 -0
- data/test/unit/connection_test.rb +10 -0
- data/test/unit/consistency_test.rb +13 -0
- data/test/unit/core_test.rb +55 -0
- data/test/unit/identity_test.rb +26 -0
- data/test/unit/inspect_test.rb +26 -0
- data/test/unit/log_subscriber_test.rb +22 -0
- data/test/unit/persistence_test.rb +187 -0
- data/test/unit/savepoints_test.rb +35 -0
- data/test/unit/schema/tasks_test.rb +29 -0
- data/test/unit/schema_test.rb +47 -0
- data/test/unit/scope/batches_test.rb +30 -0
- data/test/unit/scope/finder_methods_test.rb +51 -0
- data/test/unit/scope/query_methods_test.rb +26 -0
- data/test/unit/scoping_test.rb +7 -0
- data/test/unit/timestamps_test.rb +27 -0
- data/test/unit/types/array_type_test.rb +71 -0
- data/test/unit/types/base_type_test.rb +24 -0
- data/test/unit/types/boolean_type_test.rb +24 -0
- data/test/unit/types/date_type_test.rb +11 -0
- data/test/unit/types/float_type_test.rb +17 -0
- data/test/unit/types/integer_type_test.rb +19 -0
- data/test/unit/types/json_type_test.rb +77 -0
- data/test/unit/types/string_type_test.rb +32 -0
- data/test/unit/types/time_type_test.rb +14 -0
- data/test/unit/validations_test.rb +27 -0
- metadata +208 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::AttributeMethods::PrimaryKeyTest < CassandraObject::TestCase
|
4
|
+
test 'get id' do
|
5
|
+
model = temp_object do
|
6
|
+
key do
|
7
|
+
"foo"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
record = model.new
|
11
|
+
|
12
|
+
assert_equal 'foo', record.id
|
13
|
+
end
|
14
|
+
|
15
|
+
test 'set id' do
|
16
|
+
issue = Issue.new id: 'foo'
|
17
|
+
|
18
|
+
assert_equal 'foo', issue.id
|
19
|
+
end
|
20
|
+
|
21
|
+
test 'attributes' do
|
22
|
+
issue = Issue.new
|
23
|
+
|
24
|
+
assert_not_nil issue.attributes['id']
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::AttributeMethods::TypecastingTest < CassandraObject::TestCase
|
4
|
+
class CustomType
|
5
|
+
end
|
6
|
+
|
7
|
+
class CustomCoder < CassandraObject::Types::BaseType
|
8
|
+
end
|
9
|
+
|
10
|
+
class TestIssue < CassandraObject::Base
|
11
|
+
self.column_family = 'Issues'
|
12
|
+
|
13
|
+
attribute :custom_column, type: CustomType, coder: CustomCoder
|
14
|
+
boolean :enabled
|
15
|
+
float :rating
|
16
|
+
integer :price
|
17
|
+
json :orders
|
18
|
+
string :name
|
19
|
+
end
|
20
|
+
|
21
|
+
class TestChildIssue < TestIssue
|
22
|
+
string :description
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'attributes not shared' do
|
26
|
+
assert_nothing_raised { Issue.new.description }
|
27
|
+
assert_raise(NoMethodError) { TestIssue.new.description }
|
28
|
+
assert_nothing_raised { TestChildIssue.new.description }
|
29
|
+
end
|
30
|
+
|
31
|
+
test 'custom attribute definer' do
|
32
|
+
model_attribute = TestIssue.attribute_definitions[:custom_column]
|
33
|
+
|
34
|
+
assert_kind_of CustomCoder, model_attribute.coder
|
35
|
+
assert_equal 'custom_column', model_attribute.name
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'typecast_attribute' do
|
39
|
+
assert_equal 1, TestIssue.typecast_attribute(TestIssue.new, 'price', 1)
|
40
|
+
assert_equal 1, TestIssue.typecast_attribute(TestIssue.new, :price, 1)
|
41
|
+
|
42
|
+
assert_raise NoMethodError do
|
43
|
+
TestIssue.typecast_attribute(TestIssue.new, 'wtf', 1)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
test 'boolean attribute' do
|
48
|
+
issue = TestIssue.create! enabled: '1'
|
49
|
+
assert_equal true, issue.enabled
|
50
|
+
|
51
|
+
issue = TestIssue.find issue.id
|
52
|
+
assert_equal true, issue.enabled
|
53
|
+
end
|
54
|
+
|
55
|
+
test 'float attribute' do
|
56
|
+
issue = TestIssue.create! rating: '4.5'
|
57
|
+
assert_equal 4.5, issue.rating
|
58
|
+
|
59
|
+
issue = TestIssue.find issue.id
|
60
|
+
assert_equal(4.5, issue.rating)
|
61
|
+
end
|
62
|
+
|
63
|
+
test 'integer attribute' do
|
64
|
+
issue = TestIssue.create! price: '101'
|
65
|
+
assert_equal 101, issue.price
|
66
|
+
|
67
|
+
issue = TestIssue.find issue.id
|
68
|
+
assert_equal(101, issue.price)
|
69
|
+
end
|
70
|
+
|
71
|
+
test 'json attribute' do
|
72
|
+
issue = TestIssue.create! orders: {'a' => 'b'}
|
73
|
+
assert_equal({'a' => 'b'}, issue.orders)
|
74
|
+
|
75
|
+
issue = TestIssue.find issue.id
|
76
|
+
assert_equal({'a' => 'b'}, issue.orders)
|
77
|
+
end
|
78
|
+
|
79
|
+
test 'string attribute' do
|
80
|
+
issue = TestIssue.create! name: 'hola'
|
81
|
+
assert_equal('hola', issue.name)
|
82
|
+
|
83
|
+
issue = TestIssue.find issue.id
|
84
|
+
assert_equal('hola', issue.name)
|
85
|
+
end
|
86
|
+
|
87
|
+
test 'multiple attributes definition' do
|
88
|
+
class MultipleAttributesIssue < CassandraObject::Base
|
89
|
+
self.column_family = 'Issues'
|
90
|
+
end
|
91
|
+
|
92
|
+
assert_nothing_raised {
|
93
|
+
MultipleAttributesIssue.string :hello, :greetings, :bye
|
94
|
+
}
|
95
|
+
issue = MultipleAttributesIssue.new :hello => 'hey', :greetings => 'how r u', :bye => 'see ya'
|
96
|
+
|
97
|
+
assert_equal 'how r u', issue.greetings
|
98
|
+
end
|
99
|
+
|
100
|
+
test 'multiple attributes with options' do
|
101
|
+
class MultipleAttributesIssue < CassandraObject::Base
|
102
|
+
self.column_family = 'Issues'
|
103
|
+
end
|
104
|
+
|
105
|
+
MultipleAttributesIssue.expects(:attribute).with(:hello, { :unique => :true, :type => :string })
|
106
|
+
MultipleAttributesIssue.expects(:attribute).with(:world, { :unique => :true, :type => :string })
|
107
|
+
|
108
|
+
class MultipleAttributesIssue < CassandraObject::Base
|
109
|
+
string :hello, :world, :unique => :true
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::AttributeMethodsTest < CassandraObject::TestCase
|
4
|
+
test 'read and write attributes' do
|
5
|
+
issue = Issue.new
|
6
|
+
assert_nil issue.read_attribute(:description)
|
7
|
+
|
8
|
+
issue.write_attribute(:description, nil)
|
9
|
+
assert_nil issue.read_attribute(:description)
|
10
|
+
|
11
|
+
issue.write_attribute(:description, 'foo')
|
12
|
+
assert_equal 'foo', issue.read_attribute(:description)
|
13
|
+
end
|
14
|
+
|
15
|
+
test 'hash accessor aliases' do
|
16
|
+
issue = Issue.new
|
17
|
+
|
18
|
+
issue[:description] = 'bar'
|
19
|
+
|
20
|
+
assert_equal 'bar', issue[:description]
|
21
|
+
end
|
22
|
+
|
23
|
+
# test 'attribute_exists' do
|
24
|
+
# assert !Issue.new.attribute_exists?(:description)
|
25
|
+
# assert Issue.new(description: nil).attribute_exists?(:description)
|
26
|
+
# assert Issue.new(description: false).attribute_exists?(:description)
|
27
|
+
# assert Issue.new(description: 'hey').attribute_exists?(:description)
|
28
|
+
# end
|
29
|
+
|
30
|
+
test 'attributes setter' do
|
31
|
+
issue = Issue.new
|
32
|
+
|
33
|
+
issue.attributes = {
|
34
|
+
description: 'foo'
|
35
|
+
}
|
36
|
+
|
37
|
+
assert_equal 'foo', issue.description
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::BaseTest < CassandraObject::TestCase
|
4
|
+
class Son < CassandraObject::Base
|
5
|
+
end
|
6
|
+
|
7
|
+
class Grandson < Son
|
8
|
+
end
|
9
|
+
|
10
|
+
test 'base_class' do
|
11
|
+
assert_equal CassandraObject::Base, CassandraObject::Base
|
12
|
+
assert_equal Son, Son.base_class
|
13
|
+
assert_equal Son, Grandson.base_class
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'column family' do
|
17
|
+
assert_equal 'CassandraObject::BaseTest::Sons', Son.column_family
|
18
|
+
assert_equal 'CassandraObject::BaseTest::Sons', Grandson.column_family
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::BelongsTo::ReflectionTest < CassandraObject::TestCase
|
4
|
+
class ::Status < CassandraObject::Base; end
|
5
|
+
class ::User < CassandraObject::Base
|
6
|
+
belongs_to :status
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'class_name' do
|
10
|
+
assert_equal 'Status', User.new.belongs_to_reflections[:status].class_name
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::BelongsToTest < CassandraObject::TestCase
|
4
|
+
class TestObject < Issue
|
5
|
+
string :issue_id
|
6
|
+
belongs_to :issue
|
7
|
+
|
8
|
+
string :widget_id
|
9
|
+
belongs_to :widget, class_name: 'Issue'
|
10
|
+
|
11
|
+
string :target_id
|
12
|
+
string :target_type
|
13
|
+
belongs_to :target, polymorphic: true
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'belongs_to' do
|
17
|
+
issue = Issue.create
|
18
|
+
|
19
|
+
record = TestObject.create(issue: issue)
|
20
|
+
|
21
|
+
assert_equal issue, record.issue
|
22
|
+
assert_equal issue.id, record.issue_id
|
23
|
+
|
24
|
+
record = TestObject.find(record.id)
|
25
|
+
assert_equal issue, record.issue
|
26
|
+
end
|
27
|
+
|
28
|
+
test 'belongs_to with class_name' do
|
29
|
+
issue = Issue.create
|
30
|
+
|
31
|
+
record = TestObject.create(widget: issue)
|
32
|
+
|
33
|
+
assert_equal issue, record.widget
|
34
|
+
assert_equal issue.id, record.widget_id
|
35
|
+
|
36
|
+
record = TestObject.find(record.id)
|
37
|
+
assert_equal issue, record.widget
|
38
|
+
end
|
39
|
+
|
40
|
+
test 'belongs_to with polymorphic' do
|
41
|
+
issue = Issue.create
|
42
|
+
|
43
|
+
record = TestObject.create(target: issue)
|
44
|
+
|
45
|
+
assert_equal issue, record.target
|
46
|
+
assert_equal issue.id, record.target_id
|
47
|
+
assert_equal 'Issue', record.target_type
|
48
|
+
|
49
|
+
record = TestObject.find(record.id)
|
50
|
+
assert_equal issue, record.target
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'belongs_to clear cache after reload' do
|
54
|
+
issue = Issue.create
|
55
|
+
record = TestObject.create(issue: issue)
|
56
|
+
issue.destroy
|
57
|
+
|
58
|
+
assert_not_nil record.issue
|
59
|
+
assert_nil TestObject.find(record.id).issue
|
60
|
+
assert_nil record.reload.issue
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::CallbacksTest < CassandraObject::TestCase
|
4
|
+
class TestIssue < CassandraObject::Base
|
5
|
+
self.column_family = 'Issues'
|
6
|
+
string :description
|
7
|
+
|
8
|
+
%w(before_validation after_validation after_save after_create after_update after_destroy).each do |method|
|
9
|
+
send(method) do
|
10
|
+
callback_history << method
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def reset_callback_history
|
15
|
+
@callback_history = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def callback_history
|
19
|
+
@callback_history ||= []
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'create' do
|
24
|
+
issue = TestIssue.create
|
25
|
+
|
26
|
+
assert_equal ['before_validation', 'after_validation', 'after_save', 'after_create'], issue.callback_history
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'update' do
|
30
|
+
issue = TestIssue.create
|
31
|
+
issue.reset_callback_history
|
32
|
+
|
33
|
+
issue.update_attribute :description, 'foo'
|
34
|
+
|
35
|
+
assert_equal ['after_save', 'after_update'], issue.callback_history
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'destroy' do
|
39
|
+
issue = TestIssue.create
|
40
|
+
issue.reset_callback_history
|
41
|
+
|
42
|
+
issue.destroy
|
43
|
+
|
44
|
+
assert_equal ['after_destroy'], issue.callback_history
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::ConfigTest < CassandraObject::TestCase
|
4
|
+
test 'config writer' do
|
5
|
+
config = CassandraObject::Config.new(
|
6
|
+
keyspace: 'place_directory_development',
|
7
|
+
servers: '192.168.0.100:9160',
|
8
|
+
thrift: {'timeout' => 10},
|
9
|
+
keyspace_options: {'placement_strategy' => 'NetworkTopologyStrategy'}
|
10
|
+
)
|
11
|
+
|
12
|
+
assert_equal ['192.168.0.100:9160'], config.servers
|
13
|
+
assert_equal 'place_directory_development', config.keyspace
|
14
|
+
assert_equal 10, config.thrift_options[:timeout]
|
15
|
+
assert_equal 'NetworkTopologyStrategy', config.keyspace_options[:placement_strategy]
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'defaults' do
|
19
|
+
config = CassandraObject::Config.new(keyspace: 'widget_factory')
|
20
|
+
|
21
|
+
assert_equal ["127.0.0.1:9160"], config.servers
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::ConnectionTest < CassandraObject::TestCase
|
4
|
+
class TestObject < CassandraObject::Base
|
5
|
+
end
|
6
|
+
|
7
|
+
test "sanitize supports question marks" do
|
8
|
+
assert_equal 'hello ?', CassandraCQL::Statement.sanitize('hello ?')
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class CassandraObject::ConsistencyTest < CassandraObject::TestCase
|
4
|
+
test "with_consistency" do
|
5
|
+
original = CassandraObject::Base.default_consistency
|
6
|
+
|
7
|
+
CassandraObject::Base.with_consistency 'LOL' do
|
8
|
+
assert_equal 'LOL', CassandraObject::Base.default_consistency
|
9
|
+
end
|
10
|
+
|
11
|
+
assert_equal original, CassandraObject::Base.default_consistency
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::CoreTest < CassandraObject::TestCase
|
4
|
+
test 'initialiaze' do
|
5
|
+
issue = Issue.new
|
6
|
+
|
7
|
+
assert issue.new_record?
|
8
|
+
assert !issue.destroyed?
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'initialize yields self' do
|
12
|
+
issue = Issue.new { |i| i.description = 'bar' }
|
13
|
+
assert_equal 'bar', issue.description
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'dup' do
|
17
|
+
issue = Issue.create description: 'foo'
|
18
|
+
|
19
|
+
dup_issue = issue.dup
|
20
|
+
|
21
|
+
assert dup_issue.new_record?
|
22
|
+
assert_not_equal issue.id, dup_issue.id
|
23
|
+
assert_nil dup_issue.created_at
|
24
|
+
assert_nil dup_issue.updated_at
|
25
|
+
assert_equal 'foo', issue.description
|
26
|
+
end
|
27
|
+
|
28
|
+
test 'equality of new records' do
|
29
|
+
assert_not_equal Issue.new, Issue.new
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'equality' do
|
33
|
+
first_issue = Issue.create
|
34
|
+
second_issue = Issue.create
|
35
|
+
|
36
|
+
assert_equal first_issue, first_issue
|
37
|
+
assert_equal first_issue, Issue.find(first_issue.id)
|
38
|
+
assert_not_equal first_issue, second_issue
|
39
|
+
end
|
40
|
+
|
41
|
+
test 'to_param' do
|
42
|
+
issue = Issue.new
|
43
|
+
assert_equal issue.id, issue.to_param
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'hash' do
|
47
|
+
issue = Issue.create
|
48
|
+
assert_equal issue.id.hash, issue.hash
|
49
|
+
end
|
50
|
+
|
51
|
+
test 'inspect' do
|
52
|
+
issue = Issue.create
|
53
|
+
assert issue.inspect =~ /^#<Issue id: \"\w+\", created_at: \".+\", updated_at: \".+\", description: \".+\">$/
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::IdentityTest < CassandraObject::TestCase
|
4
|
+
test 'primary_key' do
|
5
|
+
assert_equal 'id', Issue.primary_key
|
6
|
+
end
|
7
|
+
|
8
|
+
test 'default _generate_key' do
|
9
|
+
issue = Issue.new
|
10
|
+
|
11
|
+
assert_not_nil Issue._generate_key(issue)
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'custom key' do
|
15
|
+
model = temp_object do
|
16
|
+
key do
|
17
|
+
"name:#{name}"
|
18
|
+
end
|
19
|
+
attr_accessor :name
|
20
|
+
end
|
21
|
+
record = model.new
|
22
|
+
record.name = 'bar'
|
23
|
+
|
24
|
+
assert_equal 'name:bar', model._generate_key(record)
|
25
|
+
end
|
26
|
+
end
|