moogle 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +35 -0
  4. data/Gemfile.lock +148 -0
  5. data/LICENSE.txt +202 -0
  6. data/NOTICE.txt +4 -0
  7. data/README.md +33 -0
  8. data/Rakefile +44 -0
  9. data/fixtures/vcr_cassettes/push_blog_entry.yml +48 -0
  10. data/fixtures/vcr_cassettes/push_webhook_ping.yml +41 -0
  11. data/lib/moogle/commands/create_link.rb +45 -0
  12. data/lib/moogle/commands/create_target.rb +46 -0
  13. data/lib/moogle/commands/destroy_link.rb +37 -0
  14. data/lib/moogle/commands/destroy_target.rb +37 -0
  15. data/lib/moogle/commands/find_targets.rb +31 -0
  16. data/lib/moogle/commands/push_blog_entry.rb +54 -0
  17. data/lib/moogle/commands/push_email.rb +60 -0
  18. data/lib/moogle/commands/push_webhook_ping.rb +58 -0
  19. data/lib/moogle/commands/update_target.rb +44 -0
  20. data/lib/moogle/commands.rb +9 -0
  21. data/lib/moogle/error.rb +6 -0
  22. data/lib/moogle/events/blog_entry_pushed.rb +34 -0
  23. data/lib/moogle/events/email_pushed.rb +36 -0
  24. data/lib/moogle/events/error.rb +24 -0
  25. data/lib/moogle/events/link_created.rb +21 -0
  26. data/lib/moogle/events/link_destroyed.rb +21 -0
  27. data/lib/moogle/events/target_created.rb +21 -0
  28. data/lib/moogle/events/target_destroyed.rb +21 -0
  29. data/lib/moogle/events/target_updated.rb +21 -0
  30. data/lib/moogle/events/webhook_ping_pushed.rb +34 -0
  31. data/lib/moogle/handlers/accept_notification.rb +96 -0
  32. data/lib/moogle/messages/notification.rb +34 -0
  33. data/lib/moogle/models/blog_target.rb +29 -0
  34. data/lib/moogle/models/email_target.rb +16 -0
  35. data/lib/moogle/models/facebook_target.rb +14 -0
  36. data/lib/moogle/models/link.rb +20 -0
  37. data/lib/moogle/models/post_log.rb +21 -0
  38. data/lib/moogle/models/target.rb +22 -0
  39. data/lib/moogle/models/twitter_target.rb +14 -0
  40. data/lib/moogle/models/webhook_target.rb +18 -0
  41. data/lib/moogle/models.rb +9 -0
  42. data/lib/moogle/representers/link_representer.rb +23 -0
  43. data/lib/moogle/representers/target_representer.rb +34 -0
  44. data/lib/moogle/requests/create_link.rb +24 -0
  45. data/lib/moogle/requests/create_target.rb +40 -0
  46. data/lib/moogle/requests/destroy_link.rb +22 -0
  47. data/lib/moogle/requests/destroy_target.rb +22 -0
  48. data/lib/moogle/requests/find_targets.rb +21 -0
  49. data/lib/moogle/requests/push_blog_entry.rb +67 -0
  50. data/lib/moogle/requests/push_email.rb +46 -0
  51. data/lib/moogle/requests/push_webhook_ping.rb +49 -0
  52. data/lib/moogle/requests/update_target.rb +22 -0
  53. data/lib/moogle/requests.rb +6 -0
  54. data/lib/moogle/version.rb +11 -0
  55. data/lib/moogle.rb +5 -0
  56. data/moogle.gemspec +160 -0
  57. data/spec/commands/find_targets_spec.rb +32 -0
  58. data/spec/commands/links_spec.rb +92 -0
  59. data/spec/commands/push_blog_entry_spec.rb +33 -0
  60. data/spec/commands/push_email_spec.rb +44 -0
  61. data/spec/commands/push_webhook_ping_spec.rb +30 -0
  62. data/spec/commands/targets_spec.rb +165 -0
  63. data/spec/handlers/accept_notification_spec.rb +55 -0
  64. data/spec/moogle_spec.rb +1 -0
  65. data/spec/spec_helper.rb +12 -0
  66. data/spec/support/dependencies.rb +10 -0
  67. data/spec/support/vcr.rb +6 -0
  68. metadata +326 -0
