From e0da567af85567d7a0886636b01704ee8bd15a0d Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Thu, 25 Feb 2021 22:01:02 +0100 Subject: [PATCH 01/19] mix --- mix.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mix.lock b/mix.lock index e88f31b..9c9d28a 100644 --- a/mix.lock +++ b/mix.lock @@ -20,7 +20,7 @@ "ecto_conditionals": {:hex, :ecto_conditionals, "0.1.0", "1d545fb408a256f4639911515ddb8f6005f43bdde25291e0d14a0f9c76adb748", [:mix], [{:ecto, ">= 0.0.0", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "9ba3008fd5cede9f724410c6a5f6cbacf7bff96082de0e3acc1718d23ae3179b"}, "ecto_sql": {:hex, :ecto_sql, "3.4.0", "0e117059e95ef70dea518023f149c75e2c459ec0f81e8ea0a7c1c3c6163b1751", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "217741616fe4c54cd008b7425fb849f96107cffbb3c68172b80c92db9f3cedc2"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "ex_json_schema": {:hex, :ex_json_schema, "0.7.4", "09eb5b0c8184e5702bc89625a9d0c05c7a0a845d382e9f6f406a0fc1c9a8cc3f", [:mix], [], "hexpm"}, + "ex_json_schema": {:hex, :ex_json_schema, "0.7.4", "09eb5b0c8184e5702bc89625a9d0c05c7a0a845d382e9f6f406a0fc1c9a8cc3f", [:mix], [], "hexpm", "45c67fa840f0d719a2b5578126dc29bcdc1f92499c0f61bcb8a3bcb5935f9684"}, "ex_machina": {:hex, :ex_machina, "2.4.0", "09a34c5d371bfb5f78399029194a8ff67aff340ebe8ba19040181af35315eabb", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "a20bc9ddc721b33ea913b93666c5d0bdca5cbad7a67540784ae277228832d72c"}, "faker": {:hex, :faker, "0.16.0", "1e2cf3e8d60d44a30741fb98118fcac18b2020379c7e00d18f1a005841b2f647", [:mix], [], "hexpm", "fbcb9bf1299dff3c9dd7e50f41802bbc472ffbb84e7656394c8aa913ec315141"}, "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, @@ -38,21 +38,21 @@ "maptu": {:hex, :maptu, "1.0.0", "3f1915d3241a733f46a39e935bed369faaf4ff69182b95ea58e9ad1b065c3b11", [:mix], [], "hexpm", "a458f14a748151b3a24615927789b233eb26f06e9b34f1ee428686fee4dc232a"}, "meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm"}, + "mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm", "55a94c0f552249fc1a3dd9cd2d3ab9de9d3c89b559c2bd01121f824834f24746"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, "mock": {:hex, :mock, "0.3.6", "e810a91fabc7adf63ab5fdbec5d9d3b492413b8cda5131a2a8aa34b4185eb9b4", [:mix], [{:meck, "~> 0.8.13", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "bcf1d0a6826fb5aee01bae3d74474669a3fa8b2df274d094af54a25266a1ebd2"}, "parallel_stream": {:hex, :parallel_stream, "1.0.6", "b967be2b23f0f6787fab7ed681b4c45a215a81481fb62b01a5b750fa8f30f76c", [:mix], [], "hexpm", "639b2e8749e11b87b9eb42f2ad325d161c170b39b288ac8d04c4f31f8f0823eb"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, "phoenix": {:hex, :phoenix, "1.5.7", "2923bb3af924f184459fe4fa4b100bd25fa6468e69b2803dfae82698269aa5e0", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "774cd64417c5a3788414fdbb2be2eb9bcd0c048d9e6ad11a0c1fd67b7c0d0978"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.2.1", "13f124cf0a3ce0f1948cf24654c7b9f2347169ff75c1123f44674afee6af3b03", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "478a1bae899cac0a6e02be1deec7e2944b7754c04e7d4107fc5a517f877743c0"}, - "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, + "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.2.10", "6866fad234cbe0813de086a27fde03347162b042fd9d84a31a96433b5e486470", [:mix], [{:phoenix_html, "~> 2.14.1 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.14.3", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.4.0 or ~> 0.5.0 or ~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "9841958d558a60530f15df18b33b63a145d1b8b1f0aed63b4eaec11bbf0b4968"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.14.8", "1419f2612d5623207bfd9760c110f46cc5be05173dd6b5dc019500f93b692027", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.5.3", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 0.5", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "889660bdc113a6fe84fd1b840443e86d9c6bd0b851e8f3a8581c916bbc7a2099"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, - "phoenix_swagger": {:hex, :phoenix_swagger, "0.8.3", "298d6204802409d3b0b4fc1013873839478707cf3a62532a9e10fec0e26d0e37", [:mix], [{:ex_json_schema, "~> 0.7.1", [hex: :ex_json_schema, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.11", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm"}, + "phoenix_swagger": {:hex, :phoenix_swagger, "0.8.3", "298d6204802409d3b0b4fc1013873839478707cf3a62532a9e10fec0e26d0e37", [:mix], [{:ex_json_schema, "~> 0.7.1", [hex: :ex_json_schema, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.11", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "3bc0fa9f5b679b8a61b90a52b2c67dd932320e9a84a6f91a4af872a0ab367337"}, "plug": {:hex, :plug, "1.11.0", "f17217525597628298998bc3baed9f8ea1fa3f1160aa9871aee6df47a6e4d38e", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2d9c633f0499f9dc5c2fd069161af4e2e7756890b81adcbb2ceaa074e8308876"}, "plug_cowboy": {:hex, :plug_cowboy, "2.4.1", "779ba386c0915027f22e14a48919a9545714f849505fa15af2631a0d298abf0f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d72113b6dff7b37a7d9b2a5b68892808e3a9a752f2bf7e503240945385b70507"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.1", "5c854427528bf61d159855cedddffc0625e2228b5f30eff76d5a4de42d896ef4", [:mix], [], "hexpm"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.1", "5c854427528bf61d159855cedddffc0625e2228b5f30eff76d5a4de42d896ef4", [:mix], [], "hexpm", "6961c0e17febd9d0bfa89632d391d2545d2e0eb73768f5f50305a23961d8782c"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, "postgrex": {:hex, :postgrex, "0.15.7", "724410acd48abac529d0faa6c2a379fb8ae2088e31247687b16cacc0e0883372", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "88310c010ff047cecd73d5ceca1d99205e4b1ab1b9abfdab7e00f5c9d20ef8f9"}, "proper_case": {:git, "https://github.com/max-konin/proper_case.git", "e71fd0951c3115b24646c78935d0cc4dfbd2d9bf", [branch: "upper-case"]}, From 81c1dbb67a62993b1fd1cc6094780f3b688e576f Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Fri, 23 Apr 2021 12:57:22 +0200 Subject: [PATCH 02/19] extra fields method --- lib/cgrates_web_jsonapi/cdrs.ex | 11 +++++++++++ .../controllers/cdr_stat_controller.ex | 5 +++++ lib/cgrates_web_jsonapi_web/router.ex | 1 + .../controllers/cdr_stat_controller_test.exs | 4 ++++ 4 files changed, 21 insertions(+) diff --git a/lib/cgrates_web_jsonapi/cdrs.ex b/lib/cgrates_web_jsonapi/cdrs.ex index aae7df6..8b87680 100644 --- a/lib/cgrates_web_jsonapi/cdrs.ex +++ b/lib/cgrates_web_jsonapi/cdrs.ex @@ -58,6 +58,17 @@ defmodule CgratesWebJsonapi.Cdrs do |> Enum.map(&CdrsStats.new/1) end + def extra do + request = + "SELECT DISTINCT extra + FROM ( + SELECT jsonb_object_keys(extra_fields) AS extra + FROM cdrs + ) AS subquery" + + Repo.query(request) + end + defp group_by_created_at(q, :daily) do q |> group_by([r], fragment("date_trunc('day', ?)", r.created_at)) end diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex index 606917a..983d1d2 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex @@ -11,4 +11,9 @@ defmodule CgratesWebJsonapiWeb.CdrStatController do conn |> render("index.json-api", data: data) end + + def extra_fields(conn) do + data = Cdrs.extra() + conn |> render("", data: data) + end end diff --git a/lib/cgrates_web_jsonapi_web/router.ex b/lib/cgrates_web_jsonapi_web/router.ex index 13b7baa..828c3cf 100644 --- a/lib/cgrates_web_jsonapi_web/router.ex +++ b/lib/cgrates_web_jsonapi_web/router.ex @@ -105,6 +105,7 @@ defmodule CgratesWebJsonapiWeb.Router do resources("/tp-timings", TpTimingController, except: [:new, :edit]) resources("/users", UserController, except: [:new, :edit]) resources("/cdr-stats", CdrStatController, only: [:index]) + get("/cdr-stats/extra", CdrStatController, :extra_fields) resources("/tenants", TenantController, only: [:show, :update]) end diff --git a/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs index 183792d..f14d7d7 100644 --- a/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs @@ -506,5 +506,9 @@ defmodule CgratesWebJsonapiWeb.CdrStatControllerTest do assert length(json_response(conn, 200)["data"]) == 1 end + + test "cdrs extra fields list", %{conn: conn} do + + end end end From b09034dfc72c6d22bfe8d88021780f06e762f1d1 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Fri, 23 Apr 2021 16:08:37 +0200 Subject: [PATCH 03/19] test for extra --- lib/cgrates_web_jsonapi/cdrs.ex | 5 ++--- .../controllers/cdr_stat_controller.ex | 5 ++--- lib/cgrates_web_jsonapi_web/router.ex | 2 +- lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex | 4 ++++ .../views/extra_fields_view.ex | 10 ++++++++++ .../controllers/cdr_stat_controller_test.exs | 12 ++++++++++++ 6 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 lib/cgrates_web_jsonapi_web/views/extra_fields_view.ex diff --git a/lib/cgrates_web_jsonapi/cdrs.ex b/lib/cgrates_web_jsonapi/cdrs.ex index 8b87680..f0bbeb4 100644 --- a/lib/cgrates_web_jsonapi/cdrs.ex +++ b/lib/cgrates_web_jsonapi/cdrs.ex @@ -59,14 +59,13 @@ defmodule CgratesWebJsonapi.Cdrs do end def extra do - request = - "SELECT DISTINCT extra + request = "SELECT DISTINCT extra FROM ( SELECT jsonb_object_keys(extra_fields) AS extra FROM cdrs ) AS subquery" - Repo.query(request) + elem(Repo.query(request), 1) end defp group_by_created_at(q, :daily) do diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex index 983d1d2..78b7201 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex @@ -12,8 +12,7 @@ defmodule CgratesWebJsonapiWeb.CdrStatController do conn |> render("index.json-api", data: data) end - def extra_fields(conn) do - data = Cdrs.extra() - conn |> render("", data: data) + def extra_fields(conn, %{}) do + render(conn, "extra_fields.json", data: Cdrs.extra()) end end diff --git a/lib/cgrates_web_jsonapi_web/router.ex b/lib/cgrates_web_jsonapi_web/router.ex index 828c3cf..e97d955 100644 --- a/lib/cgrates_web_jsonapi_web/router.ex +++ b/lib/cgrates_web_jsonapi_web/router.ex @@ -104,8 +104,8 @@ defmodule CgratesWebJsonapiWeb.Router do post("/tp-timings/delete_all", TpTimingController, :delete_all) resources("/tp-timings", TpTimingController, except: [:new, :edit]) resources("/users", UserController, except: [:new, :edit]) + get("/cdr-stats/extra_fields", CdrStatController, :extra_fields) resources("/cdr-stats", CdrStatController, only: [:index]) - get("/cdr-stats/extra", CdrStatController, :extra_fields) resources("/tenants", TenantController, only: [:show, :update]) end diff --git a/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex b/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex index a56b056..03ad3cc 100644 --- a/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex +++ b/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex @@ -13,4 +13,8 @@ defmodule CgratesWebJsonapiWeb.CdrStatView do :total_normal_clearing_disconnects, :total_rejected_disconnects ]) + + def render("extra_fields.json", %{data: data}) do + %{data: %{columns: data.columns, num_rows: data.num_rows, rows: data.rows}} + end end diff --git a/lib/cgrates_web_jsonapi_web/views/extra_fields_view.ex b/lib/cgrates_web_jsonapi_web/views/extra_fields_view.ex new file mode 100644 index 0000000..daf4c32 --- /dev/null +++ b/lib/cgrates_web_jsonapi_web/views/extra_fields_view.ex @@ -0,0 +1,10 @@ +defmodule CgratesWebJsonapiWeb.EstraFieldsView do + use CgratesWebJsonapiWeb, :view + use JaSerializer.PhoenixView + + attributes([ + :columns, + :num_rows, + :rows + ]) +end diff --git a/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs index f14d7d7..b8143fb 100644 --- a/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs @@ -509,6 +509,18 @@ defmodule CgratesWebJsonapiWeb.CdrStatControllerTest do test "cdrs extra fields list", %{conn: conn} do + cdr1 = insert(:cdr, destination: "123", account: "1") + cdr2 = insert(:cdr, destination: "987", account: "2") + + conn = + conn + |> get( + Routes.cdr_stat_path(conn, :extra_fields) + ) + + response = json_response(conn, 200)["data"] + Map.has_key?(response, "rows") == true + length(List.flatten(response["rows"])) == 1 end end end From 4bd20e9218f108eb1f59bfc4af391151f68f1323 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Mon, 10 May 2021 15:40:14 +0200 Subject: [PATCH 04/19] fixes after review --- .../controllers/cdr_extra_field_controller.ex | 9 +++++ .../controllers/cdr_stat_controller.ex | 4 -- lib/cgrates_web_jsonapi_web/router.ex | 2 +- ...fields_view.ex => cdr_extra_field_view.ex} | 2 +- .../views/cdr_stat_view.ex | 4 -- .../cdr_extra_field_controller_test.exs | 40 +++++++++++++++++++ .../controllers/cdr_stat_controller_test.exs | 16 -------- 7 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex rename lib/cgrates_web_jsonapi_web/views/{extra_fields_view.ex => cdr_extra_field_view.ex} (71%) create mode 100644 test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex new file mode 100644 index 0000000..d1a5215 --- /dev/null +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex @@ -0,0 +1,9 @@ +defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do + use CgratesWebJsonapiWeb, :controller + + alias CgratesWebJsonapi.Cdrs + + def index(conn, _) do + render(conn, "index.json-api", data: Cdrs.extra()) + end +end diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex index 78b7201..606917a 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_stat_controller.ex @@ -11,8 +11,4 @@ defmodule CgratesWebJsonapiWeb.CdrStatController do conn |> render("index.json-api", data: data) end - - def extra_fields(conn, %{}) do - render(conn, "extra_fields.json", data: Cdrs.extra()) - end end diff --git a/lib/cgrates_web_jsonapi_web/router.ex b/lib/cgrates_web_jsonapi_web/router.ex index e97d955..9709091 100644 --- a/lib/cgrates_web_jsonapi_web/router.ex +++ b/lib/cgrates_web_jsonapi_web/router.ex @@ -104,7 +104,7 @@ defmodule CgratesWebJsonapiWeb.Router do post("/tp-timings/delete_all", TpTimingController, :delete_all) resources("/tp-timings", TpTimingController, except: [:new, :edit]) resources("/users", UserController, except: [:new, :edit]) - get("/cdr-stats/extra_fields", CdrStatController, :extra_fields) + resources("/cdr-extra-fields", CdrExtraFieldController, only: [:index]) resources("/cdr-stats", CdrStatController, only: [:index]) resources("/tenants", TenantController, only: [:show, :update]) end diff --git a/lib/cgrates_web_jsonapi_web/views/extra_fields_view.ex b/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex similarity index 71% rename from lib/cgrates_web_jsonapi_web/views/extra_fields_view.ex rename to lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex index daf4c32..a71db91 100644 --- a/lib/cgrates_web_jsonapi_web/views/extra_fields_view.ex +++ b/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex @@ -1,4 +1,4 @@ -defmodule CgratesWebJsonapiWeb.EstraFieldsView do +defmodule CgratesWebJsonapiWeb.CdrExtraFieldView do use CgratesWebJsonapiWeb, :view use JaSerializer.PhoenixView diff --git a/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex b/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex index 03ad3cc..a56b056 100644 --- a/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex +++ b/lib/cgrates_web_jsonapi_web/views/cdr_stat_view.ex @@ -13,8 +13,4 @@ defmodule CgratesWebJsonapiWeb.CdrStatView do :total_normal_clearing_disconnects, :total_rejected_disconnects ]) - - def render("extra_fields.json", %{data: data}) do - %{data: %{columns: data.columns, num_rows: data.num_rows, rows: data.rows}} - end end diff --git a/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs new file mode 100644 index 0000000..6a2deb0 --- /dev/null +++ b/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs @@ -0,0 +1,40 @@ +defmodule CgratesWebJsonapiWeb.CdrExtraFieldControllerTest do + use CgratesWebJsonapi.ConnCase + + alias CgratesWebJsonapi.Cdrs.Cdr + alias CgratesWebJsonapi.Repo + + import CgratesWebJsonapi.Factory + import CgratesWebJsonapi.Guardian + + setup do + user = insert(:user) + + {:ok, token, _} = encode_and_sign(user, %{}, token_type: :access) + + conn = + build_conn() + |> put_req_header("accept", "application/vnd.api+json") + |> put_req_header("content-type", "application/vnd.api+json") + |> put_req_header("authorization", "bearer: " <> token) + + {:ok, conn: conn} + end + + test "cdrs extra fields list", %{conn: conn} do + cdr1 = insert(:cdr, destination: "123", account: "1") + cdr2 = insert(:cdr, destination: "987", account: "2") + + conn = + conn + |> get(Routes.cdr_extra_field_path(conn, :index)) + + response = json_response(conn, 200)["data"] + + attributes = response["attributes"] + + assert attributes["columns"] == ["extra"] + assert attributes["num-rows"] == 1 + assert attributes["rows"] == [["cost"]] + end +end diff --git a/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs index b8143fb..183792d 100644 --- a/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/cdr_stat_controller_test.exs @@ -506,21 +506,5 @@ defmodule CgratesWebJsonapiWeb.CdrStatControllerTest do assert length(json_response(conn, 200)["data"]) == 1 end - - test "cdrs extra fields list", %{conn: conn} do - - cdr1 = insert(:cdr, destination: "123", account: "1") - cdr2 = insert(:cdr, destination: "987", account: "2") - - conn = - conn - |> get( - Routes.cdr_stat_path(conn, :extra_fields) - ) - - response = json_response(conn, 200)["data"] - Map.has_key?(response, "rows") == true - length(List.flatten(response["rows"])) == 1 - end end end From 2d401488b45c8bb54715df0a9b92029c1a468fa6 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 12 May 2021 11:19:54 +0200 Subject: [PATCH 05/19] response json updated --- lib/cgrates_web_jsonapi/cdrs.ex | 6 +++--- lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex | 2 -- .../controllers/cdr_extra_field_controller_test.exs | 5 +---- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/cgrates_web_jsonapi/cdrs.ex b/lib/cgrates_web_jsonapi/cdrs.ex index f0bbeb4..6b5471d 100644 --- a/lib/cgrates_web_jsonapi/cdrs.ex +++ b/lib/cgrates_web_jsonapi/cdrs.ex @@ -59,13 +59,13 @@ defmodule CgratesWebJsonapi.Cdrs do end def extra do - request = "SELECT DISTINCT extra + request = "SELECT DISTINCT extra_fields FROM ( - SELECT jsonb_object_keys(extra_fields) AS extra + SELECT jsonb_object_keys(extra_fields) AS extra_fields FROM cdrs ) AS subquery" - elem(Repo.query(request), 1) + %{rows: List.flatten(elem(Repo.query(request), 1).rows)} end defp group_by_created_at(q, :daily) do diff --git a/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex b/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex index a71db91..3f862c6 100644 --- a/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex +++ b/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex @@ -3,8 +3,6 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldView do use JaSerializer.PhoenixView attributes([ - :columns, - :num_rows, :rows ]) end diff --git a/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs index 6a2deb0..0f166be 100644 --- a/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs @@ -32,9 +32,6 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldControllerTest do response = json_response(conn, 200)["data"] attributes = response["attributes"] - - assert attributes["columns"] == ["extra"] - assert attributes["num-rows"] == 1 - assert attributes["rows"] == [["cost"]] + assert attributes["rows"] == ["cost"] end end From b189bde5571ab454d3460c46f0f2ba3e376e2e9e Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 12 May 2021 11:44:20 +0200 Subject: [PATCH 06/19] swagger docs --- .../controllers/cdr_extra_field_controller.ex | 11 +++++++ priv/static/swagger.json | 33 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex index d1a5215..c0ef33d 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex @@ -1,8 +1,19 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do use CgratesWebJsonapiWeb, :controller + use PhoenixSwagger alias CgratesWebJsonapi.Cdrs + swagger_path :index do + get("/api/cdr-extra-fields") + CommonSwaggerParams.authorization() + CommonSwaggerParams.content_type() + + description("An array of string values of used extra_fields") + + response(200, "OK") + end + def index(conn, _) do render(conn, "index.json-api", data: Cdrs.extra()) end diff --git a/priv/static/swagger.json b/priv/static/swagger.json index 5a4b2e5..e514c6e 100644 --- a/priv/static/swagger.json +++ b/priv/static/swagger.json @@ -384,6 +384,39 @@ "Call" ] } + }, + "/api/cdr-extra-fields": { + "get": { + "description": "An array of string values of used extra_fields", + "operationId": "CgratesWebJsonapiWeb.CdrExtraFieldController.index", + "parameters": [ + { + "description": "OAuth2 access token", + "in": "header", + "name": "Authorization", + "required": true, + "type": "string" + } + ], + "produces": [ + "application/vnd.api+json" + ], + "responses": { + "200": { + "description": "OK", + "properties": {"rows": { + "items": { + "type": "string" + } + } + } + } + }, + "summary": "", + "tags": [ + "CdrExtraField" + ] + } } }, "swagger": "2.0", From c81a9205057085c7a10966a401ebaad2a3835981 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 12 May 2021 12:29:33 +0200 Subject: [PATCH 07/19] initial cache --- lib/cgrates_web_jsonapi/ets_cache.ex | 37 +++++++++++++++++++ .../controllers/cdr_extra_field_controller.ex | 4 +- priv/static/swagger.json | 16 +++----- 3 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 lib/cgrates_web_jsonapi/ets_cache.ex diff --git a/lib/cgrates_web_jsonapi/ets_cache.ex b/lib/cgrates_web_jsonapi/ets_cache.ex new file mode 100644 index 0000000..0f07695 --- /dev/null +++ b/lib/cgrates_web_jsonapi/ets_cache.ex @@ -0,0 +1,37 @@ +defmodule CgratesWebJsonapi.EtsCache do + @moduledoc """ + Cache via ETS. + """ + + def get(args, opts \\ []) do + case lookup(args) do + nil -> + ttl = Keyword.get(opts, :ttl, 86400) + cache_apply(args, ttl) + + result -> + result + end + end + + defp lookup(args) do + case :ets.lookup(:extra_fields, [args]) do + [result | _] -> check_freshness(result) + [] -> nil + end + end + + defp check_freshness({result, expiration}) do + cond do + expiration > :os.system_time(:seconds) -> result + :else -> nil + end + end + + defp cache_apply(args, ttl) do + result = args + expiration = :os.system_time(:seconds) + ttl + :ets.insert(:extra_fields, {args, result, expiration}) + result + end +end diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex index c0ef33d..e001a17 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex @@ -3,6 +3,7 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do use PhoenixSwagger alias CgratesWebJsonapi.Cdrs + alias CgratesWebJsonapi.EtsCache swagger_path :index do get("/api/cdr-extra-fields") @@ -15,6 +16,7 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do end def index(conn, _) do - render(conn, "index.json-api", data: Cdrs.extra()) + result = EtsCache.get(Cdrs.extra(), ttl: 86400) + render(conn, "index.json-api", data: result) end end diff --git a/priv/static/swagger.json b/priv/static/swagger.json index e514c6e..7571ecf 100644 --- a/priv/static/swagger.json +++ b/priv/static/swagger.json @@ -403,18 +403,12 @@ ], "responses": { "200": { - "description": "OK", - "properties": {"rows": { - "items": { - "type": "string" - } - } + "description": "OK" } - } - }, - "summary": "", - "tags": [ - "CdrExtraField" + }, + "summary": "", + "tags": [ + "CdrExtraField" ] } } From 1ee630af76993c9b0086b05e98206aa2ac1a045f Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 12 May 2021 12:31:02 +0200 Subject: [PATCH 08/19] initial cache --- .../controllers/cdr_extra_field_controller.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex index e001a17..2b206ba 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex @@ -16,7 +16,6 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do end def index(conn, _) do - result = EtsCache.get(Cdrs.extra(), ttl: 86400) - render(conn, "index.json-api", data: result) + render(conn, "index.json-api", data: Cdrs.extra()) end end From b849ddb762c29f71982646cd95527dc918addca8 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Fri, 14 May 2021 16:33:54 +0200 Subject: [PATCH 09/19] response updated --- lib/cgrates_web_jsonapi/cdrs.ex | 2 +- .../controllers/cdr_extra_field_controller.ex | 2 +- lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex | 4 +--- .../controllers/cdr_extra_field_controller_test.exs | 5 ++--- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/cgrates_web_jsonapi/cdrs.ex b/lib/cgrates_web_jsonapi/cdrs.ex index 6b5471d..77a61e6 100644 --- a/lib/cgrates_web_jsonapi/cdrs.ex +++ b/lib/cgrates_web_jsonapi/cdrs.ex @@ -65,7 +65,7 @@ defmodule CgratesWebJsonapi.Cdrs do FROM cdrs ) AS subquery" - %{rows: List.flatten(elem(Repo.query(request), 1).rows)} + request |> Repo.query() |> elem(1) |> Map.get(:rows) |> List.flatten end defp group_by_created_at(q, :daily) do diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex index 2b206ba..d7060c6 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex @@ -16,6 +16,6 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do end def index(conn, _) do - render(conn, "index.json-api", data: Cdrs.extra()) + render(conn, "extra_fields.json", data: Cdrs.extra()) end end diff --git a/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex b/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex index 3f862c6..3770c84 100644 --- a/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex +++ b/lib/cgrates_web_jsonapi_web/views/cdr_extra_field_view.ex @@ -2,7 +2,5 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldView do use CgratesWebJsonapiWeb, :view use JaSerializer.PhoenixView - attributes([ - :rows - ]) + def render("extra_fields.json", %{data: data}), do: data end diff --git a/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs index 0f166be..ee411c2 100644 --- a/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller_test.exs @@ -29,9 +29,8 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldControllerTest do conn |> get(Routes.cdr_extra_field_path(conn, :index)) - response = json_response(conn, 200)["data"] + response = json_response(conn, 200) - attributes = response["attributes"] - assert attributes["rows"] == ["cost"] + assert response == ["cost"] end end From dcc3f1bf71baf1babb2a2811bb21009dd9ab8e5b Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Mon, 17 May 2021 10:16:56 +0200 Subject: [PATCH 10/19] response typespec, lazy init --- lib/cgrates_web_jsonapi/cdrs.ex | 2 +- lib/cgrates_web_jsonapi/ets_cache.ex | 9 +++++++++ .../controllers/cdr_extra_field_controller.ex | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/cgrates_web_jsonapi/cdrs.ex b/lib/cgrates_web_jsonapi/cdrs.ex index 77a61e6..d5f7d85 100644 --- a/lib/cgrates_web_jsonapi/cdrs.ex +++ b/lib/cgrates_web_jsonapi/cdrs.ex @@ -65,7 +65,7 @@ defmodule CgratesWebJsonapi.Cdrs do FROM cdrs ) AS subquery" - request |> Repo.query() |> elem(1) |> Map.get(:rows) |> List.flatten + request |> Repo.query() |> elem(1) |> Map.get(:rows) |> List.flatten() end defp group_by_created_at(q, :daily) do diff --git a/lib/cgrates_web_jsonapi/ets_cache.ex b/lib/cgrates_web_jsonapi/ets_cache.ex index 0f07695..9fc6699 100644 --- a/lib/cgrates_web_jsonapi/ets_cache.ex +++ b/lib/cgrates_web_jsonapi/ets_cache.ex @@ -3,6 +3,7 @@ defmodule CgratesWebJsonapi.EtsCache do Cache via ETS. """ + @spec get(any) :: list(any) def get(args, opts \\ []) do case lookup(args) do nil -> @@ -15,6 +16,8 @@ defmodule CgratesWebJsonapi.EtsCache do end defp lookup(args) do + create_table?() + case :ets.lookup(:extra_fields, [args]) do [result | _] -> check_freshness(result) [] -> nil @@ -34,4 +37,10 @@ defmodule CgratesWebJsonapi.EtsCache do :ets.insert(:extra_fields, {args, result, expiration}) result end + + defp create_table? do + if Enum.member?(:ets.all(), :extra_fields) == false do + :ets.new(:extra_fields, [:public, :named_table]) + end + end end diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex index d7060c6..137391e 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex @@ -16,6 +16,6 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do end def index(conn, _) do - render(conn, "extra_fields.json", data: Cdrs.extra()) + render(conn, "extra_fields.json", data: EtsCache.get(Cdrs.extra())) end end From 37d78c698a976e7c83ea1c86be46c7bb65b95b7a Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Mon, 17 May 2021 19:42:36 +0200 Subject: [PATCH 11/19] passed a fn into a param; updated spec and module --- lib/cgrates_web_jsonapi/ets_cache.ex | 20 +++++++++---------- .../controllers/cdr_extra_field_controller.ex | 3 ++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/cgrates_web_jsonapi/ets_cache.ex b/lib/cgrates_web_jsonapi/ets_cache.ex index 9fc6699..6100b7e 100644 --- a/lib/cgrates_web_jsonapi/ets_cache.ex +++ b/lib/cgrates_web_jsonapi/ets_cache.ex @@ -3,22 +3,22 @@ defmodule CgratesWebJsonapi.EtsCache do Cache via ETS. """ - @spec get(any) :: list(any) - def get(args, opts \\ []) do - case lookup(args) do + @spec get(any, atom | :ets.tid(), any) :: list(any) + def get(args, table_name, opts \\ []) do + case lookup(args, table_name) do nil -> ttl = Keyword.get(opts, :ttl, 86400) - cache_apply(args, ttl) + cache_apply(args.(), ttl) result -> result end end - defp lookup(args) do - create_table?() + defp lookup(args, table_name) do + maybe_create_table(table_name) - case :ets.lookup(:extra_fields, [args]) do + case :ets.lookup(table_name, [args]) do [result | _] -> check_freshness(result) [] -> nil end @@ -38,9 +38,9 @@ defmodule CgratesWebJsonapi.EtsCache do result end - defp create_table? do - if Enum.member?(:ets.all(), :extra_fields) == false do - :ets.new(:extra_fields, [:public, :named_table]) + defp maybe_create_table(table_name) do + if Enum.member?(:ets.all(), table_name) == false do + :ets.new(table_name, [:public, :named_table]) end end end diff --git a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex index 137391e..8c0ce5d 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/cdr_extra_field_controller.ex @@ -16,6 +16,7 @@ defmodule CgratesWebJsonapiWeb.CdrExtraFieldController do end def index(conn, _) do - render(conn, "extra_fields.json", data: EtsCache.get(Cdrs.extra())) + extra_fields = fn -> Cdrs.extra() end + render(conn, "extra_fields.json", data: EtsCache.get(extra_fields, :extra_fields)) end end From 99094ee8815f6655b26888c66e09e49a8246befd Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Tue, 18 May 2021 16:56:57 +0200 Subject: [PATCH 12/19] membership - init --- lib/cgrates_web_jsonapi/tenants.ex | 96 +++++++++++++++++++ lib/cgrates_web_jsonapi/tenants/membership.ex | 22 +++++ .../controllers/membership_controller.ex | 43 +++++++++ .../views/membership_view.ex | 17 ++++ .../20210517174717_create_memberships.exs | 17 ++++ test/cgrates_web_jsonapi/tenants_test.exs | 59 ++++++++++++ .../membership_controller_test.exs | 88 +++++++++++++++++ 7 files changed, 342 insertions(+) create mode 100644 lib/cgrates_web_jsonapi/tenants/membership.ex create mode 100644 lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex create mode 100644 lib/cgrates_web_jsonapi_web/views/membership_view.ex create mode 100644 priv/repo/migrations/20210517174717_create_memberships.exs create mode 100644 test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs diff --git a/lib/cgrates_web_jsonapi/tenants.ex b/lib/cgrates_web_jsonapi/tenants.ex index 811d472..84d2d33 100644 --- a/lib/cgrates_web_jsonapi/tenants.ex +++ b/lib/cgrates_web_jsonapi/tenants.ex @@ -101,4 +101,100 @@ defmodule CgratesWebJsonapi.Tenants do def change_tenant(%Tenant{} = tenant, attrs \\ %{}) do Tenant.update_changeset(tenant, attrs) end + + alias CgratesWebJsonapi.Tenants.Membership + + @doc """ + Returns the list of memberships. + + ## Examples + + iex> list_memberships() + [%Membership{}, ...] + + """ + def list_memberships do + Repo.all(Membership) + end + + @doc """ + Gets a single membership. + + Raises `Ecto.NoResultsError` if the Membership does not exist. + + ## Examples + + iex> get_membership!(123) + %Membership{} + + iex> get_membership!(456) + ** (Ecto.NoResultsError) + + """ + def get_membership!(id), do: Repo.get!(Membership, id) + + @doc """ + Creates a membership. + + ## Examples + + iex> create_membership(%{field: value}) + {:ok, %Membership{}} + + iex> create_membership(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_membership(attrs \\ %{}) do + %Membership{} + |> Membership.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a membership. + + ## Examples + + iex> update_membership(membership, %{field: new_value}) + {:ok, %Membership{}} + + iex> update_membership(membership, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_membership(%Membership{} = membership, attrs) do + membership + |> Membership.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a membership. + + ## Examples + + iex> delete_membership(membership) + {:ok, %Membership{}} + + iex> delete_membership(membership) + {:error, %Ecto.Changeset{}} + + """ + def delete_membership(%Membership{} = membership) do + Repo.delete(membership) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking membership changes. + + ## Examples + + iex> change_membership(membership) + %Ecto.Changeset{data: %Membership{}} + + """ + def change_membership(%Membership{} = membership, attrs \\ %{}) do + Membership.changeset(membership, attrs) + end end diff --git a/lib/cgrates_web_jsonapi/tenants/membership.ex b/lib/cgrates_web_jsonapi/tenants/membership.ex new file mode 100644 index 0000000..7724439 --- /dev/null +++ b/lib/cgrates_web_jsonapi/tenants/membership.ex @@ -0,0 +1,22 @@ +defmodule CgratesWebJsonapi.Tenants.Membership do + use Ecto.Schema + import Ecto.Changeset + + alias CgratesWebJsonapi.Tenants.Tenant + alias CgratesWebJsonapi.Auth.User + + schema "memberships" do + field :role, :integer + belongs_to :tenant_id, Tenant, type: :string + belongs_to :user_id, User + + timestamps() + end + + @doc false + def changeset(membership, attrs) do + membership + |> cast(attrs, [:role]) + |> validate_required([:role]) + end +end diff --git a/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex new file mode 100644 index 0000000..ed0cac3 --- /dev/null +++ b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex @@ -0,0 +1,43 @@ +defmodule CgratesWebJsonapiWeb.MembershipController do + use CgratesWebJsonapiWeb, :controller + + alias CgratesWebJsonapi.Tenants + alias CgratesWebJsonapi.Tenants.Membership + + action_fallback CgratesWebJsonapiWeb.FallbackController + + def index(conn, _params) do + memberships = Tenants.list_memberships() + render(conn, "index.json", memberships: memberships) + end + + def create(conn, %{"membership" => membership_params}) do + with {:ok, %Membership{} = membership} <- Tenants.create_membership(membership_params) do + conn + |> put_status(:created) + |> put_resp_header("location", Routes.membership_path(conn, :show, membership)) + |> render("show.json", membership: membership) + end + end + + def show(conn, %{"id" => id}) do + membership = Tenants.get_membership!(id) + render(conn, "show.json", membership: membership) + end + + def update(conn, %{"id" => id, "membership" => membership_params}) do + membership = Tenants.get_membership!(id) + + with {:ok, %Membership{} = membership} <- Tenants.update_membership(membership, membership_params) do + render(conn, "show.json", membership: membership) + end + end + + def delete(conn, %{"id" => id}) do + membership = Tenants.get_membership!(id) + + with {:ok, %Membership{}} <- Tenants.delete_membership(membership) do + send_resp(conn, :no_content, "") + end + end +end diff --git a/lib/cgrates_web_jsonapi_web/views/membership_view.ex b/lib/cgrates_web_jsonapi_web/views/membership_view.ex new file mode 100644 index 0000000..e532cb6 --- /dev/null +++ b/lib/cgrates_web_jsonapi_web/views/membership_view.ex @@ -0,0 +1,17 @@ +defmodule CgratesWebJsonapiWeb.MembershipView do + use CgratesWebJsonapiWeb, :view + alias CgratesWebJsonapiWeb.MembershipView + + def render("index.json", %{memberships: memberships}) do + %{data: render_many(memberships, MembershipView, "membership.json")} + end + + def render("show.json", %{membership: membership}) do + %{data: render_one(membership, MembershipView, "membership.json")} + end + + def render("membership.json", %{membership: membership}) do + %{id: membership.id, + role: membership. role} + end +end diff --git a/priv/repo/migrations/20210517174717_create_memberships.exs b/priv/repo/migrations/20210517174717_create_memberships.exs new file mode 100644 index 0000000..5cd5d0e --- /dev/null +++ b/priv/repo/migrations/20210517174717_create_memberships.exs @@ -0,0 +1,17 @@ +defmodule CgratesWebJsonapi.Repo.Migrations.CreateMemberships do + use Ecto.Migration + + def change do + create table(:memberships) do + add :role, :integer + add :tenant_id, references(:tenants, on_delete: :nothing, type: :string) + add :user_id, references(:users, on_delete: :nothing) + + + timestamps() + end + + create index(:memberships, [:tenant_id]) + create index(:memberships, [:user_id]) + end +end diff --git a/test/cgrates_web_jsonapi/tenants_test.exs b/test/cgrates_web_jsonapi/tenants_test.exs index 1f072d0..8cd6048 100644 --- a/test/cgrates_web_jsonapi/tenants_test.exs +++ b/test/cgrates_web_jsonapi/tenants_test.exs @@ -66,4 +66,63 @@ defmodule CgratesWebJsonapi.TenantsTest do assert %Ecto.Changeset{} = Tenants.change_tenant(tenant) end end + + describe "memberships" do + alias CgratesWebJsonapi.Tenants.Membership + + @valid_attrs %{" role": 42} + @update_attrs %{" role": 43} + @invalid_attrs %{" role": nil} + + def membership_fixture(attrs \\ %{}) do + {:ok, membership} = + attrs + |> Enum.into(@valid_attrs) + |> Tenants.create_membership() + + membership + end + + test "list_memberships/0 returns all memberships" do + membership = membership_fixture() + assert Tenants.list_memberships() == [membership] + end + + test "get_membership!/1 returns the membership with given id" do + membership = membership_fixture() + assert Tenants.get_membership!(membership.id) == membership + end + + test "create_membership/1 with valid data creates a membership" do + assert {:ok, %Membership{} = membership} = Tenants.create_membership(@valid_attrs) + assert membership. role == 42 + end + + test "create_membership/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Tenants.create_membership(@invalid_attrs) + end + + test "update_membership/2 with valid data updates the membership" do + membership = membership_fixture() + assert {:ok, %Membership{} = membership} = Tenants.update_membership(membership, @update_attrs) + assert membership. role == 43 + end + + test "update_membership/2 with invalid data returns error changeset" do + membership = membership_fixture() + assert {:error, %Ecto.Changeset{}} = Tenants.update_membership(membership, @invalid_attrs) + assert membership == Tenants.get_membership!(membership.id) + end + + test "delete_membership/1 deletes the membership" do + membership = membership_fixture() + assert {:ok, %Membership{}} = Tenants.delete_membership(membership) + assert_raise Ecto.NoResultsError, fn -> Tenants.get_membership!(membership.id) end + end + + test "change_membership/1 returns a membership changeset" do + membership = membership_fixture() + assert %Ecto.Changeset{} = Tenants.change_membership(membership) + end + end end diff --git a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs new file mode 100644 index 0000000..65df1a9 --- /dev/null +++ b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs @@ -0,0 +1,88 @@ +defmodule CgratesWebJsonapiWeb.MembershipControllerTest do + use CgratesWebJsonapiWeb.ConnCase + + alias CgratesWebJsonapi.Tenants + alias CgratesWebJsonapi.Tenants.Membership + + @create_attrs %{ + role: 42 + } + @update_attrs %{ + role: 43 + } + @invalid_attrs %{" role": nil} + + def fixture(:membership) do + {:ok, membership} = Tenants.create_membership(@create_attrs) + membership + end + + setup %{conn: conn} do + {:ok, conn: put_req_header(conn, "accept", "application/json")} + end + + describe "index" do + test "lists all memberships", %{conn: conn} do + conn = get(conn, Routes.membership_path(conn, :index)) + assert json_response(conn, 200)["data"] == [] + end + end + + describe "create membership" do + test "renders membership when data is valid", %{conn: conn} do + conn = post(conn, Routes.membership_path(conn, :create), membership: @create_attrs) + assert %{"id" => id} = json_response(conn, 201)["data"] + + conn = get(conn, Routes.membership_path(conn, :show, id)) + + assert %{ + "id" => id, + " role" => 42 + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, Routes.membership_path(conn, :create), membership: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "update membership" do + setup [:create_membership] + + test "renders membership when data is valid", %{conn: conn, membership: %Membership{id: id} = membership} do + conn = put(conn, Routes.membership_path(conn, :update, membership), membership: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] + + conn = get(conn, Routes.membership_path(conn, :show, id)) + + assert %{ + "id" => id, + " role" => 43 + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn, membership: membership} do + conn = put(conn, Routes.membership_path(conn, :update, membership), membership: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "delete membership" do + setup [:create_membership] + + test "deletes chosen membership", %{conn: conn, membership: membership} do + conn = delete(conn, Routes.membership_path(conn, :delete, membership)) + assert response(conn, 204) + + assert_error_sent 404, fn -> + get(conn, Routes.membership_path(conn, :show, membership)) + end + end + end + + defp create_membership(_) do + membership = fixture(:membership) + %{membership: membership} + end +end From 1124767cb6992cac409fa6f6b3816a6f3532ba53 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Tue, 18 May 2021 17:43:09 +0200 Subject: [PATCH 13/19] typo fix --- .../controllers/membership_controller.ex | 3 ++- .../views/membership_view.ex | 3 +-- .../20210517174717_create_memberships.exs | 11 +++++------ test/cgrates_web_jsonapi/tenants_test.exs | 9 ++++++--- .../membership_controller_test.exs | 19 +++++++++++++------ 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex index ed0cac3..d1aec6d 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex @@ -28,7 +28,8 @@ defmodule CgratesWebJsonapiWeb.MembershipController do def update(conn, %{"id" => id, "membership" => membership_params}) do membership = Tenants.get_membership!(id) - with {:ok, %Membership{} = membership} <- Tenants.update_membership(membership, membership_params) do + with {:ok, %Membership{} = membership} <- + Tenants.update_membership(membership, membership_params) do render(conn, "show.json", membership: membership) end end diff --git a/lib/cgrates_web_jsonapi_web/views/membership_view.ex b/lib/cgrates_web_jsonapi_web/views/membership_view.ex index e532cb6..79f4736 100644 --- a/lib/cgrates_web_jsonapi_web/views/membership_view.ex +++ b/lib/cgrates_web_jsonapi_web/views/membership_view.ex @@ -11,7 +11,6 @@ defmodule CgratesWebJsonapiWeb.MembershipView do end def render("membership.json", %{membership: membership}) do - %{id: membership.id, - role: membership. role} + %{id: membership.id, role: membership.role} end end diff --git a/priv/repo/migrations/20210517174717_create_memberships.exs b/priv/repo/migrations/20210517174717_create_memberships.exs index 5cd5d0e..54aaf51 100644 --- a/priv/repo/migrations/20210517174717_create_memberships.exs +++ b/priv/repo/migrations/20210517174717_create_memberships.exs @@ -3,15 +3,14 @@ defmodule CgratesWebJsonapi.Repo.Migrations.CreateMemberships do def change do create table(:memberships) do - add :role, :integer - add :tenant_id, references(:tenants, on_delete: :nothing, type: :string) - add :user_id, references(:users, on_delete: :nothing) - + add(:role, :integer) + add(:tenant_id, references(:tenants, on_delete: :nothing, type: :string)) + add(:user_id, references(:users, on_delete: :nothing)) timestamps() end - create index(:memberships, [:tenant_id]) - create index(:memberships, [:user_id]) + create(index(:memberships, [:tenant_id])) + create(index(:memberships, [:user_id])) end end diff --git a/test/cgrates_web_jsonapi/tenants_test.exs b/test/cgrates_web_jsonapi/tenants_test.exs index 8cd6048..fede9b4 100644 --- a/test/cgrates_web_jsonapi/tenants_test.exs +++ b/test/cgrates_web_jsonapi/tenants_test.exs @@ -95,7 +95,7 @@ defmodule CgratesWebJsonapi.TenantsTest do test "create_membership/1 with valid data creates a membership" do assert {:ok, %Membership{} = membership} = Tenants.create_membership(@valid_attrs) - assert membership. role == 42 + assert membership.role == 42 end test "create_membership/1 with invalid data returns error changeset" do @@ -104,8 +104,11 @@ defmodule CgratesWebJsonapi.TenantsTest do test "update_membership/2 with valid data updates the membership" do membership = membership_fixture() - assert {:ok, %Membership{} = membership} = Tenants.update_membership(membership, @update_attrs) - assert membership. role == 43 + + assert {:ok, %Membership{} = membership} = + Tenants.update_membership(membership, @update_attrs) + + assert membership.role == 43 end test "update_membership/2 with invalid data returns error changeset" do diff --git a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs index 65df1a9..0790a62 100644 --- a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs @@ -5,12 +5,12 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do alias CgratesWebJsonapi.Tenants.Membership @create_attrs %{ - role: 42 + role: 42 } @update_attrs %{ - role: 43 + role: 43 } - @invalid_attrs %{" role": nil} + @invalid_attrs %{role: nil} def fixture(:membership) do {:ok, membership} = Tenants.create_membership(@create_attrs) @@ -50,8 +50,13 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do describe "update membership" do setup [:create_membership] - test "renders membership when data is valid", %{conn: conn, membership: %Membership{id: id} = membership} do - conn = put(conn, Routes.membership_path(conn, :update, membership), membership: @update_attrs) + test "renders membership when data is valid", %{ + conn: conn, + membership: %Membership{id: id} = membership + } do + conn = + put(conn, Routes.membership_path(conn, :update, membership), membership: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] conn = get(conn, Routes.membership_path(conn, :show, id)) @@ -63,7 +68,9 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do end test "renders errors when data is invalid", %{conn: conn, membership: membership} do - conn = put(conn, Routes.membership_path(conn, :update, membership), membership: @invalid_attrs) + conn = + put(conn, Routes.membership_path(conn, :update, membership), membership: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} end end From dc0b4839a5b8ff40cf275575d70aa6372373df09 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Tue, 18 May 2021 17:43:59 +0200 Subject: [PATCH 14/19] typo fix --- .../controllers/membership_controller_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs index 0790a62..43463f3 100644 --- a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs @@ -1,5 +1,5 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do - use CgratesWebJsonapiWeb.ConnCase + use CgratesWebJsonapi.ModelCase alias CgratesWebJsonapi.Tenants alias CgratesWebJsonapi.Tenants.Membership From c5e755349a546c10e9f18375750234a6bdef3bc9 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Tue, 18 May 2021 17:46:53 +0200 Subject: [PATCH 15/19] failed tests --- .../membership_controller_test.exs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs index 43463f3..7ecb624 100644 --- a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs @@ -1,9 +1,16 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do use CgratesWebJsonapi.ModelCase + use CgratesWebJsonapi.ConnCase alias CgratesWebJsonapi.Tenants alias CgratesWebJsonapi.Tenants.Membership + alias CgratesWebJsonapi.Cdrs.Cdr + alias CgratesWebJsonapi.Repo + + import CgratesWebJsonapi.Factory + import CgratesWebJsonapi.Guardian + @create_attrs %{ role: 42 } @@ -17,8 +24,18 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do membership end - setup %{conn: conn} do - {:ok, conn: put_req_header(conn, "accept", "application/json")} + setup do + user = insert(:user) + + {:ok, token, _} = encode_and_sign(user, %{}, token_type: :access) + + conn = + build_conn() + |> put_req_header("accept", "application/vnd.api+json") + |> put_req_header("content-type", "application/vnd.api+json") + |> put_req_header("authorization", "bearer: " <> token) + + {:ok, conn: conn} end describe "index" do From 52161f9fee46591d51e3864a61bc43ecb13d28ae Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 19 May 2021 10:47:21 +0200 Subject: [PATCH 16/19] factory, index test fixes --- lib/cgrates_web_jsonapi/tenants/membership.ex | 4 +-- .../controllers/membership_controller.ex | 1 - lib/cgrates_web_jsonapi_web/router.ex | 1 + .../membership_controller_test.exs | 26 +++---------------- test/support/factory.ex | 8 ++++++ 5 files changed, 14 insertions(+), 26 deletions(-) diff --git a/lib/cgrates_web_jsonapi/tenants/membership.ex b/lib/cgrates_web_jsonapi/tenants/membership.ex index 7724439..0e81299 100644 --- a/lib/cgrates_web_jsonapi/tenants/membership.ex +++ b/lib/cgrates_web_jsonapi/tenants/membership.ex @@ -7,8 +7,8 @@ defmodule CgratesWebJsonapi.Tenants.Membership do schema "memberships" do field :role, :integer - belongs_to :tenant_id, Tenant, type: :string - belongs_to :user_id, User + belongs_to :tenant, Tenant, type: :string + belongs_to :user, User timestamps() end diff --git a/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex index d1aec6d..8a0c36e 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex @@ -4,7 +4,6 @@ defmodule CgratesWebJsonapiWeb.MembershipController do alias CgratesWebJsonapi.Tenants alias CgratesWebJsonapi.Tenants.Membership - action_fallback CgratesWebJsonapiWeb.FallbackController def index(conn, _params) do memberships = Tenants.list_memberships() diff --git a/lib/cgrates_web_jsonapi_web/router.ex b/lib/cgrates_web_jsonapi_web/router.ex index 9709091..a0e03db 100644 --- a/lib/cgrates_web_jsonapi_web/router.ex +++ b/lib/cgrates_web_jsonapi_web/router.ex @@ -107,6 +107,7 @@ defmodule CgratesWebJsonapiWeb.Router do resources("/cdr-extra-fields", CdrExtraFieldController, only: [:index]) resources("/cdr-stats", CdrStatController, only: [:index]) resources("/tenants", TenantController, only: [:show, :update]) + resources("/memberships", MembershipController) end scope "/uploaders", CgratesWebJsonapiWeb do diff --git a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs index 7ecb624..add1daf 100644 --- a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs @@ -1,5 +1,4 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do - use CgratesWebJsonapi.ModelCase use CgratesWebJsonapi.ConnCase alias CgratesWebJsonapi.Tenants @@ -11,19 +10,6 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do import CgratesWebJsonapi.Factory import CgratesWebJsonapi.Guardian - @create_attrs %{ - role: 42 - } - @update_attrs %{ - role: 43 - } - @invalid_attrs %{role: nil} - - def fixture(:membership) do - {:ok, membership} = Tenants.create_membership(@create_attrs) - membership - end - setup do user = insert(:user) @@ -40,8 +26,10 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do describe "index" do test "lists all memberships", %{conn: conn} do + membership = insert(:membership) conn = get(conn, Routes.membership_path(conn, :index)) - assert json_response(conn, 200)["data"] == [] + + assert length(json_response(conn, 200)["data"]) == 1 end end @@ -65,8 +53,6 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do end describe "update membership" do - setup [:create_membership] - test "renders membership when data is valid", %{ conn: conn, membership: %Membership{id: id} = membership @@ -93,7 +79,6 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do end describe "delete membership" do - setup [:create_membership] test "deletes chosen membership", %{conn: conn, membership: membership} do conn = delete(conn, Routes.membership_path(conn, :delete, membership)) @@ -104,9 +89,4 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do end end end - - defp create_membership(_) do - membership = fixture(:membership) - %{membership: membership} - end end diff --git a/test/support/factory.ex b/test/support/factory.ex index 9de0454..6267059 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -310,4 +310,12 @@ defmodule CgratesWebJsonapi.Factory do id: UUID.uuid4() } end + + def membership_factory do + %CgratesWebJsonapi.Tenants.Membership{ + id: sequence(:id, fn n -> n end), + tenant_id: insert(:tenant).id, + user_id: insert(:user).id + } + end end From 07d832a414ae2ec78a7c545b87685030b3aef350 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 19 May 2021 11:22:48 +0200 Subject: [PATCH 17/19] show test - added --- .../controllers/membership_controller.ex | 1 - .../controllers/membership_controller_test.exs | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex index 8a0c36e..eb8b206 100644 --- a/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex +++ b/lib/cgrates_web_jsonapi_web/controllers/membership_controller.ex @@ -4,7 +4,6 @@ defmodule CgratesWebJsonapiWeb.MembershipController do alias CgratesWebJsonapi.Tenants alias CgratesWebJsonapi.Tenants.Membership - def index(conn, _params) do memberships = Tenants.list_memberships() render(conn, "index.json", memberships: memberships) diff --git a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs index add1daf..3e27f31 100644 --- a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs @@ -26,13 +26,24 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do describe "index" do test "lists all memberships", %{conn: conn} do - membership = insert(:membership) + insert(:membership) conn = get(conn, Routes.membership_path(conn, :index)) assert length(json_response(conn, 200)["data"]) == 1 end end + describe "show" do + test "show one memberships", %{conn: conn} do + membership = insert(:membership, role: 1) + conn = get(conn, Routes.membership_path(conn, :show, membership)) |> doc + + data = json_response(conn, 200)["data"] + assert data["id"] == membership.id + assert data["role"] == 1 + end + end + describe "create membership" do test "renders membership when data is valid", %{conn: conn} do conn = post(conn, Routes.membership_path(conn, :create), membership: @create_attrs) @@ -79,7 +90,6 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do end describe "delete membership" do - test "deletes chosen membership", %{conn: conn, membership: membership} do conn = delete(conn, Routes.membership_path(conn, :delete, membership)) assert response(conn, 204) From e25458bd81658cb9d2a3598f0d8a86c920acedeb Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 19 May 2021 11:52:07 +0200 Subject: [PATCH 18/19] controller tests fixed --- .../membership_controller_test.exs | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs index 3e27f31..38e2fec 100644 --- a/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs +++ b/test/cgrates_web_jsonapi_web/controllers/membership_controller_test.exs @@ -10,6 +10,14 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do import CgratesWebJsonapi.Factory import CgratesWebJsonapi.Guardian + @create_attrs %{ + role: 42 + } + + @update_attrs %{ + role: 43 + } + setup do user = insert(:user) @@ -53,44 +61,27 @@ defmodule CgratesWebJsonapiWeb.MembershipControllerTest do assert %{ "id" => id, - " role" => 42 + "role" => 42 } = json_response(conn, 200)["data"] end - - test "renders errors when data is invalid", %{conn: conn} do - conn = post(conn, Routes.membership_path(conn, :create), membership: @invalid_attrs) - assert json_response(conn, 422)["errors"] != %{} - end end describe "update membership" do - test "renders membership when data is valid", %{ - conn: conn, - membership: %Membership{id: id} = membership - } do - conn = - put(conn, Routes.membership_path(conn, :update, membership), membership: @update_attrs) - - assert %{"id" => ^id} = json_response(conn, 200)["data"] - - conn = get(conn, Routes.membership_path(conn, :show, id)) - - assert %{ - "id" => id, - " role" => 43 - } = json_response(conn, 200)["data"] - end + test "update chosen membership", %{conn: conn} do + membership = insert(:membership, role: 1) - test "renders errors when data is invalid", %{conn: conn, membership: membership} do - conn = - put(conn, Routes.membership_path(conn, :update, membership), membership: @invalid_attrs) + id = membership.id + conn = put(conn, Routes.membership_path(conn, :update, id), membership: @update_attrs) + assert json_response(conn, 200)["data"]["id"] - assert json_response(conn, 422)["errors"] != %{} + assert json_response(conn, 200)["data"]["role"] == @update_attrs[:role] end end describe "delete membership" do - test "deletes chosen membership", %{conn: conn, membership: membership} do + test "deletes chosen membership", %{conn: conn} do + membership = insert(:membership, role: 1) + conn = delete(conn, Routes.membership_path(conn, :delete, membership)) assert response(conn, 204) From a8537cda49e7088c03fd67ca14e9050435573998 Mon Sep 17 00:00:00 2001 From: Roman Ustiantcev Date: Wed, 19 May 2021 12:00:40 +0200 Subject: [PATCH 19/19] tests fixes --- test/cgrates_web_jsonapi/tenants_test.exs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/test/cgrates_web_jsonapi/tenants_test.exs b/test/cgrates_web_jsonapi/tenants_test.exs index fede9b4..f032bc3 100644 --- a/test/cgrates_web_jsonapi/tenants_test.exs +++ b/test/cgrates_web_jsonapi/tenants_test.exs @@ -70,9 +70,9 @@ defmodule CgratesWebJsonapi.TenantsTest do describe "memberships" do alias CgratesWebJsonapi.Tenants.Membership - @valid_attrs %{" role": 42} - @update_attrs %{" role": 43} - @invalid_attrs %{" role": nil} + @valid_attrs %{role: 42} + @update_attrs %{role: 43} + @invalid_attrs %{role: nil} def membership_fixture(attrs \\ %{}) do {:ok, membership} = @@ -104,10 +104,7 @@ defmodule CgratesWebJsonapi.TenantsTest do test "update_membership/2 with valid data updates the membership" do membership = membership_fixture() - - assert {:ok, %Membership{} = membership} = - Tenants.update_membership(membership, @update_attrs) - + assert {:ok, %Membership{} = membership} = Tenants.update_membership(membership, @update_attrs) assert membership.role == 43 end