Skip to content

Commit 0409bfa

Browse files
committed
Added user_roles migration, model, endpoint.
Also added a tag to add to all endpoints that require secret env variables be ignored in tests by default. To run all tests, including those which interface with secret env vars, run 'mix test --include requires_env' Also added user_role_view_test, user_view_test, and preloaded roles relationship on all user endpoints. Endpoint issue: #40 Contributes to #109 (exclude tests that rely on ENV vars)
1 parent 6d1218c commit 0409bfa

21 files changed

Lines changed: 338 additions & 5 deletions
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule CodeCorps.Repo.Migrations.CreateUserRole do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:user_roles) do
6+
add :user_id, references(:users, on_delete: :nothing)
7+
add :role_id, references(:roles, on_delete: :nothing)
8+
9+
timestamps()
10+
end
11+
12+
create index(:user_roles, [:user_id, :role_id], unique: true)
13+
end
14+
end

test/controllers/organization_controller_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ defmodule CodeCorps.OrganizationControllerTest do
7474
assert organization.id == slugged_route.organization_id
7575
end
7676

77+
@tag :requires_env
7778
test "uploads a icon to S3", %{conn: conn} do
7879
organization = insert_organization()
7980
icon_data = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="

test/controllers/project_controller_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ defmodule CodeCorps.ProjectControllerTest do
133133
assert project.organization_id == organization.id
134134
end
135135

136+
@tag :requires_env
136137
test "uploads a icon to S3", %{conn: conn} do
137138
project = insert_project()
138139
icon_data = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="

test/controllers/user_controller_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ defmodule CodeCorps.UserControllerTest do
126126
assert user.biography == "Just a test user"
127127
end
128128

129+
@tag :requires_env
129130
test "uploads a photo to S3", %{conn: conn} do
130131
user = insert_user()
131132
photo_data = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
defmodule CodeCorps.UserRoleControllerTest do
2+
use CodeCorps.ConnCase
3+
4+
alias CodeCorps.UserRole
5+
alias CodeCorps.Repo
6+
7+
setup do
8+
conn =
9+
%{build_conn | host: "api."}
10+
|> put_req_header("accept", "application/vnd.api+json")
11+
|> put_req_header("content-type", "application/vnd.api+json")
12+
13+
{:ok, conn: conn}
14+
end
15+
16+
defp attributes do
17+
%{}
18+
end
19+
20+
defp relationships(user, role) do
21+
%{
22+
user: %{data: %{id: user.id}},
23+
role: %{data: %{id: role.id}}
24+
}
25+
end
26+
27+
test "creates and renders resource when data is valid", %{conn: conn} do
28+
user = insert_user(%{email: "test-user@mail.com"})
29+
role = insert_role(%{title: "test-role"})
30+
31+
conn = post conn, user_role_path(conn, :create), %{
32+
"meta" => %{},
33+
"data" => %{
34+
"type" => "user-role",
35+
"attributes" => attributes,
36+
"relationships" => relationships(user, role)
37+
}
38+
}
39+
40+
json = json_response(conn, 201)
41+
42+
id = json["data"]["id"] |> String.to_integer
43+
user_role = UserRole |> Repo.get!(id)
44+
45+
assert json["data"]["id"] == "#{user_role.id}"
46+
assert json["data"]["type"] == "user-role"
47+
assert json["data"]["relationships"]["user"]["data"]["id"] == "#{user.id}"
48+
assert json["data"]["relationships"]["role"]["data"]["id"] == "#{role.id}"
49+
end
50+
51+
test "does not create resource and renders errors when data is invalid", %{conn: conn} do
52+
conn = post conn, user_role_path(conn, :create), %{
53+
"meta" => %{},
54+
"data" => %{
55+
"type" => "user-role",
56+
"attributes" => attributes,
57+
}
58+
}
59+
60+
assert json_response(conn, 422)["errors"] != %{}
61+
end
62+
63+
test "deletes resource", %{conn: conn} do
64+
role = insert_role(%{title: "test-role"})
65+
user = insert_user(%{email: "test-user@mail.com"})
66+
user_role = insert_user_role(%{user_id: user.id, role_id: role.id})
67+
response = delete conn, user_role_path(conn, :delete, user_role)
68+
69+
assert response.status == 204
70+
end
71+
end

