From fb9aa9a1f1756656b9a9634852f43f2aafc29bbb Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Wed, 28 Aug 2019 13:31:59 -0400 Subject: [PATCH] context: reports --- lib/philomena/reports.ex | 104 ++++++++++++++++++++++++++++++++ lib/philomena/reports/report.ex | 30 +++++++++ test/philomena/reports_test.exs | 62 +++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 lib/philomena/reports.ex create mode 100644 lib/philomena/reports/report.ex create mode 100644 test/philomena/reports_test.exs diff --git a/lib/philomena/reports.ex b/lib/philomena/reports.ex new file mode 100644 index 00000000..7b282aa7 --- /dev/null +++ b/lib/philomena/reports.ex @@ -0,0 +1,104 @@ +defmodule Philomena.Reports do + @moduledoc """ + The Reports context. + """ + + import Ecto.Query, warn: false + alias Philomena.Repo + + alias Philomena.Reports.Report + + @doc """ + Returns the list of reports. + + ## Examples + + iex> list_reports() + [%Report{}, ...] + + """ + def list_reports do + Repo.all(Report) + end + + @doc """ + Gets a single report. + + Raises `Ecto.NoResultsError` if the Report does not exist. + + ## Examples + + iex> get_report!(123) + %Report{} + + iex> get_report!(456) + ** (Ecto.NoResultsError) + + """ + def get_report!(id), do: Repo.get!(Report, id) + + @doc """ + Creates a report. + + ## Examples + + iex> create_report(%{field: value}) + {:ok, %Report{}} + + iex> create_report(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_report(attrs \\ %{}) do + %Report{} + |> Report.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a report. + + ## Examples + + iex> update_report(report, %{field: new_value}) + {:ok, %Report{}} + + iex> update_report(report, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_report(%Report{} = report, attrs) do + report + |> Report.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a Report. + + ## Examples + + iex> delete_report(report) + {:ok, %Report{}} + + iex> delete_report(report) + {:error, %Ecto.Changeset{}} + + """ + def delete_report(%Report{} = report) do + Repo.delete(report) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking report changes. + + ## Examples + + iex> change_report(report) + %Ecto.Changeset{source: %Report{}} + + """ + def change_report(%Report{} = report) do + Report.changeset(report, %{}) + end +end diff --git a/lib/philomena/reports/report.ex b/lib/philomena/reports/report.ex new file mode 100644 index 00000000..4f04cddc --- /dev/null +++ b/lib/philomena/reports/report.ex @@ -0,0 +1,30 @@ +defmodule Philomena.Reports.Report do + use Ecto.Schema + import Ecto.Changeset + + schema "reports" do + belongs_to :user, Philomena.Users.User + belongs_to :admin, Philomena.Users.User + + field :ip, EctoNetwork.INET + field :fingerprint, :string + field :user_agent, :string, default: "" + field :referrer, :string, default: "" + field :reason, :string + field :state, :string, default: "open" + field :open, :boolean, default: true + + # fixme: rails polymorphic relation + field :reportable_id, :integer + field :reportable_type, :string + + timestamps(inserted_at: :created_at) + end + + @doc false + def changeset(report, attrs) do + report + |> cast(attrs, []) + |> validate_required([]) + end +end diff --git a/test/philomena/reports_test.exs b/test/philomena/reports_test.exs new file mode 100644 index 00000000..012e878d --- /dev/null +++ b/test/philomena/reports_test.exs @@ -0,0 +1,62 @@ +defmodule Philomena.ReportsTest do + use Philomena.DataCase + + alias Philomena.Reports + + describe "reports" do + alias Philomena.Reports.Report + + @valid_attrs %{} + @update_attrs %{} + @invalid_attrs %{} + + def report_fixture(attrs \\ %{}) do + {:ok, report} = + attrs + |> Enum.into(@valid_attrs) + |> Reports.create_report() + + report + end + + test "list_reports/0 returns all reports" do + report = report_fixture() + assert Reports.list_reports() == [report] + end + + test "get_report!/1 returns the report with given id" do + report = report_fixture() + assert Reports.get_report!(report.id) == report + end + + test "create_report/1 with valid data creates a report" do + assert {:ok, %Report{} = report} = Reports.create_report(@valid_attrs) + end + + test "create_report/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Reports.create_report(@invalid_attrs) + end + + test "update_report/2 with valid data updates the report" do + report = report_fixture() + assert {:ok, %Report{} = report} = Reports.update_report(report, @update_attrs) + end + + test "update_report/2 with invalid data returns error changeset" do + report = report_fixture() + assert {:error, %Ecto.Changeset{}} = Reports.update_report(report, @invalid_attrs) + assert report == Reports.get_report!(report.id) + end + + test "delete_report/1 deletes the report" do + report = report_fixture() + assert {:ok, %Report{}} = Reports.delete_report(report) + assert_raise Ecto.NoResultsError, fn -> Reports.get_report!(report.id) end + end + + test "change_report/1 returns a report changeset" do + report = report_fixture() + assert %Ecto.Changeset{} = Reports.change_report(report) + end + end +end