From d1a44a54579933c888669a93a390616aeb1767e0 Mon Sep 17 00:00:00 2001 From: KKlochko Date: Mon, 7 Apr 2025 22:02:52 +0300 Subject: [PATCH] Add transformers for BookId. --- .../sync/data_transformers/bid_transformer.ex | 20 +++++++ .../data_transformers/bids_transformer.ex | 21 ++++++++ .../bid_transformer_test.exs | 51 ++++++++++++++++++ .../bids_transformer_test.exs | 54 +++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 lib/decentralised_book_index/sync/data_transformers/bid_transformer.ex create mode 100644 lib/decentralised_book_index/sync/data_transformers/bids_transformer.ex create mode 100644 test/decentralised_book_index/sync/data_transformers/bid_transformer_test.exs create mode 100644 test/decentralised_book_index/sync/data_transformers/bids_transformer_test.exs diff --git a/lib/decentralised_book_index/sync/data_transformers/bid_transformer.ex b/lib/decentralised_book_index/sync/data_transformers/bid_transformer.ex new file mode 100644 index 0000000..82c701f --- /dev/null +++ b/lib/decentralised_book_index/sync/data_transformers/bid_transformer.ex @@ -0,0 +1,20 @@ +defmodule DecentralisedBookIndex.Sync.DataTransformers.BidTransformer do + def from_json(json_body) do + json_body = + if Map.has_key?(json_body, "data") do + json_body["data"] + else + json_body + end + + attrs = + %{ + id: get_in(json_body, ["id"]), + order: get_in(json_body, ["attributes", "order"]), + type: get_in(json_body, ["attributes", "type"]), + bid: get_in(json_body, ["attributes", "bid"]) + } + + {:ok, attrs} + end +end diff --git a/lib/decentralised_book_index/sync/data_transformers/bids_transformer.ex b/lib/decentralised_book_index/sync/data_transformers/bids_transformer.ex new file mode 100644 index 0000000..dc3e677 --- /dev/null +++ b/lib/decentralised_book_index/sync/data_transformers/bids_transformer.ex @@ -0,0 +1,21 @@ +defmodule DecentralisedBookIndex.Sync.DataTransformers.BidsTransformer do + alias DecentralisedBookIndex.Sync.DataTransformers.BidTransformer + + def from_json(json_body) do + json_body = + if Map.has_key?(json_body, "data") do + json_body["data"] + else + json_body + end + + {:ok, + Enum.map( + json_body, + fn record -> + {:ok, record} = BidTransformer.from_json(record) + record + end + )} + end +end diff --git a/test/decentralised_book_index/sync/data_transformers/bid_transformer_test.exs b/test/decentralised_book_index/sync/data_transformers/bid_transformer_test.exs new file mode 100644 index 0000000..f57151b --- /dev/null +++ b/test/decentralised_book_index/sync/data_transformers/bid_transformer_test.exs @@ -0,0 +1,51 @@ +defmodule DecentralisedBookIndex.Sync.DataTransformers.BidTransformerTest do + use ExUnit.Case, async: true + + alias DecentralisedBookIndex.Sync.DataTransformers.BidTransformer + + describe "correct transformations" do + test "a json contains correct bid information" do + json_body = + %{ + "data" => %{ + "attributes" => %{"bid" => "1234567890", "order" => 0, "type" => "isbn"}, + "id" => "0c0c0b3a-0410-4cb0-a7e3-b62bb392b097", + "links" => %{}, + "meta" => %{}, + "relationships" => %{}, + "type" => "book_id" + } + } + + assert {:ok, bid} = BidTransformer.from_json(json_body) + + assert %{ + id: "0c0c0b3a-0410-4cb0-a7e3-b62bb392b097", + order: 0, + type: "isbn", + bid: "1234567890" + } = bid + end + + test "a json doesn't contains bid information \"data\" attribute" do + json_body = + %{ + "attributes" => %{"bid" => "1234567890", "order" => 0, "type" => "isbn"}, + "id" => "0c0c0b3a-0410-4cb0-a7e3-b62bb392b097", + "links" => %{}, + "meta" => %{}, + "relationships" => %{}, + "type" => "book_id" + } + + assert {:ok, bid} = BidTransformer.from_json(json_body) + + assert %{ + id: "0c0c0b3a-0410-4cb0-a7e3-b62bb392b097", + order: 0, + type: "isbn", + bid: "1234567890" + } = bid + end + end +end diff --git a/test/decentralised_book_index/sync/data_transformers/bids_transformer_test.exs b/test/decentralised_book_index/sync/data_transformers/bids_transformer_test.exs new file mode 100644 index 0000000..eada296 --- /dev/null +++ b/test/decentralised_book_index/sync/data_transformers/bids_transformer_test.exs @@ -0,0 +1,54 @@ +defmodule DecentralisedBookIndex.Sync.DataTransformers.BidsTransformerTest do + use ExUnit.Case, async: true + + alias DecentralisedBookIndex.Sync.DataTransformers.BidsTransformer + + describe "correct transformations" do + test "a json contains correct bids information" do + json_body = + %{ + "data" => [ + %{ + "attributes" => %{"bid" => "1234567890", "order" => 0, "type" => "asin"}, + "id" => "0c0c0b3a-0410-4cb0-a7e3-b62bb392b097", + "links" => %{}, + "meta" => %{}, + "relationships" => %{}, + "type" => "book_id" + }, + %{ + "attributes" => %{"bid" => "1234567890123", "order" => 1, "type" => "isbn13"}, + "id" => "31eafe52-0f39-49ad-8980-cdd448f9c738", + "links" => %{}, + "meta" => %{}, + "relationships" => %{}, + "type" => "book_id" + } + ], + "jsonapi" => %{"version" => "1.0"}, + "links" => %{ + "self" => + "http://localhost:4000/api/v1/json/books/233987a5-f318-460b-9973-e553c99a0eaf/bids" + }, + "meta" => %{} + } + + assert {:ok, bids} = BidsTransformer.from_json(json_body) + + assert [ + %{ + id: "0c0c0b3a-0410-4cb0-a7e3-b62bb392b097", + order: 0, + type: "asin", + bid: "1234567890" + }, + %{ + id: "31eafe52-0f39-49ad-8980-cdd448f9c738", + order: 1, + type: "isbn13", + bid: "1234567890123" + } + ] = bids + end + end +end