quaderno 1.11.2 → 1.12.0

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +53 -1
  4. data/VERSION +1 -1
  5. data/changelog.md +3 -0
  6. data/lib/quaderno-ruby/base.rb +12 -2
  7. data/lib/quaderno-ruby/behavior/crud.rb +56 -11
  8. data/lib/quaderno-ruby/behavior/deliver.rb +10 -2
  9. data/lib/quaderno-ruby/behavior/payment.rb +23 -4
  10. data/lib/quaderno-ruby/behavior/retrieve.rb +11 -2
  11. data/lib/quaderno-ruby/collection.rb +22 -0
  12. data/lib/quaderno-ruby/helpers/authentication.rb +26 -0
  13. data/lib/quaderno-ruby.rb +4 -1
  14. data/quaderno.gemspec +16 -5
  15. data/test/fixtures/quaderno_cassettes/all_contacts.yml +11 -282
  16. data/test/fixtures/quaderno_cassettes/all_contacts_by_access_token.yml +56 -0
  17. data/test/fixtures/quaderno_cassettes/all_contacts_by_authentication_token.yml +57 -0
  18. data/test/fixtures/quaderno_cassettes/all_estimates.yml +10 -14
  19. data/test/fixtures/quaderno_cassettes/all_expenses.yml +14 -47
  20. data/test/fixtures/quaderno_cassettes/all_invoices.yml +13 -2873
  21. data/test/fixtures/quaderno_cassettes/all_items.yml +8 -8
  22. data/test/fixtures/quaderno_cassettes/all_receipts.yml +11 -14
  23. data/test/fixtures/quaderno_cassettes/all_webhooks.yml +40 -36
  24. data/test/fixtures/quaderno_cassettes/create_estimate_on_downgraded_API.yml +46 -318
  25. data/test/fixtures/quaderno_cassettes/create_expense_on_downgraded_API.yml +125 -357
  26. data/test/fixtures/quaderno_cassettes/create_invoice_on_downgraded_API.yml +45 -318
  27. data/test/fixtures/quaderno_cassettes/create_receipt_on_downgraded_API.yml +56 -53
  28. data/test/fixtures/quaderno_cassettes/deleted_contact.yml +40 -592
  29. data/test/fixtures/quaderno_cassettes/deleted_contact_by_access_token.yml +199 -0
  30. data/test/fixtures/quaderno_cassettes/deleted_contact_by_authentication_token.yml +199 -0
  31. data/test/fixtures/quaderno_cassettes/deleted_estimate.yml +40 -334
  32. data/test/fixtures/quaderno_cassettes/deleted_expense.yml +43 -364
  33. data/test/fixtures/quaderno_cassettes/deleted_invoice.yml +44 -3199
  34. data/test/fixtures/quaderno_cassettes/deleted_item.yml +22 -22
  35. data/test/fixtures/quaderno_cassettes/deleted_receipt.yml +43 -42
  36. data/test/fixtures/quaderno_cassettes/deleted_webhook.yml +48 -44
  37. data/test/fixtures/quaderno_cassettes/delivered_estimate.yml +25 -32
  38. data/test/fixtures/quaderno_cassettes/delivered_invoice.yml +29 -2888
  39. data/test/fixtures/quaderno_cassettes/delivered_receipt.yml +29 -29
  40. data/test/fixtures/quaderno_cassettes/evidence_invoice.yml +19 -354
  41. data/test/fixtures/quaderno_cassettes/found_contact.yml +19 -291
  42. data/test/fixtures/quaderno_cassettes/found_contact_by_access_token.yml +99 -0
  43. data/test/fixtures/quaderno_cassettes/found_contact_by_authentication_token.yml +100 -0
  44. data/test/fixtures/quaderno_cassettes/found_estimate.yml +20 -24
  45. data/test/fixtures/quaderno_cassettes/found_expense.yml +24 -94
  46. data/test/fixtures/quaderno_cassettes/found_invoice.yml +22 -2886
  47. data/test/fixtures/quaderno_cassettes/found_item.yml +18 -16
  48. data/test/fixtures/quaderno_cassettes/found_receipt.yml +21 -24
  49. data/test/fixtures/quaderno_cassettes/found_webhook.yml +24 -22
  50. data/test/fixtures/quaderno_cassettes/new_contact.yml +9 -7
  51. data/test/fixtures/quaderno_cassettes/new_contact_by_access_token.yml +48 -0
  52. data/test/fixtures/quaderno_cassettes/new_contact_by_authentication_token.yml +48 -0
  53. data/test/fixtures/quaderno_cassettes/new_estimate.yml +29 -320
  54. data/test/fixtures/quaderno_cassettes/new_evidence.yml +10 -8
  55. data/test/fixtures/quaderno_cassettes/new_expense.yml +42 -363
  56. data/test/fixtures/quaderno_cassettes/new_invoice.yml +29 -324
  57. data/test/fixtures/quaderno_cassettes/new_item.yml +10 -8
  58. data/test/fixtures/quaderno_cassettes/new_receipt.yml +28 -24
  59. data/test/fixtures/quaderno_cassettes/new_webhook.yml +16 -14
  60. data/test/fixtures/quaderno_cassettes/paid_expense.yml +22 -52
  61. data/test/fixtures/quaderno_cassettes/paid_invoice.yml +22 -2879
  62. data/test/fixtures/quaderno_cassettes/rate_limit.yml +5 -5
  63. data/test/fixtures/quaderno_cassettes/unpay_an_expense.yml +29 -61
  64. data/test/fixtures/quaderno_cassettes/unpay_an_invoice.yml +28 -2888
  65. data/test/fixtures/quaderno_cassettes/updated_contact.yml +22 -292
  66. data/test/fixtures/quaderno_cassettes/updated_contact_by_access_token.yml +101 -0
  67. data/test/fixtures/quaderno_cassettes/updated_contact_by_authentication_token.yml +102 -0
  68. data/test/fixtures/quaderno_cassettes/updated_estimate.yml +44 -353
  69. data/test/fixtures/quaderno_cassettes/updated_expense.yml +43 -346
  70. data/test/fixtures/quaderno_cassettes/updated_invoice.yml +43 -361
  71. data/test/fixtures/quaderno_cassettes/updated_item.yml +21 -17
  72. data/test/fixtures/quaderno_cassettes/updated_receipt.yml +47 -41
  73. data/test/fixtures/quaderno_cassettes/updated_webhook.yml +35 -31
  74. data/test/helper.rb +2 -1
  75. data/test/unit/test_quaderno_contacts.rb +1 -1
  76. data/test/unit/test_quaderno_contacts_thread_safe.rb +104 -0
  77. data/test/unit/test_quaderno_expenses.rb +5 -5
  78. metadata +15 -4
  79. data/test/fixtures/quaderno_cassettes/calculate_tax.yml +0 -85
  80. data/test/fixtures/quaderno_cassettes/wrong_token.yml +0 -36
