quaderno 1.13.2 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +56 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +2 -15
  6. data/README.md +120 -42
  7. data/Rakefile +4 -50
  8. data/changelog.md +67 -41
  9. data/lib/quaderno-ruby.rb +5 -5
  10. data/lib/quaderno-ruby/base.rb +112 -107
  11. data/lib/quaderno-ruby/behavior/block.rb +20 -19
  12. data/lib/quaderno-ruby/behavior/crud.rb +108 -95
  13. data/lib/quaderno-ruby/behavior/deliver.rb +20 -18
  14. data/lib/quaderno-ruby/behavior/payment.rb +38 -34
  15. data/lib/quaderno-ruby/behavior/retrieve.rb +26 -25
  16. data/lib/quaderno-ruby/checkout_session.rb +4 -0
  17. data/lib/quaderno-ruby/collection.rb +1 -0
  18. data/lib/quaderno-ruby/contact.rb +6 -8
  19. data/lib/quaderno-ruby/credit.rb +10 -12
  20. data/lib/quaderno-ruby/document_item.rb +1 -3
  21. data/lib/quaderno-ruby/estimate.rb +5 -7
  22. data/lib/quaderno-ruby/evidence.rb +5 -7
  23. data/lib/quaderno-ruby/exceptions/exceptions.rb +50 -44
  24. data/lib/quaderno-ruby/expense.rb +6 -8
  25. data/lib/quaderno-ruby/helpers/authentication.rb +16 -18
  26. data/lib/quaderno-ruby/helpers/rate_limit.rb +12 -0
  27. data/lib/quaderno-ruby/income.rb +8 -10
  28. data/lib/quaderno-ruby/invoice.rb +9 -11
  29. data/lib/quaderno-ruby/item.rb +3 -6
  30. data/lib/quaderno-ruby/payment.rb +2 -3
  31. data/lib/quaderno-ruby/receipt.rb +6 -8
  32. data/lib/quaderno-ruby/recurring.rb +4 -7
  33. data/lib/quaderno-ruby/report.rb +67 -29
  34. data/lib/quaderno-ruby/tax.rb +51 -46
  35. data/lib/quaderno-ruby/version.rb +3 -0
  36. data/lib/quaderno-ruby/webhook.rb +3 -5
  37. data/quaderno.gemspec +28 -148
  38. metadata +92 -92
  39. data/Gemfile.lock +0 -91
  40. data/VERSION +0 -1
  41. data/test/fixtures/quaderno_cassettes/.DS_Store +0 -0
  42. data/test/fixtures/quaderno_cassettes/all_contacts.yml +0 -52
  43. data/test/fixtures/quaderno_cassettes/all_contacts_by_access_token.yml +0 -56
  44. data/test/fixtures/quaderno_cassettes/all_contacts_by_authentication_token.yml +0 -57
  45. data/test/fixtures/quaderno_cassettes/all_estimates.yml +0 -52
  46. data/test/fixtures/quaderno_cassettes/all_expenses.yml +0 -55
  47. data/test/fixtures/quaderno_cassettes/all_invoices.yml +0 -56
  48. data/test/fixtures/quaderno_cassettes/all_items.yml +0 -46
  49. data/test/fixtures/quaderno_cassettes/all_receipts.yml +0 -53
  50. data/test/fixtures/quaderno_cassettes/all_webhooks.yml +0 -214
  51. data/test/fixtures/quaderno_cassettes/create_estimate_on_downgraded_API.yml +0 -156
  52. data/test/fixtures/quaderno_cassettes/create_expense_on_downgraded_API.yml +0 -278
  53. data/test/fixtures/quaderno_cassettes/create_invoice_on_downgraded_API.yml +0 -159
  54. data/test/fixtures/quaderno_cassettes/create_receipt_on_downgraded_API.yml +0 -196
  55. data/test/fixtures/quaderno_cassettes/deleted_contact.yml +0 -187
  56. data/test/fixtures/quaderno_cassettes/deleted_contact_by_access_token.yml +0 -199
  57. data/test/fixtures/quaderno_cassettes/deleted_contact_by_authentication_token.yml +0 -199
  58. data/test/fixtures/quaderno_cassettes/deleted_estimate.yml +0 -187
  59. data/test/fixtures/quaderno_cassettes/deleted_expense.yml +0 -189
  60. data/test/fixtures/quaderno_cassettes/deleted_invoice.yml +0 -190
  61. data/test/fixtures/quaderno_cassettes/deleted_item.yml +0 -128
  62. data/test/fixtures/quaderno_cassettes/deleted_receipt.yml +0 -223
  63. data/test/fixtures/quaderno_cassettes/deleted_webhook.yml +0 -257
  64. data/test/fixtures/quaderno_cassettes/delivered_estimate.yml +0 -136
  65. data/test/fixtures/quaderno_cassettes/delivered_invoice.yml +0 -143
  66. data/test/fixtures/quaderno_cassettes/delivered_receipt.yml +0 -140
  67. data/test/fixtures/quaderno_cassettes/evidence_invoice.yml +0 -98
  68. data/test/fixtures/quaderno_cassettes/found_contact.yml +0 -95
  69. data/test/fixtures/quaderno_cassettes/found_contact_by_access_token.yml +0 -99
  70. data/test/fixtures/quaderno_cassettes/found_contact_by_authentication_token.yml +0 -100
  71. data/test/fixtures/quaderno_cassettes/found_estimate.yml +0 -97
  72. data/test/fixtures/quaderno_cassettes/found_expense.yml +0 -99
  73. data/test/fixtures/quaderno_cassettes/found_invoice.yml +0 -100
  74. data/test/fixtures/quaderno_cassettes/found_item.yml +0 -91
  75. data/test/fixtures/quaderno_cassettes/found_receipt.yml +0 -98
  76. data/test/fixtures/quaderno_cassettes/found_webhook.yml +0 -130
  77. data/test/fixtures/quaderno_cassettes/new_contact.yml +0 -48
  78. data/test/fixtures/quaderno_cassettes/new_contact_by_access_token.yml +0 -48
  79. data/test/fixtures/quaderno_cassettes/new_contact_by_authentication_token.yml +0 -48
  80. data/test/fixtures/quaderno_cassettes/new_estimate.yml +0 -137
  81. data/test/fixtures/quaderno_cassettes/new_evidence.yml +0 -48
  82. data/test/fixtures/quaderno_cassettes/new_expense.yml +0 -189
  83. data/test/fixtures/quaderno_cassettes/new_invoice.yml +0 -137
  84. data/test/fixtures/quaderno_cassettes/new_item.yml +0 -48
  85. data/test/fixtures/quaderno_cassettes/new_receipt.yml +0 -173
  86. data/test/fixtures/quaderno_cassettes/new_webhook.yml +0 -87
  87. data/test/fixtures/quaderno_cassettes/paid_expense.yml +0 -98
  88. data/test/fixtures/quaderno_cassettes/paid_invoice.yml +0 -99
  89. data/test/fixtures/quaderno_cassettes/rate_limit.yml +0 -46
  90. data/test/fixtures/quaderno_cassettes/unpay_an_expense.yml +0 -138
  91. data/test/fixtures/quaderno_cassettes/unpay_an_invoice.yml +0 -138
  92. data/test/fixtures/quaderno_cassettes/updated_contact.yml +0 -97
  93. data/test/fixtures/quaderno_cassettes/updated_contact_by_access_token.yml +0 -101
  94. data/test/fixtures/quaderno_cassettes/updated_contact_by_authentication_token.yml +0 -102
  95. data/test/fixtures/quaderno_cassettes/updated_estimate.yml +0 -185
  96. data/test/fixtures/quaderno_cassettes/updated_expense.yml +0 -184
  97. data/test/fixtures/quaderno_cassettes/updated_invoice.yml +0 -184
  98. data/test/fixtures/quaderno_cassettes/updated_item.yml +0 -93
  99. data/test/fixtures/quaderno_cassettes/updated_receipt.yml +0 -220
  100. data/test/fixtures/quaderno_cassettes/updated_webhook.yml +0 -175
  101. data/test/fixtures/quaderno_cassettes/validate_invalid_VAT_number.yml +0 -44
  102. data/test/fixtures/quaderno_cassettes/validate_valid_VAT_number.yml +0 -44
  103. data/test/helper.rb +0 -32
  104. data/test/unit/test_quaderno_contacts.rb +0 -83
  105. data/test/unit/test_quaderno_contacts_thread_safe.rb +0 -104
  106. data/test/unit/test_quaderno_estimates.rb +0 -155
  107. data/test/unit/test_quaderno_evidences.rb +0 -41
  108. data/test/unit/test_quaderno_expenses.rb +0 -162
  109. data/test/unit/test_quaderno_invoices.rb +0 -177
  110. data/test/unit/test_quaderno_items.rb +0 -84
  111. data/test/unit/test_quaderno_receipts.rb +0 -156
  112. data/test/unit/test_quaderno_tax.rb +0 -46
  113. data/test/unit/test_quaderno_webhooks.rb +0 -93
