passbookpgh 0.4.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +7 -0
  3. data/Gemfile +17 -0
  4. data/Gemfile.lock +130 -0
  5. data/LICENSE +22 -0
  6. data/README.md +294 -0
  7. data/Rakefile +36 -0
  8. data/VERSION +1 -0
  9. data/bin/pk +22 -0
  10. data/lib/commands/build.rb +62 -0
  11. data/lib/commands/commands.rb +31 -0
  12. data/lib/commands/generate.rb +44 -0
  13. data/lib/commands/templates/boarding-pass.json +56 -0
  14. data/lib/commands/templates/coupon.json +33 -0
  15. data/lib/commands/templates/event-ticket.json +33 -0
  16. data/lib/commands/templates/generic.json +33 -0
  17. data/lib/commands/templates/store-card.json +33 -0
  18. data/lib/passbook/pkpass.rb +121 -0
  19. data/lib/passbook/push_notification.rb +19 -0
  20. data/lib/passbook/signer.rb +40 -0
  21. data/lib/passbook/version.rb +3 -0
  22. data/lib/passbook.rb +15 -0
  23. data/lib/rack/passbook_rack.rb +98 -0
  24. data/lib/rails/generators/passbook/config/config_generator.rb +16 -0
  25. data/lib/rails/generators/passbook/config/templates/initializer.rb +13 -0
  26. data/lib/utils/command_utils.rb +12 -0
  27. data/passbookpgh.gemspec +110 -0
  28. data/spec/data/icon.png +0 -0
  29. data/spec/data/icon@2x.png +0 -0
  30. data/spec/data/logo.png +0 -0
  31. data/spec/data/logo@2x.png +0 -0
  32. data/spec/lib/commands/build_spec.rb +92 -0
  33. data/spec/lib/commands/commands_spec.rb +102 -0
  34. data/spec/lib/commands/commands_spec_helper.rb +69 -0
  35. data/spec/lib/commands/generate_spec.rb +72 -0
  36. data/spec/lib/passbook/pkpass_spec.rb +108 -0
  37. data/spec/lib/passbook/push_notification_spec.rb +23 -0
  38. data/spec/lib/passbook/signer_spec.rb +84 -0
  39. data/spec/lib/rack/passbook_rack_spec.rb +233 -0
  40. data/spec/spec_helper.rb +9 -0
  41. metadata +244 -0
