maestrano 0.9.2 → 0.10.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 233ae5b1140615630d0cdb6920a810dd84a69c24
4
- data.tar.gz: 69ed0c40ebc47289eff16817111bec32b74cc4c3
3
+ metadata.gz: d94420ccbb524ba344eacad615d8a0ab9b131fd6
4
+ data.tar.gz: c09aedc8103d853baf2e39191c9731116bc8103e
5
5
  SHA512:
6
- metadata.gz: 12401f7870aa606c14cae7db6b36443b951eed778f53a41b8296910d24fc232d4e9402e472d64b00007299e74e435196272bb7fa4f3e907658a3f7e737e74b4a
7
- data.tar.gz: 0a99d1d28cb4f42c246a4e2dadd99438798b4dbc6f0a4b144b852aafc954317b316d8afc09af58413749cfe6671dee1e1dc5003a4a9bdfc2ccde2560693c438b
6
+ metadata.gz: 2c8e40d09ee79f77a21befa7baa8a75b72826129d10586f2a5ca0b90fb30e34d7bfbaef1cf4f81f996613eb524640daf12b4e8bf990f34edcff2e5d74ec2c532
7
+ data.tar.gz: f8992c9d8b743bfbd704e779f9bf9df707edf0d9097f264668a59db05053a0c5a8a82ae98a05ff6ae0fdb28643acfc6faee871db75bfe0bf33f907637e3fc899
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- maestrano (0.8.1)
4
+ maestrano (0.10.0)
5
+ httparty (~> 0.13)
5
6
  json (~> 1.8)
6
7
  mime-types (~> 1.25)
7
8
  nokogiri (>= 1.5.0)
@@ -11,17 +12,21 @@ PATH
11
12
  GEM
12
13
  remote: http://rubygems.org/
13
14
  specs:
14
- json (1.8.1)
15
+ httparty (0.13.3)
16
+ json (~> 1.8)
17
+ multi_xml (>= 0.5.2)
18
+ json (1.8.2)
15
19
  macaddr (1.7.1)
16
20
  systemu (~> 2.6.2)
17
21
  metaclass (0.0.4)
18
22
  mime-types (1.25.1)
19
- mini_portile (0.6.0)
23
+ mini_portile (0.6.2)
20
24
  mocha (0.13.3)
21
25
  metaclass (~> 0.0.1)
22
- netrc (0.7.7)
23
- nokogiri (1.6.2.1)
24
- mini_portile (= 0.6.0)
26
+ multi_xml (0.5.5)
27
+ netrc (0.10.2)
28
+ nokogiri (1.6.5)
29
+ mini_portile (~> 0.6.0)
25
30
  rake (10.3.2)
26
31
  rest-client (1.7.2)
27
32
  mime-types (>= 1.16, < 3.0)