@@ -1,84 +0,0 @@
1
- require 'helper'
2
-
3
- class TestQuadernoItem < Test::Unit::TestCase
4
- context 'A user with an authenticate token with items' do
5
-
6
- setup do
7
- Quaderno::Base.configure do |config|
8
- config.auth_token = TEST_KEY
9
- config.url = TEST_URL
10
- config.api_version = nil
11
- end
12
- end
13
-
14
- should 'get exception if pass wrong arguments' do
15
- assert_raise ArgumentError do
16
- VCR.use_cassette('all items') do
17
- Quaderno::Item.all 1, 2, 3
18
- end
19
- end
20
- assert_raise ArgumentError do
21
- VCR.use_cassette('found item') do
22
- Quaderno::Item.find
23
- end
24
- end
25
- end
26
-
27
- should 'get all items (populated db)' do
28
- VCR.use_cassette('all items') do
29
- items = Quaderno::Item.all
30
- assert_not_nil items
31
- assert_kind_of Array, items
32
- items.each do |item|
33
- assert_kind_of Quaderno::Item, item
34
- end
35
- end
36
- end
37
-
38
- should 'find an item' do
39
- VCR.use_cassette('found item') do
40
- new_item = Quaderno::Item.create(code: Time.now.to_i.to_s, name: 'Test_Skynet', unit_cost: 21.00)
41
- item = Quaderno::Item.find new_item.id
42
-
43
- assert_kind_of Quaderno::Item, item
44
- assert_equal new_item.id, item.id
45
- end
46
- end
47
-
48
- should 'create an item' do
49
- VCR.use_cassette('new item') do
50
- item = Quaderno::Item.create(code: '000000', name: 'Test_Skynet', unit_cost: 21.00)
51
- assert_kind_of Quaderno::Item, item
52
- assert_equal '000000', item.code
53
- assert_equal 'Test_Skynet', item.name
54
- end
55
- end
56
-
57
- should 'update an item' do
58
- VCR.use_cassette('updated item') do
59
- new_item = Quaderno::Item.create(code: Time.now.to_i.to_s, name: 'Test_Skynet', unit_cost: 21.00)
60
- item = Quaderno::Item.update(new_item.id, name: 'Test_OCP')
61
-
62
- assert_kind_of Quaderno::Item, item
63
- assert_equal 'Test_OCP', item.name
64
- end
65
- end
66
-
67
- should 'delete a item' do
68
- VCR.use_cassette('deleted item') do
69
- items_before = Quaderno::Item.all
70
- item_id = items_before.last.id
71
- Quaderno::Item.delete item_id
72
- items_after = Quaderno::Item.all
73
- assert_equal (items_before.length - items_after.length), 1
74
- end
75
- end
76
-
77
- should 'know the rate limit' do
78
- VCR.use_cassette('rate limit') do
79
- rate_limit_info = Quaderno::Base.rate_limit_info
80
- assert_operator rate_limit_info[:remaining], :< ,2000
81
- end
82
- end
83
- end
84
- end
@@ -1,156 +0,0 @@
1
- require 'helper'
2
-
3
- class TestQuadernoReceipt < Test::Unit::TestCase
4
- context 'A user with an authenticate token with receipts' do
5
-
6
- setup do
7
- Quaderno::Base.configure do |config|
8
- config.auth_token = TEST_KEY
9
- config.url = TEST_URL
10
- config.api_version = nil
11
- end
12
- end
13
-
14
- should 'get exception if pass wrong arguments' do
15
- assert_raise ArgumentError do
16
- VCR.use_cassette('all receipts') do
17
- Quaderno::Receipt.all 1, 2, 3
18
- end
19
- end
20
- assert_raise ArgumentError do
21
- VCR.use_cassette('found receipt') do
22
- Quaderno::Receipt.find
23
- end
24
- end
25
- end
26
-
27
- should 'get all receipts (populated db)' do
28
- VCR.use_cassette('all receipts') do
29
- receipts = Quaderno::Receipt.all
30
- assert_not_nil receipts
31
- assert_kind_of Array, receipts
32
- receipts.each do |receipt|
33
- assert_kind_of Quaderno::Receipt, receipt
34
- end
35
- end
36
- end
37
-
38
- should 'find a receipt' do
39
- VCR.use_cassette('found receipt') do
40
- receipts = Quaderno::Receipt.all
41
- receipt = Quaderno::Receipt.find receipts.first.id
42
- assert_kind_of Quaderno::Receipt, receipt
43
- assert_equal receipts.first.id, receipt.id
44
- end
45
- end
46
-
47
- should 'create a receipt' do
48
- VCR.use_cassette('new receipt') do
49
- contact = Quaderno::Contact.create(first_name: 'Test customer')
50
- receipt = Quaderno::Receipt.create(contact_id: contact.id ,
51
- currency: 'EUR',
52
- items_attributes: [
53
- {
54
- description: 'Aircraft',
55
- quantity: '1.0',
56
- unit_price: '0.0'
57
- }
58
- ],
59
- tags: 'tnt',
60
- payment_method: :cash,
61
- notes: '')
62
- assert_kind_of Quaderno::Receipt, receipt
63
- assert_equal contact.id, receipt.contact.id
64
- assert_equal 'Aircraft', receipt.items[0].description
65
- Quaderno::Receipt.delete(receipt.id)
66
- Quaderno::Contact.delete(contact.id)
67
- end
68
- end
69
-
70
- should 'update an receipt' do
71
- VCR.use_cassette('updated receipt') do
72
- contact = Quaderno::Contact.create(first_name: 'Test customer')
73
- receipt = Quaderno::Receipt.create(contact_id: contact.id ,
74
- currency: 'EUR',
75
- items_attributes: [
76
- {
77
- description: 'Aircraft',
78
- quantity: '1.0',
79
- unit_price: '0.0'
80
- }
81
- ],
82
- tags: 'tnt',
83
- payment_method: :cash,
84
- notes: '')
85
- receipt = Quaderno::Receipt.update(receipt.id, notes: 'Show me the moneeeeeeeyy!!!!')
86
- assert_kind_of Quaderno::Receipt, receipt
87
- assert_equal 'Show me the moneeeeeeeyy!!!!', receipt.notes
88
- Quaderno::Receipt.delete(receipt.id)
89
- Quaderno::Contact.delete(contact.id)
90
- end
91
- end
92
-
93
- should 'delete an receipt' do
94
- VCR.use_cassette('deleted receipt') do
95
- contact = Quaderno::Contact.create(first_name: 'Test customer')
96
- receipt = Quaderno::Receipt.create(contact_id: contact.id ,
97
- currency: 'EUR',
98
- items_attributes: [
99
- {
100
- description: 'Aircraft',
101
- quantity: '1.0',
102
- unit_price: '0.0'
103
- }
104
- ],
105
- tags: 'tnt',
106
- payment_method: :cash,
107
- notes: '')
108
- Quaderno::Receipt.delete receipt.id
109
- Quaderno::Contact.delete(contact.id)
110
-
111
- receipts = Quaderno::Receipt.all
112
- assert_not_equal receipts.first.id, receipt.id
113
- end
114
- end
115
-
116
- should 'deliver an receipt' do
117
- VCR.use_cassette('delivered receipt') do
118
- receipts = Quaderno::Receipt.all
119
- rate_limit_before = Quaderno::Base.rate_limit_info
120
- begin
121
- rate_limit_after = receipts.first.deliver
122
- rescue Quaderno::Exceptions::RequiredFieldsEmptyOrInvalid
123
- rate_limit_after = { remaining: (rate_limit_before[:remaining] - 1) }
124
- end
125
- assert_equal rate_limit_before[:remaining]-1, rate_limit_after[:remaining]
126
- end
127
- end
128
-
129
- should 'override version' do
130
- Quaderno::Base.api_version = OLDEST_SUPPORTED_API_VERSION
131
-
132
- VCR.use_cassette('create receipt on downgraded API') do
133
- contact = Quaderno::Contact.create(first_name: 'Test customer')
134
- receipt = Quaderno::Receipt.create(contact_id: contact.id ,
135
- currency: 'EUR',
136
- items_attributes: [
137
- {
138
- description: 'Aircraft',
139
- quantity: '1.0',
140
- unit_price: '0.0'
141
- }
142
- ],
143
- tags: 'tnt',
144
- payment_method: :cash,
145
- notes: '')
146
- assert receipt.total_cents.nil?
147
- assert !receipt.total.nil?
148
- assert_kind_of Quaderno::Receipt, receipt
149
- assert_equal contact.id, receipt.contact.id
150
- assert_equal 'Aircraft', receipt.items[0].description
151
- Quaderno::Receipt.delete(receipt.id)
152
- Quaderno::Contact.delete(contact.id)
153
- end
154
- end
155
- end
156
- end
@@ -1,46 +0,0 @@
1
- require 'helper'
2
-
3
- class TestQuadernoTax < Test::Unit::TestCase
4
- context 'A user with an authenticate token with webhooks' do
5
-
6
- setup do
7
- Quaderno::Base.configure do |config|
8
- config.auth_token = TEST_KEY
9
- config.url = TEST_URL
10
- config.api_version = nil
11
- end
12
- end
13
-
14
- should 'raise exception if pass wrong arguments' do
15
- assert_raise ArgumentError do
16
- Quaderno::Tax.calculate 1, 2, 3
17
- end
18
- end
19
-
20
- should 'raise exception if token is wrong' do
21
- VCR.use_cassette('wrong token') do
22
- assert_raise Quaderno::Exceptions::InvalidSubdomainOrToken do
23
- Quaderno::Base.auth_token = '7h15154f4k370k3n'
24
- Quaderno::Tax.calculate(country: 'ES', postal_code: '08080')
25
- end
26
- end
27
- end
28
-
29
- should 'calculate tax' do
30
- VCR.use_cassette('validate valid VAT number') do
31
- vat_number_valid = Quaderno::Tax.validate_vat_number('IE', 'IE6388047V')
32
- assert vat_number_valid
33
- end
34
-
35
- VCR.use_cassette('validate invalid VAT number') do
36
- vat_number_valid = Quaderno::Tax.validate_vat_number('IE', 'IE6388047X')
37
- assert !vat_number_valid
38
- end
39
- end
40
-
41
- should 'validate VAT number' do
42
- VCR.use_cassette('calculate tax') do
43
- end
44
- end
45
- end
46
- end
@@ -1,93 +0,0 @@
1
- require 'helper'
2
-
3
- class TestQuadernoWebhook < Test::Unit::TestCase
4
- context 'A user with an authenticate token with webhooks' do
5
-
6
- setup do
7
- Quaderno::Base.configure do |config|
8
- config.auth_token = TEST_KEY
9
- config.url = TEST_URL
10
- config.api_version = nil
11
- end
12
- end
13
-
14
- should 'get exception if pass wrong arguments' do
15
- assert_raise ArgumentError do
16
- VCR.use_cassette('all webhooks') do
17
- Quaderno::Webhook.all 1, 2, 3
18
- end
19
- end
20
- assert_raise ArgumentError do
21
- VCR.use_cassette('found webhook') do
22
- Quaderno::Webhook.find
23
- end
24
- end
25
- end
26
-
27
- should 'get all webhooks (populated db)' do
28
- VCR.use_cassette('all webhooks') do
29
- webhook_1 = Quaderno::Webhook.create(url: 'http://google.com', events_types: ['invoice.created', 'invoice.updated'])
30
- webhook_2 = Quaderno::Webhook.create(url: 'http://quadernoapp.com', events_types: ['expense.created', 'expense.updated', 'contact.deleted'])
31
- webhooks = Quaderno::Webhook.all
32
- assert_not_nil webhooks
33
- assert_kind_of Array, webhooks
34
- webhooks.each do |webhook|
35
- assert_kind_of Quaderno::Webhook, webhook
36
- end
37
- Quaderno::Webhook.delete webhook_1.id
38
- Quaderno::Webhook.delete webhook_2.id
39
- end
40
- end
41
-
42
- should 'find a webhook' do
43
- VCR.use_cassette('found webhook') do
44
- webhook = Quaderno::Webhook.create(url: 'http://quadernoapp.com', events_types: ['invoice.created', 'expense.updated'])
45
- webhooks = Quaderno::Webhook.all
46
- assert_kind_of Quaderno::Webhook, webhook
47
- assert_equal webhooks.last.id, webhook.id
48
- Quaderno::Webhook.delete webhook.id
49
- end
50
- end
51
-
52
- should 'create a webhook' do
53
- VCR.use_cassette('new webhook') do
54
- webhook = Quaderno::Webhook.create(url: 'http://quadernoapp.com', events_types: ['invoice.created', 'expense.updated'])
55
- assert_kind_of Quaderno::Webhook, webhook
56
- assert_equal 'http://quadernoapp.com', webhook.url
57
- assert_equal ['invoice.created', 'expense.updated'], webhook.events_types
58
- Quaderno::Webhook.delete webhook.id
59
- end
60
- end
61
-
62
- should 'update a webhook' do
63
- VCR.use_cassette('updated webhook') do
64
- Quaderno::Webhook.create(url: 'http://quadernoapp.com', events_types: ['invoice.created', 'expense.updated'])
65
- webhooks = Quaderno::Webhook.all
66
- webhook = Quaderno::Webhook.update(webhooks.last.id, events_types: ['invoice.created', 'invoice.updated', 'contact.deleted'])
67
- assert_kind_of Quaderno::Webhook, webhook
68
- assert_equal ['invoice.created', 'invoice.updated', 'contact.deleted'], webhook.events_types
69
- Quaderno::Webhook.delete webhook.id
70
- end
71
- end
72
-
73
- should 'delete a webhook' do
74
- VCR.use_cassette('deleted webhook') do
75
- webhook_1 = Quaderno::Webhook.create(url: 'http://google.com', events_types: ['invoice.created', 'expense.updated'])
76
- webhook_2 = Quaderno::Webhook.create(url: 'http://quadernoapp.com', events_types: ['invoice.created', 'expense.updated'])
77
- webhooks_before = Quaderno::Webhook.all
78
- webhook_id = webhooks_before.last.id
79
- Quaderno::Webhook.delete webhook_id
80
- webhooks_after = Quaderno::Webhook.all
81
- assert_not_equal webhooks_after.last.id, webhook_id
82
- Quaderno::Webhook.delete webhooks_after.last.id
83
- end
84
- end
85
-
86
- should 'know the rate limit' do
87
- VCR.use_cassette('rate limit') do
88
- rate_limit_info = Quaderno::Base.rate_limit_info
89
- assert_operator rate_limit_info[:remaining], :< ,2000
90
- end
91
- end
92
- end
93
- end