@@ -5,10 +5,12 @@ http_interactions:
5
5
  uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/contacts.json
6
6
  body:
7
7
  encoding: UTF-8
8
- string: first_name=Test%20customer
8
+ string: '{"first_name":"Test customer"}'
9
9
  headers:
10
10
  accept:
11
11
  - application/json
12
+ content-type:
13
+ - application/json
12
14
  authorization:
13
15
  - Basic c2tfdGVzdF9CN3hYclRzcGZlR3VrUXFHTjFwSzo=
14
16
  response:
@@ -21,38 +23,40 @@ http_interactions:
21
23
  x-ratelimit-limit:
22
24
  - '2000'
23
25
  x-ratelimit-reset:
24
- - '8'
26
+ - '13'
25
27
  x-ratelimit-remaining:
26
- - '93'
28
+ - '98'
27
29
  content-type:
28
30
  - application/json; charset=utf-8
29
31
  etag:
30
- - '"c111daa3651e62fbf7a733420693ef10"'
32
+ - '"9add49064c7cdbb7075d7041400a4793"'
31
33
  cache-control:
32
34
  - max-age=0, private, must-revalidate
33
35
  x-request-id:
34
- - 174f76e6-80f9-4920-b7b6-cbec9fae6b9b
36
+ - 2febc61d-7841-42a5-910b-fc4b7a801a0f
35
37
  x-runtime:
36
- - '0.615812'
38
+ - '1.382284'
37
39
  connection:
38
40
  - close
39
41
  server:
40
42
  - thin
41
43
  body:
42
44
  encoding: UTF-8
43
- string: '{"id":91,"kind":"company","created_at":1466681297,"full_name":"Test
44
- customer","contact_name":null,"street_line_1":null,"street_line_2":null,"postal_code":null,"city":null,"region":null,"country":"ES","phone_1":null,"phone_2":null,"fax":null,"email":null,"web":null,"discount":null,"tax_id":null,"vat_number":null,"bank_account":null,"language":"ES","notes":null,"secure_id":"a36c8e2608ce94ac2c6ddc156ef06c2606688c2a","permalink":"http://development.lvh.me:3000/billing/a36c8e2608ce94ac2c6ddc156ef06c2606688c2a","url":"http://development.lvh.me:3000/api/contacts/91"}'
45
+ string: '{"id":54,"kind":"company","created_at":1497268190,"full_name":"Test
46
+ customer","contact_name":null,"street_line_1":null,"street_line_2":null,"postal_code":null,"city":null,"region":null,"country":"ES","phone_1":null,"phone_2":null,"fax":null,"email":null,"web":null,"discount":null,"tax_id":null,"vat_number":null,"bank_account":null,"language":"ES","notes":null,"secure_id":"60bdc026b6e7315ebc4a520c729333ce73465abd","permalink":"http://development.lvh.me:3000/billing/60bdc026b6e7315ebc4a520c729333ce73465abd","url":"http://development.lvh.me:3000/api/contacts/54"}'
45
47
  http_version: '1.1'
