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
16 changes: 16 additions & 0 deletions priv/repo/migrations/20170201035458_create_user_task.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
defmodule CodeCorps.Repo.Migrations.CreateUserTask do
@moduledoc false

use Ecto.Migration

def change do
create table(:user_tasks) do
add :task_id, references(:tasks), null: false
add :user_id, references(:users), null: false

timestamps()
end

create index :user_tasks, [:user_id, :task_id], unique: true
end
end
142 changes: 141 additions & 1 deletion priv/repo/structure.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,38 @@ CREATE SEQUENCE task_lists_id_seq
ALTER SEQUENCE task_lists_id_seq OWNED BY task_lists.id;


--
-- Name: task_skills; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE task_skills (
id integer NOT NULL,
skill_id integer NOT NULL,
task_id integer NOT NULL,
inserted_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL
);


--
-- Name: task_skills_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

CREATE SEQUENCE task_skills_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;


--
-- Name: task_skills_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--

ALTER SEQUENCE task_skills_id_seq OWNED BY task_skills.id;


--
-- Name: tasks; Type: TABLE; Schema: public; Owner: -
--
Expand Down Expand Up @@ -1199,6 +1231,38 @@ CREATE SEQUENCE user_skills_id_seq
ALTER SEQUENCE user_skills_id_seq OWNED BY user_skills.id;


--
-- Name: user_tasks; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE user_tasks (
id integer NOT NULL,
task_id integer NOT NULL,
user_id integer NOT NULL,
inserted_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL
);


--
-- Name: user_tasks_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

CREATE SEQUENCE user_tasks_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;


--
-- Name: user_tasks_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--

ALTER SEQUENCE user_tasks_id_seq OWNED BY user_tasks.id;


