Skip to content

Commit

Permalink
Merge pull request #1084 from projecthydra/workflow_groups
Browse files Browse the repository at this point in the history
Allow groups to be cast to Sipity::Agents
  • Loading branch information
mjgiarlo authored Nov 8, 2016
2 parents c26ae89 + 4e197c8 commit f076604
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 8 deletions.
23 changes: 23 additions & 0 deletions app/models/curation_concerns/group.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module CurationConcerns
class Group
def initialize(name)
@name = name
end

attr_reader :name

def to_sipity_agent
sipity_agent || create_sipity_agent!
end

private

def sipity_agent
Sipity::Agent.find_by(proxy_for_id: name, proxy_for_type: self.class.name)
end

def create_sipity_agent!
Sipity::Agent.create!(proxy_for_id: name, proxy_for_type: self.class.name)
end
end
end
8 changes: 5 additions & 3 deletions app/services/curation_concerns/workflow/permission_query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,11 @@ def authorized_for_processing?(user:, entity:, action:)
def scope_processing_agents_for(user:)
return Sipity::Agent.none unless user.present?
return Sipity::Agent.none unless user.persisted?
agent = PowerConverter.convert_to_sipity_agent(user)
user_constraints = Sipity::Agent.arel_table[:id].eq(agent.id)
Sipity::Agent.where(user_constraints)
user_agent = PowerConverter.convert_to_sipity_agent(user)
group_agents = user.groups.map do |g|
PowerConverter.convert_to_sipity_agent(CurationConcerns::Group.new(g))
end
Sipity::Agent.where(id: group_agents + [user_agent])
end

PermissionScope = Struct.new(:entity, :workflow)
Expand Down
15 changes: 15 additions & 0 deletions spec/models/curation_concerns/group_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
require 'spec_helper'

RSpec.describe CurationConcerns::Group do
let(:instance) { described_class.new('librarians') }
let(:other_instance) { described_class.new('librarians') }

describe "#to_sipity_agent" do
it "is a Sipity::Agent" do
expect(instance.to_sipity_agent).to be_kind_of Sipity::Agent
end
it "only creates one" do
expect(instance.to_sipity_agent).to eq other_instance.to_sipity_agent
end
end
end
18 changes: 13 additions & 5 deletions spec/services/curation_concerns/workflow/permission_query_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
module CurationConcerns
module Workflow
RSpec.describe PermissionQuery, slow_test: true, no_clean: true do
let(:reviewing_user) { FactoryGirl.create(:user) }
let(:completing_user) { FactoryGirl.create(:user) }
let(:reviewing_user) { create(:user) }
let(:completing_user) { create(:user) }
let(:workflow_config) do
{
workflows: [{
Expand Down Expand Up @@ -59,14 +59,21 @@ def expect_entities_for(user:, entities:)
end

describe 'permissions assigned at the workflow level' do
it 'will fullfil the battery of tests (of which they are nested because setup is expensive)' do
let(:reviewing_group_member) { create(:user) }
let(:reviewing_group) { Group.new('librarians') }
before do
allow(reviewing_group_member).to receive(:groups).and_return(['librarians'])
PermissionGenerator.call(roles: 'reviewing', workflow: sipity_workflow, agents: reviewing_user)
PermissionGenerator.call(roles: 'reviewing', workflow: sipity_workflow, agents: reviewing_group)
PermissionGenerator.call(roles: 'completing', workflow: sipity_workflow, agents: completing_user)
end

expect_agents_for(entity: sipity_entity, role: 'reviewing', agents: [reviewing_user])
it 'will fullfil the battery of tests (of which they are nested because setup is expensive)' do
expect_agents_for(entity: sipity_entity, role: 'reviewing', agents: [reviewing_user, reviewing_group])
expect_agents_for(entity: sipity_entity, role: 'completing', agents: [completing_user])

expect_actions_for(user: reviewing_user, entity: sipity_entity, actions: ['forward'])
expect_actions_for(user: reviewing_group_member, entity: sipity_entity, actions: ['forward'])
expect_actions_for(user: completing_user, entity: sipity_entity, actions: [])

expect_users_for(users: reviewing_user, entity: sipity_entity, roles: 'reviewing')
Expand Down Expand Up @@ -162,7 +169,8 @@ def expect_entities_for(user:, entities:)
let(:user) { create(:user) }
subject { described_class.scope_processing_agents_for(user: user) }
it 'will equal [kind_of(Sipity::Agent)]' do
is_expected.to eq([PowerConverter.convert_to_sipity_agent(user)])
is_expected.to eq([PowerConverter.convert_to_sipity_agent(user),
PowerConverter.convert_to_sipity_agent(Group.new('registered'))])
end
end
end
Expand Down

0 comments on commit f076604

Please sign in to comment.