diff --git a/services/app/apps/codebattle/lib/codebattle/utils/populate_tasks.ex b/services/app/apps/codebattle/lib/codebattle/utils/populate_tasks.ex new file mode 100644 index 000000000..666637c85 --- /dev/null +++ b/services/app/apps/codebattle/lib/codebattle/utils/populate_tasks.ex @@ -0,0 +1,17 @@ +defmodule Codebattle.Utils.PopulateTasks do + @moduledoc false + + def from_dir!(dir) do + dir + |> File.ls!() + |> Enum.each(&process_file(dir, &1)) + end + + defp process_file(dir, file) do + dir + |> Path.join(file) + |> File.read!() + |> Jason.decode!(keys: :atoms) + |> Codebattle.Task.upsert!() + end +end diff --git a/services/app/apps/codebattle/test/codebattle/utils/populate_tasks_test.exs b/services/app/apps/codebattle/test/codebattle/utils/populate_tasks_test.exs new file mode 100644 index 000000000..ed95b3f55 --- /dev/null +++ b/services/app/apps/codebattle/test/codebattle/utils/populate_tasks_test.exs @@ -0,0 +1,76 @@ +defmodule Codebattle.Utils.PopulateTasksTest do + use Codebattle.DataCase, async: true + + test "from_dir!" do + dir = Temp.mkdir!() + + task1 = """ + { + "name": "testtask1", + "level": "elementary", + "examples": "none", + "origin": "user", + "state": "active", + "description_ru": "", + "description_en": "none", + "tags": [], + "visibility": "public", + "input_signature": [{ + "argument_name": "ping", + "type": { + "name": "string" + } + }], + "output_signature": { + "type": { + "name": "string" + } + }, + "asserts": [{ + "arguments": "ping", + "expected": "pong" + }] + } + """ + + task2 = """ + { + "name": "testtask2", + "level": "medium", + "examples": "none", + "origin": "user", + "state": "active", + "description_ru": "", + "description_en": "none", + "tags": [], + "visibility": "public", + "input_signature": [{ + "argument_name": "ping", + "type": { + "name": "string" + } + }], + "output_signature": { + "type": { + "name": "string" + } + }, + "asserts": [{ + "arguments": "ping", + "expected": "pong" + }] + } + """ + + dir + |> Path.join("task1.json") + |> File.write!(task1) + + dir + |> Path.join("task2.json") + |> File.write!(task2) + + assert Codebattle.Utils.PopulateTasks.from_dir!(dir) == :ok + assert %{name: "testtask2"} = Codebattle.Task |> Ecto.Query.where(name: "testtask2") |> Codebattle.Repo.one!() + end +end