notifiable-apns-grocer 0.18.1 → 0.18.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a7adada696de05fdfd1e5832b7e83bf8a2091456
4
- data.tar.gz: 358b09ce7dc56babfccc12884f003cb4a2091f9c
3
+ metadata.gz: 572d182bac38c11f83c19102093c492a5d3bc9ef
4
+ data.tar.gz: 062e8ad480204e5c0ebbbace67c763737b57e982
5
5
  SHA512:
6
- metadata.gz: f4d552f9263b48d618dc59cf98d48273d28a262302062c78ee93b9c8cabde1ed15450ee9cd3b8b73ac15a1a3c08f97f973ef6df3306c24b76de7d5746d28ffc7
7
- data.tar.gz: 96168a41a57a9ce2f23664590b2d4296c65bf02260f6b8722929e5bf407f8ebee8fed9dd5cdd2191d1bf382ec11b17a9665a6f123a7dca85b8eed1ce9d48fd5a
6
+ metadata.gz: 48fbaabc72a516ab2c19aafaddc7e2c76d5221ff978ea75e43a9a77c2213b5dc28068ea96934f64288463d0b7695b92f1f86d3e28e1d820079aba9483ef95610
7
+ data.tar.gz: 860de49da62776244ed3d72e8e5178f777daa6289b68f2975264fb0bc924baaccdf2343801c1ba884a1036c3ab1d73326907164f7479ddd87f3ee2f881d5be1f
@@ -44,7 +44,7 @@ module Notifiable
44
44
  end
45
45
 
46
46
  def flush
47
- process_feedback unless self.test_env?
47
+ process_feedback
48
48
  end
49
49
 
50
50
  private
@@ -1,7 +1,7 @@
1
1
  module Notifiable
2
2
  module Apns
3
3
  module Grocer
4
- VERSION = "0.18.1"
4
+ VERSION = "0.18.2"
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notifiable-apns-grocer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 0.18.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Brooke-Smith
@@ -185,22 +185,13 @@ executables: []
185
185
  extensions: []
186
186
  extra_rdoc_files: []
187
187
  files:
188
- - ".gitignore"
189
- - ".rspec"
190
- - Gemfile
191
188
  - LICENSE
192
- - LICENSE.txt
193
189
  - README.md
194
190
  - Rakefile
195
- - config/database.yml
196
191
  - lib/notifiable/apns/grocer.rb
197
192
  - lib/notifiable/apns/grocer/grocer_ssl_connection.rb
198
193
  - lib/notifiable/apns/grocer/stream.rb
199
194
  - lib/notifiable/apns/grocer/version.rb
200
- - notifiable-apns-grocer.gemspec
201
- - spec/fixtures/apns-development.pem
202
- - spec/spec_helper.rb
203
- - spec/stream_spec.rb
204
195
  homepage: http://www.futureworkshops.com
205
196
  licenses:
206
197
  - Apache 2.0
@@ -225,7 +216,4 @@ rubygems_version: 2.6.14
225
216
  signing_key:
226
217
  specification_version: 4
227
218
  summary: Notifiable APNS plugin for Grocer
