From 55dd64087d922b24b9818a82b172048285f364fe Mon Sep 17 00:00:00 2001 From: nelsonic Date: Wed, 23 Jan 2019 17:59:47 +0000 Subject: [PATCH] add Credential code following running of "mix phx.gen.context Accounts Credential ..." on p.73 for #55 --- rumbl/lib/rumbl/accounts/accounts.ex | 96 +++++++++++++++++++ rumbl/lib/rumbl/accounts/credential.ex | 21 ++++ .../20190123175540_create_credentials.exs | 16 ++++ rumbl/test/rumbl/accounts/accounts_test.exs | 66 +++++++++++++ 4 files changed, 199 insertions(+) create mode 100644 rumbl/lib/rumbl/accounts/credential.ex create mode 100644 rumbl/priv/repo/migrations/20190123175540_create_credentials.exs create mode 100644 rumbl/test/rumbl/accounts/accounts_test.exs diff --git a/rumbl/lib/rumbl/accounts/accounts.ex b/rumbl/lib/rumbl/accounts/accounts.ex index 86bc0ea..c93d973 100644 --- a/rumbl/lib/rumbl/accounts/accounts.ex +++ b/rumbl/lib/rumbl/accounts/accounts.ex @@ -33,4 +33,100 @@ defmodule Rumbl.Accounts do |> Repo.insert() end + + alias Rumbl.Accounts.Credential + + @doc """ + Returns the list of credentials. + + ## Examples + + iex> list_credentials() + [%Credential{}, ...] + + """ + def list_credentials do + Repo.all(Credential) + end + + @doc """ + Gets a single credential. + + Raises `Ecto.NoResultsError` if the Credential does not exist. + + ## Examples + + iex> get_credential!(123) + %Credential{} + + iex> get_credential!(456) + ** (Ecto.NoResultsError) + + """ + def get_credential!(id), do: Repo.get!(Credential, id) + + @doc """ + Creates a credential. + + ## Examples + + iex> create_credential(%{field: value}) + {:ok, %Credential{}} + + iex> create_credential(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_credential(attrs \\ %{}) do + %Credential{} + |> Credential.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a credential. + + ## Examples + + iex> update_credential(credential, %{field: new_value}) + {:ok, %Credential{}} + + iex> update_credential(credential, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_credential(%Credential{} = credential, attrs) do + credential + |> Credential.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a Credential. + + ## Examples + + iex> delete_credential(credential) + {:ok, %Credential{}} + + iex> delete_credential(credential) + {:error, %Ecto.Changeset{}} + + """ + def delete_credential(%Credential{} = credential) do + Repo.delete(credential) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking credential changes. + + ## Examples + + iex> change_credential(credential) + %Ecto.Changeset{source: %Credential{}} + + """ + def change_credential(%Credential{} = credential) do + Credential.changeset(credential, %{}) + end end diff --git a/rumbl/lib/rumbl/accounts/credential.ex b/rumbl/lib/rumbl/accounts/credential.ex new file mode 100644 index 0000000..ad18c5e --- /dev/null +++ b/rumbl/lib/rumbl/accounts/credential.ex @@ -0,0 +1,21 @@ +defmodule Rumbl.Accounts.Credential do + use Ecto.Schema + import Ecto.Changeset + + + schema "credentials" do + field :email, :string + field :password_hash, :string + field :user_id, :id + + timestamps() + end + + @doc false + def changeset(credential, attrs) do + credential + |> cast(attrs, [:email, :password_hash]) + |> validate_required([:email, :password_hash]) + |> unique_constraint(:email) + end +end diff --git a/rumbl/priv/repo/migrations/20190123175540_create_credentials.exs b/rumbl/priv/repo/migrations/20190123175540_create_credentials.exs new file mode 100644 index 0000000..b66f8b9 --- /dev/null +++ b/rumbl/priv/repo/migrations/20190123175540_create_credentials.exs @@ -0,0 +1,16 @@ +defmodule Rumbl.Repo.Migrations.CreateCredentials do + use Ecto.Migration + + def change do + create table(:credentials) do + add :email, :string + add :password_hash, :string + add :user_id, references(:users, on_delete: :nothing) + + timestamps() + end + + create unique_index(:credentials, [:email]) + create index(:credentials, [:user_id]) + end +end diff --git a/rumbl/test/rumbl/accounts/accounts_test.exs b/rumbl/test/rumbl/accounts/accounts_test.exs new file mode 100644 index 0000000..3fbe5fb --- /dev/null +++ b/rumbl/test/rumbl/accounts/accounts_test.exs @@ -0,0 +1,66 @@ +defmodule Rumbl.AccountsTest do + use Rumbl.DataCase + + alias Rumbl.Accounts + + describe "credentials" do + alias Rumbl.Accounts.Credential + + @valid_attrs %{email: "some email", password_hash: "some password_hash"} + @update_attrs %{email: "some updated email", password_hash: "some updated password_hash"} + @invalid_attrs %{email: nil, password_hash: nil} + + def credential_fixture(attrs \\ %{}) do + {:ok, credential} = + attrs + |> Enum.into(@valid_attrs) + |> Accounts.create_credential() + + credential + end + + test "list_credentials/0 returns all credentials" do + credential = credential_fixture() + assert Accounts.list_credentials() == [credential] + end + + test "get_credential!/1 returns the credential with given id" do + credential = credential_fixture() + assert Accounts.get_credential!(credential.id) == credential + end + + test "create_credential/1 with valid data creates a credential" do + assert {:ok, %Credential{} = credential} = Accounts.create_credential(@valid_attrs) + assert credential.email == "some email" + assert credential.password_hash == "some password_hash" + end + + test "create_credential/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Accounts.create_credential(@invalid_attrs) + end + + test "update_credential/2 with valid data updates the credential" do + credential = credential_fixture() + assert {:ok, %Credential{} = credential} = Accounts.update_credential(credential, @update_attrs) + assert credential.email == "some updated email" + assert credential.password_hash == "some updated password_hash" + end + + test "update_credential/2 with invalid data returns error changeset" do + credential = credential_fixture() + assert {:error, %Ecto.Changeset{}} = Accounts.update_credential(credential, @invalid_attrs) + assert credential == Accounts.get_credential!(credential.id) + end + + test "delete_credential/1 deletes the credential" do + credential = credential_fixture() + assert {:ok, %Credential{}} = Accounts.delete_credential(credential) + assert_raise Ecto.NoResultsError, fn -> Accounts.get_credential!(credential.id) end + end + + test "change_credential/1 returns a credential changeset" do + credential = credential_fixture() + assert %Ecto.Changeset{} = Accounts.change_credential(credential) + end + end +end