From 0e30023f5da6a349e05bd76267c49650898725b3 Mon Sep 17 00:00:00 2001 From: snewcomer24 Date: Wed, 20 Dec 2017 08:10:58 -0800 Subject: [PATCH] Add part_type to conversation_part --- lib/code_corps/messages/conversation_parts.ex | 10 ++++-- lib/code_corps/model/conversation_part.ex | 1 + ...20154922_add_part_type_to_conversation.exs | 9 +++++ .../messages/conversation_parts_test.exs | 36 +++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 priv/repo/migrations/20171220154922_add_part_type_to_conversation.exs diff --git a/lib/code_corps/messages/conversation_parts.ex b/lib/code_corps/messages/conversation_parts.ex index 3d1b047a5..dfbccc534 100644 --- a/lib/code_corps/messages/conversation_parts.ex +++ b/lib/code_corps/messages/conversation_parts.ex @@ -4,7 +4,8 @@ defmodule CodeCorps.Messages.ConversationParts do i.e. a reply to the `CodeCorps.Conversation` by any participant. """ - import Ecto.Changeset, only: [assoc_constraint: 2, cast: 3, validate_required: 2] + import Ecto.Changeset, only: [assoc_constraint: 2, cast: 3, validate_required: 2, + validate_inclusion: 3] alias CodeCorps.{ ConversationPart, @@ -24,9 +25,14 @@ defmodule CodeCorps.Messages.ConversationParts do @spec create_changeset(ConversationPart.t, map) :: Ecto.Changeset.t def create_changeset(%ConversationPart{} = conversation_part, attrs) do conversation_part - |> cast(attrs, [:author_id, :body, :conversation_id]) + |> cast(attrs, [:author_id, :body, :conversation_id, :part_type]) |> validate_required([:author_id, :body, :conversation_id]) + |> validate_inclusion(:part_type, part_types()) |> assoc_constraint(:author) |> assoc_constraint(:conversation) end + + defp part_types do + ~w{ closed comment note reopened } + end end diff --git a/lib/code_corps/model/conversation_part.ex b/lib/code_corps/model/conversation_part.ex index 02e92cd85..49172226f 100644 --- a/lib/code_corps/model/conversation_part.ex +++ b/lib/code_corps/model/conversation_part.ex @@ -19,6 +19,7 @@ defmodule CodeCorps.ConversationPart do schema "conversation_parts" do field :body, :string, null: false field :read_at, :utc_datetime, null: true + field :part_type, :string, default: "comment" belongs_to :author, CodeCorps.User belongs_to :conversation, CodeCorps.Conversation diff --git a/priv/repo/migrations/20171220154922_add_part_type_to_conversation.exs b/priv/repo/migrations/20171220154922_add_part_type_to_conversation.exs new file mode 100644 index 000000000..de58cbb1a --- /dev/null +++ b/priv/repo/migrations/20171220154922_add_part_type_to_conversation.exs @@ -0,0 +1,9 @@ +defmodule CodeCorps.Repo.Migrations.AddPartTypeToConversation do + use Ecto.Migration + + def change do + alter table(:conversation_parts) do + add :part_type, :string, default: "comment" + end + end +end diff --git a/test/lib/code_corps/messages/conversation_parts_test.exs b/test/lib/code_corps/messages/conversation_parts_test.exs index 947e20493..c70982d6f 100644 --- a/test/lib/code_corps/messages/conversation_parts_test.exs +++ b/test/lib/code_corps/messages/conversation_parts_test.exs @@ -13,9 +13,45 @@ defmodule CodeCorps.Messages.ConversationPartsTest do describe "create_changeset/2" do test "with valid attributes" do + user_id = insert(:user, id: 1).id + insert(:conversation, id: 1) attrs = @valid_attrs |> Map.merge(%{author_id: 1, conversation_id: 1}) + {:ok, conversation} = ConversationParts.create_changeset(%ConversationPart{}, attrs) |> Repo.insert + assert conversation.body == "Test body." + assert conversation.part_type == "comment" + assert conversation.author_id == user_id + end + + test "validates part_type inclusion: note" do + insert(:user, id: 1) + insert(:conversation, id: 1) + attrs = @valid_attrs |> Map.merge(%{author_id: 1, conversation_id: 1, part_type: "note"}) + changeset = ConversationParts.create_changeset(%ConversationPart{}, attrs) + assert changeset.valid? + assert changeset.changes.part_type == "note" + end + + test "validates part_type inclusion: reopened" do + attrs = @valid_attrs |> Map.merge(%{author_id: 1, conversation_id: 1, part_type: "reopened"}) changeset = ConversationParts.create_changeset(%ConversationPart{}, attrs) assert changeset.valid? + assert changeset.changes.part_type == "reopened" + end + + test "validates part_type inclusion: closed" do + attrs = @valid_attrs |> Map.merge(%{author_id: 1, conversation_id: 1, part_type: "closed"}) + changeset = ConversationParts.create_changeset(%ConversationPart{}, attrs) + assert changeset.valid? + assert changeset.changes.part_type == "closed" + end + + test "validates part_type inclusion: wat" do + insert(:user, id: 1) + insert(:conversation, id: 1) + attrs = @valid_attrs |> Map.merge(%{author_id: 1, conversation_id: 1, part_type: "wat"}) + changeset = ConversationParts.create_changeset(%ConversationPart{}, attrs) + refute changeset.valid? + assert_error_message(changeset, :part_type, "is invalid") end test "requires author_id" do