Skip to content

Commit

Permalink
add Credential code following running of "mix phx.gen.context Account…
Browse files Browse the repository at this point in the history
…s Credential ..." on p.73 for #55
  • Loading branch information
nelsonic committed Jan 23, 2019
1 parent e68897b commit 55dd640
Show file tree
Hide file tree
Showing 4 changed files with 199 additions and 0 deletions.
96 changes: 96 additions & 0 deletions rumbl/lib/rumbl/accounts/accounts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
21 changes: 21 additions & 0 deletions rumbl/lib/rumbl/accounts/credential.ex
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions rumbl/priv/repo/migrations/20190123175540_create_credentials.exs
Original file line number Diff line number Diff line change
@@ -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
66 changes: 66 additions & 0 deletions rumbl/test/rumbl/accounts/accounts_test.exs
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 55dd640

Please sign in to comment.