--
-- Name: users; Type: TABLE; Schema: public; Owner: -
--
Expand Down Expand Up @@ -1422,6 +1486,13 @@ ALTER TABLE ONLY stripe_platform_customers ALTER COLUMN id SET DEFAULT nextval('
ALTER TABLE ONLY task_lists ALTER COLUMN id SET DEFAULT nextval('task_lists_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--

ALTER TABLE ONLY task_skills ALTER COLUMN id SET DEFAULT nextval('task_skills_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
Expand Down Expand Up @@ -1450,6 +1521,13 @@ ALTER TABLE ONLY user_roles ALTER COLUMN id SET DEFAULT nextval('user_roles_id_s
ALTER TABLE ONLY user_skills ALTER COLUMN id SET DEFAULT nextval('user_skills_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_tasks ALTER COLUMN id SET DEFAULT nextval('user_tasks_id_seq'::regclass);


--
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
--
Expand Down Expand Up @@ -1633,6 +1711,14 @@ ALTER TABLE ONLY task_lists
ADD CONSTRAINT task_lists_pkey PRIMARY KEY (id);


--
-- Name: task_skills_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY task_skills
ADD CONSTRAINT task_skills_pkey PRIMARY KEY (id);


--
-- Name: user_categories_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
Expand All @@ -1657,6 +1743,14 @@ ALTER TABLE ONLY user_skills
ADD CONSTRAINT user_skills_pkey PRIMARY KEY (id);


--
-- Name: user_tasks_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_tasks
ADD CONSTRAINT user_tasks_pkey PRIMARY KEY (id);


--
-- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
Expand Down Expand Up @@ -1966,6 +2060,13 @@ CREATE UNIQUE INDEX stripe_platform_customers_user_id_index ON stripe_platform_c
CREATE INDEX task_lists_project_id_index ON task_lists USING btree (project_id);


--
-- Name: task_skills_task_id_skill_id_index; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX task_skills_task_id_skill_id_index ON task_skills USING btree (task_id, skill_id);


--
-- Name: tasks_number_project_id_index; Type: INDEX; Schema: public; Owner: -
--
Expand Down Expand Up @@ -2008,6 +2109,13 @@ CREATE UNIQUE INDEX user_categories_user_id_category_id_index ON user_categories
CREATE UNIQUE INDEX user_roles_user_id_role_id_index ON user_roles USING btree (user_id, role_id);


--
-- Name: user_tasks_user_id_task_id_index; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX user_tasks_user_id_task_id_index ON user_tasks USING btree (user_id, task_id);


--
-- Name: users_email_index; Type: INDEX; Schema: public; Owner: -
--
Expand Down Expand Up @@ -2301,6 +2409,22 @@ ALTER TABLE ONLY task_lists
ADD CONSTRAINT task_lists_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects(id);


--
-- Name: task_skills_skill_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY task_skills
ADD CONSTRAINT task_skills_skill_id_fkey FOREIGN KEY (skill_id) REFERENCES skills(id);


--
-- Name: task_skills_task_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY task_skills
ADD CONSTRAINT task_skills_task_id_fkey FOREIGN KEY (task_id) REFERENCES tasks(id);


--
-- Name: tasks_project_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
Expand Down Expand Up @@ -2373,9 +2497,25 @@ ALTER TABLE ONLY user_skills
ADD CONSTRAINT user_skills_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);


--
-- Name: user_tasks_task_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_tasks
ADD CONSTRAINT user_tasks_task_id_fkey FOREIGN KEY (task_id) REFERENCES tasks(id);


--
-- Name: user_tasks_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY user_tasks
ADD CONSTRAINT user_tasks_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id);


--
-- PostgreSQL database dump complete
--

INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100);
INSERT INTO "schema_migrations" (version) VALUES (20160723215749), (20160804000000), (20160804001111), (20160805132301), (20160805203929), (20160808143454), (20160809214736), (20160810124357), (20160815125009), (20160815143002), (20160816020347), (20160816034021), (20160817220118), (20160818000944), (20160818132546), (20160820113856), (20160820164905), (20160822002438), (20160822004056), (20160822011624), (20160822020401), (20160822044612), (20160830081224), (20160830224802), (20160911233738), (20160912002705), (20160912145957), (20160918003206), (20160928232404), (20161003185918), (20161019090945), (20161019110737), (20161020144622), (20161021131026), (20161031001615), (20161121005339), (20161121014050), (20161121043941), (20161121045709), (20161122015942), (20161123081114), (20161123150943), (20161124085742), (20161125200620), (20161126045705), (20161127054559), (20161205024856), (20161207112519), (20161209192504), (20161212005641), (20161214005935), (20161215052051), (20161216051447), (20161218005913), (20161219160401), (20161219163909), (20161220141753), (20161221085759), (20161226213600), (20161231063614), (20170102130055), (20170102181053), (20170104113708), (20170104212623), (20170104235423), (20170106013143), (20170115035159), (20170115230549), (20170121014100), (20170131234029), (20170201035458);

101 changes: 101 additions & 0 deletions test/controllers/user_task_controller_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
defmodule CodeCorps.UserTaskControllerTest do
@moduledoc false

use CodeCorps.ApiCase, resource_name: :user_task

describe "index" do
test "lists all entries on index", %{conn: conn} do
[user_task_1, user_task_2] = insert_pair(:user_task)

conn
|> request_index
|> json_response(200)
|> assert_ids_from_response([user_task_1.id, user_task_2.id])
end

test "filters resources on index", %{conn: conn} do
[user_task_1, user_task_2 | _] = insert_list(3, :user_task)

path = "user-tasks/?filter[id]=#{user_task_1.id},#{user_task_2.id}"

conn
|> get(path)
|> json_response(200)
|> assert_ids_from_response([user_task_1.id, user_task_2.id])
end
end

describe "show" do
test "shows chosen resource", %{conn: conn} do
user = insert(:user)
task = insert(:task)
user_task = insert(:user_task, task: task, user: user)

conn
|> request_show(user_task)
|> json_response(200)
|> Map.get("data")
|> assert_result_id(user_task.id)
end

test "renders 404 error when id is nonexistent", %{conn: conn} do
assert conn |> request_show(:not_found) |> json_response(404)
end
end

describe "create" do
@tag :authenticated
test "creates and renders resource when data is valid", %{conn: conn, current_user: current_user} do
task = insert(:task, user: current_user)
user = insert(:user)

attrs = %{task: task, user: user}
assert conn |> request_create(attrs) |> json_response(201)
end

@tag :authenticated
test "renders 422 error when data is invalid", %{conn: conn, current_user: current_user} do
task = insert(:task, user: current_user)

invalid_attrs = %{task: task, user: nil}
assert conn |> request_create(invalid_attrs) |> json_response(422)
end

test "renders 401 when unauthenticated", %{conn: conn} do
assert conn |> request_create |> json_response(401)
end

@tag :authenticated
test "renders 403 when not authorized", %{conn: conn} do
task = insert(:task)
user = insert(:user)
attrs = %{task: task, user: user}

assert conn |> request_create(attrs) |> json_response(403)
end
end

describe "delete" do
@tag :authenticated
test "deletes chosen resource", %{conn: conn, current_user: current_user} do
task = insert(:task, user: current_user)
user_task = insert(:user_task, task: task)

assert conn |> request_delete(user_task) |> response(204)
end

test "renders 401 when unauthenticated", %{conn: conn} do
assert conn |> request_delete |> json_response(401)
end

@tag :authenticated
test "renders 403 when not authorized", %{conn: conn} do
assert conn |> request_delete |> json_response(403)
end

@tag :authenticated
test "renders 404 when id is nonexistent on delete", %{conn: conn} do
assert conn |> request_delete(:not_found) |> json_response(404)
end
end
end
43 changes: 43 additions & 0 deletions test/models/user_task_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
defmodule CodeCorps.UserTaskTest do
@moduledoc false

use CodeCorps.ModelCase

alias CodeCorps.UserTask

describe "create_changeset/2" do
@required_attrs ~w(task_id user_id)

test "requires #{@required_attrs}" do
changeset = UserTask.create_changeset(%UserTask{}, %{})

assert_validation_triggered(changeset, :task_id, :required)
assert_validation_triggered(changeset, :user_id, :required)
end

test "ensures associated Task record exists" do
user = insert(:user)
changeset = UserTask.create_changeset(%UserTask{}, %{task_id: -1, user_id: user.id})

{:error, response_changeset} = Repo.insert(changeset)
assert_error_message(response_changeset, :task, "does not exist")
end

test "ensures associated User record exists" do
task = insert(:task)
changeset = UserTask.create_changeset(%UserTask{}, %{task_id: task.id, user_id: -1})

{:error, response_changeset} = Repo.insert(changeset)
assert_error_message(response_changeset, :user, "does not exist")
end

test "ensures uniqueness of User/Task combination" do
user_task = insert(:user_task)

changeset = UserTask.create_changeset(%UserTask{}, %{task_id: user_task.task_id, user_id: user_task.user_id})

{:error, response_changeset} = Repo.insert(changeset)
assert_error_message(response_changeset, :user, "has already been taken")
end
end
end
Loading