data/moogle.gemspec ADDED
@@ -0,0 +1,160 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "moogle"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Benjamin Yu"]
12
+ s.date = "2012-05-02"
13
+ s.description = "Notification pushing to 3rd parties"
14
+ s.email = "benjaminlyu@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "NOTICE.txt",
26
+ "README.md",
27
+ "Rakefile",
28
+ "fixtures/vcr_cassettes/push_blog_entry.yml",
29
+ "fixtures/vcr_cassettes/push_webhook_ping.yml",
30
+ "lib/moogle.rb",
31
+ "lib/moogle/commands.rb",
32
+ "lib/moogle/commands/create_link.rb",
33
+ "lib/moogle/commands/create_target.rb",
34
+ "lib/moogle/commands/destroy_link.rb",
35
+ "lib/moogle/commands/destroy_target.rb",
36
+ "lib/moogle/commands/find_targets.rb",
37
+ "lib/moogle/commands/push_blog_entry.rb",
38
+ "lib/moogle/commands/push_email.rb",
39
+ "lib/moogle/commands/push_webhook_ping.rb",
40
+ "lib/moogle/commands/update_target.rb",
41
+ "lib/moogle/error.rb",
42
+ "lib/moogle/events/blog_entry_pushed.rb",
43
+ "lib/moogle/events/email_pushed.rb",
44
+ "lib/moogle/events/error.rb",
45
+ "lib/moogle/events/link_created.rb",
46
+ "lib/moogle/events/link_destroyed.rb",
47
+ "lib/moogle/events/target_created.rb",
48
+ "lib/moogle/events/target_destroyed.rb",
49
+ "lib/moogle/events/target_updated.rb",
50
+ "lib/moogle/events/webhook_ping_pushed.rb",
51
+ "lib/moogle/handlers/accept_notification.rb",
52
+ "lib/moogle/messages/notification.rb",
53
+ "lib/moogle/models.rb",
54
+ "lib/moogle/models/blog_target.rb",
55
+ "lib/moogle/models/email_target.rb",
56
+ "lib/moogle/models/facebook_target.rb",
57
+ "lib/moogle/models/link.rb",
58
+ "lib/moogle/models/post_log.rb",
59
+ "lib/moogle/models/target.rb",
60
+ "lib/moogle/models/twitter_target.rb",
61
+ "lib/moogle/models/webhook_target.rb",
62
+ "lib/moogle/representers/link_representer.rb",
63
+ "lib/moogle/representers/target_representer.rb",
64
+ "lib/moogle/requests.rb",
65
+ "lib/moogle/requests/create_link.rb",
66
+ "lib/moogle/requests/create_target.rb",
67
+ "lib/moogle/requests/destroy_link.rb",
68
+ "lib/moogle/requests/destroy_target.rb",
69
+ "lib/moogle/requests/find_targets.rb",
70
+ "lib/moogle/requests/push_blog_entry.rb",
71
+ "lib/moogle/requests/push_email.rb",
72
+ "lib/moogle/requests/push_webhook_ping.rb",
73
+ "lib/moogle/requests/update_target.rb",
74
+ "lib/moogle/version.rb",
75
+ "moogle.gemspec",
76
+ "spec/commands/find_targets_spec.rb",
77
+ "spec/commands/links_spec.rb",
78
+ "spec/commands/push_blog_entry_spec.rb",
79
+ "spec/commands/push_email_spec.rb",
80
+ "spec/commands/push_webhook_ping_spec.rb",
81
+ "spec/commands/targets_spec.rb",
82
+ "spec/handlers/accept_notification_spec.rb",
83
+ "spec/moogle_spec.rb",
84
+ "spec/spec_helper.rb",
85
+ "spec/support/dependencies.rb",
86
+ "spec/support/vcr.rb"
87
+ ]
88
+ s.homepage = "http://github.com/byu/moogle"
89
+ s.licenses = ["Apache 2.0"]
90
+ s.require_paths = ["lib"]
91
+ s.rubygems_version = "1.8.17"
92
+ s.summary = "Notification pushing to 3rd parties"
93
+
94
+ if s.respond_to? :specification_version then
95
+ s.specification_version = 3
96
+
97
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
98
+ s.add_runtime_dependency(%q<addressable>, [">= 2.2.7"])
99
+ s.add_runtime_dependency(%q<aequitas>, [">= 0.0.2"])
100
+ s.add_runtime_dependency(%q<data_mapper>, [">= 1.2.0"])
101
+ s.add_runtime_dependency(%q<mail>, [">= 2.4.3"])
102
+ s.add_runtime_dependency(%q<faraday>, [">= 0.7.6"])
103
+ s.add_runtime_dependency(%q<rafaday>, [">= 0.1.0"])
104
+ s.add_runtime_dependency(%q<roar>, [">= 0.9.2"])
105
+ s.add_runtime_dependency(%q<serf>, [">= 0.8.0"])
106
+ s.add_runtime_dependency(%q<uuidtools>, [">= 2.1.2"])
107
+ s.add_runtime_dependency(%q<virtus>, [">= 0.3.0"])
108
+ s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
109
+ s.add_development_dependency(%q<yard>, ["~> 0.7.5"])
110
+ s.add_development_dependency(%q<bundler>, ["~> 1.1.3"])
111
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
112
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
113
+ s.add_development_dependency(%q<vcr>, ["~> 2.0.0"])
114
+ s.add_development_dependency(%q<webmock>, ["~> 1.8.1"])
115
+ s.add_development_dependency(%q<dm-sqlite-adapter>, [">= 0"])
116
+ s.add_development_dependency(%q<dm-mysql-adapter>, [">= 0"])
117
+ else
118
+ s.add_dependency(%q<addressable>, [">= 2.2.7"])
119
+ s.add_dependency(%q<aequitas>, [">= 0.0.2"])
120
+ s.add_dependency(%q<data_mapper>, [">= 1.2.0"])
121
+ s.add_dependency(%q<mail>, [">= 2.4.3"])
122
+ s.add_dependency(%q<faraday>, [">= 0.7.6"])
123
+ s.add_dependency(%q<rafaday>, [">= 0.1.0"])
124
+ s.add_dependency(%q<roar>, [">= 0.9.2"])
125
+ s.add_dependency(%q<serf>, [">= 0.8.0"])
126
+ s.add_dependency(%q<uuidtools>, [">= 2.1.2"])
127
+ s.add_dependency(%q<virtus>, [">= 0.3.0"])
128
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
129
+ s.add_dependency(%q<yard>, ["~> 0.7.5"])
130
+ s.add_dependency(%q<bundler>, ["~> 1.1.3"])
131
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
132
+ s.add_dependency(%q<simplecov>, [">= 0"])
133
+ s.add_dependency(%q<vcr>, ["~> 2.0.0"])
134
+ s.add_dependency(%q<webmock>, ["~> 1.8.1"])
135
+ s.add_dependency(%q<dm-sqlite-adapter>, [">= 0"])
136
+ s.add_dependency(%q<dm-mysql-adapter>, [">= 0"])
137
+ end
138
+ else
139
+ s.add_dependency(%q<addressable>, [">= 2.2.7"])
140
+ s.add_dependency(%q<aequitas>, [">= 0.0.2"])
141
+ s.add_dependency(%q<data_mapper>, [">= 1.2.0"])
142
+ s.add_dependency(%q<mail>, [">= 2.4.3"])
143
+ s.add_dependency(%q<faraday>, [">= 0.7.6"])
144
+ s.add_dependency(%q<rafaday>, [">= 0.1.0"])
145
+ s.add_dependency(%q<roar>, [">= 0.9.2"])
146
+ s.add_dependency(%q<serf>, [">= 0.8.0"])
147
+ s.add_dependency(%q<uuidtools>, [">= 2.1.2"])
148
+ s.add_dependency(%q<virtus>, [">= 0.3.0"])
149
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
150
+ s.add_dependency(%q<yard>, ["~> 0.7.5"])
151
+ s.add_dependency(%q<bundler>, ["~> 1.1.3"])
152
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
153
+ s.add_dependency(%q<simplecov>, [">= 0"])
154
+ s.add_dependency(%q<vcr>, ["~> 2.0.0"])
155
+ s.add_dependency(%q<webmock>, ["~> 1.8.1"])
156
+ s.add_dependency(%q<dm-sqlite-adapter>, [">= 0"])
157
+ s.add_dependency(%q<dm-mysql-adapter>, [">= 0"])
158
+ end
159
+ end
160
+
@@ -0,0 +1,32 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Moogle::Commands::FindTargets' do
4
+ before {
5
+ Moogle::WebhookTarget.create(
6
+ owner_ref: 'System:1a',
7
+ options: {
8
+ 'webhook_uri' => 'http://example.com/target'
9
+ },
10
+ links: [
11
+ Moogle::Link.new
12
+ ])
13
+ }
14
+ let(:request_hash) {{
15
+ owner_ref: 'System:1a'
16
+ }}
17
+ let(:request) {
18
+ Moogle::Requests::FindTargets.new request_hash
19
+ }
20
+ let(:command) {
21
+ Moogle::Commands::FindTargets
22
+ }
23
+
24
+ it 'should find the target with link' do
25
+ result = command.call request
26
+ result.size.should == 1
27
+ result.first.kind.should == 'moogle/domain/target'
28
+ result.first.owner_ref.should == 'System:1a'
29
+ result.first.options['webhook_uri'].should == 'http://example.com/target'
30
+ result.first.links.size.should == 1
31
+ end
32
+ end
@@ -0,0 +1,92 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Moogle::Commands::CreateLink' do
4
+ let(:existing_target) {
5
+ Moogle::WebhookTarget.create(
6
+ owner_ref: 'System:1a',
7
+ options: {
8
+ 'webhook_uri' => 'http://example.com/target'
9
+ })
10
+ }
11
+ let(:request_hash) {{
12
+ target_id: existing_target.id,
13
+ receiver_ref: 'Gym:1',
14
+ message_kind: 'my_message_kind'
15
+ }}
16
+ let(:request) {
17
+ Moogle::Requests::CreateLink.new request_hash
18
+ }
19
+ let(:command) {
20
+ Moogle::Commands::CreateLink
21
+ }
22
+
23
+ it 'should create a link' do
24
+ result = command.call request
25
+ result.kind.should == 'moogle/events/link_created'
26
+ result.parent_uuid.should == request.uuid
27
+ result.link.message_kind.should == 'my_message_kind'
28
+ result.link.receiver_ref.should == 'Gym:1'
29
+ end
30
+
31
+ it 'should be able to parse a hash as request' do
32
+ result = command.call request
33
+ result.kind.should == 'moogle/events/link_created'
34
+ result.link.message_kind.should == 'my_message_kind'
35
+ result.link.receiver_ref.should == 'Gym:1'
36
+ end
37
+ end
38
+
39
+ describe 'Moogle::Commands::DestroyLink' do
40
+ let(:request_hash) {{
41
+ link_id: 12345
42
+ }}
43
+ let(:command) {
44
+ Moogle::Commands::DestroyLink
45
+ }
46
+
47
+ describe 'with non-existent link' do
48
+ let(:request) {
49
+ Moogle::Requests::DestroyLink.new request_hash
50
+ }
51
+
52
+ it 'should succeed' do
53
+ result = command.call request
54
+ result.kind.should == 'moogle/events/link_destroyed'
55
+ result.link_id.should == 12345
56
+ result.parent_uuid.should == request.uuid
57
+ end
58
+ end
59
+
60
+ describe 'with existing link' do
61
+ let(:existing_target) {
62
+ Moogle::WebhookTarget.create(
63
+ owner_ref: 'System:1a',
64
+ options: {
65
+ 'webhook_uri' => 'http://example.com/target'
66
+ })
67
+ }
68
+ let(:existing_link) {
69
+ Moogle::Commands::CreateLink.call(
70
+ Moogle::Requests::CreateLink.new(
71
+ target_id: existing_target.id,
72
+ receiver_ref: 'Gym:1',
73
+ message_kind: 'my_message_kind')).link
74
+ }
75
+ let(:request) {
76
+ Moogle::Requests::DestroyLink.new link_id: existing_link.id
77
+ }
78
+
79
+ it 'should succeed' do
80
+ result = command.call request
81
+ result.kind.should == 'moogle/events/link_destroyed'
82
+ result.link_id.should == existing_link.id
83
+ result.parent_uuid.should == request.uuid
84
+ end
85
+ end
86
+
87
+ it 'should be able to parse a hash as request' do
88
+ result = command.call request_hash
89
+ result.kind.should == 'moogle/events/link_destroyed'
90
+ result.link_id.should == 12345
91
+ end
92
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Moogle::Commands::PushBlogEntry' do
4
+ let(:request) {{
5
+ target_id: 1,
6
+ message_origin: 'btwb/events/workout_session_created',
7
+ subject: 'My Test Title',
8
+ html_body: 'Body of the blog post',
9
+ categories: ['tag1', 'tag2'],
10
+ rpc_uri: 'http://example.wordpress.com/xmlrpc.php',
11
+ blog_uri: 'http://example.wordpress.com/',
12
+ blog_id: 'my_blog_id',
13
+ username: 'user@example.com',
14
+ password: 'password',
15
+ publish_immediately: true,
16
+ uuid: '85d9e997-6dcd-499e-9a5d-09dc0dc8c3b4'
17
+ }}
18
+ let(:command) {
19
+ Moogle::Commands::PushBlogEntry
20
+ }
21
+
22
+ it 'should push a blog entry' do
23
+ VCR.use_cassette('push_blog_entry') do
24
+ result = command.call request
25
+ result.kind.should == 'moogle/events/blog_entry_pushed'
26
+ result.post_ref.should == '61'
27
+ result.target_id.should == request[:target_id]
28
+ result.message_origin == request[:message_origin]
29
+ result.parent_uuid.should == request[:uuid]
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Moogle::Commands::PushEmail' do
4
+ before(:each) do
5
+ Mail.defaults do
6
+ delivery_method :test
7
+ end
8
+ end
9
+
10
+ let(:request) {{
11
+ uuid: '85d9e997-6dcd-499e-9a5d-09dc0dc8c3b4',
12
+ target_id: 1,
13
+ message_origin: 'btwb/events/daily_wod_created',
14
+ subject: 'My Test Subject',
15
+ text_body: 'This is a text email',
16
+ html_body: 'This is an html body email',
17
+ categories: ['tag1'],
18
+ to: 'user@example.com',
19
+ from: 'from_user@example.com'
20
+ }}
21
+ let(:command) {
22
+ Moogle::Commands::PushEmail
23
+ }
24
+ let(:options) {{
25
+ }}
26
+
27
+ it 'should push an email' do
28
+ result = command.call request, options
29
+ result.kind.should == 'moogle/events/email_pushed'
30
+
31
+ result.target_id.should == request[:target_id]
32
+ result.message_origin == request[:message_origin]
33
+ result.parent_uuid.should == request[:uuid]
34
+ result.request.should_not be_nil
35
+
36
+ deliveries = Mail.delivery_method.class.deliveries
37
+ deliveries.size.should == 1
38
+ sent_mail = deliveries.first
39
+ sent_mail.to.should == [request[:to]]
40
+ sent_mail.from.should == [request[:from]]
41
+ sent_mail.subject.should == request[:subject]
42
+ end
43
+
44
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Moogle::Commands::PushWebhookPing' do
4
+ let(:request) {{
5
+ uuid: '85d9e997-6dcd-499e-9a5d-09dc0dc8c3b4',
6
+ target_id: 1,
7
+ message_origin: 'btwb/events/daily_wod_created',
8
+ data: '{}',
9
+ webhook_uri: 'http://www.example.com/',
10
+ secret: 'secretpassword'
11
+ }}
12
+ let(:command) {
13
+ Moogle::Commands::PushWebhookPing
14
+ }
15
+ let(:options) {{
16
+ }}
17
+
18
+ it 'should push a ping' do
19
+ VCR.use_cassette('push_webhook_ping') do
20
+ result = command.call request, options
21
+ result.kind.should == 'moogle/events/webhook_ping_pushed'
22
+
23
+ result.webhook_uri.should == request[:webhook_uri]
24
+ result.target_id.should == request[:target_id]
25
+ result.message_origin == request[:message_origin]
26
+ result.parent_uuid.should == request[:uuid]
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,165 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Moogle::Commands::CreateTarget' do
4
+ let(:request_hash) {{
5
+ type: :blog,
6
+ owner_ref: 'System:1',
7
+ options: {
8
+ 'rpc_uri' => 'http://example.com/target',
9
+ 'blog_uri' => 'http://example.com/',
10
+ 'blog_id' => 'example_blog_name',
11
+ 'username' => 'username',
12
+ 'password' => 'password',
13
+ 'publish_immediately' => true
14
+ }
15
+ }}
16
+ let(:request) {
17
+ Moogle::Requests::CreateTarget.new request_hash
18
+ }
19
+ let(:command) {
20
+ Moogle::Commands::CreateTarget
21
+ }
22
+
23
+ it 'should create a target' do
24
+ result = command.call request
25
+ result.kind.should == 'moogle/events/target_created'
26
+ result.parent_uuid.should == request.uuid
27
+ result.target.type.should == Moogle::BlogTarget
28
+ result.target.owner_ref.should == 'System:1'
29
+ result.target.options.should == {
30
+ 'rpc_uri' => 'http://example.com/target',
31
+ 'blog_uri' => 'http://example.com/',
32
+ 'blog_id' => 'example_blog_name',
33
+ 'username' => 'username',
34
+ 'password' => 'password',
35
+ 'publish_immediately' => true
36
+ }
37
+ end
38
+
39
+ it 'should be able to parse a hash as request' do
40
+ result = command.call request_hash
41
+ result.kind.should == 'moogle/events/target_created'
42
+ result.target.type.should == Moogle::BlogTarget
43
+ result.target.owner_ref.should == 'System:1'
44
+ result.target.options.should == {
45
+ 'rpc_uri' => 'http://example.com/target',
46
+ 'blog_uri' => 'http://example.com/',
47
+ 'blog_id' => 'example_blog_name',
48
+ 'username' => 'username',
49
+ 'password' => 'password',
50
+ 'publish_immediately' => true
51
+ }
52
+ end
53
+ end
54
+
55
+ describe 'Moogle::Commands::DestroyTarget' do
56
+ let(:request_hash) {{
57
+ target_id: 12345
58
+ }}
59
+ let(:command) {
60
+ Moogle::Commands::DestroyTarget
61
+ }
62
+
63
+ describe 'with non-existent target' do
64
+ let(:request) {
65
+ Moogle::Requests::DestroyTarget.new request_hash
66
+ }
67
+
68
+ it 'should succeed' do
69
+ result = command.call request
70
+ result.kind.should == 'moogle/events/target_destroyed'
71
+ result.parent_uuid.should == request.uuid
72
+ result.target_id.should == 12345
73
+ end
74
+ end
75
+
76
+ describe 'with existing target' do
77
+ let(:existing_target) {
78
+ Moogle::BlogTarget.create(
79
+ owner_ref: 'System:1a',
80
+ options: {
81
+ 'rpc_uri' => 'http://example.com/target',
82
+ 'blog_uri' => 'http://example.com/',
83
+ 'blog_id' => 'example_blog_name',
84
+ 'username' => 'username',
85
+ 'password' => 'password',
86
+ 'publish_immediately' => true
87
+ })
88
+ }
89
+ let(:request) {
90
+ Moogle::Requests::DestroyTarget.new target_id: existing_target.id
91
+ }
92
+
93
+ it 'should succeed' do
94
+ result = command.call request
95
+ result.kind.should == 'moogle/events/target_destroyed'
96
+ result.parent_uuid.should == request.uuid
97
+ result.target_id.should == existing_target.id
98
+ end
99
+ end
100
+
101
+ it 'should be able to parse a hash as request' do
102
+ result = command.call request_hash
103
+ result.kind.should == 'moogle/events/target_destroyed'
104
+ result.target_id.should == 12345
105
+ end
106
+ end
107
+
108
+ describe 'Moogle::Commands::UpdateTarget' do
109
+ let(:existing_target) {
110
+ Moogle::BlogTarget.create(
111
+ owner_ref: 'System:1a',
112
+ options: {
113
+ 'rpc_uri' => 'http://example.com/target',
114
+ 'blog_uri' => 'http://example.com/',
115
+ 'blog_id' => 'example_blog_name',
116
+ 'username' => 'username',
117
+ 'password' => 'password',
118
+ 'publish_immediately' => true
119
+ })
120
+ }
121
+ let(:request_hash) {{
122
+ target_id: existing_target.id,
123
+ options: {
124
+ 'rpc_uri' => 'http://example.com/target',
125
+ 'blog_uri' => 'http://example.com/',
126
+ 'blog_id' => 'example_blog_name',
127
+ 'username' => 'username',
128
+ 'password' => 'password',
129
+ 'publish_immediately' => false
130
+ }
131
+ }}
132
+ let(:request) {
133
+ Moogle::Requests::UpdateTarget.new request_hash
134
+ }
135
+ let(:command) {
136
+ Moogle::Commands::UpdateTarget
137
+ }
138
+
139
+ it 'should update existing target' do
140
+ result = command.call request
141
+ result.kind.should == 'moogle/events/target_updated'
142
+ result.parent_uuid.should == request.uuid
143
+ result.target.options.should == {
144
+ 'rpc_uri' => 'http://example.com/target',
145
+ 'blog_uri' => 'http://example.com/',
146
+ 'blog_id' => 'example_blog_name',
147
+ 'username' => 'username',
148
+ 'password' => 'password',
149
+ 'publish_immediately' => false
150
+ }
151
+ end
152
+
153
+ it 'should be able to parse a hash as request' do
154
+ result = command.call request
155
+ result.kind.should == 'moogle/events/target_updated'
156
+ result.target.options.should == {
157
+ 'rpc_uri' => 'http://example.com/target',
158
+ 'blog_uri' => 'http://example.com/',
159
+ 'blog_id' => 'example_blog_name',
160
+ 'username' => 'username',
161
+ 'password' => 'password',
162
+ 'publish_immediately' => false
163
+ }
164
+ end
165
+ end
@@ -0,0 +1,55 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Moogle::Handlers::AcceptNotification' do
4
+ let(:target) {
5
+ Moogle::EmailTarget.create(
6
+ owner_ref: 'member:1',
7
+ options: {
8
+ 'to' => 'target@example.com',
9
+ 'from' => 'source@example.com'
10
+ },
11
+ links: [
12
+ {
13
+ receiver_ref: 'member:1',
14
+ message_kind: 'some_application/my_notification'
15
+ }
16
+ ]
17
+ )
18
+ }
19
+
20
+ before(:each) do
21
+ target
22
+ end
23
+ after(:each) do
24
+ target.destroy
25
+ end
26
+
27
+ let(:message) {{
28
+ message_kind: 'some_application/my_notification',
29
+ receiver_refs: ['member:1', 'gym:1'],
30
+ subject: 'Subject',
31
+ html_body: 'My Html Body',
32
+ text_body: 'Text Body'
33
+ }}
34
+ let(:handler) {
35
+ Moogle::Handlers::AcceptNotification
36
+ }
37
+
38
+ it 'should accept a notification' do
39
+ pusher_queue = []
40
+ error_channel = []
41
+ results = handler.call(
42
+ message,
43
+ pusher_queue: pusher_queue,
44
+ error_channel: error_channel)
45
+ results.should be_nil
46
+ pusher_queue.first.class.should == Hash
47
+ pusher_queue.first[:subject].should == 'Subject'
48
+ pusher_queue.first[:html_body].should == 'My Html Body'
49
+ pusher_queue.first[:text_body].should == 'Text Body'
50
+ pusher_queue.first[:to].should == 'target@example.com'
51
+ pusher_queue.first[:from].should == 'source@example.com'
52
+ error_channel.should == []
53
+ end
54
+
55
+ end
@@ -0,0 +1 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'moogle'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
@@ -0,0 +1,10 @@
1
+ require 'moogle/commands'
2
+ require 'moogle/handlers/accept_notification'
3
+ require 'moogle/requests'
4
+
5
+ Aequitas::Violation.default_transformer =
6
+ Aequitas::MessageTransformer::DefaultStatic.new
7
+
8
+ DataMapper::Logger.new($stdout, :debug)
9
+ DataMapper.setup(:moogle_db, 'sqlite::memory:')
10
+ DataMapper.auto_migrate!
@@ -0,0 +1,6 @@
1
+ require 'vcr'
2
+
3
+ VCR.configure do |c|
4
+ c.cassette_library_dir = 'fixtures/vcr_cassettes'
5
+ c.hook_into :webmock
6
+ end