data/README.md CHANGED
@@ -27,6 +27,9 @@ Maestrano Cloud Integration is currently in closed beta. Want to know more? Send
27
27
  6. [API](#api)
28
28
  * [Bill](#bill)
29
29
  * [Recurring Bill](#recurring-bill)
30
+ 7. [Connec!™ Data Sharing](#connec-data-sharing)
31
+ * [Making Requests](#making-requests)
32
+ * [Webhook Notifications](#webhook-notifications)
30
33
 
31
34
  - - -
32
35
 
@@ -178,6 +181,34 @@ Maestrano.configure do |config|
178
181
  #
179
182
  # config.webhook.account.groups_path = '/maestrano/account/groups/:id',
180
183
  # config.webhook.account.group_users_path = '/maestrano/account/groups/:group_id/users/:id',
184
+
185
+
186
+ # ==> Connec Subscriptions/Webhook
187
+ # The following section is used to configure the Connec!™ webhooks and which entities
188
+ # you should receive via webhook.
189
+ #
190
+ # == Notification Path
191
+ # This is the path of your application where notifications (created/updated entities) will
192
+ # be POSTed to.
193
+ # You should have a controller matching this path handling the update of your internal entities
194
+ # based on the Connec!™ entities you receive
195
+ #
196
+ # config.webhook.connec.notifications_path = '/maestrano/connec/notifications'
197
+ #
198
+ # == Subscriptions
199
+ # This is the list of entities (organizations,people,invoices etc.) for which you want to be
200
+ # notified upon creation/update in Connec!™
201
+ #
202
+ # config.webhook.connec.subscriptions = {
203
+ # accounts: false,
204
+ # company: false,
205
+ # invoice: false,
206
+ # item: false,
207
+ # organization: false,
208
+ # person: false,
209
+ # tax_codes: false,
210
+ # tax_rates: false
211
+ # }
181
212
  end
182
213
  ```
183
214
 
@@ -783,6 +814,59 @@ rec_bill = Maestrano::Account::RecurringBill.retrieve("rbill-f1d2s54")
783
814
  rec_bill.cancel
784
815
  ```
785
816
 
817
+ ## Connec!™ Data Sharing
818
+ Maestrano offers the capability to share actual business data between application via its data sharing platform Connec!™.
819
+
820
+ The platform exposes a set of RESTful JSON APIs allowing your application to receive data generated by other applications and update data in other applications as well!
821
+
822
+ Connec!™ also offers the ability to create webhooks on your side to get automatically notified of changes happening in other systems.
823
+
824
+ Connec!™ enables seamless data sharing between the Maestrano applications as well as popular apps such as QuickBooks and Xero. One connector - tens of integrations!
825
+
826
+ ### Making Requests
827
+
828
+ Connec!™ REST API documentation can be found here: http://maestrano.github.io/connec
829
+
830
+ The Maestrano API provides a built-in client - based on HTTParty - for connecting to Connec!™. Things like connection and authentication are automatically managed by the Connec!™ client.
831
+
832
+
833
+ ```ruby
834
+ # Pass the customer group id as argument
835
+ client = Maestrano::Connec::Client.new("cld-f7f5g4")
836
+
837
+ # Retrieve all organizations (customers and suppliers) created in other applications
838
+ resp = client.get('/organizations')
839
+ resp.body # returns the raw response "{\"organizations\":[ ... ]}"
840
+ resp.parsed_response # returns a ruby hash { "organizations": [ ... ] }
841
+
842
+ # Create a new organization
843
+ client.post('/organizations', { organizations: { name: "DoeCorp Inc."} })
844
+
845
+ # Update an organization
846
+ client.put('/organizations/e32303c1-5102-0132-661e-600308937d74', { organizations: { is_customer: true} })
847
+ ```
848
+
849
+
850
+
851
+ ### Webhook Notifications
852
+ If you have configured the Maestrano API to receive update notifications (see 'subscriptions' configuration at the top) from Connec!™ then you can expect to receive regular POST requests on the notification_path you have configured.
853
+
854
+ Notifications are JSON messages containing the list of entities that have recently changed in other systems. You will only receive notifications for entities you have subscribed to.
855
+
856
+ Example of notification message:
857
+ ```ruby
858
+ {
859
+ "organizations": [
860
+ { "id": "e32303c1-5102-0132-661e-600308937d74", name: "DoeCorp Inc.", ... }
861
+ ],
862
+ "people": [
863
+ { "id": "a34303d1-4142-0152-362e-610408337d74", first_name: "John", last_name: "Doe", ... }
864
+ ]
865
+ }
866
+ ```
867
+
868
+ Entities sent via notifications follow the same data structure as the one described in our REST API documentation (available at http://maestrano.github.io/connec)
869
+
786
870
 
787
871
  ## Support
788
872
  This README is still in the process of being written and improved. As such it might not cover some of the questions you might have.
data/lib/maestrano.rb CHANGED
@@ -54,6 +54,9 @@ require 'maestrano/account/group'
54
54
  require 'maestrano/account/bill'
55
55
  require 'maestrano/account/recurring_bill'
56
56
 
57
+ # Connec
58
+ require 'maestrano/connec/client'
59
+
57
60
  module Maestrano
58
61
 
59
62
  class << self
@@ -182,6 +185,10 @@ module Maestrano
182
185
  account: OpenStruct.new({
183
186
  groups_path: '/maestrano/account/groups/:id',
184
187
  group_users_path: '/maestrano/account/groups/:group_id/users/:id',
188
+ }),
189
+ connec: OpenStruct.new({
190
+ notifications_path: '/maestrano/connec/notifications',
191
+ subscriptions: {}
185
192
  })
186
193
  })
187
194
  end
@@ -258,7 +265,9 @@ module Maestrano
258
265
  'sso.idp' => 'https://maestrano.com',
259
266
  'sso.name_id_format' => Maestrano::Saml::Settings::NAMEID_PERSISTENT,
260
267
  'sso.x509_fingerprint' => '01:06:15:89:25:7d:78:12:28:a6:69:c7:de:63:ed:74:21:f9:f5:36',
261
- 'sso.x509_certificate' => "-----BEGIN CERTIFICATE-----\nMIIDezCCAuSgAwIBAgIJAOehBr+YIrhjMA0GCSqGSIb3DQEBBQUAMIGGMQswCQYD\nVQQGEwJBVTEMMAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxGjAYBgNVBAoT\nEU1hZXN0cmFubyBQdHkgTHRkMRYwFAYDVQQDEw1tYWVzdHJhbm8uY29tMSQwIgYJ\nKoZIhvcNAQkBFhVzdXBwb3J0QG1hZXN0cmFuby5jb20wHhcNMTQwMTA0MDUyMjM5\nWhcNMzMxMjMwMDUyMjM5WjCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEP\nMA0GA1UEBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQG\nA1UEAxMNbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVz\ndHJhbm8uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVkIqo5t5Paflu\nP2zbSbzxn29n6HxKnTcsubycLBEs0jkTkdG7seF1LPqnXl8jFM9NGPiBFkiaR15I\n5w482IW6mC7s8T2CbZEL3qqQEAzztEPnxQg0twswyIZWNyuHYzf9fw0AnohBhGu2\n28EZWaezzT2F333FOVGSsTn1+u6tFwIDAQABo4HuMIHrMB0GA1UdDgQWBBSvrNxo\neHDm9nhKnkdpe0lZjYD1GzCBuwYDVR0jBIGzMIGwgBSvrNxoeHDm9nhKnkdpe0lZ\njYD1G6GBjKSBiTCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE\nBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQGA1UEAxMN\nbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVzdHJhbm8u\nY29tggkA56EGv5giuGMwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCc\nMPgV0CpumKRMulOeZwdpnyLQI/NTr3VVHhDDxxCzcB0zlZ2xyDACGnIG2cQJJxfc\n2GcsFnb0BMw48K6TEhAaV92Q7bt1/TYRvprvhxUNMX2N8PHaYELFG2nWfQ4vqxES\nRkjkjqy+H7vir/MOF3rlFjiv5twAbDKYHXDT7v1YCg==\n-----END CERTIFICATE-----"
268
+ 'sso.x509_certificate' => "-----BEGIN CERTIFICATE-----\nMIIDezCCAuSgAwIBAgIJAOehBr+YIrhjMA0GCSqGSIb3DQEBBQUAMIGGMQswCQYD\nVQQGEwJBVTEMMAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxGjAYBgNVBAoT\nEU1hZXN0cmFubyBQdHkgTHRkMRYwFAYDVQQDEw1tYWVzdHJhbm8uY29tMSQwIgYJ\nKoZIhvcNAQkBFhVzdXBwb3J0QG1hZXN0cmFuby5jb20wHhcNMTQwMTA0MDUyMjM5\nWhcNMzMxMjMwMDUyMjM5WjCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEP\nMA0GA1UEBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQG\nA1UEAxMNbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVz\ndHJhbm8uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVkIqo5t5Paflu\nP2zbSbzxn29n6HxKnTcsubycLBEs0jkTkdG7seF1LPqnXl8jFM9NGPiBFkiaR15I\n5w482IW6mC7s8T2CbZEL3qqQEAzztEPnxQg0twswyIZWNyuHYzf9fw0AnohBhGu2\n28EZWaezzT2F333FOVGSsTn1+u6tFwIDAQABo4HuMIHrMB0GA1UdDgQWBBSvrNxo\neHDm9nhKnkdpe0lZjYD1GzCBuwYDVR0jBIGzMIGwgBSvrNxoeHDm9nhKnkdpe0lZ\njYD1G6GBjKSBiTCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE\nBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQGA1UEAxMN\nbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVzdHJhbm8u\nY29tggkA56EGv5giuGMwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCc\nMPgV0CpumKRMulOeZwdpnyLQI/NTr3VVHhDDxxCzcB0zlZ2xyDACGnIG2cQJJxfc\n2GcsFnb0BMw48K6TEhAaV92Q7bt1/TYRvprvhxUNMX2N8PHaYELFG2nWfQ4vqxES\nRkjkjqy+H7vir/MOF3rlFjiv5twAbDKYHXDT7v1YCg==\n-----END CERTIFICATE-----",
269
+ 'connec.host' => 'http://api-sandbox.maestrano.io',
270
+ 'connec.base_path' => '/connec/api/v2'
262
271
  },
263
272
  'production' => {
264
273
  'api.host' => 'https://maestrano.com',
@@ -266,7 +275,9 @@ module Maestrano
266
275
  'sso.idp' => 'https://maestrano.com',
267
276
  'sso.name_id_format' => Maestrano::Saml::Settings::NAMEID_PERSISTENT,
268
277
  'sso.x509_fingerprint' => '2f:57:71:e4:40:19:57:37:a6:2c:f0:c5:82:52:2f:2e:41:b7:9d:7e',
269
- 'sso.x509_certificate' => "-----BEGIN CERTIFICATE-----\nMIIDezCCAuSgAwIBAgIJAPFpcH2rW0pyMA0GCSqGSIb3DQEBBQUAMIGGMQswCQYD\nVQQGEwJBVTEMMAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxGjAYBgNVBAoT\nEU1hZXN0cmFubyBQdHkgTHRkMRYwFAYDVQQDEw1tYWVzdHJhbm8uY29tMSQwIgYJ\nKoZIhvcNAQkBFhVzdXBwb3J0QG1hZXN0cmFuby5jb20wHhcNMTQwMTA0MDUyNDEw\nWhcNMzMxMjMwMDUyNDEwWjCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEP\nMA0GA1UEBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQG\nA1UEAxMNbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVz\ndHJhbm8uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD3feNNn2xfEz5/\nQvkBIu2keh9NNhobpre8U4r1qC7h7OeInTldmxGL4cLHw4ZAqKbJVrlFWqNevM5V\nZBkDe4mjuVkK6rYK1ZK7eVk59BicRksVKRmdhXbANk/C5sESUsQv1wLZyrF5Iq8m\na9Oy4oYrIsEF2uHzCouTKM5n+O4DkwIDAQABo4HuMIHrMB0GA1UdDgQWBBSd/X0L\n/Pq+ZkHvItMtLnxMCAMdhjCBuwYDVR0jBIGzMIGwgBSd/X0L/Pq+ZkHvItMtLnxM\nCAMdhqGBjKSBiTCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE\nBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQGA1UEAxMN\nbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVzdHJhbm8u\nY29tggkA8WlwfatbSnIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQDE\nhe/18oRh8EqIhOl0bPk6BG49AkjhZZezrRJkCFp4dZxaBjwZTddwo8O5KHwkFGdy\nyLiPV326dtvXoKa9RFJvoJiSTQLEn5mO1NzWYnBMLtrDWojOe6Ltvn3x0HVo/iHh\nJShjAn6ZYX43Tjl1YXDd1H9O+7/VgEWAQQ32v8p5lA==\n-----END CERTIFICATE-----"
278
+ 'sso.x509_certificate' => "-----BEGIN CERTIFICATE-----\nMIIDezCCAuSgAwIBAgIJAPFpcH2rW0pyMA0GCSqGSIb3DQEBBQUAMIGGMQswCQYD\nVQQGEwJBVTEMMAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxGjAYBgNVBAoT\nEU1hZXN0cmFubyBQdHkgTHRkMRYwFAYDVQQDEw1tYWVzdHJhbm8uY29tMSQwIgYJ\nKoZIhvcNAQkBFhVzdXBwb3J0QG1hZXN0cmFuby5jb20wHhcNMTQwMTA0MDUyNDEw\nWhcNMzMxMjMwMDUyNDEwWjCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEP\nMA0GA1UEBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQG\nA1UEAxMNbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVz\ndHJhbm8uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD3feNNn2xfEz5/\nQvkBIu2keh9NNhobpre8U4r1qC7h7OeInTldmxGL4cLHw4ZAqKbJVrlFWqNevM5V\nZBkDe4mjuVkK6rYK1ZK7eVk59BicRksVKRmdhXbANk/C5sESUsQv1wLZyrF5Iq8m\na9Oy4oYrIsEF2uHzCouTKM5n+O4DkwIDAQABo4HuMIHrMB0GA1UdDgQWBBSd/X0L\n/Pq+ZkHvItMtLnxMCAMdhjCBuwYDVR0jBIGzMIGwgBSd/X0L/Pq+ZkHvItMtLnxM\nCAMdhqGBjKSBiTCBhjELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE\nBxMGU3lkbmV5MRowGAYDVQQKExFNYWVzdHJhbm8gUHR5IEx0ZDEWMBQGA1UEAxMN\nbWFlc3RyYW5vLmNvbTEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEBtYWVzdHJhbm8u\nY29tggkA8WlwfatbSnIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQDE\nhe/18oRh8EqIhOl0bPk6BG49AkjhZZezrRJkCFp4dZxaBjwZTddwo8O5KHwkFGdy\nyLiPV326dtvXoKa9RFJvoJiSTQLEn5mO1NzWYnBMLtrDWojOe6Ltvn3x0HVo/iHh\nJShjAn6ZYX43Tjl1YXDd1H9O+7/VgEWAQQ32v8p5lA==\n-----END CERTIFICATE-----",
279
+ 'connec.host' => 'https://api-connec.maestrano.com',
280
+ 'connec.base_path' => '/api/v2'
270
281
  }
271
282
  }
272
283
  end
@@ -0,0 +1,62 @@
1
+ require 'httparty'
2
+
3
+ module Maestrano
4
+ module Connec
5
+
6
+ class Client
7
+ include ::HTTParty
8
+ headers 'Accept' => 'application/vnd.api+json'
9
+ headers 'Content-Type' => 'application/vnd.api+json'
10
+ format :json
11
+
12
+ attr_reader :group_id
13
+
14
+ def initialize(group_id)
15
+ @group_id = group_id
16
+ self.class.base_uri("#{Maestrano.param('connec.host')}#{Maestrano.param('connec.base_path')}")
17
+ end
18
+
19
+ # Return the default options which includes
20
+ # maestrano authentication
21
+ def default_options
22
+ {
23
+ basic_auth: {
24
+ username: Maestrano.param('api.id'),
25
+ password: Maestrano.param('api.key')
26
+ }
27
+ }
28
+ end
29
+
30
+ # Return the right path scoped using the customer
31
+ # group id
32
+ def scoped_path(relative_path)
33
+ clean_path = relative_path.gsub(/^\/+/, "").gsub(/\/+$/, "")
34
+ "/#{@group_id}/#{clean_path}"
35
+ end
36
+
37
+ # E.g: client.get('/organizations')
38
+ # E.g: client.get('/organizations/123')
39
+ def get(relative_path, options = {})
40
+ self.class.get(self.scoped_path(relative_path),default_options.merge(options))
41
+ end
42
+
43
+ # E.g: client.post('/organizations', { organizations: { name: 'DoeCorp Inc.' } })
44
+ def post(relative_path, body, options = {})
45
+ self.class.post(self.scoped_path(relative_path),
46
+ default_options.merge(body: body.to_json).merge(options)
47
+ )
48
+ end
49
+
50
+ # E.g for collection:
51
+ # => client.put('/organizations/123', { organizations: { name: 'DoeCorp Inc.' } })
52
+ # E.g for singular resource:
53
+ # => client.put('/company', { company: { name: 'DoeCorp Inc.' } })
54
+ def put(relative_path, body, options = {})
55
+ self.class.put(self.scoped_path(relative_path),
56
+ default_options.merge(body: body.to_json).merge(options)
57
+ )
58
+ end
59
+ end
60
+
61
+ end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module Maestrano
2
- VERSION = '0.9.2'
2
+ VERSION = '0.10.0'
3
3
  end
data/maestrano.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency('rest-client', '~> 1.4')
21
21
  s.add_dependency('mime-types', '~> 1.25')
22
22
  s.add_dependency('json', '~> 1.8')
23
+ s.add_dependency('httparty', '~> 0.13')
23
24
 
24
25
  s.add_development_dependency('test-unit', '~> 2')
25
26
  s.add_development_dependency('mocha', '~> 0.13')
@@ -0,0 +1,94 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ module Maestrano
4
+ module Connec
5
+ class ClientTest < Test::Unit::TestCase
6
+
7
+ context 'initializer' do
8
+ context '.base_uri' do
9
+ context 'in test' do
10
+ setup { Maestrano.configure { |config| config.environment = 'test' } }
11
+ setup { @client = Maestrano::Connec::Client.new("cld-123") }
12
+
13
+ should "return the right uri" do
14
+ assert_equal "http://api-sandbox.maestrano.io/connec/api/v2", Maestrano::Connec::Client.base_uri
15
+ end
16
+ end
17
+
18
+ context 'in production' do
19
+ setup { Maestrano.configure { |config| config.environment = 'production' } }
20
+ setup { @client = Maestrano::Connec::Client.new("cld-123") }
21
+
22
+ should "return the right uri" do
23
+ assert_equal "https://api-connec.maestrano.com/api/v2", Maestrano::Connec::Client.base_uri
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ context 'scoped_path' do
30
+ setup { @client = Maestrano::Connec::Client.new("cld-123") }
31
+
32
+ should "return the right scoped path" do
33
+ assert_equal "/cld-123/people", @client.scoped_path('/people')
34
+ end
35
+
36
+ should "remove any leading or trailing slash" do
37
+ assert_equal "/cld-123/people", @client.scoped_path('/people/')
38
+ end
39
+ end
40
+
41
+ context 'default_options' do
42
+ setup { @client = Maestrano::Connec::Client.new("cld-123") }
43
+
44
+ should "return the right authentication options" do
45
+ expected_opts = {
46
+ basic_auth: {
47
+ username: Maestrano.param('api.id'),
48
+ password: Maestrano.param('api.key')
49
+ }
50
+ }
51
+ assert_equal expected_opts, @client.default_options
52
+ end
53
+ end
54
+
55
+ context 'get' do
56
+ setup { @client = Maestrano::Connec::Client.new("cld-123") }
57
+
58
+ should "perform the right query" do
59
+ path = '/people'
60
+ opts = { foo: 'bar' }
61
+ resp = mock('resp')
62
+ Maestrano::Connec::Client.expects(:get).with(@client.scoped_path(path),@client.default_options.merge(opts)).returns(resp)
63
+ assert_equal resp, @client.get(path,opts)
64
+ end
65
+ end
66
+
67
+ context 'post' do
68
+ setup { @client = Maestrano::Connec::Client.new("cld-123") }
69
+
70
+ should "perform the right query" do
71
+ path = '/people'
72
+ body = { some: 'data'}
73
+ opts = { foo: 'bar' }
74
+ resp = mock('resp')
75
+ Maestrano::Connec::Client.expects(:post).with(@client.scoped_path(path),@client.default_options.merge(body: body.to_json).merge(opts)).returns(resp)
76
+ assert_equal resp, @client.post(path,body,opts)
77
+ end
78
+ end
79
+
80
+ context 'put' do
81
+ setup { @client = Maestrano::Connec::Client.new("cld-123") }
82
+
83
+ should "perform the right query" do
84
+ path = '/people/123'
85
+ body = { some: 'data'}
86
+ opts = { foo: 'bar' }
87
+ resp = mock('resp')
88
+ Maestrano::Connec::Client.expects(:put).with(@client.scoped_path(path),@client.default_options.merge(body: body.to_json).merge(opts)).returns(resp)
89
+ assert_equal resp, @client.put(path,body,opts)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -16,8 +16,10 @@ class MaestranoTest < Test::Unit::TestCase
16
16
  'sso.creation_mode' => 'real',
17
17
  'sso.idm' => 'http://idp.mysuperapp.com',
18
18
 
19
- 'webhook.account.groups_path' => '/mno/groups/:id',
20
- 'webhook.account.group_users_path' => '/mno/groups/:group_id/users/:id',
19
+ 'webhook.account.groups_path' => '/mno/groups/:id',
20
+ 'webhook.account.group_users_path' => '/mno/groups/:group_id/users/:id',
21
+ 'webhook.connec.notifications_path' => 'mno/receive',
22
+ 'webhook.connec.subscriptions' => { organizations: true, people: true }
21
23
  }
22
24
 
23
25
  Maestrano.configure do |config|
@@ -34,8 +36,11 @@ class MaestranoTest < Test::Unit::TestCase
34
36
  config.sso.consume_path = @config['sso.consume_path']
35
37
  config.sso.creation_mode = @config['sso.creation_mode']
36
38
 
37
- config.webhook.account.groups_path = @config['webhook.account.groups_path' ]
38
- config.webhook.account.group_users_path = @config['webhook.account.group_users_path' ]
39
+ config.webhook.account.groups_path = @config['webhook.account.groups_path']
40
+ config.webhook.account.group_users_path = @config['webhook.account.group_users_path']
41
+
42
+ config.webhook.connec.notifications_path = @config['webhook.connec.notifications_path']
43
+ config.webhook.connec.subscriptions = @config['webhook.connec.subscriptions']
39
44
  end
40
45
  end
41
46
 
@@ -87,7 +92,7 @@ class MaestranoTest < Test::Unit::TestCase
87
92
  should "return the right test parameters" do
88
93
  Maestrano.configure { |config| config.environment = 'test' }
89
94
 
90
- ['api.host','api.base','sso.idp', 'sso.name_id_format', 'sso.x509_certificate'].each do |parameter|
95
+ ['api.host','api.base','sso.idp', 'sso.name_id_format', 'sso.x509_certificate', 'connec.host','connec.base_path'].each do |parameter|
91
96
  assert_equal Maestrano::Configuration::EVT_CONFIG['test'][parameter], Maestrano.param(parameter)
92
97
  end
93
98
  end
@@ -95,7 +100,7 @@ class MaestranoTest < Test::Unit::TestCase
95
100
  should "return the right production parameters" do
96
101
  Maestrano.configure { |config| config.environment = 'production' }
97
102
 
98
- ['api.host','api.base','sso.idp', 'sso.name_id_format', 'sso.x509_certificate'].each do |parameter|
103
+ ['api.host','api.base','sso.idp', 'sso.name_id_format', 'sso.x509_certificate','connec.host','connec.base_path'].each do |parameter|
99
104
  assert_equal Maestrano::Configuration::EVT_CONFIG['production'][parameter], Maestrano.param(parameter)
100
105
  end
101
106
  end
@@ -249,6 +254,10 @@ class MaestranoTest < Test::Unit::TestCase
249
254
  'account' => {
250
255
  'groups_path' => @config['webhook.account.groups_path'],
251
256
  'group_users_path' => @config['webhook.account.group_users_path'],
257
+ },
258
+ 'connec' => {
259
+ 'notifications_path' => 'mno/receive',
260
+ 'subscriptions' => { organizations: true, people: true }
252
261
  }
253
262
  }
254
263
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maestrano
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arnaud Lachaume
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-11 00:00:00.000000000 Z
11
+ date: 2015-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.13'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.13'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: test-unit
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -184,6 +198,7 @@ files:
184
198
  - lib/maestrano/api/operation/update.rb
185
199
  - lib/maestrano/api/resource.rb
186
200
  - lib/maestrano/api/util.rb
201
+ - lib/maestrano/connec/client.rb
187
202
  - lib/maestrano/open_struct.rb
188
203
  - lib/maestrano/saml/attribute_value.rb
189
204
  - lib/maestrano/saml/metadata.rb
@@ -216,6 +231,7 @@ files:
216
231
  - test/maestrano/api/object_test.rb
217
232
  - test/maestrano/api/resource_test.rb
218
233
  - test/maestrano/api/util_test.rb
234
+ - test/maestrano/connec/client_test.rb
219
235
  - test/maestrano/maestrano_test.rb
220
236
  - test/maestrano/open_struct_test.rb
221
237
  - test/maestrano/saml/request_test.rb
@@ -285,6 +301,7 @@ test_files:
285
301
  - test/maestrano/api/object_test.rb
286
302
  - test/maestrano/api/resource_test.rb
287
303
  - test/maestrano/api/util_test.rb
304
+ - test/maestrano/connec/client_test.rb
288
305
  - test/maestrano/maestrano_test.rb
289
306
  - test/maestrano/open_struct_test.rb
290
307
  - test/maestrano/saml/request_test.rb