levelup 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +36 -0
  3. data/.rubocop.yml +427 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +58 -0
  6. data/LICENSE +21 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +113 -0
  9. data/Rakefile +1 -0
  10. data/levelup.gemspec +32 -0
  11. data/lib/levelup.rb +55 -0
  12. data/lib/levelup/api.rb +102 -0
  13. data/lib/levelup/configuration.rb +23 -0
  14. data/lib/levelup/endpoints/access_tokens.rb +40 -0
  15. data/lib/levelup/endpoints/app_users.rb +30 -0
  16. data/lib/levelup/endpoints/apps.rb +30 -0
  17. data/lib/levelup/endpoints/base.rb +25 -0
  18. data/lib/levelup/endpoints/credit_cards.rb +26 -0
  19. data/lib/levelup/endpoints/location_orders.rb +32 -0
  20. data/lib/levelup/endpoints/merchant_funded_credits.rb +19 -0
  21. data/lib/levelup/endpoints/merchant_locations.rb +32 -0
  22. data/lib/levelup/endpoints/merchant_orders.rb +28 -0
  23. data/lib/levelup/endpoints/orders.rb +19 -0
  24. data/lib/levelup/endpoints/permissions_requests.rb +28 -0
  25. data/lib/levelup/endpoints/qr_codes.rb +28 -0
  26. data/lib/levelup/endpoints/specific_location.rb +24 -0
  27. data/lib/levelup/endpoints/specific_merchant.rb +28 -0
  28. data/lib/levelup/endpoints/specific_order.rb +28 -0
  29. data/lib/levelup/endpoints/specific_permissions_request.rb +26 -0
  30. data/lib/levelup/endpoints/user_addresses.rb +25 -0
  31. data/lib/levelup/endpoints/user_orders.rb +18 -0
  32. data/lib/levelup/endpoints/users.rb +16 -0
  33. data/lib/levelup/errors/invalid_request.rb +8 -0
  34. data/lib/levelup/errors/unauthenticated.rb +8 -0
  35. data/lib/levelup/requests/authenticate_app.rb +19 -0
  36. data/lib/levelup/requests/authenticate_merchant.rb +26 -0
  37. data/lib/levelup/requests/base.rb +87 -0
  38. data/lib/levelup/requests/create_address.rb +19 -0
  39. data/lib/levelup/requests/create_card.rb +21 -0
  40. data/lib/levelup/requests/create_order.rb +33 -0
  41. data/lib/levelup/requests/create_user.rb +34 -0
  42. data/lib/levelup/requests/get_order.rb +17 -0
  43. data/lib/levelup/requests/get_qr_code.rb +16 -0
  44. data/lib/levelup/requests/get_user.rb +17 -0
  45. data/lib/levelup/requests/give_merchant_credit.rb +23 -0
  46. data/lib/levelup/requests/list_addresses.rb +20 -0
  47. data/lib/levelup/requests/list_locations.rb +24 -0
  48. data/lib/levelup/requests/list_orders.rb +23 -0
  49. data/lib/levelup/requests/list_user_orders.rb +20 -0
  50. data/lib/levelup/requests/refund_order.rb +21 -0
  51. data/lib/levelup/requests/request_permissions.rb +27 -0
  52. data/lib/levelup/requests/show_permissions_request.rb +21 -0
  53. data/lib/levelup/responses/error.rb +36 -0
  54. data/lib/levelup/responses/success.rb +11 -0
  55. data/lib/levelup/templates/data_parcel.rb +41 -0
  56. data/lib/levelup/templates/merchant_and_user_authenticated.rb +21 -0
  57. data/lib/levelup/templates/merchant_authenticated.rb +19 -0
  58. data/lib/levelup/templates/user_address_data.rb +20 -0
  59. data/lib/levelup/templates/user_authenticated.rb +17 -0
  60. data/spec/data_objects/requests/authenticate_app_spec.rb +13 -0
  61. data/spec/data_objects/requests/authenticate_merchant_spec.rb +14 -0
  62. data/spec/data_objects/requests/create_order_spec.rb +14 -0
  63. data/spec/data_objects/requests/get_order_spec.rb +13 -0
  64. data/spec/data_objects/requests/list_locations_spec.rb +13 -0
  65. data/spec/data_objects/requests/list_orders_spec.rb +13 -0
  66. data/spec/data_objects/requests/refund_order_spec.rb +19 -0
  67. data/spec/data_objects/requests/request_permissions_spec.rb +21 -0
  68. data/spec/data_objects/responses/error_spec.rb +67 -0
  69. data/spec/data_objects/responses/response_spec.rb +13 -0
  70. data/spec/endpoints/access_tokens_spec.rb +81 -0
  71. data/spec/endpoints/app_users_spec.rb +43 -0
  72. data/spec/endpoints/location_orders_spec.rb +34 -0
  73. data/spec/endpoints/merchant_funded_credits_spec.rb +16 -0
  74. data/spec/endpoints/merchant_locations_spec.rb +35 -0
  75. data/spec/endpoints/orders_spec.rb +37 -0
  76. data/spec/endpoints/permissions_requests_spec.rb +22 -0
  77. data/spec/endpoints/qr_codes_spec.rb +12 -0
  78. data/spec/endpoints/specific_order_spec.rb +33 -0
  79. data/spec/endpoints/specific_permissions_request_spec.rb +24 -0
  80. data/spec/endpoints/user_addresses_spec.rb +41 -0
  81. data/spec/endpoints/user_orders_spec.rb +12 -0
  82. data/spec/fixtures/keys.yml.example +15 -0
  83. data/spec/spec_helper.rb +28 -0
  84. data/spec/support/vcr_filter_sensitive_data.rb +53 -0
  85. metadata +281 -0
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Responses::Success' do
4
+ before do
5
+ @test_response = Levelup::Responses::Success.new({})
6
+ end
7
+
8
+ describe '#success?' do
9
+ it 'returns true' do
10
+ expect(@test_response.success?).to be_true
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::AccessTokens', vcr: true do
4
+ describe '#create_for_app' do
5
+ context 'with no request object' do
6
+ context 'with no predefined API key/app secret' do
7
+ it 'fails to authenticate' do
8
+ expect(@test_client.access_tokens.create_for_app).to_not be_success
9
+ end
10
+ end
11
+
12
+ context 'with a predefined API key/app secret' do
13
+ before do
14
+ @test_client.api_key = TestConfig.api_key_valid
15
+ @test_client.secret = TestConfig.secret_valid
16
+ end
17
+
18
+ it 'returns a successful authentication response' do
19
+ response = @test_client.access_tokens.create_for_app
20
+ expect(response).to be_success
21
+ expect(response.token).to_not be_nil
22
+ expect(response.token).to_not be_empty
23
+ end
24
+ end
25
+ end
26
+
27
+ context 'with invalid keys' do
28
+ it 'returns an error response' do
29
+ auth_request = Levelup::Requests::AuthenticateApp.new(
30
+ api_key: 'wrong_api_key',
31
+ client_secret: 'wrong_client_secret'
32
+ )
33
+ response = @test_client.access_tokens.create_for_app(auth_request)
34
+ expect(response).to_not be_success
35
+ end
36
+ end
37
+
38
+ context 'with valid keys' do
39
+ it 'returns a successful authenticate response' do
40
+ auth_request = Levelup::Requests::AuthenticateApp.new(
41
+ api_key: TestConfig.api_key_valid,
42
+ client_secret: TestConfig.secret_valid
43
+ )
44
+ response = @test_client.access_tokens.create_for_app(auth_request)
45
+ expect(response).to be_success
46
+ expect(response.token).to_not be_nil
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#create_for_merchant' do
52
+ context 'with valid keys' do
53
+ it 'returns a successful authentication response' do
54
+ merchant_auth_request =
55
+ Levelup::Requests::AuthenticateMerchant.new(
56
+ api_key: TestConfig.merchant_api_key,
57
+ username: TestConfig.merchant_username,
58
+ password: TestConfig.merchant_password
59
+ )
60
+
61
+ response = @test_client.access_tokens.
62
+ create_for_merchant(merchant_auth_request)
63
+ expect(response).to be_success
64
+ expect(response.token).to_not be_nil
65
+ end
66
+ end
67
+
68
+ context 'with invalid keys' do
69
+ it 'fails to authenticate' do
70
+ merchant_auth_request = Levelup::Requests::AuthenticateMerchant.new(
71
+ api_key: 'abc123',
72
+ username: 'username_wrong',
73
+ password: 'password1'
74
+ )
75
+ response = @test_client.access_tokens.
76
+ create_for_merchant(merchant_auth_request)
77
+ expect(response).to_not be_success
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::AppUsers', vcr: true do
4
+ before do
5
+ @test_client.api_key = TestConfig.api_key_valid
6
+ @test_client.secret = TestConfig.secret_valid
7
+ auth = @test_client.access_tokens.create_for_app
8
+ @test_client.app_access_token = auth.token
9
+ end
10
+
11
+ describe '#create' do
12
+ it 'creates a user' do
13
+ response = @test_client.apps.users.create(
14
+ email: 'some@email.com',
15
+ first_name: 'firstname',
16
+ last_name: 'lastname',
17
+ permission_keynames: ['create_orders']
18
+ )
19
+
20
+ expect(response).to be_success
21
+ expect(response.user.last_name).to eq('lastname')
22
+ end
23
+ end
24
+
25
+ describe '#get' do
26
+ context 'with an invalid access token' do
27
+ it 'returns an error response' do
28
+ response = @test_client.apps.users.get('invalid')
29
+ expect(response).to_not be_success
30
+ end
31
+ end
32
+
33
+ context 'with a valid access token' do
34
+ it 'returns the user\'s info' do
35
+ response = @test_client.apps.users.get(
36
+ TestConfig.user_token_with_read_info_perms)
37
+
38
+ expect(response).to be_success
39
+ expect(response.email).to_not be_nil
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::LocationOrders', vcr: true do
4
+ before :all do
5
+ VCR.use_cassette('merchant_auth') do
6
+ merchant_auth = Levelup::Api.new.access_tokens.create_for_merchant(
7
+ api_key: TestConfig.merchant_api_key,
8
+ username: TestConfig.merchant_username,
9
+ password: TestConfig.merchant_password
10
+ )
11
+
12
+ @test_merchant_auth_token = merchant_auth.token
13
+ end
14
+ end
15
+
16
+ describe '#list' do
17
+ context 'with a valid location' do
18
+ it 'returns a list of orders' do
19
+ response = @test_client.locations(TestConfig.location_id).
20
+ orders.list(@test_merchant_auth_token)
21
+ expect(response).to be_success
22
+ expect(response.orders).to_not be_nil
23
+ end
24
+ end
25
+
26
+ context 'with an invalid location' do
27
+ it 'returns an error response' do
28
+ response = @test_client.locations(-25).orders.
29
+ list(@test_merchant_auth_token)
30
+ expect(response).to_not be_success
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::MerchantFundedCredits', vcr: true do
4
+ describe '#give' do
5
+ it 'grants a user credit' do
6
+ response = @test_client.merchant_funded_credits.give(
7
+ email: 'pos@thelevelup.com',
8
+ value_amount: 5,
9
+ merchant_access_token: TestConfig.
10
+ merchant_token_with_grant_credit_perms
11
+ )
12
+
13
+ expect(response).to be_success
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::MerchantLocations', vcr: true do
4
+ before :all do
5
+ VCR.use_cassette('merchant_auth') do
6
+ merchant_auth = Levelup::Api.new.access_tokens.create_for_merchant(
7
+ api_key: TestConfig.merchant_api_key,
8
+ username: TestConfig.merchant_username,
9
+ password: TestConfig.merchant_password
10
+ )
11
+
12
+ @test_merchant_auth_token = merchant_auth.token
13
+ @test_merchant_id = merchant_auth.merchant_id
14
+ end
15
+ end
16
+
17
+ describe '#list' do
18
+ context 'with a valid merchant' do
19
+ it 'returns a successful list-locations response' do
20
+ response = @test_client.merchants(@test_merchant_id).locations.
21
+ list(@test_merchant_auth_token)
22
+ expect(response).to be_success
23
+ expect(response.locations).to_not be_nil
24
+ end
25
+ end
26
+
27
+ context 'with an invalid merchant' do
28
+ it 'returns an error response' do
29
+ response = @test_client.merchants(-25).locations.
30
+ list(@test_merchant_auth_token)
31
+ expect(response).to_not be_success
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::Orders', vcr: true do
4
+ describe '#create' do
5
+ context 'with an invalid user access token' do
6
+ it 'returns an error response' do
7
+ order_request = Levelup::Requests::CreateOrder.new(
8
+ items: [],
9
+ location_id: TestConfig.location_id,
10
+ spend_amount: 10,
11
+ merchant_access_token:
12
+ TestConfig.merchant_token_with_manage_orders_perms,
13
+ user_access_token: 'invalid'
14
+ )
15
+ expect(@test_client.orders.create(order_request)).to_not be_success
16
+ end
17
+ end
18
+
19
+ context 'with a valid user access token' do
20
+ it 'returns a successful order response' do
21
+ order_request = Levelup::Requests::CreateOrder.new(
22
+ items: [],
23
+ location_id: TestConfig.location_id,
24
+ spend_amount: 10,
25
+ merchant_access_token:
26
+ TestConfig.merchant_token_with_manage_orders_perms,
27
+ user_access_token:
28
+ TestConfig.user_token_with_create_orders_perms
29
+ )
30
+
31
+ response = @test_client.orders.create(order_request)
32
+ expect(response).to be_success
33
+ expect(response.spend_amount).to eq(order_request.spend_amount)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::PermissionsRequests', vcr: true do
4
+ before do
5
+ @test_client.api_key = TestConfig.api_key_valid
6
+ @test_client.secret = TestConfig.secret_valid
7
+ auth = @test_client.access_tokens.create_for_app
8
+ @test_client.app_access_token = auth.token
9
+ end
10
+
11
+ describe '#create' do
12
+ it 'submits a permissions request' do
13
+ response = @test_client.apps.permissions_requests.create(
14
+ email: TestConfig.user_email,
15
+ permission_keynames: ['create_orders']
16
+ )
17
+
18
+ expect(response).to be_success
19
+ expect(response.state).to eq('pending')
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::QrCodes', vcr: true do
4
+ describe '#get' do
5
+ it 'retrieves a user\'s QR code' do
6
+ response = @test_client.qr_codes.get(TestConfig.
7
+ user_token_with_read_qr_perms)
8
+ expect(response).to be_success
9
+ expect(response.code).to_not be_nil
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::SpecificOrder', vcr: true do
4
+ describe '#refund' do
5
+ context 'with an invalid UUID' do
6
+ it 'returns an error response' do
7
+ response = @test_client.orders('0').
8
+ refund(@merchant_token_with_create_privs)
9
+ expect(response).to_not be_success
10
+ end
11
+ end
12
+
13
+ context 'with a valid UUID' do
14
+ it 'refunds the specified order' do
15
+ order_response = @test_client.orders.create(
16
+ items: [],
17
+ location_id: TestConfig.location_id,
18
+ spend_amount: 10,
19
+ merchant_access_token:
20
+ TestConfig.merchant_token_with_manage_orders_perms,
21
+ user_access_token:
22
+ TestConfig.user_token_with_create_orders_perms
23
+ )
24
+ expect(order_response).to be_success
25
+
26
+ refund_response = @test_client.orders(order_response.uuid).
27
+ refund(TestConfig.merchant_token_with_manage_orders_perms)
28
+ expect(refund_response).to be_success
29
+ expect(refund_response.uuid).to eq(order_response.uuid)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::SpecificPermissionsRequest', vcr: true do
4
+ before do
5
+ @test_client.api_key = TestConfig.api_key_valid
6
+ @test_client.secret = TestConfig.secret_valid
7
+ auth = @test_client.access_tokens.create_for_app
8
+ @test_client.app_access_token = auth.token
9
+ end
10
+
11
+ describe '#show' do
12
+ it 'returns a permissions request' do
13
+ perms_request = @test_client.apps.permissions_requests.create(
14
+ email: TestConfig.user_email,
15
+ permission_keynames: ['read_user_basic_info']
16
+ )
17
+
18
+ response = @test_client.apps.permissions_requests(perms_request.id).
19
+ show
20
+ expect(response).to be_success
21
+ expect(response.permission_keynames).to eq(['read_user_basic_info'])
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::UserAddresses', vcr: true do
4
+ describe '#create' do
5
+ before do
6
+ @test_address_hash = {
7
+ address_type: 'home',
8
+ street_address: '1 Levelup Lane',
9
+ extended_address: 'Suite 3',
10
+ locality: 'Boston',
11
+ region: 'MA',
12
+ postal_code: '02114'
13
+ }
14
+ @test_client.api_key = TestConfig.api_key_valid
15
+ @test_client.secret = TestConfig.secret_valid
16
+ end
17
+
18
+ context 'with an invalid user token' do
19
+ it 'returns an error response' do
20
+ test_request =
21
+ Levelup::Requests::CreateAddress.new(@test_address_hash)
22
+ test_request.user_access_token = 'invalid'
23
+ response = @test_client.user_addresses.create(test_request)
24
+ expect(response).to_not be_success
25
+ end
26
+ end
27
+
28
+ context 'with a valid user token' do
29
+ it 'returns a successful creation response' do
30
+ test_request =
31
+ Levelup::Requests::CreateAddress.new(@test_address_hash)
32
+ test_request.user_access_token =
33
+ TestConfig.user_token_with_manage_addresses_perms
34
+ response = @test_client.user_addresses.create(test_request)
35
+ expect(response).to be_success
36
+ expect(response.street_address).
37
+ to eq(@test_address_hash[:street_address])
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Levelup::Endpoints::UserOrders', vcr: true do
4
+ describe '#list' do
5
+ it 'returns a user\'s order history' do
6
+ response = @test_client.users.orders.
7
+ list(TestConfig.user_token_with_read_orders_perms)
8
+ expect(response).to be_success
9
+ expect(response.orders).to_not be_nil
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ #Rename this file to keys.yml once you've supplied the fields below
2
+ api_key_valid: key
3
+ secret_valid: secret
4
+ location_id: 123
5
+ merchant_token_with_grant_credit_perms: token
6
+ merchant_token_with_manage_orders_perms: token (can be same as other merchant token)
7
+ merchant_api_key: token_v14
8
+ merchant_username: merchant@email.tld
9
+ merchant_password: password
10
+ user_token_with_create_orders_perms: token
11
+ user_token_with_manage_addresses_perms: token (can be same as other user token)
12
+ user_token_with_read_info_perms: token (can be same as other user token)
13
+ user_token_with_read_orders_perms: token (can be same as other user token)
14
+ user_token_with_read_qr_perms: token (can be same as other user token)
15
+ user_email: user@email.tld
@@ -0,0 +1,28 @@
1
+ require 'settingslogic'
2
+ require 'vcr'
3
+ require 'support/vcr_filter_sensitive_data'
4
+
5
+ $LOAD_PATH << File.expand_path('../lib', __FILE__)
6
+ require 'levelup'
7
+
8
+ Levelup::Configuration.base_api_url = 'https://api.staging-levelup.com/'
9
+
10
+ class TestConfig < Settingslogic
11
+ source 'spec/fixtures/keys.yml'
12
+ end
13
+
14
+ VCR.configure do |config|
15
+ config.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
16
+ config.hook_into :webmock
17
+ config.default_cassette_options = {
18
+ record: :new_episodes,
19
+ match_requests_on: [:method, :uri, :body]
20
+ }
21
+ config.configure_rspec_metadata!
22
+ end
23
+
24
+ RSpec.configure do |config|
25
+ config.before do
26
+ @test_client = Levelup::Api.new
27
+ end
28
+ end