opinions 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,70 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class IntegrationTestOpinionsOpinionated < MiniTest::Integration::TestCase
6
+
7
+ def test_voting_on_any_confirming_object
8
+
9
+ example_target = ExampleTarget.new
10
+ example_target.id = 456
11
+
12
+ ExampleObject.send(:include, Opinionated)
13
+ ExampleObject.send(:opinions, :example)
14
+
15
+ example_object = ExampleObject.new
16
+ example_object.id = 123
17
+
18
+ example_object.example(example_target)
19
+
20
+ assert Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
21
+
22
+ end
23
+
24
+ def test_cancelling_a_vote_on_any_conforming_object
25
+
26
+ example_target = ExampleTarget.new
27
+ example_target.id = 456
28
+
29
+ ExampleObject.send(:include, Opinionated)
30
+ ExampleObject.send(:opinions, :example)
31
+
32
+ example_object = ExampleObject.new
33
+ example_object.id = 123
34
+
35
+ expected_opinion = Opinion.new(target: example_target, object: example_object, opinion: :example)
36
+ expected_opinion.persist
37
+
38
+ example_object.cancel_example(example_target)
39
+
40
+ refute Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
41
+
42
+ end
43
+
44
+ def test_retrieving_votes_from_the_backend
45
+
46
+ example_target_one = ExampleTarget.new
47
+ example_target_one.id = 456
48
+
49
+ example_target_two = ExampleTarget.new
50
+ example_target_two.id = 789
51
+
52
+ ExampleObject.send(:include, Opinionated)
53
+ ExampleObject.send(:opinions, :example)
54
+
55
+ example_object = ExampleObject.new
56
+ example_object.id = 123
57
+
58
+ expected_opinion_one = Opinion.new(target: example_target_one, object: example_object, opinion: :example)
59
+ expected_opinion_one.persist
60
+
61
+ expected_opinion_two = Opinion.new(target: example_target_two, object: example_object, opinion: :example)
62
+ expected_opinion_two.persist
63
+
64
+ assert_equal 2, example_object.example_opinions.count
65
+
66
+ end
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,71 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class IntegrationTestOpinionsPollable < MiniTest::Integration::TestCase
6
+
7
+ def test_being_voted_by_any_conforming_object
8
+
9
+ example_object = ExampleObject.new
10
+ example_object.id = 123
11
+
12
+ ExampleTarget.send(:include, Pollable)
13
+ ExampleTarget.send(:opinions, :example)
14
+
15
+ example_target = ExampleTarget.new
16
+ example_target.id = 456
17
+
18
+ example_target.example_by(example_object)
19
+
20
+ assert Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
21
+
22
+ end
23
+
24
+ def test_cancelling_a_vote_by_any_conforming_object
25
+
26
+ example_object = ExampleObject.new
27
+ example_object.id = 123
28
+
29
+ ExampleTarget.send(:include, Pollable)
30
+ ExampleTarget.send(:opinions, :example)
31
+
32
+ example_target = ExampleTarget.new
33
+ example_target.id = 456
34
+
35
+ expected_opinion = Opinion.new(target: example_target, object: example_object, opinion: :example)
36
+ expected_opinion.persist
37
+
38
+ example_target.cancel_example_by(example_object)
39
+
40
+ refute Opinion.new(target: example_target, object: example_object, opinion: :example).exists?
41
+
42
+ end
43
+
44
+ def test_counting_the_number_of_votes
45
+
46
+ example_object_one = ExampleObject.new
47
+ example_object_one.id = 123
48
+
49
+ example_object_two = ExampleObject.new
50
+ example_object_two.id = 456
51
+
52
+ ExampleTarget.send(:include, Pollable)
53
+ ExampleTarget.send(:opinions, :example)
54
+
55
+ example_target = ExampleTarget.new
56
+ example_target.id = 456
57
+
58
+ expected_opinion_one = Opinion.new(target: example_target, object: example_object_one, opinion: :example)
59
+ expected_opinion_one.persist
60
+
61
+ expected_opinion_two = Opinion.new(target: example_target, object: example_object_two, opinion: :example)
62
+ expected_opinion_two.persist
63
+
64
+ assert_equal 2, example_target.example_votes.count
65
+
66
+ end
67
+
68
+
69
+ end
70
+
71
+ end
@@ -0,0 +1,6 @@
1
+ daemonize yes
2
+ bind 127.0.0.1
3
+ port 9738
4
+ pidfile /tmp/opinions_integration_test_redis.pid
5
+ logfile /tmp/opinions_integration_test_redis.log
6
+ dir /tmp
@@ -0,0 +1,112 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ require 'singleton'
5
+ require 'tempfile'
6
+
7
+ Bundler.setup
8
+
9
+ require 'daemon_controller'
10
+
11
+ require 'minitest/unit'
12
+ require 'minitest/spec'
13
+ require 'minitest/autorun'
14
+
15
+ require 'turn'
16
+
17
+ require_relative '../lib/opinions'
18
+
19
+ Turn.config do |tc|
20
+ tc.ansi = true
21
+ tc.format = :dot
22
+ end
23
+
24
+ IntegrationTestRedis = DaemonController.new(
25
+ identifier: "Opinions Ingration Test Redis Server",
26
+ start_command: "redis-server #{File.expand_path('./opinions_integration_test_redis.conf', 'test')}",
27
+ ping_command: [:tcp, '127.0.0.1', 9738],
28
+ pid_file: "/tmp/opinions_integration_test_redis.pid",
29
+ log_file: "/tmp/opinions_integration_test_redis.log",
30
+ start_timeout: 2
31
+ )
32
+
33
+ module Opinions
34
+
35
+ module MiniTest
36
+
37
+ class Unit
38
+ TestCase = Class.new(::MiniTest::Unit::TestCase)
39
+ end
40
+
41
+ class Acceptance
42
+ TestCase = Class.new(Unit::TestCase)
43
+ end
44
+
45
+ class Integration
46
+ TestCase = Class.new(Acceptance::TestCase)
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ Opinions::MiniTest::Unit::TestCase.class_eval do
54
+
55
+ def setup_with_clean_objects
56
+ setup_without_clean_objects
57
+ instance_methods = Module.new do
58
+ def ==(other)
59
+ id == other.id
60
+ end
61
+ def initialize(id = nil)
62
+ @id = id
63
+ end
64
+ end
65
+ class_methods = Module.new do
66
+ def find(id)
67
+ new(id)
68
+ end
69
+ end
70
+ ::Object.const_set(:ExampleObject, Class.new)
71
+ ::Object.const_set(:ExampleTarget, Class.new)
72
+ ::ExampleObject.class_eval { attr_accessor :id }
73
+ ::ExampleTarget.class_eval { attr_accessor :id }
74
+ ::ExampleObject.send(:include, instance_methods)
75
+ ::ExampleTarget.send(:include, instance_methods)
76
+ ::ExampleObject.send(:extend, class_methods)
77
+ ::ExampleTarget.send(:extend, class_methods)
78
+ end
79
+ alias :setup_without_clean_objects :setup
80
+ alias :setup :setup_with_clean_objects
81
+
82
+ def teardown_with_clean_objects
83
+ teardown_without_clean_objects
84
+ Object.send(:remove_const, :ExampleObject)
85
+ Object.send(:remove_const, :ExampleTarget)
86
+ end
87
+ alias :teardown_without_clean_objects :teardown
88
+ alias :teardown :teardown_with_clean_objects
89
+
90
+ end
91
+
92
+ Opinions::MiniTest::Integration::TestCase.class_eval do
93
+
94
+ def setup_with_live_redis
95
+ setup_without_live_redis
96
+ ::IntegrationTestRedis.start
97
+ rb = Opinions::RedisBackend.new
98
+ rb.redis = ::Redis.new(port: 9738)
99
+ rb.redis.flushdb
100
+ Opinions.backend = rb
101
+ end
102
+ alias :setup_without_live_redis :setup
103
+ alias :setup :setup_with_live_redis
104
+
105
+ def teardown_with_live_redis
106
+ teardown_without_live_redis
107
+ ::IntegrationTestRedis.stop
108
+ end
109
+ alias :teardown_without_live_redis :teardown
110
+ alias :teardown :teardown_with_live_redis
111
+
112
+ end
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class UnitTestKeyBuilder < MiniTest::Unit::TestCase
6
+
7
+ def test_an_argument_error_is_raised_when_instantiated_with_an_empty_hash
8
+ assert_raises KeyError do
9
+ KeyBuilder.new({})
10
+ end
11
+ end
12
+
13
+ def test_generating_a_simple_key
14
+ example_object = ::ExampleObject.new
15
+ example_object.id = 123
16
+ assert_equal 'ExampleObject:test:123', KeyBuilder.new(object: example_object, opinion: :test).key
17
+ end
18
+
19
+ def test_generating_a_key_with_a_non_numerical_id
20
+ example_instance = ::ExampleObject.new
21
+ example_instance.id = "digest"
22
+ assert_equal 'ExampleObject:test:digest', KeyBuilder.new(object: example_instance, opinion: :test).key
23
+ end
24
+
25
+ def test_generating_a_key_for_an_object_class_count
26
+ # Note: This slightly abuses the KeyBuilder (target vs. object)
27
+ example_target = ::ExampleTarget.new
28
+ example_target.id = 456
29
+ assert_equal 'ExampleTarget:like:456', KeyBuilder.new(object: example_target, opinion: :like).key
30
+ end
31
+
32
+ def test_generating_a_key_for_an_object_class
33
+ example_object = ::ExampleObject.new
34
+ example_object.id = 123
35
+ assert_equal 'ExampleObject:like:123:ExampleTarget', KeyBuilder.new(object: example_object, opinion: :like, target: ::ExampleTarget).key
36
+ end
37
+
38
+ def test_generating_a_key_for_a_simple_opinion
39
+ example_object = ::ExampleObject.new
40
+ example_object.id = 123
41
+ example_target = ::ExampleTarget.new
42
+ example_target.id = 456
43
+ assert_equal 'ExampleObject:like:123:ExampleTarget', KeyBuilder.new(object: example_object, opinion: :like, target: example_target).key
44
+ end
45
+
46
+ def test_generating_a_key_for_a_less_simple_opinion
47
+ example_object = ::ExampleObject.new
48
+ example_object.id = 123
49
+ example_target = ::ExampleTarget.new
50
+ example_target.id = 456
51
+ assert_equal 'ExampleObject:absolute_hate:123:ExampleTarget', KeyBuilder.new(object: example_object, opinion: :absolute_hate, target: example_target).key
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,72 @@
1
+ require 'test_helper'
2
+
3
+ module Opinions
4
+
5
+ class UnitTestOpinion < MiniTest::Unit::TestCase
6
+
7
+ def test_an_argument_error_is_raised_when_instantiated_without_a_target
8
+ assert_raises KeyError do
9
+ Opinion.new(object: true, opinion: true)
10
+ end
11
+ end
12
+
13
+ def test_an_argument_error_is_raised_when_instantiated_without_an_object
14
+ assert_raises KeyError do
15
+ Opinion.new(target: true, opinion: true)
16
+ end
17
+ end
18
+
19
+ def test_an_argument_error_is_raised_when_instantiated_without_an_opinion
20
+ assert_raises KeyError do
21
+ Opinion.new(object: true, target: true)
22
+ end
23
+ end
24
+
25
+ def test_opinions_with_the_same_properties_compare_equal
26
+ o, t = Class.new, Class.new
27
+ opinion_one = Opinion.new(opinion: :test, target: t, object: o)
28
+ opinion_two = Opinion.new(opinion: :test, target: t, object: o)
29
+ assert_equal opinion_one, opinion_two
30
+ end
31
+
32
+ def test_opinions_with_different_properties_do_not_compare_equal
33
+ opinion_one = Opinion.new(opinion: :test, target: Class.new, object: Class.new)
34
+ opinion_two = Opinion.new(opinion: :test, target: Class.new, object: Class.new)
35
+ refute_equal opinion_one, opinion_two
36
+ end
37
+
38
+ def test_the_creation_time_is_readable_via_an_accessor_default_nil
39
+ assert_nil Opinion.new(object: true, target: :example, opinion: true).created_at
40
+ end
41
+
42
+ def test_the_target_is_readable_via_an_accessor
43
+ assert_equal :example, Opinion.new(object: true, target: :example, opinion: true).target
44
+ end
45
+
46
+ def test_the_object_is_readable_via_an_accessor
47
+ assert_equal :example, Opinion.new(object: :example, target: true, opinion: true).object
48
+ end
49
+
50
+ def test_the_opinion_is_readable_via_an_accessor
51
+ assert_equal :example, Opinion.new(object: true, target: true, opinion: :example).opinion
52
+ end
53
+
54
+ def test_the_target_key_is_made_available_via_an_accessor
55
+ example_object = ::ExampleObject.new
56
+ example_target = ::ExampleTarget.new
57
+ example_target.id = 456
58
+ opinion = Opinion.new(object: example_object, target: example_target, opinion: :example)
59
+ assert_equal 'ExampleTarget:example:456:ExampleObject', opinion.target_key
60
+ end
61
+
62
+ def test_the_object_key_is_made_available_via_an_accessor
63
+ example_object = ::ExampleObject.new
64
+ example_object.id = 123
65
+ example_target = ::ExampleTarget.new
66
+ opinion = Opinion.new(object: example_object, target: example_target, opinion: :example)
67
+ assert_equal 'ExampleObject:example:123:ExampleTarget', opinion.object_key
68
+ end
69
+
70
+ end
71
+
72
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opinions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lee Hambley
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-10 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: redis
16
+ requirement: &70143554472800 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70143554472800
25
+ - !ruby/object:Gem::Dependency
26
+ name: minitest
27
+ requirement: &70143554471840 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 2.11.3
33
+ - - <
34
+ - !ruby/object:Gem::Version
35
+ version: 2.12.0
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: *70143554471840
39
+ - !ruby/object:Gem::Dependency
40
+ name: autotest
41
+ requirement: &70143554470080 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: *70143554470080
50
+ - !ruby/object:Gem::Dependency
51
+ name: turn
52
+ requirement: &70143554468980 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ type: :development
59
+ prerelease: false
60
+ version_requirements: *70143554468980
61
+ - !ruby/object:Gem::Dependency
62
+ name: daemon_controller
63
+ requirement: &70143554468440 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: *70143554468440
72
+ description: A toolkit for storing user votes/opinions in Redis
73
+ email:
74
+ - lee.hambley@gmail.com
75
+ executables: []
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - .autotest
80
+ - .gitignore
81
+ - Gemfile
82
+ - LICENSE
83
+ - README.md
84
+ - Rakefile
85
+ - lib/opinions.rb
86
+ - lib/opinions/version.rb
87
+ - opinions.gemspec
88
+ - test/acceptance_test_key_loader.rb
89
+ - test/acceptance_test_opinions_opinion.rb
90
+ - test/acceptance_test_opinions_opinionated_mixin.rb
91
+ - test/acceptance_test_opinions_pollable_mixin.rb
92
+ - test/integration_test_opinions_opinion.rb
93
+ - test/integration_test_opinions_opinionated_mixin.rb
94
+ - test/integration_test_opinions_pollable_mixin.rb
95
+ - test/opinions_integration_test_redis.conf
96
+ - test/test_helper.rb
97
+ - test/unit_test_opinions_key_builder.rb
98
+ - test/unit_test_opinions_opinion.rb
99
+ homepage: ''
100
+ licenses: []
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 1.8.10
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: Opinions allows the storage of opinions in Redis, a fast and atomic structured
123
+ data store. If one's users hate, love, appreciate, despise or just-don-t-care, one
124
+ can store that easily via a simple API.
125
+ test_files:
126
+ - test/acceptance_test_key_loader.rb
127
+ - test/acceptance_test_opinions_opinion.rb
128
+ - test/acceptance_test_opinions_opinionated_mixin.rb
129
+ - test/acceptance_test_opinions_pollable_mixin.rb
130
+ - test/integration_test_opinions_opinion.rb
131
+ - test/integration_test_opinions_opinionated_mixin.rb
132
+ - test/integration_test_opinions_pollable_mixin.rb
133
+ - test/opinions_integration_test_redis.conf
134
+ - test/test_helper.rb
135
+ - test/unit_test_opinions_key_builder.rb
136
+ - test/unit_test_opinions_opinion.rb
137
+ has_rdoc: