ios_push_notifications 0.5
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.
- data/CHANGELOG +2 -0
- data/Gemfile +2 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +60 -0
- data/Rakefile +23 -0
- data/lib/generators/ios_push_notifications_generator.rb +30 -0
- data/lib/generators/templates/device_migration.rb +18 -0
- data/lib/generators/templates/initializer.rb +3 -0
- data/lib/generators/templates/notification_migration.rb +25 -0
- data/lib/ios_push_notifications.rb +43 -0
- data/lib/ios_push_notifications/configuration.rb +32 -0
- data/lib/ios_push_notifications/device.rb +33 -0
- data/lib/ios_push_notifications/notification.rb +60 -0
- data/test/apple_push_notification_development.pem +11 -0
- data/test/database.yml +22 -0
- data/test/debug.log +92 -0
- data/test/device_test.rb +37 -0
- data/test/ios_push_notifications_plugin.sqlite3.db +0 -0
- data/test/ios_push_notifications_test.rb +3 -0
- data/test/notification_test.rb +82 -0
- data/test/schema.rb +18 -0
- data/test/test_helper.rb +56 -0
- metadata +98 -0
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 [name of plugin creator]
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
IosPushNotifications
|
2
|
+
====================
|
3
|
+
|
4
|
+
== What is ios_push_notifications
|
5
|
+
Nicely documented Push Notification gem for rails 3 applications, has generators for migrations and an initializer with configuration. Well documented and tested.... compared to other shitty forks out there >_>
|
6
|
+
== Install
|
7
|
+
|
8
|
+
gem install ios_push_notifications
|
9
|
+
|
10
|
+
== Rails 3
|
11
|
+
|
12
|
+
To use ios_push_notifications with Rails 3 you will need to include it in your Gemfile.
|
13
|
+
|
14
|
+
group :development do
|
15
|
+
gem "ios_push_notifications"
|
16
|
+
end
|
17
|
+
|
18
|
+
== Usage
|
19
|
+
* rails g iospn : Will name the migration files (iospn_devices and iospn_notifications) combined with the initializer
|
20
|
+
|
21
|
+
== Configuration
|
22
|
+
TODO
|
23
|
+
|
24
|
+
== Usage
|
25
|
+
TODO
|
26
|
+
device = IOSPN::Device.find_or_create_by_token("params[:device_token]")
|
27
|
+
|
28
|
+
notification = IOSPN::Notification.new
|
29
|
+
notification.device = device
|
30
|
+
notification.badge = 5
|
31
|
+
notification.sound = true
|
32
|
+
notification.alert = "text..."
|
33
|
+
notification.save
|
34
|
+
IOSPN::Notification.send_notifications
|
35
|
+
== Rake Tasks
|
36
|
+
TODO
|
37
|
+
|
38
|
+
== Certificates
|
39
|
+
TODO
|
40
|
+
|
41
|
+
Copyright (c) 2011 [name of plugin creator]
|
42
|
+
|
43
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
44
|
+
a copy of this software and associated documentation files (the
|
45
|
+
"Software"), to deal in the Software without restriction, including
|
46
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
47
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
48
|
+
permit persons to whom the Software is furnished to do so, subject to
|
49
|
+
the following conditions:
|
50
|
+
|
51
|
+
The above copyright notice and this permission notice shall be
|
52
|
+
included in all copies or substantial portions of the Software.
|
53
|
+
|
54
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
55
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
56
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
57
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
58
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
59
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
60
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the ios_push_notifications plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.libs << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Generate documentation for the ios_push_notifications plugin.'
|
17
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
19
|
+
rdoc.title = 'IosPushNotifications'
|
20
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
21
|
+
rdoc.rdoc_files.include('README')
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
23
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
class IosPushNotificationsGenerator < Rails::Generators::Base #:nodoc:
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
|
8
|
+
|
9
|
+
def create_initializer
|
10
|
+
template 'initializer.rb', "config/initializers/ios_push_notification.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_migration
|
14
|
+
migration_template 'device_migration.rb', "db/migrate/create_iospn_devices.rb"
|
15
|
+
migration_template 'notification_migration.rb', "db/migrate/create_iospn_notifications.rb"
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
# FIXME: Should be proxied to ActiveRecord::Generators::Base
|
20
|
+
# Implement the required interface for Rails::Generators::Migration.
|
21
|
+
|
22
|
+
def self.next_migration_number(dirname) #:nodoc:
|
23
|
+
if ActiveRecord::Base.timestamped_migrations
|
24
|
+
Time.now.utc.strftime("%Y%m%d%H%M#{rand 60}")
|
25
|
+
else
|
26
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateIospnDevices < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :iospn_devices do |t|
|
4
|
+
t.text :token, :length => 100, :null => false
|
5
|
+
t.datetime :last_registered_at
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
add_index :iospn_devices, :token, :unique => true
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.down
|
12
|
+
drop_table :iospn_devices
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class CreateIospnNotifications < ActiveRecord::Migration # :nodoc:
|
2
|
+
|
3
|
+
def self.up
|
4
|
+
|
5
|
+
create_table :iospn_notifications do |t|
|
6
|
+
t.integer :device_id, :null => false
|
7
|
+
t.integer :errors_nb, :default => 0 # used for storing errors from apple feedbacks
|
8
|
+
t.string :device_language, :size => 5 # if you don't want to send localized strings
|
9
|
+
t.string :sound
|
10
|
+
t.string :alert, :size => 150
|
11
|
+
t.integer :badge
|
12
|
+
t.text :custom_properties
|
13
|
+
t.datetime :sent_at
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
|
17
|
+
add_index :iospn_notifications, :device_id
|
18
|
+
add_index :iospn_notifications, :sent_at
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.down
|
22
|
+
drop_table :iospn_notifications
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "active_record" unless defined?(ActiveRecord)
|
2
|
+
require "action_view" unless defined?(ActionView)
|
3
|
+
|
4
|
+
require "rails" unless defined?(Rails)
|
5
|
+
|
6
|
+
|
7
|
+
require 'socket'
|
8
|
+
require 'openssl'
|
9
|
+
require "ios_push_notifications/notification"
|
10
|
+
require "ios_push_notifications/device"
|
11
|
+
require "ios_push_notifications/configuration"
|
12
|
+
module IOSPN
|
13
|
+
def open_for_delivery(options = {}, &block)
|
14
|
+
open(options, &block)
|
15
|
+
end
|
16
|
+
def open(options = {}, &block)
|
17
|
+
options = IOSPN.configuration.notification.merge(options)
|
18
|
+
cert = File.read(options[:cert])
|
19
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
20
|
+
ctx.key = OpenSSL::PKey::RSA.new(cert, options[:passphrase])
|
21
|
+
ctx.cert = OpenSSL::X509::Certificate.new(cert)
|
22
|
+
|
23
|
+
sock = TCPSocket.new(options[:host], options[:port])
|
24
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
|
25
|
+
ssl.sync = true
|
26
|
+
ssl.connect
|
27
|
+
|
28
|
+
yield ssl, sock if block_given?
|
29
|
+
ssl.close
|
30
|
+
sock.close
|
31
|
+
end
|
32
|
+
|
33
|
+
# Yields up an SSL socket to receive feedback from.
|
34
|
+
# The connections are close automatically.
|
35
|
+
# Configuration parameters are:
|
36
|
+
#
|
37
|
+
def open_for_feedback(options = {}, &block)
|
38
|
+
options = IOSPN.configuration.feedback.merge(options)
|
39
|
+
Notification.open(options, &block)
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module IOSPN
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :feedback,:notification
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@feedback = {}
|
7
|
+
@notification = {}
|
8
|
+
@notification = {:passphrase => '', :port => 2195}
|
9
|
+
@feedback = {:passphrase => @notification[:passphrase], :port => 2196}
|
10
|
+
if Rails.env.production?
|
11
|
+
@notification[:host] = "gateway.push.apple.com"
|
12
|
+
@notification[:cert] = File.join(Rails.root, 'config', 'apple_push_notification_production.pem') if Rails.root
|
13
|
+
@feedback[:host] = "feedback.push.apple.com"
|
14
|
+
@feedback[:cert] = @notification[:cert]
|
15
|
+
else
|
16
|
+
@notification[:host] = "gateway.sandbox.push.apple.com"
|
17
|
+
@notification[:cert] = File.join(Rails.root, 'config', 'apple_push_notification_development.pem') if Rails.root
|
18
|
+
@feedback[:host] = "feedback.sandbox.push.apple.com"
|
19
|
+
@feedback[:cert] = @notification[:cert]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class << self
|
25
|
+
attr_accessor :configuration
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.configure
|
29
|
+
self.configuration ||= Configuration.new
|
30
|
+
yield(configuration)
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module IOSPN
|
2
|
+
class Device < ActiveRecord::Base
|
3
|
+
set_table_name "iospn_devices"
|
4
|
+
has_many :notifications
|
5
|
+
validates_uniqueness_of :token
|
6
|
+
validates_format_of :token, :with => /^[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}$/
|
7
|
+
# before_save :set_last_registered_at
|
8
|
+
# private
|
9
|
+
# def self.set_last_registered_at
|
10
|
+
# self.last_registered_at = Time.now if self.last_registered_at.nil?
|
11
|
+
# end
|
12
|
+
|
13
|
+
def save
|
14
|
+
self.last_registered_at = Time.now if self.last_registered_at.nil?
|
15
|
+
super()
|
16
|
+
end
|
17
|
+
|
18
|
+
def token=(token)
|
19
|
+
res = token.scan(/\<(.+)\>/).first
|
20
|
+
unless res.nil? || res.empty?
|
21
|
+
token = res.first
|
22
|
+
end
|
23
|
+
write_attribute('token', token)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def to_hex
|
28
|
+
[self.token.delete(' ')].pack('H*')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module IOSPN
|
2
|
+
class Notification < ActiveRecord::Base
|
3
|
+
set_table_name "iospn_notifications"
|
4
|
+
class << self
|
5
|
+
include IOSPN
|
6
|
+
end
|
7
|
+
belongs_to :device
|
8
|
+
include ::ActionView::Helpers::TextHelper
|
9
|
+
|
10
|
+
def alert=(message)
|
11
|
+
if !message.blank? && message.size > 150
|
12
|
+
message = truncate(message, :length => 150)
|
13
|
+
end
|
14
|
+
write_attribute(:alert, message)
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_hash_for_push_notification
|
18
|
+
result = {}
|
19
|
+
result['aps'] = {}
|
20
|
+
result['aps']['alert'] = self.alert if self.alert
|
21
|
+
result['aps']['badge'] = self.badge.to_i if self.badge
|
22
|
+
if self.sound
|
23
|
+
result['aps']['sound'] = self.sound if self.sound.is_a?(String) && self.sound
|
24
|
+
end
|
25
|
+
if self.custom_properties
|
26
|
+
self.custom_properties.each do |key,value|
|
27
|
+
result["#{key}"] = "#{value}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
def build_hash_for_json
|
34
|
+
self.build_hash_for_push_notification.to_json
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_message_for_sending
|
38
|
+
json = self.build_hash_for_json
|
39
|
+
message = "\0\0 #{self.device.to_hex}\0#{json.length.chr}#{json}"
|
40
|
+
if message.size.to_i > 256
|
41
|
+
return false
|
42
|
+
else
|
43
|
+
message
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.send_notifications(notifications =Notification.where(:sent_at => nil))
|
48
|
+
unless notifications.nil? || notifications.empty?
|
49
|
+
open_for_delivery do |conn, sock|
|
50
|
+
notifications.each do |noty|
|
51
|
+
conn.write(noty.build_message_for_sending)
|
52
|
+
noty.sent_at = Time.now
|
53
|
+
noty.save
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
-----BEGIN CERTIFICATE REQUEST-----
|
2
|
+
MIIBqjCCARMCAQAwPDELMAkGA1UEBhMCU0UxCjAIBgNVBAgTAXMxITAfBgNVBAoT
|
3
|
+
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
|
4
|
+
gYkCgYEA0C+d/EP3ra8y//u9C1+tatY1S2YBuTNofSvfEcvTs4KH8lGqt9Lvfd2S
|
5
|
+
u7kqWzUFVHbhanG0gHkaF1vKowLImeVch6dvYWxRKahTfnSaw86nyKEYJuljrx2d
|
6
|
+
dlzFPPEpp3/SY1h4HIsH4PWYwujGUiAPu1DUXrxhBLmdU5ntTA0CAwEAAaAuMBUG
|
7
|
+
CSqGSIb3DQEJAjEIEwZhc2Rhc2QwFQYJKoZIhvcNAQkHMQgTBmFzZGFzZDANBgkq
|
8
|
+
hkiG9w0BAQUFAAOBgQAx7EavEK0sf6XdiXRuwman2yLOpDHYWUIZu+2IfBMqUG+C
|
9
|
+
I2K0JrMaQzT30giG4S7MQX1WzZLPN20aeiaNXqkNHIHwO4GtjWZCun4L8iNj47em
|
10
|
+
EPXyHopUQEjHSW23uJa52wjQhlnwoyrFZ0I11gG18J5DbhSSrny2n2e3EltT5A==
|
11
|
+
-----END CERTIFICATE REQUEST-----
|
data/test/database.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# vendor/plugins/yaffle/test/database.yml
|
2
|
+
sqlite:
|
3
|
+
:adapter: sqlite
|
4
|
+
:database: test/ios_push_notifications_plugin.sqlite.db
|
5
|
+
|
6
|
+
sqlite3:
|
7
|
+
:adapter: sqlite3
|
8
|
+
:database: test/ios_push_notifications_plugin.sqlite3.db
|
9
|
+
|
10
|
+
postgresql:
|
11
|
+
:adapter: postgresql
|
12
|
+
:username: postgres
|
13
|
+
:password: postgres
|
14
|
+
:database: ios_push_notifications_plugin_test
|
15
|
+
:min_messages: ERROR
|
16
|
+
|
17
|
+
mysql:
|
18
|
+
:adapter: mysql
|
19
|
+
:host: localhost
|
20
|
+
:username: root
|
21
|
+
:password: password
|
22
|
+
:database: ios_push_notifications_plugin_test
|
data/test/debug.log
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
[1m[36mSQL (0.3ms)[0m [1mDROP TABLE iospn_notifications[0m
|
2
|
+
SQLite3::SQLException: no such table: iospn_notifications: DROP TABLE iospn_notifications
|
3
|
+
[1m[36mSQL (0.3ms)[0m [1mDROP TABLE iospn_notifications[0m
|
4
|
+
SQLite3::SQLException: no such table: iospn_notifications: DROP TABLE iospn_notifications
|
5
|
+
[1m[35mSQL (0.2ms)[0m select sqlite_version(*)
|
6
|
+
[1m[36mSQL (4.0ms)[0m [1mCREATE TABLE "iospn_devices" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "token" text NOT NULL, "last_registered_at" datetime, "created_at" datetime, "updated_at" datetime) [0m
|
7
|
+
[1m[35mSQL (8.2ms)[0m CREATE TABLE "iospn_notifications" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "device_id" integer NOT NULL, "errors_nb" integer DEFAULT 0, "device_language" varchar(255), "sound" varchar(255), "alert" varchar(255), "badge" integer, "custom_properties" text, "sent_at" datetime, "created_at" datetime, "updated_at" datetime)
|
8
|
+
[1m[36mSQL (0.3ms)[0m [1m SELECT name
|
9
|
+
FROM sqlite_master
|
10
|
+
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
11
|
+
[0m
|
12
|
+
[1m[35mSQL (1.2ms)[0m CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL)
|
13
|
+
[1m[36mSQL (0.1ms)[0m [1mPRAGMA index_list("schema_migrations")[0m
|
14
|
+
[1m[35mSQL (1.4ms)[0m CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version")
|
15
|
+
[1m[36mSQL (0.2ms)[0m [1m SELECT name
|
16
|
+
FROM sqlite_master
|
17
|
+
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
18
|
+
[0m
|
19
|
+
[1m[35mSQL (0.1ms)[0m SELECT version FROM "schema_migrations"
|
20
|
+
[1m[36mSQL (1.0ms)[0m [1mINSERT INTO "schema_migrations" (version) VALUES ('0')[0m
|
21
|
+
[1m[35mSQL (0.3ms)[0m SELECT name
|
22
|
+
FROM sqlite_master
|
23
|
+
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
24
|
+
|
25
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
26
|
+
[1m[35mAREL (0.4ms)[0m INSERT INTO "iospn_devices" ("token", "last_registered_at", "created_at", "updated_at") VALUES ('5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz', '2011-02-07 21:26:19.764189', '2011-02-07 21:26:19.820338', '2011-02-07 21:26:19.820338')
|
27
|
+
[1m[36mAREL (0.1ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:26:19.822051', '2011-02-07 21:26:19.822051')[0m
|
28
|
+
[1m[35mAREL (0.1ms)[0m INSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:26:19.823923', '2011-02-07 21:26:19.823923')
|
29
|
+
[1m[36mAREL (0.1ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:26:19.824817', '2011-02-07 21:26:19.824817')[0m
|
30
|
+
[1m[35mAREL (0.1ms)[0m INSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:26:19.825738', '2011-02-07 21:26:19.825738')
|
31
|
+
[1m[36mAREL (0.1ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:26:19.826643', '2011-02-07 21:26:19.826643')[0m
|
32
|
+
[1m[35mSQL (0.2ms)[0m SELECT COUNT(*) FROM "iospn_notifications" WHERE ("iospn_notifications".device_id = 1)
|
33
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
34
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
35
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
36
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
37
|
+
[1m[36mIOSPN::Device Load (0.3ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
38
|
+
[1m[35mIOSPN::Device Load (0.1ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
39
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
40
|
+
[1m[35mIOSPN::Device Load (0.1ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
41
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
42
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
43
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
44
|
+
[1m[35mIOSPN::Device Load (0.1ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
45
|
+
[1m[36mAREL (1.3ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:26:19.885546', '2011-02-07 21:26:19.885546')[0m
|
46
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
47
|
+
[1m[36mAREL (0.4ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (NULL, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:26:19.911904', '2011-02-07 21:26:19.911904')[0m
|
48
|
+
SQLite3::ConstraintException: iospn_notifications.device_id may not be NULL: INSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (NULL, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:26:19.911904', '2011-02-07 21:26:19.911904')
|
49
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
50
|
+
[1m[36mAREL (0.3ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:26:19.914939', '2011-02-07 21:26:19.914939')[0m
|
51
|
+
[1m[35mSQL (0.1ms)[0m SELECT COUNT(*) FROM "iospn_notifications" WHERE ("iospn_notifications"."sent_at" IS NULL)
|
52
|
+
[1m[36mSQL (3.5ms)[0m [1mDROP TABLE iospn_notifications[0m
|
53
|
+
[1m[35mSQL (1.4ms)[0m DROP TABLE iospn_devices
|
54
|
+
[1m[36mSQL (0.2ms)[0m [1mselect sqlite_version(*)[0m
|
55
|
+
[1m[35mSQL (1.1ms)[0m CREATE TABLE "iospn_devices" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "token" text NOT NULL, "last_registered_at" datetime, "created_at" datetime, "updated_at" datetime)
|
56
|
+
[1m[36mSQL (7.5ms)[0m [1mCREATE TABLE "iospn_notifications" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "device_id" integer NOT NULL, "errors_nb" integer DEFAULT 0, "device_language" varchar(255), "sound" varchar(255), "alert" varchar(255), "badge" integer, "custom_properties" text, "sent_at" datetime, "created_at" datetime, "updated_at" datetime) [0m
|
57
|
+
[1m[35mSQL (0.3ms)[0m SELECT name
|
58
|
+
FROM sqlite_master
|
59
|
+
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
60
|
+
|
61
|
+
[1m[36mSQL (0.1ms)[0m [1mSELECT version FROM "schema_migrations"[0m
|
62
|
+
[1m[35mSQL (0.2ms)[0m SELECT name
|
63
|
+
FROM sqlite_master
|
64
|
+
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
65
|
+
|
66
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
67
|
+
[1m[35mAREL (0.3ms)[0m INSERT INTO "iospn_devices" ("token", "last_registered_at", "created_at", "updated_at") VALUES ('5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz', '2011-02-07 21:50:54.133692', '2011-02-07 21:50:54.188627', '2011-02-07 21:50:54.188627')
|
68
|
+
[1m[36mAREL (0.1ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:50:54.190235', '2011-02-07 21:50:54.190235')[0m
|
69
|
+
[1m[35mAREL (0.1ms)[0m INSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:50:54.191986', '2011-02-07 21:50:54.191986')
|
70
|
+
[1m[36mAREL (0.1ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:50:54.192872', '2011-02-07 21:50:54.192872')[0m
|
71
|
+
[1m[35mAREL (0.1ms)[0m INSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:50:54.193781', '2011-02-07 21:50:54.193781')
|
72
|
+
[1m[36mAREL (0.1ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, NULL, NULL, NULL, NULL, NULL, '2011-02-07 21:50:54.194667', '2011-02-07 21:50:54.194667')[0m
|
73
|
+
[1m[35mSQL (0.1ms)[0m SELECT COUNT(*) FROM "iospn_notifications" WHERE ("iospn_notifications".device_id = 1)
|
74
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
75
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
76
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices"."id" FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
77
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
78
|
+
[1m[36mIOSPN::Device Load (0.2ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
79
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
80
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
81
|
+
[1m[35mIOSPN::Device Load (0.1ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
82
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
83
|
+
[1m[35mIOSPN::Device Load (0.1ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
84
|
+
[1m[36mIOSPN::Device Load (0.1ms)[0m [1mSELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1[0m
|
85
|
+
[1m[35mIOSPN::Device Load (0.1ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
86
|
+
[1m[36mAREL (0.7ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:50:54.250848', '2011-02-07 21:50:54.250848')[0m
|
87
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
88
|
+
[1m[36mAREL (0.5ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (NULL, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:50:54.280836', '2011-02-07 21:50:54.280836')[0m
|
89
|
+
SQLite3::ConstraintException: iospn_notifications.device_id may not be NULL: INSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (NULL, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:50:54.280836', '2011-02-07 21:50:54.280836')
|
90
|
+
[1m[35mIOSPN::Device Load (0.2ms)[0m SELECT "iospn_devices".* FROM "iospn_devices" WHERE ("iospn_devices"."token" = '5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz') LIMIT 1
|
91
|
+
[1m[36mAREL (0.3ms)[0m [1mINSERT INTO "iospn_notifications" ("device_id", "errors_nb", "device_language", "sound", "alert", "badge", "custom_properties", "sent_at", "created_at", "updated_at") VALUES (1, 0, NULL, 'awesome.wav', 'Lorem Ipsum', 7, NULL, NULL, '2011-02-07 21:50:54.284408', '2011-02-07 21:50:54.284408')[0m
|
92
|
+
[1m[35mSQL (0.1ms)[0m SELECT COUNT(*) FROM "iospn_notifications" WHERE ("iospn_notifications"."sent_at" IS NULL)
|
data/test/device_test.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
class Device < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def setup
|
5
|
+
@device = IOSPN::Device.new(:token => "5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_notification_instance
|
9
|
+
assert @device
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_notification_token
|
13
|
+
token = @device.token
|
14
|
+
@device.token = "<#{token}>"
|
15
|
+
assert_equal(token, @device.token)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_registered_at_before_save
|
19
|
+
assert(@device.last_registered_at.nil?)
|
20
|
+
@device.save
|
21
|
+
assert(@device.last_registered_at)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_has_many_notifications
|
25
|
+
5.times do
|
26
|
+
@device.notifications << IOSPN::Notification.new
|
27
|
+
end
|
28
|
+
@device.save
|
29
|
+
assert_equal(@device.notifications.count, 5)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_unique_token
|
33
|
+
@device.save
|
34
|
+
bad_device = IOSPN::Device.create(:token => @device.token)
|
35
|
+
assert bad_device.errors
|
36
|
+
end
|
37
|
+
end
|
Binary file
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
class Notification < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def setup
|
5
|
+
@notif = IOSPN::Notification.new
|
6
|
+
@notif.alert = "Lorem Ipsum"
|
7
|
+
@notif.badge = 7
|
8
|
+
@notif.sound = "awesome.wav"
|
9
|
+
@device = IOSPN::Device.find_or_create_by_token("5gxadhy6 6zmtxfl6 5zpbcxmw ez3w7ksf qscpr55t trknkzap 7yyt45sc g6jrw7qz")
|
10
|
+
@notif.device = @device
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_notification_instance
|
14
|
+
assert @notif
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def test_notification_alert
|
19
|
+
message = "Hey man what's up?"
|
20
|
+
@notif.alert = message
|
21
|
+
assert_equal(@notif.alert, message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_existence_of_sound
|
25
|
+
assert_equal @notif.sound, "awesome.wav"
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_notification_truncate_above_150_characters
|
30
|
+
long_message = ""
|
31
|
+
160.times { |n| long_message << n}
|
32
|
+
@notif.alert = long_message
|
33
|
+
assert_equal(150, @notif.alert.length)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def test_notification_badge
|
38
|
+
number = 5
|
39
|
+
@notif.badge = number
|
40
|
+
assert_equal(@notif.badge, number)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_save_notification_without_device
|
44
|
+
@notif.device = nil
|
45
|
+
assert_raise(ActiveRecord::StatementInvalid) {@notif.save}
|
46
|
+
assert_not_nil @notif.errors
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_save_notification_with_device
|
50
|
+
assert(!@notif.device.new_record?)
|
51
|
+
assert @notif.save
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_hash_for_push_notification
|
55
|
+
hash = @notif.build_hash_for_push_notification
|
56
|
+
assert_instance_of(Hash, hash)
|
57
|
+
matcher = {'aps' => {'alert' => @notif.alert,
|
58
|
+
'badge' => @notif.badge,
|
59
|
+
'sound' => @notif.sound }}
|
60
|
+
assert_equal(matcher, hash)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_build_hash_for_json
|
64
|
+
assert @notif.build_hash_for_json
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_build_message_for_sending
|
68
|
+
assert(@notif.device.to_hex, "device.to_hex returns false")
|
69
|
+
assert(@notif.build_hash_for_json, "notification.build_hash_to_json returns false")
|
70
|
+
json = @notif.build_hash_for_json
|
71
|
+
message = "\0\0 #{@notif.device.to_hex}\0#{json.length.chr}#{json}"
|
72
|
+
assert_equal(@notif.build_message_for_sending, message)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_sending_notifications_for_sent_at_nil
|
76
|
+
@notif.save
|
77
|
+
IOSPN::Notification.send_notifications
|
78
|
+
assert(@notif.sent_at, "Notification timestamp was not, has not been sent")
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
end
|
data/test/schema.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 0) do
|
2
|
+
create_table :iospn_devices do |t|
|
3
|
+
t.text :token, :length => 100, :null => false
|
4
|
+
t.datetime :last_registered_at
|
5
|
+
t.timestamps
|
6
|
+
end
|
7
|
+
create_table :iospn_notifications do |t|
|
8
|
+
t.integer :device_id, :null => false
|
9
|
+
t.integer :errors_nb, :default => 0 # used for storing errors from apple feedbacks
|
10
|
+
t.string :device_language, :size => 5 # if you don't want to send localized strings
|
11
|
+
t.string :sound
|
12
|
+
t.string :alert, :size => 150
|
13
|
+
t.integer :badge
|
14
|
+
t.text :custom_properties
|
15
|
+
t.datetime :sent_at
|
16
|
+
t.timestamps
|
17
|
+
end
|
18
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require "yaml"
|
4
|
+
require "logger"
|
5
|
+
|
6
|
+
require File.dirname(__FILE__) + '/../init'
|
7
|
+
ENV['RAILS_ENV'] = 'test'
|
8
|
+
|
9
|
+
|
10
|
+
def clean_database!
|
11
|
+
models = [IOSPN::Notification, IOSPN::Device]
|
12
|
+
begin
|
13
|
+
models.each do |model|
|
14
|
+
ActiveRecord::Base.connection.execute "DROP TABLE #{model.table_name}"
|
15
|
+
end
|
16
|
+
rescue ActiveRecord::StatementInvalid
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def load_schema!
|
22
|
+
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
23
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
24
|
+
|
25
|
+
db_adapter = ENV['DB']
|
26
|
+
|
27
|
+
# no db passed, try one of these fine config-free DBs before bombing.
|
28
|
+
db_adapter ||=
|
29
|
+
begin
|
30
|
+
require 'rubygems'
|
31
|
+
require 'sqlite'
|
32
|
+
'sqlite'
|
33
|
+
rescue MissingSourceFile
|
34
|
+
begin
|
35
|
+
require 'sqlite3'
|
36
|
+
'sqlite3'
|
37
|
+
rescue MissingSourceFile
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
if db_adapter.nil?
|
42
|
+
raise "No DB Adapter selected. Pass the DB= option to pick one, or install Sqlite or Sqlite3."
|
43
|
+
end
|
44
|
+
|
45
|
+
ActiveRecord::Base.establish_connection(config[db_adapter])
|
46
|
+
|
47
|
+
IOSPN.configure do |c|
|
48
|
+
c.notification[:cert] = File.join(Dir.pwd,"test", "apple_push_notification_development.pem")
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
clean_database!
|
54
|
+
load(File.dirname(__FILE__) + "/schema.rb")
|
55
|
+
end
|
56
|
+
load_schema!
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ios_push_notifications
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: "0.5"
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Seivan Heidari
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-02-07 00:00:00 +01:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rails
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 3.0.0
|
25
|
+
type: :development
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sqlite3-ruby
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 1.3.1
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
description: Nicely documented Push Notification gem for rails 3 applications, has generators for migrations and an initializer with configuration. It is well documented and tested.... compared to other shitty forks out there >_>
|
39
|
+
email: seivan@kth.se
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files: []
|
45
|
+
|
46
|
+
files:
|
47
|
+
- lib/generators/ios_push_notifications_generator.rb
|
48
|
+
- lib/generators/templates/device_migration.rb
|
49
|
+
- lib/generators/templates/initializer.rb
|
50
|
+
- lib/generators/templates/notification_migration.rb
|
51
|
+
- lib/ios_push_notifications/configuration.rb
|
52
|
+
- lib/ios_push_notifications/device.rb
|
53
|
+
- lib/ios_push_notifications/notification.rb
|
54
|
+
- lib/ios_push_notifications.rb
|
55
|
+
- test/apple_push_notification_development.pem
|
56
|
+
- test/database.yml
|
57
|
+
- test/debug.log
|
58
|
+
- test/device_test.rb
|
59
|
+
- test/ios_push_notifications_plugin.sqlite3.db
|
60
|
+
- test/ios_push_notifications_test.rb
|
61
|
+
- test/notification_test.rb
|
62
|
+
- test/schema.rb
|
63
|
+
- test/test_helper.rb
|
64
|
+
- CHANGELOG
|
65
|
+
- Gemfile
|
66
|
+
- MIT-LICENSE
|
67
|
+
- Rakefile
|
68
|
+
- README.rdoc
|
69
|
+
has_rdoc: true
|
70
|
+
homepage: http://github.com/seivan/ios_push_notifications
|
71
|
+
licenses: []
|
72
|
+
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.3.4
|
90
|
+
requirements: []
|
91
|
+
|
92
|
+
rubyforge_project: ios_push_notifications
|
93
|
+
rubygems_version: 1.5.0
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: Push Notification gem for Rails 3 with proper tests and documentation
|
97
|
+
test_files: []
|
98
|
+
|