From 5e4bc1845ff0a6330865212f9aed317c570de4ca Mon Sep 17 00:00:00 2001 From: Daniel Berkompas Date: Thu, 8 Sep 2016 17:34:23 -0700 Subject: [PATCH] [#16] Update encryption version in cloak.migrate Fixes #16. --- lib/mix/tasks/cloak.migrate.ex | 18 ++++----- mix.lock | 12 +++--- test/mix/cloak.migrate_test.exs | 65 +++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 test/mix/cloak.migrate_test.exs diff --git a/lib/mix/tasks/cloak.migrate.ex b/lib/mix/tasks/cloak.migrate.ex index 4978cda..f432243 100644 --- a/lib/mix/tasks/cloak.migrate.ex +++ b/lib/mix/tasks/cloak.migrate.ex @@ -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 ===" @@ -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) @@ -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" @@ -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 diff --git a/mix.lock b/mix.lock index efabd7f..8896017 100644 --- a/mix.lock +++ b/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], []}} diff --git a/test/mix/cloak.migrate_test.exs b/test/mix/cloak.migrate_test.exs new file mode 100644 index 0000000..46b0c8f --- /dev/null +++ b/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