test/models/organization_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ defmodule CodeCorps.OrganizationTest do
1616
refute changeset.valid?
1717
end
1818

19+
@tag :requires_env
1920
test "uploads base64icon data to aws" do
2021
# 1x1 black pixel gif
2122
icon_data = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="

test/models/project_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ defmodule CodeCorps.ProjectTest do
3939
refute changeset.valid?
4040
end
4141

42+
@tag :requires_env
4243
test "uploads base64icon data to aws" do
4344
# 1x1 black pixel gif
4445
icon_data = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="

test/models/user_role_test.exs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
defmodule CodeCorps.UserRoleTest do
2+
use CodeCorps.ModelCase
3+
4+
alias CodeCorps.UserRole
5+
6+
test "valid_changeset_is_valid" do
7+
user_id = insert_user().id
8+
role_id = insert_role().id
9+
10+
changeset = UserRole.changeset(%UserRole{}, %{user_id: user_id, role_id: role_id})
11+
assert changeset.valid?
12+
end
13+
14+
test "changeset requires user_id" do
15+
role_id = insert_role().id
16+
17+
changeset = UserRole.changeset(%UserRole{}, %{role_id: role_id})
18+
19+
refute changeset.valid?
20+
assert changeset.errors[:user_id] == {"can't be blank", []}
21+
end
22+
23+
test "changeset requires role_id" do
24+
user_id = insert_user().id
25+
26+
changeset = UserRole.changeset(%UserRole{}, %{user_id: user_id})
27+
28+
refute changeset.valid?
29+
assert changeset.errors[:role_id] == {"can't be blank", []}
30+
end
31+
32+
test "changeset requires id of actual user" do
33+
user_id = -1
34+
role_id = insert_role().id
35+
36+
{ result, changeset } =
37+
UserRole.changeset(%UserRole{}, %{user_id: user_id, role_id: role_id})
38+
|> Repo.insert
39+
40+
assert result == :error
41+
refute changeset.valid?
42+
assert changeset.errors[:user] == {"does not exist", []}
43+
end
44+
45+
test "changeset requires id of actual role" do
46+
user_id = insert_user().id
47+
role_id = -1
48+
49+
{ result, changeset } =
50+
UserRole.changeset(%UserRole{}, %{user_id: user_id, role_id: role_id})
51+
|> Repo.insert
52+
53+
assert result == :error
54+
refute changeset.valid?
55+
assert changeset.errors[:role] == {"does not exist", []}
56+
end
57+
end

test/models/user_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ defmodule CodeCorps.UserTest do
9898
refute Map.has_key?(changeset.changes, :website)
9999
end
100100

101+
@tag :requires_env
101102
test "uploads base64photo data to aws" do
102103
# 1x1 black pixel gif
103104
photo_data = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="

test/support/factories.ex

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,21 @@ defmodule CodeCorps.Factories do
1010
}
1111
end
1212

13+
def user_role_factory do
14+
%CodeCorps.UserRole{
15+
user: build(:user),
16+
role: build(:role)
17+
}
18+
end
19+
20+
def role_factory do
21+
%CodeCorps.Role{
22+
name: sequence(:name, &"Role #{&1}"),
23+
ability: sequence(:ability, &"Ability for role #{&1}"),
24+
kind: sequence(:kind, &"Kind for role #{&1}")
25+
}
26+
end
27+
1328
def organization_factory do
1429
%CodeCorps.Organization{
1530
name: sequence(:username, &"Organization #{&1}"),

0 commit comments

Comments
 (0)