Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 98 additions & 32 deletions test/controllers/organization_memberships_controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,6 @@ defmodule CodeCorps.OrganizationMembershipControllerTest do
alias CodeCorps.Organization
alias CodeCorps.User

def filter_params(records) do
ids =
records
|> Enum.map(fn(r) -> r.id end)
|> Enum.join(",")

%{filter: %{id: ids}}
end

setup do
conn =
%{build_conn | host: "api."}
Expand All @@ -23,36 +14,111 @@ defmodule CodeCorps.OrganizationMembershipControllerTest do
{:ok, conn: conn}
end

test "filters resources on index", %{conn: conn} do
membership_1 = insert(:organization_membership)
membership_2 = insert(:organization_membership)
insert(:organization_membership)
describe "index" do
test "lists all resources", %{conn: conn} do
membership_1 = insert(:organization_membership)
membership_2 = insert(:organization_membership)

params = filter_params([membership_1, membership_2])
path = conn |> organization_membership_path(:index)
path = conn |> organization_membership_path(:index)

data = conn |> get(path, params) |> json_response(200) |> Map.get("data")
assert data |> length == 2
data = conn |> get(path) |> json_response(200) |> Map.get("data")
assert data |> length == 2

[first_result, second_result] = data
assert first_result["id"] == "#{membership_1.id}"
assert second_result["id"] == "#{membership_2.id}"
end
[first_result, second_result] = data
assert first_result["id"] == "#{membership_1.id}"
assert second_result["id"] == "#{membership_2.id}"
end

test "lists all resources for specified organization", %{conn: conn} do
organization = insert(:organization)
membership_1 = insert(:organization_membership, organization: organization)
membership_2 = insert(:organization_membership, organization: organization)
insert(:organization_membership)
test "lists all resources for specified organization", %{conn: conn} do
organization = insert(:organization)
membership_1 = insert(:organization_membership, organization: organization)
membership_2 = insert(:organization_membership, organization: organization)
insert(:organization_membership)

path = conn |> organization_organization_membership_path(:index, organization)
path = conn |> organization_organization_membership_path(:index, organization)

data = conn |> get(path) |> json_response(200) |> Map.get("data")
assert data |> length == 2
data = conn |> get(path) |> json_response(200) |> Map.get("data")
assert data |> length == 2

[first_result, second_result] = data
assert first_result["id"] == "#{membership_1.id}"
assert second_result["id"] == "#{membership_2.id}"
end

test "filters resources by member id", %{conn: conn} do
member_1 = insert(:user)
member_2 = insert(:user)
member_3 = insert(:user)
membership_1 = insert(:organization_membership, member: member_1)
membership_2 = insert(:organization_membership, member: member_2)
insert(:organization_membership, member: member_3)

params = %{"filter" => %{"id" => "#{member_1.id},#{member_2.id}"}}
path = conn |> organization_membership_path(:index, params)
data = conn |> get(URI.decode(path)) |> json_response(200) |> Map.get("data")
assert data |> length == 2

[first_result, second_result] = data
assert first_result["id"] == "#{membership_1.id}"
assert second_result["id"] == "#{membership_2.id}"
end

test "filters resources by role", %{conn: conn} do
membership_1 = insert(:organization_membership, role: "admin")
membership_2 = insert(:organization_membership, role: "admin")
insert(:organization_membership, role: "owner")

[first_result, second_result] = data
assert first_result["id"] == "#{membership_1.id}"
assert second_result["id"] == "#{membership_2.id}"
params = %{"role" => "admin"}
path = conn |> organization_membership_path(:index, params)

data = conn |> get(path) |> json_response(200) |> Map.get("data")
assert data |> length == 2

[first_result, second_result] = data
assert first_result["id"] == "#{membership_1.id}"
assert second_result["id"] == "#{membership_2.id}"
end

test "filters resources by role and id", %{conn: conn} do
member_1 = insert(:user)
member_2 = insert(:user)
membership_1 = insert(:organization_membership, role: "admin", member: member_1)
insert(:organization_membership, role: "admin", member: member_2)
insert(:organization_membership, role: "owner")

