From a8d5f7c48edc2ef8599d747e0253da994799f892 Mon Sep 17 00:00:00 2001 From: Josh Smith Date: Sun, 5 Nov 2017 16:10:58 -0800 Subject: [PATCH] Archived tasks don't need task lists or order --- lib/code_corps/model/task.ex | 20 ++++++-- test/lib/code_corps/model/task_test.exs | 68 ++++++++++++++++++++++--- 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/lib/code_corps/model/task.ex b/lib/code_corps/model/task.ex index 1025cc015..d70a83773 100644 --- a/lib/code_corps/model/task.ex +++ b/lib/code_corps/model/task.ex @@ -41,15 +41,27 @@ defmodule CodeCorps.Task do def changeset(struct, params \\ %{}) do struct - |> cast(params, [:title, :markdown, :task_list_id, :position]) - |> validate_required([:title, :task_list_id]) + |> cast(params, [:archived, :title, :markdown, :task_list_id, :position]) + |> validate_required([:title]) |> assoc_constraint(:task_list) - |> order_task() + |> handle_archived() |> MarkdownRendererService.render_markdown_to_html(:markdown, :body) end + def handle_archived(changeset) do + case get_field(changeset, :archived) do + true -> + changeset + |> put_change(:task_list_id, nil) + |> put_change(:order, nil) + _ -> + order_task(changeset) + end + end + def order_task(changeset) do changeset + |> validate_required([:task_list_id]) |> apply_position() |> set_order(:position, :order, :task_list_id) end @@ -71,7 +83,7 @@ defmodule CodeCorps.Task do def update_changeset(struct, %{} = params) do struct |> changeset(params) - |> cast(params, [:archived, :status]) + |> cast(params, [:status]) |> validate_inclusion(:status, statuses()) |> set_closed_at() |> update_modified_at() diff --git a/test/lib/code_corps/model/task_test.exs b/test/lib/code_corps/model/task_test.exs index 0a62736d5..af31a6147 100644 --- a/test/lib/code_corps/model/task_test.exs +++ b/test/lib/code_corps/model/task_test.exs @@ -16,19 +16,37 @@ defmodule CodeCorps.TaskTest do end test "renders body html from markdown" do - user = insert(:user) - project = insert(:project) - task_list = insert(:task_list) changes = Map.merge(@valid_attrs, %{ markdown: "A **strong** body", - project_id: project.id, - task_list_id: task_list.id, - user_id: user.id + project_id: 1, + task_list_id: 1, + user_id: 1 }) changeset = Task.changeset(%Task{}, changes) assert changeset.valid? assert changeset |> get_change(:body) == "

A strong body

\n" end + + test "removes the order and task list when the task is archived" do + changes = Map.put(@valid_attrs, :archived, true) + changeset = Task.update_changeset(%Task{order: 1, task_list_id: 1}, changes) + %{archived: archived, order: order, task_list_id: task_list_id} = changeset.changes + assert changeset.valid? + assert archived + refute order + refute task_list_id + end + + test "validates task list when the task is not archived and position is set" do + changes = Map.merge(@valid_attrs, %{ + position: 1, + project_id: 1, + user_id: 1 + }) + changeset = Task.changeset(%Task{}, changes) + refute changeset.valid? + assert changeset.errors[:task_list_id] + end end describe "create_changeset/2" do @@ -46,6 +64,26 @@ defmodule CodeCorps.TaskTest do {:ok, %Task{created_at: created_at, modified_at: modified_at}} = Repo.insert(changeset) assert created_at == modified_at end + + test "sets the order when the task is not archived and position is set" do + project = insert(:project) + task_list = insert(:task_list) + insert(:task, task_list: task_list, order: 1) + user = insert(:user) + changes = Map.merge(@valid_attrs, %{ + position: 1, + project_id: project.id, + task_list_id: task_list.id, + user_id: user.id + }) + changeset = Task.create_changeset(%Task{}, changes) + assert changeset.valid? + {:ok, %Task{order: order}} = Repo.insert(changeset) + + # We really want to test the order is set, but we have no good way to + # test this since the column default is `0` + assert order !== 0 + end end describe "update_changeset/2" do @@ -78,5 +116,23 @@ defmodule CodeCorps.TaskTest do assert changeset.valid? assert archived end + + test "does not reset order when task was already archived" do + project = insert(:project) + user = insert(:user) + changes = Map.merge(@valid_attrs, %{ + archived: true, + position: 1, + project_id: project.id, + user_id: user.id + }) + changeset = Task.create_changeset(%Task{}, changes) + {:ok, %Task{order: order} = task} = Repo.insert(changeset) + refute order + + changeset = Task.update_changeset(task, %{title: "New title"}) + {:ok, %Task{order: order}} = Repo.update(changeset) + refute order + end end end