Skip to content

Commit

Permalink
[#16] Update encryption version in cloak.migrate
Browse files Browse the repository at this point in the history
Fixes #16.
  • Loading branch information
danielberkompas committed Sep 9, 2016
1 parent 58230a5 commit 5e4bc18
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 16 deletions.
18 changes: 8 additions & 10 deletions lib/mix/tasks/cloak.migrate.ex
Expand Up @@ -47,10 +47,6 @@ defmodule Mix.Tasks.Cloak.Migrate do
import Logger, only: [info: 1]
import String, only: [to_existing_atom: 1]

@config Application.get_env(:cloak, :migration)
@repo @config[:repo]
@models @config[:models] || []

@doc false
def run(args) do
info "=== Starting Migration ==="
Expand All @@ -65,13 +61,13 @@ defmodule Mix.Tasks.Cloak.Migrate do
f: :field,
r: :repo])
repo = case opts[:repo] do
nil -> @repo
nil -> Application.get_env(:cloak, :migration)[:repo]
repo -> to_module(repo)
end

models = case opts[:model] do
nil -> @models
model -> [{to_module(model), opts[:field]}]
nil -> Application.get_env(:cloak, :migration)[:models]
model -> [{to_module(model), String.to_atom(opts[:field])}]
end

validate!(repo, models)
Expand All @@ -96,12 +92,11 @@ defmodule Mix.Tasks.Cloak.Migrate do
mix cloak.migrate -r Repo -m ModelName -f encryption_version_field
"""
end

defp validate!(_repo, _models) do
end

defp migrate({model, field}, repo) do
info "--- Migrating #{inspect model.__struct__} Model ---"
info "--- Migrating #{inspect model} Model ---"
ids = ids_for({model, field}, repo)
info "#{length(ids)} records found needing migration"

Expand All @@ -124,7 +119,10 @@ defmodule Mix.Tasks.Cloak.Migrate do
version = Map.get(row, field)

if version != Cloak.version do
repo.update!(row)
row
|> Ecto.Changeset.change
|> Ecto.Changeset.put_change(field, Cloak.version)
|> repo.update!
end
end

Expand Down
12 changes: 6 additions & 6 deletions mix.lock
@@ -1,6 +1,6 @@
%{"decimal": {:hex, :decimal, "1.1.0"},
"ecto": {:hex, :ecto, "1.0.3"},
"ex_doc": {:hex, :ex_doc, "0.11.1"},
"inch_ex": {:hex, :inch_ex, "0.4.0"},
"poison": {:hex, :poison, "1.5.0"},
"poolboy": {:hex, :poolboy, "1.5.1"}}
%{"decimal": {:hex, :decimal, "1.1.2", "79a769d4657b2d537b51ef3c02d29ab7141d2b486b516c109642d453ee08e00c", [:mix], []},
"ecto": {:hex, :ecto, "2.0.5", "7f4c79ac41ffba1a4c032b69d7045489f0069c256de606523c65d9f8188e502d", [:mix], [{:db_connection, "~> 1.0-rc.4", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.1.2 or ~> 1.2", [hex: :decimal, optional: false]}, {:mariaex, "~> 0.7.7", [hex: :mariaex, optional: true]}, {:poison, "~> 1.5 or ~> 2.0", [hex: :poison, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}, {:postgrex, "~> 0.12.0", [hex: :postgrex, optional: true]}, {:sbroker, "~> 1.0-beta", [hex: :sbroker, optional: true]}]},
"ex_doc": {:hex, :ex_doc, "0.11.1", "43a16e4168e384213a052e6ee77723b765165b866ac52a10394dfa8f7de5b203", [:mix], [{:earmark, "~> 0.1.17 or ~> 0.2", [hex: :earmark, optional: true]}]},
"inch_ex": {:hex, :inch_ex, "0.4.0", "27829de2227edfba8fa5c431088578685c0956128b40522957077963e563e868", [:mix], [{:poison, "~> 1.2", [hex: :poison, optional: false]}]},
"poison": {:hex, :poison, "1.5.2", "560bdfb7449e3ddd23a096929fb9fc2122f709bcc758b2d5d5a5c7d0ea848910", [:mix], []},
"poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], []}}
65 changes: 65 additions & 0 deletions test/mix/cloak.migrate_test.exs
@@ -0,0 +1,65 @@
defmodule Cloak.MigrateTest do
use ExUnit.Case

defmodule Schema do
use Ecto.Schema

schema "schemas" do
field :encryption_version, :binary
end
end

defmodule Repo do
@schema %Schema{
encryption_version: <<"AES", 5>>
}

def get(_, _id) do
@schema
end

def all(_query) do
[@schema]
end

def update!(changeset) do
send self, {:changeset, changeset}
end
end

setup do
Logger.disable(self)
:ok
end

test "migrates existing rows to new version" do
run("cloak.migrate", [
"-r", "Cloak.MigrateTest.Repo",
"-m", "Cloak.MigrateTest.Schema",
"-f", "encryption_version"
])

assert_changed_version
end

test "uses cloak configuration if present" do
Application.put_env(:cloak, :migration, [
repo: Repo,
models: [{Schema, :encryption_version}]
])

run("cloak.migrate", [])

assert_changed_version
end

defp assert_changed_version do
assert_received {:changeset, changeset}
assert Ecto.Changeset.get_change(changeset, :encryption_version) == Cloak.version
end

defp run(task, args) do
Mix.Task.run(task, args)
Mix.Task.reenable(task)
end
end

0 comments on commit 5e4bc18

Please sign in to comment.