46
- recorded_at: Thu, 23 Jun 2016 11:28:17 GMT
48
+ recorded_at: Mon, 12 Jun 2017 11:49:50 GMT
47
49
  - request:
48
50
  method: post
49
51
  uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/receipts.json
50
52
  body:
51
53
  encoding: UTF-8
52
- string: contact_id=91&currency=EUR&items_attributes[][description]=Aircraft&items_attributes[][quantity]=1.0&items_attributes[][unit_price]=0.0&tags=tnt&payment_method=cash&notes=
54
+ string: '{"contact_id":54,"currency":"EUR","items_attributes":[{"description":"Aircraft","quantity":"1.0","unit_price":"0.0"}],"tags":"tnt","payment_method":"cash","notes":""}'
53
55
  headers:
54
56
  accept:
55
57
  - application/json
58
+ content-type:
59
+ - application/json
56
60
  authorization:
57
61
  - Basic c2tfdGVzdF9CN3hYclRzcGZlR3VrUXFHTjFwSzo=
58
62
  response:
@@ -65,38 +69,40 @@ http_interactions:
65
69
  x-ratelimit-limit:
66
70
  - '2000'
67
71
  x-ratelimit-reset:
68
- - '8'
72
+ - '12'
69
73
  x-ratelimit-remaining:
70
- - '92'
74
+ - '97'
71
75
  content-type:
72
76
  - application/json; charset=utf-8
73
77
  etag:
74
- - '"3b8daf2008cf6060bc69ab9984d4d453"'
78
+ - '"91cf83bc0d595ace3687a1b2e122958c"'
75
79
  cache-control:
76
80
  - max-age=0, private, must-revalidate
77
81
  x-request-id:
78
- - 85a4a288-fba4-493a-ac81-56f7c8c78cab
82
+ - 2646602d-8a60-408d-849f-22aa435aa465
79
83
  x-runtime:
80
- - '4.289370'
84
+ - '4.620237'
81
85
  connection:
82
86
  - close
83
87
  server:
84
88
  - thin
85
89
  body:
86
90
  encoding: UTF-8
87
- string: '{"id":1072,"number":"0000006","issue_date":"2016-06-23","created_at":1466681297,"contact":{"id":91,"full_name":"Test
88
- customer"},"street_line_1":null,"street_line_2":null,"city":null,"region":null,"postal_code":null,"po_number":null,"currency":"EUR","exchange_rate":"1.9558","items":[{"id":3091,"description":"Aircraft","quantity":"1.0","unit_price_cents":"0.0","discount_rate":"0.0","tax_1_name":null,"tax_1_rate":null,"tax_2_name":null,"tax_2_rate":null,"reference":null,"subtotal_cents":"0.0","discount_cents":"0.0","gross_amount_cents":"0.0"}],"subtotal_cents":"0.0","discount_cents":"0.0","taxes":[],"payments":[{"id":35,"date":"2016-06-23","payment_method":"cash","amount_cents":0}],"notes":null,"state":"paid","tag_list":[],"secure_id":"fb58b3334e527c7dd485fb9aa9e19804e6856c7a","permalink":"http://development.lvh.me:3000/receipt/fb58b3334e527c7dd485fb9aa9e19804e6856c7a","pdf":"http://development.lvh.me:3000/receipt/fb58b3334e527c7dd485fb9aa9e19804e6856c7a.pdf","url":"http://development.lvh.me:3000/api/receipts/1072.json","processor":null,"processor_id":null}'
91
+ string: '{"id":204,"blocked":false,"number":"0003","issue_date":"2017-06-12","created_at":1497268191,"contact":{"id":54,"full_name":"Test
92
+ customer"},"country":"ES","street_line_1":null,"street_line_2":null,"city":null,"region":null,"postal_code":null,"po_number":null,"currency":"EUR","subject":null,"items":[{"id":205,"description":"Aircraft","quantity":"1.0","unit_price_cents":"0.0","discount_rate":"0.0","tax_1_name":null,"tax_1_rate":null,"tax_2_name":null,"tax_2_rate":null,"reference":null,"subtotal_cents":"0.0","discount_cents":"0.0","gross_amount_cents":"0.0"}],"subtotal_cents":"0.0","discount_cents":"0.0","taxes":[],"payments":[{"id":54,"date":"2017-06-12","payment_method":"cash","amount_cents":0}],"notes":null,"state":"paid","tag_list":[],"secure_id":"64687022590db95fa97a32ac967b24cb88bad958","permalink":"http://development.lvh.me:3000/receipt/64687022590db95fa97a32ac967b24cb88bad958","pdf":"http://development.lvh.me:3000/receipt/64687022590db95fa97a32ac967b24cb88bad958.pdf","url":"http://development.lvh.me:3000/api/receipts/204.json","processor":null,"processor_id":null,"custom_metadata":{}}'
89
93
  http_version: '1.1'
90
- recorded_at: Thu, 23 Jun 2016 11:28:21 GMT
94
+ recorded_at: Mon, 12 Jun 2017 11:49:55 GMT
91
95
  - request:
92
96
  method: put
