rexpense 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +22 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +24 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +54 -0
  7. data/.travis.yml +9 -0
  8. data/CHANGELOG.md +1 -0
  9. data/Gemfile +4 -0
  10. data/Gemfile.lock +97 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +195 -0
  13. data/Rakefile +6 -0
  14. data/bin/console +14 -0
  15. data/bin/rspec +21 -0
  16. data/bin/setup +7 -0
  17. data/lib/rexpense/client.rb +39 -0
  18. data/lib/rexpense/configuration.rb +13 -0
  19. data/lib/rexpense/entities/activity.rb +11 -0
  20. data/lib/rexpense/entities/activity_collection.rb +14 -0
  21. data/lib/rexpense/entities/advancement.rb +14 -0
  22. data/lib/rexpense/entities/advancement_collection.rb +14 -0
  23. data/lib/rexpense/entities/advancement_devolution.rb +13 -0
  24. data/lib/rexpense/entities/attachment.rb +13 -0
  25. data/lib/rexpense/entities/attachment_collection.rb +14 -0
  26. data/lib/rexpense/entities/base.rb +9 -0
  27. data/lib/rexpense/entities/collection.rb +65 -0
  28. data/lib/rexpense/entities/comment.rb +13 -0
  29. data/lib/rexpense/entities/comment_collection.rb +14 -0
  30. data/lib/rexpense/entities/expense.rb +22 -0
  31. data/lib/rexpense/entities/expense_collection.rb +14 -0
  32. data/lib/rexpense/entities/membership.rb +10 -0
  33. data/lib/rexpense/entities/membership_collection.rb +14 -0
  34. data/lib/rexpense/entities/organization.rb +14 -0
  35. data/lib/rexpense/entities/organization_collection.rb +14 -0
  36. data/lib/rexpense/entities/pre_expense.rb +17 -0
  37. data/lib/rexpense/entities/pre_expense_collection.rb +14 -0
  38. data/lib/rexpense/entities/reimbursement.rb +14 -0
  39. data/lib/rexpense/entities/reimbursement_collection.rb +14 -0
  40. data/lib/rexpense/entities/tag.rb +8 -0
  41. data/lib/rexpense/entities/tag_collection.rb +14 -0
  42. data/lib/rexpense/entities/user.rb +14 -0
  43. data/lib/rexpense/entities/user_collection.rb +14 -0
  44. data/lib/rexpense/entities/webhook.rb +10 -0
  45. data/lib/rexpense/entities/webhook_collection.rb +14 -0
  46. data/lib/rexpense/exception.rb +11 -0
  47. data/lib/rexpense/http.rb +41 -0
  48. data/lib/rexpense/request.rb +56 -0
  49. data/lib/rexpense/resources/activity.rb +24 -0
  50. data/lib/rexpense/resources/advancement.rb +20 -0
  51. data/lib/rexpense/resources/advancement_devolution.rb +36 -0
  52. data/lib/rexpense/resources/base.rb +52 -0
  53. data/lib/rexpense/resources/expense.rb +39 -0
  54. data/lib/rexpense/resources/nested_endpoints/attachment.rb +48 -0
  55. data/lib/rexpense/resources/nested_endpoints/comment.rb +84 -0
  56. data/lib/rexpense/resources/nested_endpoints/membership.rb +74 -0
  57. data/lib/rexpense/resources/nested_endpoints/participant.rb +43 -0
  58. data/lib/rexpense/resources/organization.rb +31 -0
  59. data/lib/rexpense/resources/pre_expense.rb +56 -0
  60. data/lib/rexpense/resources/reimbursement.rb +20 -0
  61. data/lib/rexpense/resources/resource_base.rb +105 -0
  62. data/lib/rexpense/resources/tag.rb +82 -0
  63. data/lib/rexpense/resources/webhook.rb +82 -0
  64. data/lib/rexpense/response.rb +43 -0
  65. data/lib/rexpense/version.rb +3 -0
  66. data/lib/rexpense.rb +19 -0
  67. data/rexpense.gemspec +48 -0
  68. data/spec/lib/rexpense/client_spec.rb +47 -0
  69. data/spec/lib/rexpense/configuration_spec.rb +26 -0
  70. data/spec/lib/rexpense/entities/activity_collection_spec.rb +5 -0
  71. data/spec/lib/rexpense/entities/activity_spec.rb +9 -0
  72. data/spec/lib/rexpense/entities/advancement_collection_spec.rb +5 -0
  73. data/spec/lib/rexpense/entities/advancement_devolution_spec.rb +9 -0
  74. data/spec/lib/rexpense/entities/advancement_spec.rb +10 -0
  75. data/spec/lib/rexpense/entities/base_spec.rb +28 -0
  76. data/spec/lib/rexpense/entities/collection_spec.rb +70 -0
  77. data/spec/lib/rexpense/entities/comment_collection_spec.rb +5 -0
  78. data/spec/lib/rexpense/entities/comment_spec.rb +10 -0
  79. data/spec/lib/rexpense/entities/expense_collection_spec.rb +5 -0
  80. data/spec/lib/rexpense/entities/expense_spec.rb +14 -0
  81. data/spec/lib/rexpense/entities/membership_collection_spec.rb +5 -0
  82. data/spec/lib/rexpense/entities/membership_spec.rb +7 -0
  83. data/spec/lib/rexpense/entities/organization_collection_spec.rb +5 -0
  84. data/spec/lib/rexpense/entities/organization_spec.rb +8 -0
  85. data/spec/lib/rexpense/entities/pre_expense_collection_spec.rb +5 -0
  86. data/spec/lib/rexpense/entities/pre_expense_spec.rb +10 -0
  87. data/spec/lib/rexpense/entities/reimbursement_collection_spec.rb +5 -0
  88. data/spec/lib/rexpense/entities/reimbursement_spec.rb +10 -0
  89. data/spec/lib/rexpense/entities/user_collection_spec.rb +5 -0
  90. data/spec/lib/rexpense/entities/user_spec.rb +10 -0
  91. data/spec/lib/rexpense/entities/webhook_collection_spec.rb +5 -0
  92. data/spec/lib/rexpense/entities/webhook_spec.rb +7 -0
  93. data/spec/lib/rexpense/http_spec.rb +37 -0
  94. data/spec/lib/rexpense/request_spec.rb +29 -0
  95. data/spec/lib/rexpense/resources/activity_spec.rb +16 -0
  96. data/spec/lib/rexpense/resources/advancement_devolution_spec.rb +29 -0
  97. data/spec/lib/rexpense/resources/advancement_spec.rb +207 -0
  98. data/spec/lib/rexpense/resources/expense_spec.rb +227 -0
  99. data/spec/lib/rexpense/resources/organization_spec.rb +162 -0
  100. data/spec/lib/rexpense/resources/pre_expense_spec.rb +83 -0
  101. data/spec/lib/rexpense/resources/reimbursement_spec.rb +207 -0
  102. data/spec/lib/rexpense/resources/tag_specs.rb +77 -0
  103. data/spec/lib/rexpense/resources/webhook_spec.rb +51 -0
  104. data/spec/lib/rexpense/response_spec.rb +91 -0
  105. data/spec/lib/rexpense_spec.rb +34 -0
  106. data/spec/spec_helper.rb +39 -0
  107. data/spec/support/attachments/logo.png +0 -0
  108. data/spec/support/client.rb +3 -0
  109. data/spec/support/matchers/have_attr_accessor.rb +18 -0
  110. data/spec/support/shared_examples/entity_attributes.rb +9 -0
  111. data/spec/support/shared_examples/entity_collection.rb +19 -0
  112. data/spec/support/shared_examples/http_request_methods.rb +35 -0
  113. data/spec/support/vcr.rb +7 -0
  114. metadata +390 -0
