Skip to content

Commit

Permalink
Add Stripe Account policy
Browse files Browse the repository at this point in the history
  • Loading branch information
amyschools authored and joshsmith committed Nov 20, 2016
1 parent c6cc27a commit e0de53b
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/code_corps/helpers/policy.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ defmodule CodeCorps.Helpers.Policy do

import Ecto.Query

alias CodeCorps.{Organization, OrganizationMembership, Project, Repo, User}
alias CodeCorps.{Organization, OrganizationMembership, Project, Repo, StripeAccount, User}
alias Ecto.Changeset

@doc """
Expand All @@ -24,6 +24,7 @@ defmodule CodeCorps.Helpers.Policy do
|> where([m], m.member_id == ^user_id and m.organization_id == ^organization_id)
|> Repo.one
end
def get_membership(%StripeAccount{organization_id: organization_id}, %User{id: user_id}), do: do_get_membership(organization_id, user_id)

@doc """
Retrieves a project record, from a model struct, or an `Ecto.Changeset` containing a `project_id` field
Expand Down
64 changes: 64 additions & 0 deletions test/policies/stripe_account_policy_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
defmodule CodeCorps.StripeAccountPolicyTest do
use CodeCorps.PolicyCase

import CodeCorps.StripeAccount
import CodeCorps.StripeAccountPolicy, only: [show?: 2]

alias CodeCorps.StripeAccount

describe "show?" do
test "returns true when user is an admin" do
user = build(:user, admin: true)
stripe_account = insert(:stripe_account)

assert show?(user, stripe_account)
end

test "returns true when user is owner of organization" do
user = insert(:user)
organization = insert(:organization)
insert(:organization_membership, role: "owner", member: user, organization: organization)

stripe_account = insert(:stripe_account, organization: organization)

assert show?(user, stripe_account)
end

test "returns false when user is admin of organization" do
user = insert(:user)
organization = insert(:organization)
insert(:organization_membership, role: "admin", member: user)

stripe_account = insert(:stripe_account, organization: organization)

refute show?(user, stripe_account)
end

test "returns false when user is not member of organization" do
user = insert(:user)
stripe_account = insert(:stripe_account)

refute show?(user, stripe_account)
end

test "returns false when user is pending member of organization" do
user = insert(:user)
organization = insert(:organization)
insert(:organization_membership, role: "pending", member: user)

stripe_account = insert(:stripe_account, organization: organization)

refute show?(user, stripe_account)
end

test "returns false when user is contributor of organization" do
user = insert(:user)
organization = insert(:organization)
insert(:organization_membership, role: "contributor", member: user)

stripe_account = insert(:stripe_account, organization: organization)

refute show?(user, stripe_account)
end
end
end
7 changes: 7 additions & 0 deletions test/support/factories.ex
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,13 @@ defmodule CodeCorps.Factories do
}
end

def stripe_account_factory do
%CodeCorps.StripeAccount{
id_from_stripe: sequence(:id_from_stripe, &"stripe_id_#{&1}"),
organization: build(:organization),
}
end

def stripe_customer_factory do
%CodeCorps.StripeCustomer{
created: Timex.now,
Expand Down
3 changes: 3 additions & 0 deletions web/models/abilities.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ defmodule Canary.Abilities do
alias CodeCorps.Role
alias CodeCorps.RoleSkill
alias CodeCorps.Skill
alias CodeCorps.StripeAccount
alias CodeCorps.StripeCustomer
alias CodeCorps.User
alias CodeCorps.UserCategory
Expand Down Expand Up @@ -92,6 +93,8 @@ defmodule Canary.Abilities do

def can?(%User{} = user, :create, Skill), do: SkillPolicy.create?(user)

def can?(%User{} = user, :show, %StripeAccount{}=stripe_account), do: StripeAccountPolicy.show?(user, stripe_account)

def can?(%User{} = user, :create, %Changeset{data: %StripeCustomer{}} = changeset), do: StripeCustomerPolicy.create?(user, changeset)
def can?(%User{} = user, :show, %StripeCustomer{} = stripe_customer), do: StripeCustomerPolicy.show?(user, stripe_customer)

Expand Down
13 changes: 13 additions & 0 deletions web/policies/stripe_account_policy.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
defmodule CodeCorps.StripeAccountPolicy do
import CodeCorps.Helpers.Policy,
only: [get_membership: 2, get_role: 1, owner?: 1]

alias CodeCorps.StripeAccount
alias CodeCorps.User
alias CodeCorps.OrganizationMembership
alias Ecto.Changeset

def show?(%User{admin: true}, %StripeAccount{}), do: true
def show?(%User{} = user, %StripeAccount{} = stripe_account), do: stripe_account |> get_membership(user) |> get_role |> owner?
def show?(%User{}, %StripeAccount{}), do: false
end

0 comments on commit e0de53b

Please sign in to comment.