93
- uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/receipts/1072.json
97
+ uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/receipts/204.json
94
98
  body:
95
99
  encoding: UTF-8
96
- string: notes=Show%20me%20the%20moneeeeeeeyy!!!!
100
+ string: '{"notes":"Show me the moneeeeeeeyy!!!!"}'
97
101
  headers:
98
102
  accept:
99
103
  - application/json
104
+ content-type:
105
+ - application/json
100
106
  authorization:
101
107
  - Basic c2tfdGVzdF9CN3hYclRzcGZlR3VrUXFHTjFwSzo=
102
108
  response:
@@ -109,33 +115,33 @@ http_interactions:
109
115
  x-ratelimit-limit:
110
116
  - '2000'
111
117
  x-ratelimit-reset:
112
- - '3'
118
+ - '7'
113
119
  x-ratelimit-remaining:
114
- - '91'
120
+ - '96'
115
121
  content-type:
116
122
  - application/json; charset=utf-8
117
123
  etag:
118
- - '"7f8dc9cee20404c7cd8cd3b3f68615b9"'
124
+ - '"4d11c125cf46e28ca6ed2994d9665b32"'
119
125
  cache-control:
120
126
  - max-age=0, private, must-revalidate
121
127
  x-request-id:
122
- - 367a989c-946d-4d5f-8c09-166b7e68261c
128
+ - ec358ced-cca9-4a6a-9bf9-aa7c25050997
123
129
  x-runtime:
124
- - '0.804763'
130
+ - '3.640285'
125
131
  connection:
126
132
  - close
127
133
  server:
128
134
  - thin
129
135
  body:
130
136
  encoding: UTF-8
131
- string: '{"id":1072,"number":"0000006","issue_date":"2016-06-23","created_at":1466681297,"contact":{"id":91,"full_name":"Test
132
- customer"},"street_line_1":null,"street_line_2":null,"city":null,"region":null,"postal_code":null,"po_number":null,"currency":"EUR","exchange_rate":"1.9558","items":[{"id":3091,"description":"Aircraft","quantity":"1.0","unit_price_cents":"0.0","discount_rate":"0.0","tax_1_name":null,"tax_1_rate":null,"tax_2_name":null,"tax_2_rate":null,"reference":null,"subtotal_cents":"0.0","discount_cents":"0.0","gross_amount_cents":"0.0"}],"subtotal_cents":"0.0","discount_cents":"0.0","taxes":[],"payments":[{"id":35,"date":"2016-06-23","payment_method":"cash","amount_cents":0}],"notes":"Show
133
- me the moneeeeeeeyy!!!!","state":"paid","tag_list":[],"secure_id":"fb58b3334e527c7dd485fb9aa9e19804e6856c7a","permalink":"http://development.lvh.me:3000/receipt/fb58b3334e527c7dd485fb9aa9e19804e6856c7a","pdf":"http://development.lvh.me:3000/receipt/fb58b3334e527c7dd485fb9aa9e19804e6856c7a.pdf","url":"http://development.lvh.me:3000/api/receipts/1072.json","processor":null,"processor_id":null}'
137
+ string: '{"id":204,"blocked":false,"number":"0003","issue_date":"2017-06-12","created_at":1497268191,"contact":{"id":54,"full_name":"Test
138
+ customer"},"country":"ES","street_line_1":null,"street_line_2":null,"city":null,"region":null,"postal_code":null,"po_number":null,"currency":"EUR","subject":null,"items":[{"id":205,"description":"Aircraft","quantity":"1.0","unit_price_cents":"0.0","discount_rate":"0.0","tax_1_name":null,"tax_1_rate":null,"tax_2_name":null,"tax_2_rate":null,"reference":null,"subtotal_cents":"0.0","discount_cents":"0.0","gross_amount_cents":"0.0"}],"subtotal_cents":"0.0","discount_cents":"0.0","taxes":[],"payments":[{"id":54,"date":"2017-06-12","payment_method":"cash","amount_cents":0}],"notes":"Show
139
+ me the moneeeeeeeyy!!!!","state":"paid","tag_list":[],"secure_id":"64687022590db95fa97a32ac967b24cb88bad958","permalink":"http://development.lvh.me:3000/receipt/64687022590db95fa97a32ac967b24cb88bad958","pdf":"http://development.lvh.me:3000/receipt/64687022590db95fa97a32ac967b24cb88bad958.pdf","url":"http://development.lvh.me:3000/api/receipts/204.json","processor":null,"processor_id":null,"custom_metadata":{}}'
134
140
  http_version: '1.1'
135
- recorded_at: Thu, 23 Jun 2016 11:28:22 GMT
141
+ recorded_at: Mon, 12 Jun 2017 11:49:59 GMT
136
142
  - request:
137
143
  method: delete
138
- uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/receipts/1072.json
144
+ uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/receipts/204.json
139
145
  body:
140
146
  encoding: US-ASCII
141
147
  string: ''
@@ -154,15 +160,15 @@ http_interactions:
154
160
  x-ratelimit-limit:
155
161
  - '2000'