params = %{"role" => "admin", "filter" => %{"id" => "#{member_1.id}"}}
path = conn |> organization_membership_path(:index, params)

data = conn |> get(path) |> json_response(200) |> Map.get("data")

assert data |> length == 1

[only_result] = data
assert only_result["id"] == "#{membership_1.id}"
end

test "filters resources by role and id on specific organization", %{conn: conn} do
member_1 = insert(:user)
organization = insert(:organization)
membership_1 =
insert(
:organization_membership,
organization: organization,
role: "admin",
member: member_1
)
insert(:organization_membership, organization: organization, role: "admin")
insert(:organization_membership, role: "owner")

params = %{"role" => "admin", "filter" => %{"id" => "#{member_1.id}"}}
path = conn |> organization_organization_membership_path(:index, organization)

data = conn |> get(path, params) |> json_response(200) |> Map.get("data")
assert data |> length == 1

[only_result] = data
assert only_result["id"] == "#{membership_1.id}"
end
end

test "shows chosen resource", %{conn: conn} do
Expand Down
5 changes: 5 additions & 0 deletions web/controllers/controller_helpers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,9 @@ defmodule CodeCorps.ControllerHelpers do
|> String.split(",")
|> Enum.map(&String.to_integer(&1))
end

def coalesce_string(string) do
string
|> String.split(",")
end
end
17 changes: 2 additions & 15 deletions web/controllers/organization_membership_controller.ex
Original file line number Diff line number Diff line change
@@ -1,34 +1,21 @@
defmodule CodeCorps.OrganizationMembershipController do
use CodeCorps.Web, :controller

import CodeCorps.ControllerHelpers

alias JaSerializer.Params
alias CodeCorps.OrganizationMembership

plug :scrub_params, "data" when action in [:create, :update]

def index(conn, %{"filter" => %{"id" => id_list}}) do
ids = id_list |> coalesce_id_string
def index(conn, params) do
memberships =
OrganizationMembership
|> OrganizationMembership.index_filters(params)
|> preload([:organization, :member])
|> where([p], p.id in ^ids)
|> Repo.all

render(conn, "index.json-api", data: memberships)
end

def index(conn, %{"organization_id" => organization_id}) do
memberships =
OrganizationMembership
|> preload([:organization, :member])
|> where([m], m.organization_id == ^organization_id)
|> Repo.all

render(conn, "index.json-api", data: memberships)
end

def show(conn, %{"id" => id}) do
membership =
OrganizationMembership
Expand Down
21 changes: 20 additions & 1 deletion web/models/model_helpers.ex
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
defmodule CodeCorps.ModelHelpers do
import Ecto.Changeset
use CodeCorps.Web, :model

import CodeCorps.ControllerHelpers

def generate_slug(changeset, value_key, slug_key) do
case changeset do
Expand All @@ -10,4 +12,21 @@ defmodule CodeCorps.ModelHelpers do
changeset
end
end

def member_filter(query, %{"filter" => %{"id" => id_list}}) do
ids = id_list |> coalesce_id_string
query |> where([om], om.member_id in ^ids)
end
def member_filter(query, _), do: query

def organization_filter(query, %{"organization_id" => organization_id}) do
query |> where([om], om.organization_id == ^organization_id)
end
def organization_filter(query, _), do: query

def role_filter(query, %{"role" => roles}) do
roles = roles |> coalesce_string
query |> where([om], om.role in ^roles)
end
def role_filter(query, _), do: query
end
9 changes: 9 additions & 0 deletions web/models/organization_membership.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ defmodule CodeCorps.OrganizationMembership do

use CodeCorps.Web, :model

import CodeCorps.ModelHelpers

alias CodeCorps.Organization
alias CodeCorps.User

Expand Down Expand Up @@ -47,6 +49,13 @@ defmodule CodeCorps.OrganizationMembership do
|> changeset(params)
end

def index_filters(query, params) do
query
|> organization_filter(params)
|> role_filter(params)
|> member_filter(params)
end

defp roles do
~w{ pending contributor admin owner }
end
Expand Down