Skip to content

Commit

Permalink
Test papertail versions using UUID columns
Browse files Browse the repository at this point in the history
  • Loading branch information
drapergeek committed May 25, 2017
1 parent e22cba9 commit ae834f9
Show file tree
Hide file tree
Showing 9 changed files with 151 additions and 4 deletions.
10 changes: 9 additions & 1 deletion config/test.exs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use Mix.Config

config :paper_trail, ecto_repos: [PaperTrail.Repo]
config :paper_trail, ecto_repos: [PaperTrail.Repo, PaperTrail.UUIDRepo]

config :paper_trail, repo: PaperTrail.Repo, originator: [name: :user, model: User]

Expand All @@ -11,3 +11,11 @@ config :paper_trail, PaperTrail.Repo,
database: "paper_trail_test",
hostname: "localhost",
poolsize: 10

config :paper_trail, PaperTrail.UUIDRepo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "paper_trail_uuid_test",
hostname: "localhost",
poolsize: 10
1 change: 0 additions & 1 deletion lib/version.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ defmodule PaperTrail.Version do

@setter PaperTrail.RepoClient.originator || nil

#types
@item_type Application.get_env(:paper_trail, :item_type, :integer)
@originator_type Application.get_env(:paper_trail, :originator_type, :integer)

Expand Down
12 changes: 12 additions & 0 deletions priv/uuid_repo/migrations/20170525133833_create_uuid_products.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
defmodule PaperTrail.UUIDRepo.Migrations.CreateUuidProducts do
use Ecto.Migration

def change do
create table(:products, primary_key: false) do
add :id, :binary_id, primary_key: true
add :name, :string, null: false

timestamps()
end
end
end
12 changes: 12 additions & 0 deletions priv/uuid_repo/migrations/20170525142546_create_admins.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
defmodule PaperTrail.UUIDRepo.Migrations.CreateAdmins do
use Ecto.Migration

def change do
create table(:admins, primary_key: false) do
add :id, :binary_id, primary_key: true
add :email, :string, null: false

timestamps()
end
end
end
22 changes: 22 additions & 0 deletions priv/uuid_repo/migrations/20170525142612_create_versions.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
defmodule PaperTrail.UUIDRepo.Migrations.CreateVersions do
use Ecto.Migration

def change do
create table(:versions) do
add :event, :string, null: false, size: 10
add :item_type, :string, null: false
add :item_id, :binary_id
add :item_changes, :map, null: false
add :originator_id, references(:admins, type: :binary_id)
add :origin, :string, size: 50
add :meta, :map

add :inserted_at, :utc_datetime, null: false
end

create index(:versions, [:originator_id])
create index(:versions, [:item_id, :item_type])
create index(:versions, [:event, :item_type])
create index(:versions, [:item_type, :inserted_at])
end
end
52 changes: 52 additions & 0 deletions test/paper_trail/uuid_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
defmodule PaperTrailTest.UUIDTest do
use ExUnit.Case
import PaperTrail.RepoClient, only: [repo: 0]
alias PaperTrail.Version
import Ecto.Query


setup do
Application.put_env(:paper_trail, :repo, PaperTrail.UUIDRepo)
Application.put_env(:paper_trail, :originator, [name: :admin, model: Admin])
Application.put_env(:paper_trail, :originator_type, Ecto.UUID)
Application.put_env(:paper_trail, :item_type, Ecto.UUID)
Code.eval_file("lib/paper_trail.ex")
Code.eval_file("lib/version.ex")
repo().delete_all(Version)
repo().delete_all(Admin)
repo().delete_all(Product)
:ok
end

test "creates versions with models that have a UUID primary key" do
product =
%Product{}
|> Product.changeset(%{name: "Hair Cream"})
|> PaperTrail.insert!

version = Version |> last |> repo.one

assert version.item_id == product.id
assert version.item_type == "Product"
end

test "handles originators with a UUID primary key" do
admin =
%Admin{}
|> Admin.changeset(%{email: "admin@example.com"})
|> repo.insert!

product =
%Product{}
|> Product.changeset(%{name: "Hair Cream"})
|> PaperTrail.insert!(originator: admin)

version =
Version
|> last
|> repo.one
|> repo.preload(:admin)

assert version.admin == admin
end
end
4 changes: 4 additions & 0 deletions test/support/repo.ex → test/support/repos.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ defmodule PaperTrail.Repo do
use Ecto.Repo, otp_app: :paper_trail
end

defmodule PaperTrail.UUIDRepo do
use Ecto.Repo, otp_app: :paper_trail
end

defmodule User do
use Ecto.Schema

Expand Down
36 changes: 36 additions & 0 deletions test/support/uuid_models.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
defmodule Product do
use Ecto.Schema

import Ecto.Changeset

@primary_key {:id, :binary_id, autogenerate: true}
schema "products" do
field :name, :string

timestamps()
end

def changeset(model, params \\ %{}) do
model
|> cast(params, [:name])
|> validate_required([:name])
end
end

defmodule Admin do
use Ecto.Schema
import Ecto.Changeset

@primary_key {:id, :binary_id, autogenerate: true}
schema "admins" do
field :email, :string

timestamps()
end

def changeset(model, params \\ %{}) do
model
|> cast(params, [:email])
|> validate_required([:email])
end
end
6 changes: 4 additions & 2 deletions test/test_helper.exs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
Mix.Task.run "ecto.create", ~w(-r PaperTrail.Repo)
Mix.Task.run "ecto.migrate", ~w(-r PaperTrail.Repo)
Mix.Task.run "ecto.create"
Mix.Task.run "ecto.migrate"

PaperTrail.Repo.start_link
PaperTrail.UUIDRepo.start_link

Code.require_file("test/support/simple_models.exs")
Code.require_file("test/support/strict_models.exs")
Code.require_file("test/support/uuid_models.exs")

ExUnit.configure seed: 0

Expand Down

0 comments on commit ae834f9

Please sign in to comment.