156
162
  x-ratelimit-reset:
157
- - '2'
163
+ - '3'
158
164
  x-ratelimit-remaining:
159
- - '90'
165
+ - '95'
160
166
  cache-control:
161
167
  - no-cache
162
168
  x-request-id:
163
- - 9208eb39-1b9b-44dc-902e-530484a41e50
169
+ - eef2ba83-87a9-45b8-9493-f0606805b64c
164
170
  x-runtime:
165
- - '0.597983'
171
+ - '2.957383'
166
172
  connection:
167
173
  - close
168
174
  server:
@@ -171,10 +177,10 @@ http_interactions:
171
177
  encoding: US-ASCII
172
178
  string: ''
173
179
  http_version: '1.1'
174
- recorded_at: Thu, 23 Jun 2016 11:28:23 GMT
180
+ recorded_at: Mon, 12 Jun 2017 11:50:02 GMT
175
181
  - request:
176
182
  method: delete
177
- uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/contacts/91.json
183
+ uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/contacts/54.json
178
184
  body:
179
185
  encoding: US-ASCII
180
186
  string: ''
@@ -193,15 +199,15 @@ http_interactions:
193
199
  x-ratelimit-limit:
194
200
  - '2000'
195
201
  x-ratelimit-reset:
196
- - '2'
202
+ - '1'
197
203
  x-ratelimit-remaining:
198
- - '89'
204
+ - '94'
199
205
  cache-control:
200
206
  - no-cache
201
207
  x-request-id:
202
- - c3a29402-d140-448a-be42-e4b0ad2f008f
208
+ - cab0ead8-c00f-4179-81e7-5816ef7c81b5
203
209
  x-runtime:
204
- - '0.421027'
210
+ - '1.099096'
205
211
  connection:
206
212
  - close
207
213
  server:
@@ -210,5 +216,5 @@ http_interactions:
210
216
  encoding: US-ASCII
211
217
  string: ''
212
218
  http_version: '1.1'
213
- recorded_at: Thu, 23 Jun 2016 11:28:23 GMT
219
+ recorded_at: Mon, 12 Jun 2017 11:50:03 GMT
214
220
  recorded_with: VCR 2.9.2
@@ -5,10 +5,12 @@ http_interactions:
5
5
  uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/webhooks.json
6
6
  body:
7
7
  encoding: UTF-8
8
- string: url=http%3A%2F%2Fquadernoapp.com&events_types[]=invoice.created&events_types[]=expense.updated
8
+ string: '{"url":"http://quadernoapp.com","events_types":["invoice.created","expense.updated"]}'
9
9
  headers:
10
10
  accept:
11
11
  - application/json
12
+ content-type:
13
+ - application/json
12
14
  authorization:
13
15
  - Basic c2tfdGVzdF9CN3hYclRzcGZlR3VrUXFHTjFwSzo=
14
16
  response:
@@ -21,31 +23,31 @@ http_interactions:
21
23
  x-ratelimit-limit:
22
24
  - '2000'
23
25
  x-ratelimit-reset:
24
- - '13'
26
+ - '7'
25
27
  x-ratelimit-remaining:
26
- - '97'
28
+ - '93'
27
29
  content-type:
28
30
  - application/json; charset=utf-8
29
31
  etag:
30
- - '"6b237dc215b1a3130a0d968ff98ec5fb"'
32
+ - '"50272ad49799cb72cebe932d58808877"'
31
33
  cache-control:
32
34
  - max-age=0, private, must-revalidate
33
35
  x-request-id:
34
- - f6e6998d-d2c0-4251-8409-0c88e15b136c
36
+ - c057b4fb-bdd8-49a4-8fd6-ef2e6eceb20f
35
37
  x-runtime:
36
- - '15.033065'
38
+ - '1.872855'
37
39
  connection:
38
40
  - close
39
41
  server:
40
42
  - thin
41
43
  body:
42
44
  encoding: UTF-8
43
- string: '{"id":35,"url":"http://quadernoapp.com","auth_key":"qKa3Ok0WZgvldD5FjRpb0A","events_types":["invoice.created","expense.updated"],"last_sent_at":null,"last_error":null,"events_sent":0,"created_at":"2016-06-23T11:29:54.649Z","updated_at":"2016-06-23T11:29:54.649Z"}'
45
+ string: '{"id":8,"url":"http://quadernoapp.com","auth_key":"JL-KguI89KWWPQfx-j_jVQ","events_types":["invoice.created","expense.updated"],"last_sent_at":null,"last_error":null,"events_sent":0,"created_at":"2017-06-12T11:54:33.493Z","updated_at":"2017-06-12T11:54:33.493Z"}'
44
46
  http_version: '1.1'
45
- recorded_at: Thu, 23 Jun 2016 11:29:54 GMT
47
+ recorded_at: Mon, 12 Jun 2017 11:54:33 GMT
46
48
  - request:
47
49
  method: get
48
- uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/webhooks.json
50
+ uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/webhooks.json?
49
51
  body:
50
52
  encoding: US-ASCII