228
- test_files:
229
- - spec/fixtures/apns-development.pem
230
- - spec/spec_helper.rb
231
- - spec/stream_spec.rb
219
+ test_files: []
data/.gitignore DELETED
@@ -1,20 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
-
19
- .DS_Store
20
- .byebug_history
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --color
data/Gemfile DELETED
@@ -1,13 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- ruby '2.3.1'
4
-
5
- git_source(:github) do |repo_name|
6
- repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
7
- "https://github.com/#{repo_name}.git"
8
- end
9
-
10
- # Specify your gem's dependencies in notifiable-apns-grocer.gemspec
11
- gemspec
12
-
13
- gem 'grocer', github: 'FutureWorkshops/grocer', ref: 'd574d5adca5d800eee2fac47f4ba64ce9a2d4a93'
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2014 Matt Brooke-Smith
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/config/database.yml DELETED
@@ -1,12 +0,0 @@
1
- postgres: &postgres
2
- adapter: postgresql
3
- host: localhost
4
- port: 5432
5
-
6
- development:
7
- <<: *postgres
8
- database: notifiable-apns-grocer-development
9
-
10
- test:
11
- <<: *postgres
12
- database: notifiable-apns-grocer-test
@@ -1,35 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'notifiable/apns/grocer/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "notifiable-apns-grocer"
8
- spec.version = Notifiable::Apns::Grocer::VERSION
9
- spec.authors = ["Matt Brooke-Smith"]
10
- spec.email = ["matt@futureworkshops.com"]
11
- spec.homepage = "http://www.futureworkshops.com"
12
- spec.description = "Notifiable APNS plugin for Grocer"
13
- spec.summary = "Notifiable APNS plugin for Grocer"
14
- spec.license = "Apache 2.0"
15
-
16
- spec.files = `git ls-files`.split($/)
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_dependency "notifiable-core", ">= 0.1.3"
22
- spec.add_dependency "grocer", '~> 0.7.2'
23
- spec.add_dependency "connection_pool", '~> 2.0.0'
24
-
25
- spec.add_development_dependency "bundler", "~> 1.3"
26
- spec.add_development_dependency "rake"
27
- spec.add_development_dependency "rspec"
28
- spec.add_development_dependency "simplecov"
29
- spec.add_development_dependency "simplecov-rcov"
30
- spec.add_development_dependency "sqlite3"
31
- spec.add_development_dependency "database_cleaner"
32
- spec.add_development_dependency "byebug"
33
- spec.add_development_dependency "pg"
34
-
35
- end
@@ -1,61 +0,0 @@
1
- Bag Attributes
2
- friendlyName: Fake APNs Provider Certificate
3
- localKeyID: C0 9A 0E C0 77 F5 7A A4 71 1B 07 9D 10 0E 2D FB 8C B5 62 BC
4
- subject=/CN=Fake APNs Provider Certificate/O=Fake Provider/OU=Fake Notification Sending Division/ST=Fake Washington/C=US/L=Fake Seattle/emailAddress=info@wavii.com
5
- issuer=/CN=Fake APNs Certificate Authority/O=Fake Apple/OU=Fake Certificate Signing Division/ST=Fake California/C=US/L=Fake Cupertino/emailAddress=info@wavii.com
6
- -----BEGIN CERTIFICATE-----
7
- MIIENDCCAxygAwIBAgIBAjALBgkqhkiG9w0BAQswgcoxKDAmBgNVBAMMH0Zha2Ug
8
- QVBOcyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxEzARBgNVBAoMCkZha2UgQXBwbGUx
9
- KjAoBgNVBAsMIUZha2UgQ2VydGlmaWNhdGUgU2lnbmluZyBEaXZpc2lvbjEYMBYG
10
- A1UECAwPRmFrZSBDYWxpZm9ybmlhMQswCQYDVQQGEwJVUzEXMBUGA1UEBwwORmFr
11
- ZSBDdXBlcnRpbm8xHTAbBgkqhkiG9w0BCQEWDmluZm9Ad2F2aWkuY29tMB4XDTEy
12
- MDQwNDIwNTYzNloXDTEzMDQwNDIwNTYzNlowgcsxJzAlBgNVBAMMHkZha2UgQVBO
13
- cyBQcm92aWRlciBDZXJ0aWZpY2F0ZTEWMBQGA1UECgwNRmFrZSBQcm92aWRlcjEr
14
- MCkGA1UECwwiRmFrZSBOb3RpZmljYXRpb24gU2VuZGluZyBEaXZpc2lvbjEYMBYG
15
- A1UECAwPRmFrZSBXYXNoaW5ndG9uMQswCQYDVQQGEwJVUzEVMBMGA1UEBwwMRmFr
16
- ZSBTZWF0dGxlMR0wGwYJKoZIhvcNAQkBFg5pbmZvQHdhdmlpLmNvbTCCASIwDQYJ
17
- KoZIhvcNAQEBBQADggEPADCCAQoCggEBALeeRtyoGCoyTZPLr4mjbK8nQpbwcf6/
18
- 2GlkqDDaYy17kFjZXA3ZrdPncWnC1gA+93ZAtvy/a1PdSyKMNrTdkqmiId4EzRl5
19
- oEFVAEXYSy5DmL78KiMYfmhGXtusq+mj0HvsBHRRsTESqmRhwHj8Th4wYBp6w4jr
20
- UmFDIP2FuTqck1WgtgsVQMgVgrgyUUDCzejMfGxBkvavP9TRmYqlZPqRkadMoads
21
- T+JTA8JAa7srtQVmdfCg0PvIKZxegIAiGjdoO0ZoWSlS2fWFzDKfsIybXbqinO/s
22
- Og5C9ITAYR5+A/pBYXv+R3MOvYLxZ4SgHFOqs4J0oF26324jovt1FWkCAwEAAaMk
23
- MCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEB
24
- CwUAA4IBAQCfsBLbFlCfMFA1t5o4C1QWMA3tfM+MyGUDSJ4qIWFF1/zBQl8bSTc/
25
- XkUaNZ42R/NZ+anwyPlYNK/N7JBC5nJiIDkn+SF/ifXUMZcJ6ryWwEIuM9oPf+yM
26
- LABztG23gD6RbFw5n3PhO2IsO8dKa2HS4yxBPWAJuOnn9A+H87G+Vy7f7hc9ZgR+
27
- BmUNVj9Wm+NBrZrWU431HbLUyi2udD2vDfXk2LopBUN05iOD7BqHEUbdeQ5bPxe5
28
- 7smdpmEV3QrbpfCfWtoV28OJ/EA0qB0GwihJ3Pkx3V7SaASOwEwhhiwHQDPN/Ksy
29
- lG47dCmL1Q47TN9Rzv7LnCSuKXuEycxo
30
- -----END CERTIFICATE-----
31
- Bag Attributes
32
- friendlyName: Fake APNs Provider Certificate
33
- localKeyID: C0 9A 0E C0 77 F5 7A A4 71 1B 07 9D 10 0E 2D FB 8C B5 62 BC
34
- Key Attributes: <No Attributes>
35
- -----BEGIN RSA PRIVATE KEY-----
36
- MIIEowIBAAKCAQEAt55G3KgYKjJNk8uviaNsrydClvBx/r/YaWSoMNpjLXuQWNlc
37
- Ddmt0+dxacLWAD73dkC2/L9rU91LIow2tN2SqaIh3gTNGXmgQVUARdhLLkOYvvwq
38
- Ixh+aEZe26yr6aPQe+wEdFGxMRKqZGHAePxOHjBgGnrDiOtSYUMg/YW5OpyTVaC2
39
- CxVAyBWCuDJRQMLN6Mx8bEGS9q8/1NGZiqVk+pGRp0yhp2xP4lMDwkBruyu1BWZ1
40
- 8KDQ+8gpnF6AgCIaN2g7RmhZKVLZ9YXMMp+wjJtduqKc7+w6DkL0hMBhHn4D+kFh
41
- e/5Hcw69gvFnhKAcU6qzgnSgXbrfbiOi+3UVaQIDAQABAoIBAAKv1zudXhUn/Uif
42
- X2c1M/7wJSJOTGy84+7O4UMtvuvIdhlGvPka6VdDeL5icn04bqiVU9go+OoWP+Y2
43
- hQpqf53p2HMGQPYReI3cL4/WFWuM46xPxlITJq5h8TtnsHBPzFoz3vDQzTX5nvKv
44
- F4DtuDrq3E0m5LuZLfBsagwrq8U2xPzIQaRVfl+BGATOFBa30hSwNByqMHW3AuMd
45
- 5qZQAAXa5C2OhWTEV5sfqQT3hJN/fHgn2gSOi3R3CW8F9yEx0M4ECR+kYb0NdYt/
46
- FczNtgnrneK60yhQnOkX19Tr5MGvj44GryLndxAkrFTp5ipfBm+Gc26XKNkfoWJ+
47
- ovzT1n0CgYEA2Q5umhJudO3W13WsKOxoU7ErtewemzDpYb0CrxdI9/i9Fxi1QV7C
48
- +JSSf0XFKu+nW50D8jMJ60WwU4WX4v8DoG3M0vrXiJ0CZyIClFWgvk+VWi0hGh9b
49
- e3PcjNMIKQNK2FyOnOwUnL0DerNFMtYD1kLkDS5CsjGY4VYGPVFRx1sCgYEA2JAB
50
- rdUcmN3bfixXeHedRGzw6YFkEbEXqKt8Oa0dVlsDL20JX/Cj5xAESIXyswsIfuAo
51
- Rjv4mI/J6lxXhoEiNo/9VsNJ+QH77zv8mVPqs1Z5pxjtp1lNag9jOMZZAX6vgJ1e
52
- Glx/stLxxkIhX5aI1ppIZXNFCIY7e8qx9OPYNYsCgYBAw/imimdhBnK7mYYEM/4x
53
- MsVLJChBwEdy/XXmjrkcHKE3Wg0Dc2YTzCkmRsg9NoMmZ+R8iVQlWobxdQRMHDGV
54
- 1g1uyqAzSD4mTdSdNCuhfZef76VX6RFf9cNSVcmyiyPzCTMYiazg09lM7F7yez9r
55
- 2Eu5zxrhlsD6Q7Pa6f/PzwKBgQCitPd9+mrk83MQxhHmAcCYA12xorRjknFbGZRY
56
- 5Rbwpaqr/DkZ6vvKA7+kGXdyS6zTXmkD89TgEtA6k6xy8xyYb/CAOnOecX4ujRxI
57
- usLQgP0frVwI6tB+ChebNXLz65HCiPmFxs9utIxQT6kxXzFqQzp3dnZ8ZBXW+UBg
58
- 5Lqx5wKBgFIi2DP5/cF5nUDqOtiQTzl0MeJWW3w3UBS9jQF7Cx00YyLSqIF1batv
59
- Zk0Yq5w/2oh9C5EDrf8eyCYfK3iU2Ij4Jy6N6zITjRhW/kxxZigjmcTb/Tsme2Xh
60
- IFo5RoAfOV1dPiXM4oqZFPNmppAxiZH2ohEmo593DHYosQHMjXYG
61
- -----END RSA PRIVATE KEY-----
data/spec/spec_helper.rb DELETED
@@ -1,46 +0,0 @@
1
- require 'simplecov'
2
- require 'simplecov-rcov'
3
- SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
4
- SimpleCov.start do
5
- add_filter "/spec/"
6
- end
7
-
8
- require 'timeout'
9
- require 'database_cleaner'
10
- require 'active_record'
11
- require 'notifiable'
12
- require 'notifiable/apns/grocer'
13
- require 'grocer'
14
- require 'byebug'
15
-
16
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
17
-
18
- # Setup ActiveRecord db connection
19
- ActiveRecord::Base.establish_connection(YAML.load_file('config/database.yml')['test'])
20
-
21
- RSpec.configure do |config|
22
- config.mock_with :rspec
23
- config.order = "random"
24
-
25
- config.before(:all) {
26
- DatabaseCleaner.strategy = :truncation
27
- Notifiable.notifier_classes[:apns] = Notifiable::Apns::Grocer::Stream
28
- Notifiable::App.define_configuration_accessors(Notifiable.notifier_classes)
29
-
30
- @grocer = Grocer.server(port: 2195)
31
- @grocer.accept
32
- }
33
-
34
- config.before(:each) {
35
- DatabaseCleaner.start
36
- @grocer.notifications.clear
37
- }
38
-
39
- config.after(:each) {
40
- DatabaseCleaner.clean
41
- }
42
-
43
- config.after(:all) {
44
- @grocer.close
45
- }
46
- end
data/spec/stream_spec.rb DELETED
@@ -1,125 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Notifiable::Apns::Grocer::Stream do
4
-
5
- subject { Notifiable::Apns::Grocer::Stream.new(n1) }
6
- let(:a1) { Notifiable::App.create! name: "Drum Cussac" }
7
- let(:n1) { Notifiable::Notification.create! app: a1 }
8
-
9
- describe "#sandbox?" do
10
- before(:each) { subject.instance_variable_set("@sandbox", "1") }
11
- it { expect(subject.send(:sandbox?)).to eql true }
12
- end
13
-
14
- describe "#grocer_payload?" do
15
- let(:d1) { Notifiable::DeviceToken.create! app: a1, token: "abc123", provider: 'apns' }
16
- before(:each) { @grocer_payload = subject.send("grocer_payload", d1, n1) }
17
-
18
- context "message" do
19
- let(:n1) { Notifiable::Notification.create! app: a1, message: "New deals!" }
20
- it { expect(@grocer_payload).to include(device_token: "abc123") }
21
- it { expect(@grocer_payload[:alert]).to include({body: "New deals!"}) }
22
- it { expect(@grocer_payload).to include({sound: 'default'}) }
23
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
24
- end
25
-
26
- context "title and message" do
27
- let(:n1) { Notifiable::Notification.create! app: a1, title: 'Shopping', message: "New deals!" }
28
- it { expect(@grocer_payload[:alert]).to include({title: 'Shopping'}) }
29
- it { expect(@grocer_payload[:alert]).to include({body: 'New deals!'}) }
30
- it { expect(@grocer_payload).to include({sound: 'default'}) }
31
- it { expect(@grocer_payload).to include(device_token: "abc123") }
32
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
33
- end
34
-
35
- context "sound" do
36
- let(:n1) { Notifiable::Notification.create! app: a1, sound: "buzzer" }
37
- it { expect(@grocer_payload).to include(sound: "buzzer") }
38
- it { expect(@grocer_payload).to include(device_token: "abc123") }
39
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
40
- end
41
-
42
- context "badge count" do
43
- let(:n1) { Notifiable::Notification.create! app: a1, badge_count: 1 }
44
- it { expect(@grocer_payload).to include(badge: 1) }
45
- it { expect(@grocer_payload).to include(device_token: "abc123") }
46
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
47
- end
48
-
49
- context "parameters" do
50
- let(:n1) { Notifiable::Notification.create! app: a1, parameters: {screen: "leaderboard"}}
51
- it { expect(@grocer_payload).to include(device_token: "abc123") }
52
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
53
- it { expect(@grocer_payload[:custom]).to include(screen: "leaderboard") }
54
- end
55
-
56
- context "identifier" do
57
- let(:n1) { Notifiable::Notification.create! app: a1, identifier: "23508241"}
58
- it { expect(@grocer_payload).to include(device_token: "abc123") }
59
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
60
- it { expect(@grocer_payload).to include(identifier: "23508241") }
61
- end
62
-
63
- context "content_available" do
64
- let(:n1) { Notifiable::Notification.create! app: a1, content_available: true}
65
- it { expect(@grocer_payload).to include(device_token: "abc123") }
66
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
67
- it { expect(@grocer_payload).to include(content_available: true) }
68
- end
69
-
70
- context "mutable_content" do
71
- let(:n1) { Notifiable::Notification.create! app: a1, mutable_content: true}
72
- it { expect(@grocer_payload).to include(device_token: "abc123") }
73
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
74
- it { expect(@grocer_payload).to include(mutable_content: true) }
75
- end
76
-
77
- context "expiry" do
78
- let(:expiry) { Time.now + 60*60 }
79
- let(:n1) { Notifiable::Notification.create! app: a1, expiry: expiry}
80
- it { expect(@grocer_payload).to include(device_token: "abc123") }
81
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
82
- it { expect(@grocer_payload).to include(expiry: expiry) }
83
- end
84
-
85
- context "thread id" do
86
- let(:thread_id) { "threadabc123" }
87
- let(:n1) { Notifiable::Notification.create! app: a1, thread_id: thread_id}
88
- it { expect(@grocer_payload).to include(device_token: "abc123") }
89
- it { expect(@grocer_payload).to include(thread_id: "threadabc123") }
90
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
91
- end
92
-
93
- context "category" do
94
- let(:category) { "INVITATION" }
95
- let(:n1) { Notifiable::Notification.create! app: a1, category: category}
96
- it { expect(@grocer_payload).to include(device_token: "abc123") }
97
- it { expect(@grocer_payload).to include(category: "INVITATION") }
98
- it { expect(@grocer_payload[:custom]).to include(n_id: n1.id) }
99
- end
100
- end
101
-
102
- describe "#gateway_host" do
103
- context "sandbox" do
104
- before(:each) { allow(subject).to receive(:sandbox?) { true } }
105
- it { expect(subject.send(:gateway_host)).to eql "gateway.sandbox.push.apple.com" }
106
- end
107
-
108
- context "production" do
109
- before(:each) { allow(subject).to receive(:sandbox?) { false } }
110
- it { expect(subject.send(:gateway_host)).to eql "gateway.push.apple.com" }
111
- end
112
- end
113
-
114
- describe "#feedback" do
115
- let!(:d1) { Notifiable::DeviceToken.create! app: a1, token: 'abc123', provider: 'apns' }
116
- before(:each) do
117
- feedback_double = double('Grocer::Feedback')
118
- attempt_double = double('Grocer::FailedDeliveryAttempt', device_token: 'abc123', timestamp: DateTime.now)
119
- allow(subject).to receive(:grocer_feedback) { [attempt_double].each }
120
- subject.send(:process_feedback)
121
- end
122
- it { expect(Notifiable::DeviceToken.count).to eq 0 }
123
- end
124
-
125
- end