example/permissions.rb in pmp-0.2.1 vs example/permissions.rb in pmp-0.2.2
- old
+ new
@@ -1,11 +1,24 @@
#!/usr/bin/env ruby
+# ruby version of https://github.com/APMG/pmp-sdk-perl/blob/master/t/002-authz.t
require 'rubygems'
require 'bundler/setup'
require 'pmp'
+require 'json'
+# some utility methods
+def waiting(seconds, message="waiting")
+ print message
+ seconds.to_i.times{ print "."; sleep(1) }
+ print "\n"
+end
+
+def pretty_json(s)
+ JSON.pretty_generate(JSON.parse(s))
+end
+
# ------------------------------------------------------------------------------
# Setup: Make sure you can make a client with id and secret
# ------------------------------------------------------------------------------
client_id = ENV['PMP_CLIENT_ID']
client_secret = ENV['PMP_CLIENT_SECRET']
@@ -15,11 +28,19 @@
# doing this against the sandbox for now
endpoint = 'https://api-sandbox.pmp.io/'
# make a new client, assume id and secret are in the env
pmp = PMP::Client.new(client_id: client_id, client_secret: client_secret, endpoint: endpoint)
+puts "\n\nSetup complete: pmp client: #{pmp.inspect}\n\n"
+# ------------------------------------------------------------------------------
+# Step 0: Clean up any old data from prior runs
+# ------------------------------------------------------------------------------
+delete_count = 0
+pmp.query["urn:pmp:query:docs"].where(tag: 'pmp_example_permissions', limit: 100).items.each{|i| i.delete; delete_count+=1 }
+puts "\n\nStep 0 complete: deleted #{delete_count}\n\n"
+exit 1 if ARGV[0] == 'delete-only'
# ------------------------------------------------------------------------------
# Step 1: Make 3 orgs that will end up with different permissions
# ------------------------------------------------------------------------------
organizations = (0..2).map do |index|
@@ -34,57 +55,89 @@
scope: 'write'
}
org.save
org
end
-puts "Step 1 complete: organizations: #{organzations.to_json}\n\n"
+puts "\n\nStep 1 complete: organizations: #{pretty_json(organizations.to_json)}\n\n"
-
# ------------------------------------------------------------------------------
# Step 2: Make 4 permission groups, 0:[0,1], 1:[0], 2:[1], and an empty group 3:[]
# ------------------------------------------------------------------------------
group_orgs = [ [0,1], [0], [1], [] ]
permission_groups = group_orgs.collect do |orgs|
group = pmp.doc_of_type('group')
group.tags = ['pmp_example_permissions']
group.title = "pmp ruby example, permissions: permission group #{orgs.inspect}"
- group.links['item'] = orgs.map{|o| PMP::Link(href: organization[o].href)} if (orgs.size > 0)
+ group.links['item'] = orgs.map{|o| PMP::Link.new(href: organizations[o].href)} if (orgs.size > 0)
group.save
group
end
+puts "\n\nStep 2 complete: permission_groups: #{pretty_json(permission_groups.to_json)}\n\n"
-puts "Step 2 complete: permission_groups: #{permission_groups.to_json}\n\n"
-
# ------------------------------------------------------------------------------
# Step 3: Make docs to be protected
# ------------------------------------------------------------------------------
documents = (0..3).collect do |index|
doc = pmp.doc_of_type('story')
- doc.tags = ['pmp_example_permissions']
+ doc.tags = ['pmp_example_permissions', 'pmp_example_permissions_test_doc']
doc.title = "pmp ruby example, permissions: story #{index}"
+ doc
end
-documents[0].links['permission'] = { href: permission_groups[0].href, operation: 'read' }
+documents[0].links['permission'] = PMP::Link.new(href: permission_groups[0].href, operation: 'read')
documents[1].links['permission'] = [
- {
+ PMP::Link.new(
href: permission_groups[2].href,
operation: 'read',
blacklist: true
- },
- {
+ ),
+ PMP::Link.new(
href: permission_groups[1].href,
operation: 'read'
- },
+ ),
]
-documents[3].links['permission'] = { href: permission_groups[3].href, operation: 'read' }
+documents[3].links['permission'] = PMP::Link.new(href: permission_groups[3].href, operation: 'read')
documents.each{|d| d.save }
+puts "\n\nStep 3 complete: documents: #{pretty_json(documents.to_json)}\n\n"
# ------------------------------------------------------------------------------
-# Step 4: Make credentials for each org
+# Step 4: Make credentials and clients for each org
# ------------------------------------------------------------------------------
credentials = organizations.map do |org|
- pmp.credentials.create(user: org.auth['user'], password: org.auth['password'])
+ puts "create credentials for org: #{org.auth}"
+ pmp.credentials(user: org.auth[:user], password: org.auth[:password]).create
end
+
+waiting(5)
+
+clients = credentials.map do |creds|
+ PMP::Client.new(client_id: creds['client_id'], client_secret: creds['client_secret'], endpoint: endpoint)
+end
+puts "\n\nStep 4 complete: credentials: #{pretty_json(credentials.to_json)}\n\n"
+
+# ------------------------------------------------------------------------------
+# Step 5: Test doc visibility!
+# ------------------------------------------------------------------------------
+puts "\n\nStep 5: TEST TIME!\n\n"
+results = (0..2).collect do |index|
+ expected_size = (3 - index)
+ puts "org #{index} should retrieve #{expected_size} items"
+
+ puts "org #{index} got token: #{clients[index].token.token}"
+ waiting(5)
+
+ result = clients[index].query["urn:pmp:query:docs"].where(tag: 'pmp_example_permissions_test_doc').retrieve
+ actual_size = result.items.size
+ msg = (actual_size == expected_size) ? "SUCCESS" : "FAIL"
+ puts "#{msg}: org #{index} retrieved #{actual_size} items, expected #{expected_size}.\n"
+ puts "retrieved: #{pretty_json(result.to_json)}\n\n"
+
+ result
+end
+
+puts "\n\nStep 5 complete, all done!\n\n"
+
+exit 1