51
53
  string: ''
@@ -64,37 +66,39 @@ http_interactions:
64
66
  x-ratelimit-limit:
65
67
  - '2000'
66
68
  x-ratelimit-reset:
67
- - '15'
69
+ - '5'
68
70
  x-ratelimit-remaining:
69
- - '100'
71
+ - '92'
70
72
  content-type:
71
73
  - application/json; charset=utf-8
72
74
  etag:
73
- - '"8b9ae2f8d987168201324f5263607c2f"'
75
+ - '"5096b6af7b77b2a57d706dd1434b3970"'
74
76
  cache-control:
75
77
  - max-age=0, private, must-revalidate
76
78
  x-request-id:
77
- - 0bcd7271-9436-4d6e-8d22-37f0f5a705e6
79
+ - 81b27380-7fc2-42dd-b974-e2c93f9d2315
78
80
  x-runtime:
79
- - '0.528242'
81
+ - '0.645302'
80
82
  connection:
81
83
  - close
82
84
  server:
83
85
  - thin
84
86
  body:
85
87
  encoding: UTF-8
86
- string: '[{"id":35,"url":"http://quadernoapp.com","auth_key":"qKa3Ok0WZgvldD5FjRpb0A","events_types":["invoice.created","expense.updated"],"last_sent_at":null,"last_error":null,"events_sent":0,"created_at":"2016-06-23T11:29:54.000Z","updated_at":"2016-06-23T11:29:54.000Z"}]'
88
+ string: '[{"id":1,"url":"http://quadernoapp.com","auth_key":"Ze024XpO9CJ6Fy2frwWV4Q","events_types":["invoice.created","expense.updated"],"last_sent_at":null,"last_error":null,"events_sent":0,"created_at":"2017-06-12T11:53:54.000Z","updated_at":"2017-06-12T11:53:54.000Z"},{"id":8,"url":"http://quadernoapp.com","auth_key":"JL-KguI89KWWPQfx-j_jVQ","events_types":["invoice.created","expense.updated"],"last_sent_at":null,"last_error":null,"events_sent":0,"created_at":"2017-06-12T11:54:33.000Z","updated_at":"2017-06-12T11:54:33.000Z"}]'
87
89
  http_version: '1.1'
88
- recorded_at: Thu, 23 Jun 2016 11:29:55 GMT
90
+ recorded_at: Mon, 12 Jun 2017 11:54:34 GMT
89
91
  - request:
90
92
  method: put
91
- uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/webhooks/35.json
93
+ uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/webhooks/8.json
92
94
  body:
93
95
  encoding: UTF-8
94
- string: events_types[]=invoice.created&events_types[]=invoice.updated&events_types[]=contact.deleted
96
+ string: '{"events_types":["invoice.created","invoice.updated","contact.deleted"]}'
95
97
  headers:
96
98
  accept:
97
99
  - application/json
100
+ content-type:
101
+ - application/json
98
102
  authorization:
99
103
  - Basic c2tfdGVzdF9CN3hYclRzcGZlR3VrUXFHTjFwSzo=
100
104
  response:
@@ -107,31 +111,31 @@ http_interactions:
107
111
  x-ratelimit-limit:
108
112
  - '2000'
109
113
  x-ratelimit-reset:
110
- - '15'
114
+ - '4'
111
115
  x-ratelimit-remaining:
112
- - '99'
116
+ - '91'
113
117
  content-type:
114
118
  - application/json; charset=utf-8
115
119
  etag:
116
- - '"a66bc2099cc6f3d83bb3ac760725fbf5"'
120
+ - '"926cdf82d9b90ab6c43e3b76c7cbb096"'
117
121
  cache-control:
118
122
  - max-age=0, private, must-revalidate
119
123
  x-request-id:
120
- - 3ddf7610-0bbc-4cad-bcc5-77be1e5995a2
124
+ - 4ac6d2cf-c1e5-48fc-81e8-20f745a84040
121
125
  x-runtime:
122
- - '10.841410'
126
+ - '1.871170'
123
127
  connection:
124
128
  - close
125
129
  server:
126
130
  - thin
127
131
  body:
128
132
  encoding: UTF-8
129
- string: '{"id":35,"url":"http://quadernoapp.com","auth_key":"qKa3Ok0WZgvldD5FjRpb0A","events_types":["invoice.created","invoice.updated","contact.deleted"],"last_sent_at":null,"last_error":null,"events_sent":0,"created_at":"2016-06-23T11:29:54.000Z","updated_at":"2016-06-23T11:30:06.066Z"}'
133
+ string: '{"id":8,"url":"http://quadernoapp.com","auth_key":"JL-KguI89KWWPQfx-j_jVQ","events_types":["invoice.created","invoice.updated","contact.deleted"],"last_sent_at":null,"last_error":null,"events_sent":0,"created_at":"2017-06-12T11:54:33.000Z","updated_at":"2017-06-12T11:54:36.369Z"}'
130
134
  http_version: '1.1'