@@ -0,0 +1,233 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rack::PassbookRack do
4
+
5
+ let(:register_delete_path) {'/v1/devices/fe772e610be3efafb65ed77772ca311a/registrations/pass.com.polyglotprogramminginc.testpass/27-1'}
6
+ let(:register_delete_params) {{'deviceLibraryIdentifier' => 'fe772e610be3efafb65ed77772ca311a',
7
+ 'passTypeIdentifier' => 'pass.com.polyglotprogramminginc.testpass',
8
+ 'serialNumber' => '27-1'}}
9
+ let(:passes_for_device_path) {'/v1/devices/fe772e610be3efafb65ed77772ca311a/registrations/pass.com.polyglotprogramminginc.testpass'}
10
+ let(:passes_for_device_params) {{'deviceLibraryIdentifier' => 'fe772e610be3efafb65ed77772ca311a',
11
+ 'passTypeIdentifier' => 'pass.com.polyglotprogramminginc.testpass'}}
12
+ let(:latest_pass_path) {'/v1/passes/pass.com.polyglotprogramminginc.testpass/27-1'}
13
+ let(:latest_pass_params) {{'passTypeIdentifier' => 'pass.com.polyglotprogramminginc.testpass',
14
+ 'serialNumber' => '27-1'}}
15
+ let(:log_path) {'/v1/log'}
16
+ let(:push_token) {"8c56f2e787d9c089963960ace834bc2875e3f0cf7745da5b98d58bc6be05b4dc"}
17
+ let(:auth_token) {"3c0adc9ccbcf3e733edeb897043a4835"}
18
+
19
+ context 'find method' do
20
+ let(:passbook_rack) {Rack::PassbookRack.new nil}
21
+
22
+ shared_examples_for 'a method that can handle non passbook urls' do
23
+ context 'incomplete passbook api path' do
24
+ subject {passbook_rack.find_method('/v1/devices/fe772e610be3efafb65ed77772ca311a/registrations')}
25
+ it {should eq nil}
26
+ end
27
+
28
+ context 'no version api path' do
29
+ subject {passbook_rack.find_method('/devices/fe772e610be3efafb65ed77772ca311a/registrations')}
30
+ it {should eq nil}
31
+ end
32
+
33
+ context 'no devices api path' do
34
+ subject {passbook_rack.find_method('/v1/fe772e610be3efafb65ed77772ca311a/registrations')}
35
+ it {should eq nil}
36
+ end
37
+
38
+ context 'no registrations api path' do
39
+ subject {passbook_rack.find_method('/v1/devices/fe772e610be3efafb65ed77772ca311a')}
40
+ it {should eq nil}
41
+ end
42
+ end
43
+
44
+ context 'device register delete' do
45
+ context 'a valid path' do
46
+ subject {passbook_rack.find_method(register_delete_path)}
47
+ its([:method]) {should eq 'device_register_delete'}
48
+ its([:params]) {should eq(register_delete_params) }
49
+ end
50
+
51
+ it_behaves_like 'a method that can handle non passbook urls'
52
+
53
+ end
54
+
55
+ context 'passes for device' do
56
+ subject {passbook_rack.find_method(passes_for_device_path)}
57
+ its([:method]) {should eq 'passes_for_device'}
58
+ its([:params]) {should eq passes_for_device_params }
59
+ end
60
+
61
+ context 'latest pass' do
62
+ subject {passbook_rack.find_method(latest_pass_path)}
63
+ its([:method]) {should eq 'latest_pass'}
64
+ its([:params]) {should eq(latest_pass_params) }
65
+ end
66
+
67
+ context 'latest pass' do
68
+ subject {passbook_rack.find_method(log_path)}
69
+ its([:method]) {should eq 'log'}
70
+ end
71
+ end
72
+
73
+ context 'rack middleware' do
74
+
75
+ context 'register pass without authToken' do
76
+ before do
77
+ Passbook::PassbookNotification.should_receive(:register_pass).
78
+ with(register_delete_params.merge!('pushToken' => push_token)).and_return({:status => 201})
79
+ post register_delete_path, {"pushToken" => push_token}.to_json
80
+ end
81
+
82
+ subject {last_response}
83
+ its(:status) {should eq 201}
84
+ end
85
+
86
+ context 'register pass with authToken' do
87
+ before do
88
+ Passbook::PassbookNotification.should_receive(:register_pass).
89
+ with(register_delete_params.merge!('pushToken' => push_token,'authToken' => auth_token)).and_return({:status => 201})
90
+ post register_delete_path, {"pushToken" => push_token}.to_json, rack_env = {'HTTP_AUTHORIZATION' => auth_token}
91
+ end
92
+
93
+ subject {last_response}
94
+ its(:status) {should eq 201}
95
+ end
96
+
97
+ context 'passes for device' do
98
+ context 'with passes' do
99
+ let(:passes_for_device_response) {{'last_updated' => 1, 'serial_numbers' => [343, 234]}}
100
+ before do
101
+ Passbook::PassbookNotification.should_receive(:passes_for_device).
102
+ with(passes_for_device_params).and_return(passes_for_device_response)
103
+ get passes_for_device_path
104
+ end
105
+
106
+ context 'status' do
107
+ subject {last_response.status}
108
+ it {should eq 200}
109
+ end
110
+
111
+ context 'body' do
112
+ subject{JSON.parse(last_response.body)}
113
+ it {should eq passes_for_device_response}
114
+ end
115
+ end
116
+
117
+ context 'with passes modified since' do
118
+ before do
119
+ Passbook::PassbookNotification.should_receive(:passes_for_device).
120
+ with(passes_for_device_params.merge!('passesUpdatedSince' => '1371189712')).and_return(nil)
121
+ path_with_update_since = passes_for_device_path + "?passesUpdatedSince=1371189712"
122
+ get path_with_update_since
123
+ end
124
+
125
+ context 'status' do
126
+ subject {last_response.status}
127
+ it {should eq 204}
128
+ end
129
+ end
130
+
131
+ context 'without passes' do
132
+ before do
133
+ Passbook::PassbookNotification.should_receive(:passes_for_device).
134
+ with(passes_for_device_params).and_return(nil)
135
+ get passes_for_device_path
136
+ end
137
+
138
+ context 'status' do
139
+ subject {last_response.status}
140
+ it {should eq 204}
141
+ end
142
+ end
143
+ end
144
+
145
+ context 'get latest pass' do
146
+ context 'valid pass' do
147
+ let(:raw_pass) {{:status => 200, :latest_pass => 'some url encoded text', :last_modified => '1442401010'}}
148
+
149
+ before do
150
+ Passbook::PassbookNotification.should_receive(:latest_pass).with(latest_pass_params).
151
+ and_return(raw_pass)
152
+ get latest_pass_path
153
+ end
154
+
155
+ subject {last_response}
156
+ its(:status) {should eq 200}
157
+ its(:header) {should eq({'Content-Type' => 'application/vnd.apple.pkpass',
158
+ 'Content-Disposition' => 'attachment', 'filename' => '27-1.pkpass', 'last-modified' => '1442401010', 'Content-Length' => '21'})}
159
+ its(:body) {should eq raw_pass[:latest_pass]}
160
+ end
161
+
162
+ context 'no pass' do
163
+ before do
164
+ Passbook::PassbookNotification.should_receive(:latest_pass).with(latest_pass_params).
165
+ and_return({:status => 204, :latest_pass => nil})
166
+ get latest_pass_path
167
+ end
168
+
169
+ subject {last_response}
170
+ its(:status) {should eq 204}
171
+ end
172
+ end
173
+
174
+ context 'unregister pass without authToken' do
175
+ before do
176
+ Passbook::PassbookNotification.should_receive(:unregister_pass).
177
+ with(register_delete_params).and_return({:status => 200})
178
+ delete register_delete_path
179
+ end
180
+
181
+ subject {last_response}
182
+ its(:status) {should eq 200}
183
+ end
184
+
185
+ context 'unregister pass with authToken' do
186
+ before do
187
+ Passbook::PassbookNotification.should_receive(:unregister_pass).
188
+ with(register_delete_params.merge!('authToken' => auth_token)).and_return({:status => 200})
189
+ delete register_delete_path, {}, rack_env = {'HTTP_AUTHORIZATION' => auth_token}
190
+ end
191
+
192
+ subject {last_response}
193
+ its(:status) {should eq 200}
194
+ end
195
+
196
+ context 'log' do
197
+ let(:log_params) {{'logs' => ['some error']}}
198
+ before do
199
+ Passbook::PassbookNotification.should_receive(:passbook_log).
200
+ with(log_params)
201
+ post log_path, log_params.to_json
202
+ end
203
+
204
+ subject {last_response}
205
+ its(:status) {should eq 200}
206
+ end
207
+
208
+ context 'non passbook requests' do
209
+ before do
210
+ get '/foo'
211
+ end
212
+
213
+ subject {last_response}
214
+ its(:status) {should eq 200}
215
+ its(:body) {should eq 'test app'}
216
+ end
217
+ end
218
+
219
+ end
220
+
221
+ require 'rack/test'
222
+ include Rack::Test::Methods
223
+
224
+ def app
225
+ test_app = lambda do |env|
226
+ [200, {}, 'test app']
227
+ end
228
+
229
+ Rack::PassbookRack.new test_app
230
+ end
231
+
232
+ class Passbook::PassbookNotification
233
+ end
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ require 'json'
4
+ require 'simplecov'
5
+ require 'grocer'
6
+ SimpleCov.start
7
+
8
+ Dir['lib/passbook/**/*.rb'].each {|f| require File.join(File.dirname(__FILE__), '..', f.gsub(/.rb/, ''))}
9
+ Dir['lib/rack/**/*.rb'].each {|f| require File.join(File.dirname(__FILE__), '..', f.gsub(/.rb/, ''))}
metadata ADDED
@@ -0,0 +1,244 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: passbookpgh
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.5
5
+ platform: ruby
6
+ authors:
7
+ - Thomas Lauro
8
+ - Lance Gleason
9
+ - Danielle Greaves
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2022-01-26 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rubyzip
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: 1.0.0
29
+ - !ruby/object:Gem::Dependency
30
+ name: grocer
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: commander
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: terminal-table
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: rack-test
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: activesupport
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: jeweler
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: simplecov
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: rspec
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rake
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ - !ruby/object:Gem::Dependency
156
+ name: yard
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ description: This gem allows you to create IOS Passbooks. Unlike some, this works
170
+ with Rails but does not require it.
171
+ email:
172
+ - thomas@lauro.fr
173
+ - lgleason@polyglotprogramminginc.com
174
+ - greaves@trustarts.org
175
+ executables:
176
+ - pk
177
+ extensions: []
178
+ extra_rdoc_files:
179
+ - LICENSE
180
+ - README.md
181
+ files:
182
+ - ".travis.yml"
183
+ - Gemfile
184
+ - Gemfile.lock
185
+ - LICENSE
186
+ - README.md
187
+ - Rakefile
188
+ - VERSION
189
+ - bin/pk
190
+ - lib/commands/build.rb
191
+ - lib/commands/commands.rb
192
+ - lib/commands/generate.rb
193
+ - lib/commands/templates/boarding-pass.json
194
+ - lib/commands/templates/coupon.json
195
+ - lib/commands/templates/event-ticket.json
196
+ - lib/commands/templates/generic.json
197
+ - lib/commands/templates/store-card.json
198
+ - lib/passbook.rb
199
+ - lib/passbook/pkpass.rb
200
+ - lib/passbook/push_notification.rb
201
+ - lib/passbook/signer.rb
202
+ - lib/passbook/version.rb
203
+ - lib/rack/passbook_rack.rb
204
+ - lib/rails/generators/passbook/config/config_generator.rb
205
+ - lib/rails/generators/passbook/config/templates/initializer.rb
206
+ - lib/utils/command_utils.rb
207
+ - passbookpgh.gemspec
208
+ - spec/data/icon.png
209
+ - spec/data/icon@2x.png
210
+ - spec/data/logo.png
211
+ - spec/data/logo@2x.png
212
+ - spec/lib/commands/build_spec.rb
213
+ - spec/lib/commands/commands_spec.rb
214
+ - spec/lib/commands/commands_spec_helper.rb
215
+ - spec/lib/commands/generate_spec.rb
216
+ - spec/lib/passbook/pkpass_spec.rb
217
+ - spec/lib/passbook/push_notification_spec.rb
218
+ - spec/lib/passbook/signer_spec.rb
219
+ - spec/lib/rack/passbook_rack_spec.rb
220
+ - spec/spec_helper.rb
221
+ homepage: https://github.com/pgharts/passbookpgh
222
+ licenses:
223
+ - MIT
224
+ metadata: {}
225
+ post_install_message:
226
+ rdoc_options: []
227
+ require_paths:
228
+ - lib
229
+ required_ruby_version: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: '0'
234
+ required_rubygems_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ requirements: []
240
+ rubygems_version: 3.0.3
241
+ signing_key:
242
+ specification_version: 4
243
+ summary: A IOS Passbook generator.
244
+ test_files: []