passbookpgh 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
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: []