131
- recorded_at: Thu, 23 Jun 2016 11:30:06 GMT
135
+ recorded_at: Mon, 12 Jun 2017 11:54:36 GMT
132
136
  - request:
133
137
  method: delete
134
- uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/webhooks/35.json
138
+ uri: http://sk_test_B7xXrTspfeGukQqGN1pK@development.lvh.me:3000/api/webhooks/8.json
135
139
  body:
136
140
  encoding: US-ASCII
137
141
  string: ''
@@ -150,15 +154,15 @@ http_interactions:
150
154
  x-ratelimit-limit:
151
155
  - '2000'
152
156
  x-ratelimit-reset:
153
- - '4'
157
+ - '2'
154
158
  x-ratelimit-remaining:
155
- - '98'
159
+ - '90'
156
160
  cache-control:
157
161
  - no-cache
158
162
  x-request-id:
159
- - 0b4c8dbe-a204-4b87-9aed-6226b4dcc4a9
163
+ - 70e6bc87-63f8-456a-a42f-3ac79d407e94
160
164
  x-runtime:
161
- - '0.358537'
165
+ - '0.936896'
162
166
  connection:
163
167
  - close
164
168
  server:
@@ -167,5 +171,5 @@ http_interactions:
167
171
  encoding: US-ASCII
168
172
  string: ''
169
173
  http_version: '1.1'
170
- recorded_at: Thu, 23 Jun 2016 11:30:06 GMT
174
+ recorded_at: Mon, 12 Jun 2017 11:54:37 GMT
171
175
  recorded_with: VCR 2.9.2
data/test/helper.rb CHANGED
@@ -14,7 +14,7 @@ end
14
14
 
15
15
  require 'vcr'
16
16
  require 'test/unit'
17
- require 'shoulda'
17
+ require 'shoulda-context'
18
18
  require 'quaderno-ruby'
19
19
 
20
20
  VCR.configure do |c|
@@ -25,6 +25,7 @@ end
25
25
 
26
26
  TEST_URL = 'http://development.lvh.me:3000/api/'
27
27
  TEST_KEY = 'sk_test_B7xXrTspfeGukQqGN1pK'
28
+ TEST_OAUTH_ACCESS_TOKEN = '36b82411e6686581fe3d7d10fbe931a3fdc9265a353832f0e3ff6269bd319e12'
28
29
  OLDEST_SUPPORTED_API_VERSION = 20160602
29
30
 
30
31
  class Test::Unit::TestCase
@@ -1,8 +1,8 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestQuadernoContact < Test::Unit::TestCase
4
- context 'A user with an authenticate token with contacts' do
5
4
 
5
+ context 'using the default configuration with an authentication token' do
6
6
  setup do
7
7
  Quaderno::Base.configure do |config|
8
8
  config.auth_token = TEST_KEY