data/rexpense.gemspec ADDED
@@ -0,0 +1,48 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "rexpense/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rexpense"
7
+ spec.version = Rexpense::VERSION
8
+ spec.authors = ["Eduardo Hertz", "Dante Alighieri"]
9
+ spec.email = [
10
+ "dante.alighierimds@gmail.com",
11
+ "eduardohertz@gmail.com",
12
+ ]
13
+ spec.required_ruby_version = ">= 2.0.0"
14
+
15
+ spec.summary = %q{A Ruby client for the Rexpense REST API}
16
+ spec.description = %q{A Ruby client for the Rexpense REST API: http://developers.rexpense.com}
17
+ spec.homepage = "https://github.com/myfreecomm/rexpense-client-ruby"
18
+ spec.license = "MIT"
19
+
20
+ # Prevent pushing this gem to RubyGems.org by setting "allowed_push_host", or
21
+ # delete this section to allow pushing this gem to any host.
22
+ if spec.respond_to?(:metadata)
23
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
24
+ else
25
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
26
+ end
27
+
28
+ spec.files = `git ls-files`.split($/).reject { |f| f =~ %r{(vcr_cassettes)/} }
29
+ spec.bindir = "bin"
30
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
31
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
32
+ spec.require_paths = ["lib"]
33
+
34
+ spec.add_dependency "typhoeus", "~> 0.8"
35
+ spec.add_dependency "virtus", "~> 1.0.5"
36
+ spec.add_dependency "mime-types", "~> 2.99"
37
+ spec.add_dependency "require_all", "~> 1.4.0"
38
+
39
+ spec.add_development_dependency "rake", "~> 10.0"
40
+ spec.add_development_dependency "rspec"
41
+ spec.add_development_dependency "vcr", "~> 2.4"
42
+ spec.add_development_dependency "webmock", "~> 1.9.3"
43
+ spec.add_development_dependency "pry", "~> 0.9"
44
+ spec.add_development_dependency "pry-nav", "~> 0.2"
45
+ spec.add_development_dependency "awesome_print", "~> 1.1"
46
+ spec.add_development_dependency "simplecov", "~> 0.9"
47
+ spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
48
+ end
@@ -0,0 +1,47 @@
1
+ require "spec_helper"
2
+
3
+ describe Rexpense::Client do
4
+ subject { client }
5
+
6
+ shared_examples :resource do |method, type|
7
+ describe "##{method}" do
8
+ it "instantiates a new #{type}" do
9
+ allow(type).to receive(:new)
10
+ subject.send(method)
11
+ expect(type).to have_received(:new).with(subject.http)
12
+ end
13
+ end
14
+ end
15
+
16
+ describe "#initialize" do
17
+ it "instantiates a new Rexpense::Http object" do
18
+ expect(Rexpense::Http).to receive(:new).with("abc")
19
+ Rexpense::Client.new("abc")
20
+ end
21
+
22
+ context "when account_id is present" do
23
+ it "instantiates a new Rexpense::Http object" do
24
+ expect(Rexpense::Http).to receive(:new).with("abc")
25
+ Rexpense::Client.new("abc")
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "#authenticated?" do
31
+ context "with a valid token" do
32
+ it "returns true" do
33
+ VCR.use_cassette("client/authenticated/true") { expect(subject.authenticated?).to be_truthy }
34
+ end
35
+ end
36
+
37
+ context "with an invalid token" do
38
+ subject { described_class.new("FAKE-TOKEN") }
39
+
40
+ it "returns false" do
41
+ VCR.use_cassette("client/authenticated/false") { expect(subject.authenticated?).to be_falsey }
42
+ end
43
+ end
44
+ end
45
+
46
+ # include_examples :resource, :entities, Rexpense::Resources::Entity
47
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Rexpense::Configuration do
5
+ subject { Rexpense::Configuration.new }
6
+
7
+ it "uses the production mode by default" do
8
+ expect(subject.api_mode).to eq("production")
9
+ end
10
+
11
+ it "uses a default user agent" do
12
+ expect(subject.user_agent).to eq("Rexpense Ruby Client v#{Rexpense::VERSION}")
13
+ end
14
+
15
+ it 'allows setting the configuration parameters' do
16
+ subject.api_mode = "sandbox"
17
+ subject.user_agent = "My specific user agent"
18
+
19
+ expect(subject.api_mode).to eq("sandbox")
20
+ expect(subject.user_agent).to eq("My specific user agent")
21
+ end
22
+
23
+ it 'does not respond to #token' do
24
+ expect(subject).to_not respond_to(:token)
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::ActivityCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Activity, 'activities'
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Activity do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :subject, :source, :user, :changes
8
+ ]
9
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::AdvancementCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Advancement, 'advancements'
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::AdvancementDevolution do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :currency, :amount, :deleted_at, :date, :payer, :receiver
8
+ ]
9
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Advancement do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :comments_count, :activities_count, :description, :currency,
8
+ :amount, :tags, :created_at, :updated_at, :payer, :receiver
9
+ ]
10
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ describe Rexpense::Entities::Base do
4
+
5
+ class DummyEntity < Rexpense::Entities::Base
6
+ attribute :property_1, String
7
+ attribute :property_2, String
8
+ end
9
+
10
+ let(:hash) { { property_1: 1, property_2: 2 } }
11
+ subject { DummyEntity.new(hash) }
12
+
13
+ it "builds an object from a hash" do
14
+ expect(subject).to respond_to(:property_1)
15
+ expect(subject).to respond_to(:property_2)
16
+ expect(subject.property_1).to eq("1")
17
+ expect(subject.property_2).to eq("2")
18
+ end
19
+
20
+ describe "#attributes" do
21
+ it "returns a hash from object attributes" do
22
+ expect(subject.to_hash).to eq({
23
+ property_1: "1",
24
+ property_2: "2"
25
+ })
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Collection do
4
+ let(:response) { double(headers: {"Link" => "<https://sandbox.rexpense.com/api/v1/expenses?page=3>; rel=next, <https://sandbox.rexpense.com/api/v1/expenses?page=1>; rel=prev, <https://sandbox.rexpense.com/api/v1/expenses?page=3>; rel=last, <https://sandbox.rexpense.com/api/v1/expenses?page=1>; rel=first" },
5
+ body: "[]") }
6
+
7
+ subject { described_class.new(response) }
8
+
9
+ describe '#build' do
10
+ it 'raises NotImplementedError' do
11
+ expect { subject.build }.to raise_error(NotImplementedError)
12
+ end
13
+ end
14
+
15
+ describe '#next_page' do
16
+ it 'returns next page (3)' do
17
+ expect(subject.next_page).to eq(3)
18
+ end
19
+
20
+ context 'when there is no next page' do
21
+ let(:response) { double(headers: {"Link" => ""}, body: "") }
22
+
23
+ it 'returns nil' do
24
+ expect(subject.next_page).to be_nil
25
+ end
26
+ end
27
+ end
28
+
29
+ describe '#last_page' do
30
+ it 'returns last page (3)' do
31
+ expect(subject.last_page).to eq(3)
32
+ end
33
+
34
+ context 'when there is no last page' do
35
+ let(:response) { double(headers: {"Link" => ""}, body: "") }
36
+
37
+ it 'returns nil' do
38
+ expect(subject.last_page).to be_nil
39
+ end
40
+ end
41
+ end
42
+
43
+ describe '#previous_page' do
44
+ it 'returns previous page (3)' do
45
+ expect(subject.previous_page).to eq(1)
46
+ end
47
+
48
+ context 'when there is no previous page' do
49
+ let(:response) { double(headers: {"Link" => ""}, body: "") }
50
+
51
+ it 'returns nil' do
52
+ expect(subject.previous_page).to be_nil
53
+ end
54
+ end
55
+ end
56
+
57
+ describe '#first_page' do
58
+ it 'returns first page (3)' do
59
+ expect(subject.first_page).to eq(1)
60
+ end
61
+
62
+ context 'when there is no first page' do
63
+ let(:response) { double(headers: {"Link" => ""}, body: "") }
64
+
65
+ it 'returns nil' do
66
+ expect(subject.first_page).to be_nil
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::CommentCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Comment, 'comments'
5
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Comment do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :content, :content_html, :mentioned_users, :user,
8
+ :created_at, :updated_at, :deleted_at
9
+ ]
10
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::ExpenseCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Expense, 'expenses'
5
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Expense do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :attachments_count, :comments_count, :activities_count, :travel_time,
8
+ :description, :currency, :approved_amount_currency, :kind, :status,
9
+ :distance_kind, :destination, :origin, :amount, :approved_amount, :latitude,
10
+ :longitude, :distance, :destination_latitude, :destination_longitude,
11
+ :origin_longitude, :origin_latitude, :tags, :liquidate_through_advancement,
12
+ :created_at, :updated_at, :pre_expense_id, :payer, :receiver
13
+ ]
14
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::MembershipCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Membership, 'memberships'
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Membership do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [:id, :role, :organization, :user]
7
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::OrganizationCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Organization, 'organizations'
5
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Organization do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [:id, :name, :restricted_tags, :expired,
7
+ :members_count, :logo, :created_at, :updated_at]
8
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::PreExpenseCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::PreExpense, 'pre_expenses'
5
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::PreExpense do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :amount, :description, :currency, :created_at, :converted_at, :updated_at,
8
+ :ignored_at, :occurred_at, :tags, :payer, :receiver
9
+ ]
10
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::ReimbursementCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Reimbursement, 'reimbursements'
5
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Reimbursement do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :comments_count, :activities_count, :description, :currency,
8
+ :amount, :tags, :created_at, :updated_at, :payer, :receiver
9
+ ]
10
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::UserCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::User, 'participants'
5
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::User do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [
7
+ :id, :first_name, :last_name, :mention_name,
8
+ :default_currency, :name, :avatar, :default_avatar
9
+ ]
10
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::WebhookCollection do
4
+ it_behaves_like :entity_collection, Rexpense::Entities::Webhook, 'webhooks'
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Entities::Webhook do
4
+ subject { described_class.new({}) }
5
+
6
+ it_behaves_like "entity_attributes", [:id, :url, :description, :secret]
7
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Http do
4
+ subject { Rexpense::Http.new('8cd049b4afca9213fb2455528394ab2fb0bc34f5c905f33c') }
5
+
6
+ describe '#get' do
7
+ let(:http_method) { :get }
8
+ let(:url) { '/organizations/68/tags' }
9
+ let(:params) { {} }
10
+
11
+ it_behaves_like 'available http request methods'
12
+ end
13
+
14
+ describe '#post' do
15
+ let(:http_method) { :post }
16
+ let(:url) { '/organizations/68/tags' }
17
+ let(:params) { { name: 'Rexpense gem client' } }
18
+
19
+ it_behaves_like 'available http request methods'
20
+ end
21
+
22
+ describe '#put' do
23
+ let(:http_method) { :put }
24
+ let(:url) { '/organizations/68/tags/172' }
25
+ let(:params) { { name: 'Rexpense gem client 02' } }
26
+
27
+ it_behaves_like 'available http request methods'
28
+ end
29
+
30
+ describe '#delete' do
31
+ let(:http_method) { :delete }
32
+ let(:url) { '/organizations/68/tags/114' }
33
+ let(:params) { {} }
34
+
35
+ it_behaves_like 'available http request methods'
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe Rexpense::Request do
4
+ describe "#run" do
5
+ subject { described_class.new({ method: 'post', params: {}, url: 'https://sandbox.rexpense.com', user_agent: 'My Test User-Agent', token: 'my-auth-hash' }) }
6
+
7
+ it "does a request using Typhoeus::Request" do
8
+ expect(Typhoeus::Request).to receive(:new).with("https://sandbox.rexpense.com", { method: "post", params: {}, headers: { "Accept" => "application/json", "Content-Type" => "application/json", "User-Agent" => "My Test User-Agent", "Authorization" => "Basic bXktYXV0aC1oYXNoOlg=" }, accept_encoding: "gzip", params_encoding: :rack }).and_return(double(run: true, response: true))
9
+ subject.run
10
+ end
11
+
12
+ it "invokes Typhoeus::Request#run" do
13
+ expect_any_instance_of(Typhoeus::Request).to receive(:run)
14
+ subject.run
15
+ end
16
+
17
+ it "invokes Typhoeus::Request#response" do
18
+ allow_any_instance_of(Typhoeus::Request).to receive(:run)
19
+ expect_any_instance_of(Typhoeus::Request).to receive(:response)
20
+ subject.run
21
+ end
22
+
23
+ it "generates the base 64 of the user token" do
24
+ allow_any_instance_of(Typhoeus::Request).to receive(:run)
25
+ expect(Base64).to receive(:strict_encode64).with("my-auth-hash:X").and_call_original
26
+ subject.run
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Resources::Activity, vcr: true do
4
+ let(:activity_klass) { Rexpense::Entities::Activity }
5
+
6
+ describe "#find_all" do
7
+ context "with success" do
8
+ subject { client.activities.find_all }
9
+
10
+ it "show all activities successfully" do
11
+ expect(subject.class).to eq(Rexpense::Entities::ActivityCollection)
12
+ expect(subject.collection.first.class).to eq(activity_klass)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rexpense::Resources::AdvancementDevolution, vcr: true do
4
+ let(:devolution_klass) { Rexpense::Entities::AdvancementDevolution }
5
+
6
+ describe "#create" do
7
+ let(:params) do
8
+ {
9
+ payer_id: 35, receiver_id: 2, amount: 10.10,
10
+ currency: 'BRL', date: '27/09/2017'
11
+ }
12
+ end
13
+
14
+
15
+ it 'create a new devolution' do
16
+ result = client.advancement_devolutions.create(params)
17
+ expect(result).to be_a(devolution_klass)
18
+ expect(result.amount).to eq(10.10)
19
+ end
20
+
21
+ context "with error" do
22
+ it "raises Rexpense::RequestError with 422 status code" do
23
+ expect { client.advancement_devolutions.create({}) }.to raise_error(Rexpense::RequestError) do |error|
24
+ expect(error.code).to eq(422)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end