@@ -0,0 +1,104 @@
1
+ require 'helper'
2
+
3
+ class TestQuadernoContactThreadSafe < Test::Unit::TestCase
4
+ context 'using the thread-safe configuration' do
5
+ context 'with an authentication token' do
6
+ should 'get all contacts (populated db)' do
7
+ VCR.use_cassette('all contacts by authentication token') do
8
+ puts Quaderno::Base.url
9
+ contacts = Quaderno::Contact.all(api_url: TEST_URL, auth_token: TEST_KEY)
10
+ assert_not_nil contacts
11
+ assert_kind_of Array, contacts
12
+ contacts.each { |contact| assert_kind_of Quaderno::Contact, contact }
13
+ end
14
+ end
15
+
16
+ should 'find a contact' do
17
+ VCR.use_cassette('found contact by authentication token') do
18
+ contacts = Quaderno::Contact.all(api_url: TEST_URL, auth_token: TEST_KEY)
19
+ contact = Quaderno::Contact.find contacts[2].id, api_url: TEST_URL, auth_token: TEST_KEY
20
+ assert_kind_of Quaderno::Contact, contact
21
+ assert_equal contacts[2].id, contact.id
22
+ end
23
+ end
24
+
25
+ should 'create a contact' do
26
+ VCR.use_cassette('new contact by authentication token') do
27
+ contact = Quaderno::Contact.create(kind: 'company', first_name: 'Test_Skynet', email: 'my_little@po.ny', api_url: TEST_URL, auth_token: TEST_KEY)
28
+ assert_kind_of Quaderno::Contact, contact
29
+ assert_equal 'company', contact.kind
30
+ assert_equal 'Test_Skynet', contact.full_name
31
+ end
32
+ end
33
+
34
+ should 'update a contact' do
35
+ VCR.use_cassette('updated contact by authentication token') do
36
+ contacts = Quaderno::Contact.all(api_url: TEST_URL, auth_token: TEST_KEY)
37
+ contact = Quaderno::Contact.update(contacts[2].id, first_name: 'Test_OCP', email: 'dont@stop.believing', api_url: TEST_URL, auth_token: TEST_KEY)
38
+ assert_kind_of Quaderno::Contact, contact
39
+ assert_equal 'Test_OCP', contact.first_name || contact.full_name
40
+ end
41
+ end
42
+
43
+ should 'delete a contact' do
44
+ VCR.use_cassette('deleted contact by authentication token') do
45
+ new_contact = Quaderno::Contact.create(kind: 'company', first_name: 'Z, Mazinger Z', email: 'koji@kabuto.ftw', api_url: TEST_URL, auth_token: TEST_KEY)
46
+ contacts_before = Quaderno::Contact.all(api_url: TEST_URL, auth_token: TEST_KEY)
47
+ contact_id = contacts_before.last.id
48
+ Quaderno::Contact.delete contact_id, api_url: TEST_URL, auth_token: TEST_KEY
49
+ contacts_after = Quaderno::Contact.all(api_url: TEST_URL, auth_token: TEST_KEY)
50
+ assert_not_equal contacts_after.last.id, contact_id
51
+ end
52
+ end
53
+ end
54
+
55
+ context 'with an OAuth 2.0 access token' do
56
+ should 'get all contacts (populated db)' do
57
+ VCR.use_cassette('all contacts by access token') do
58
+ contacts = Quaderno::Contact.all(api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
59
+ assert_not_nil contacts
60
+ assert_kind_of Array, contacts
61
+ contacts.each { |contact| assert_kind_of Quaderno::Contact, contact }
62
+ end
63
+ end
64
+
65
+ should 'find a contact' do
66
+ VCR.use_cassette('found contact by access token') do
67
+ contacts = Quaderno::Contact.all(api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
68
+ contact = Quaderno::Contact.find contacts[2].id, api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN
69
+ assert_kind_of Quaderno::Contact, contact
70
+ assert_equal contacts[2].id, contact.id
71
+ end
72
+ end
73
+
74
+ should 'create a contact' do
75
+ VCR.use_cassette('new contact by access token') do
76
+ contact = Quaderno::Contact.create(kind: 'company', first_name: 'Test_Skynet', email: 'my_little@po.ny', api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
77
+ assert_kind_of Quaderno::Contact, contact
78
+ assert_equal 'company', contact.kind
79
+ assert_equal 'Test_Skynet', contact.full_name
80
+ end
81
+ end
82
+
83
+ should 'update a contact' do
84
+ VCR.use_cassette('updated contact by access token') do
85
+ contacts = Quaderno::Contact.all(api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
86
+ contact = Quaderno::Contact.update(contacts[2].id, first_name: 'Test_OCP', email: 'dont@stop.believing', api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
87
+ assert_kind_of Quaderno::Contact, contact
88
+ assert_equal 'Test_OCP', contact.first_name || contact.full_name
89
+ end
90
+ end
91
+
92
+ should 'delete a contact' do
93
+ VCR.use_cassette('deleted contact by access token') do
94
+ new_contact = Quaderno::Contact.create(kind: 'company', first_name: 'Z, Mazinger Z', email: 'koji@kabuto.ftw', api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
95
+ contacts_before = Quaderno::Contact.all(api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
96
+ contact_id = contacts_before.last.id
97
+ Quaderno::Contact.delete contact_id, api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN
98
+ contacts_after = Quaderno::Contact.all(api_url: TEST_URL, access_token: TEST_OAUTH_ACCESS_TOKEN)
99
+ assert_not_equal contacts_after.last.id, contact_id
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -69,8 +69,8 @@ class TestQuadernoExpense < Test::Unit::TestCase
69
69
 
70
70
  should 'update an expense' do
71
71
  VCR.use_cassette('updated expense') do
72
- contacts = Quaderno::Contact.all
73
- expense = Quaderno::Expense.create(contact_id: contacts.first.id ,
72
+ contacts = Quaderno::Contact.all
73
+ expense = Quaderno::Expense.create(contact_id: contacts.first.id ,
74
74
  contact_name: contacts.first.full_name,
75
75
  currency: 'EUR',
76
76
  items_attributes: [
@@ -82,9 +82,9 @@ class TestQuadernoExpense < Test::Unit::TestCase
82
82
  ],
83
83
  tags: 'tnt', payment_details: '',
84
84
  notes: '')
85
- expense = Quaderno::Expense.update(expense.id, currency: 'USD')
85
+ expense = Quaderno::Expense.update(expense.id, po_number: 'Updated expense!')
86
86
  assert_kind_of Quaderno::Expense, expense
87
- assert_equal 'USD', expense.currency
87
+ assert_equal 'Updated expense!', expense.po_number
88
88
  Quaderno::Expense.delete(expense.id)
89
89
  end
90
90
  end
@@ -127,7 +127,7 @@ class TestQuadernoExpense < Test::Unit::TestCase
127
127
  expenses.first.add_payment(payment_method: "cash", amount: "10000")
128
128
  payment = expenses.first.payments.last
129
129
  array_length = expenses.first.payments.length
130
- expenses.first.remove_payment(payment.id) unless payment.nil?
130
+ expenses.first.remove_payment(payment.id)
131
131
  assert_equal (array_length.zero? ? array_length : array_length-1), expenses.first.payments.length
132
132
  end
133
133
  end