From 6b042f65ab553a4c594e7b320173667671452652 Mon Sep 17 00:00:00 2001 From: danilo silva Date: Sat, 23 May 2020 21:51:56 +0000 Subject: [PATCH] using json instaed of xml removed hardcoded from generic podcast medatadata --- config/test.exs | 12 +- lib/podcast_feed.ex | 5 +- lib/podcast_feed/Utility/Format.ex | 7 + lib/podcast_feed/provider/archive/parser.ex | 187 +++++++----------- lib/podcast_feed/repo.ex | 10 +- .../controllers/feed_controller.ex | 4 +- lib/podcast_feed_web/endpoint.ex | 2 +- .../templates/feed/feed.xml.eex | 45 +++-- lib/podcast_feed_web/views/feed_view.ex | 1 + mix.exs | 7 +- mix.lock | 1 + .../provider/archive/parser_test.exs | 55 ++++++ test/podcast_feed/utility/format_test.exs | 9 + test/support/channel_case.ex | 8 +- test/support/conn_case.ex | 8 +- test/support/data_case.ex | 24 +-- test/test_helper.exs | 2 +- 17 files changed, 213 insertions(+), 174 deletions(-) create mode 100644 lib/podcast_feed/Utility/Format.ex create mode 100644 test/podcast_feed/provider/archive/parser_test.exs create mode 100644 test/podcast_feed/utility/format_test.exs diff --git a/config/test.exs b/config/test.exs index ca7664b..2b65e42 100644 --- a/config/test.exs +++ b/config/test.exs @@ -5,12 +5,12 @@ use Mix.Config # The MIX_TEST_PARTITION environment variable can be used # to provide built-in test partitioning in CI environment. # Run `mix help test` for more information. -config :podcast_feed, PodcastFeed.Repo, - username: "postgres", - password: "postgres", - database: "podcast_feed_test#{System.get_env("MIX_TEST_PARTITION")}", - hostname: "localhost", - pool: Ecto.Adapters.SQL.Sandbox +# config :podcast_feed, PodcastFeed.Repo, +# username: "postgres", +# password: "postgres", +# database: "podcast_feed_test#{System.get_env("MIX_TEST_PARTITION")}", +# hostname: "localhost", +# pool: Ecto.Adapters.SQL.Sandbox # We don't run a server during test. If one is required, # you can enable the server option below. diff --git a/lib/podcast_feed.ex b/lib/podcast_feed.ex index 62ed9c1..2afd95a 100644 --- a/lib/podcast_feed.ex +++ b/lib/podcast_feed.ex @@ -8,9 +8,8 @@ defmodule PodcastFeed do """ alias PodcastFeed.Provider.Archive - def archive() do - Archive.Parser.feed('https://ia601402.us.archive.org/8/items/incontri-a-piano-terra/incontri-a-piano-terra_files.xml') #FIXME: should be dynamic - |> IO.inspect + def archive(identifier) do + Archive.Parser.by_identifier(identifier) end end diff --git a/lib/podcast_feed/Utility/Format.ex b/lib/podcast_feed/Utility/Format.ex new file mode 100644 index 0000000..1b7d0a7 --- /dev/null +++ b/lib/podcast_feed/Utility/Format.ex @@ -0,0 +1,7 @@ +defmodule PodcastFeed.Utility.Format do + + def compile(subject, replacements) do + replacements + |> Enum.reduce(subject, fn {replacement_key, replacement_value}, subject -> String.replace(subject, "{#{replacement_key}}", replacement_value) end) + end +end \ No newline at end of file diff --git a/lib/podcast_feed/provider/archive/parser.ex b/lib/podcast_feed/provider/archive/parser.ex index 2c0ded3..9a365c7 100644 --- a/lib/podcast_feed/provider/archive/parser.ex +++ b/lib/podcast_feed/provider/archive/parser.ex @@ -1,130 +1,95 @@ defmodule PodcastFeed.Provider.Archive.Parser do - def feed(url) do - url - |> fetch_xml() - |> parse() - |> IO.inspect() - |> filter_mp3() - |> compose() + alias PodcastFeed.Utility.Format + + @extra_metadata_url "https://archive.org/download/{identifier}/metadata.json" + @metadata_url "http://archive.org/metadata/{identifier}" + @download_url "https://archive.org/download/{identifier}/{filename}" + + def by_identifier(identifier) do + extra_metadata_json = fetch_extra_metadata(identifier) + metadata_json = fetch_metadata(identifier) + parse(identifier, metadata_json, extra_metadata_json) end - defp fetch_xml(url) do - {:ok, {_, _, xml}} = :httpc.request(:get, {url, []}, [], [body_format: :binary]) - xml + defp fetch_extra_metadata(identifier) do + extra_metadata_url = Format.compile(@extra_metadata_url, identifier: identifier) + {:ok, 200, _headers, client_ref} = :hackney.get(extra_metadata_url, [], "", [follow_redirect: true]) + {:ok, extra_metadata_json} = :hackney.body(client_ref) + extra_metadata_json |> String.split("\n") |> Enum.join() |> Poison.decode!() end - defp parse(xml) do - xml |> XmlToMap.naive_map() |> Map.get("files") |> Map.get("file") |> Enum.map(fn f -> Map.get(f, "#content") |> Map.put("filename", Map.get(f, "-name")) end) + defp fetch_metadata(identifier) do + metadata_url = Format.compile(@metadata_url, identifier: identifier) + metadata_url |> IO.inspect + {:ok, 200, _headers, client_ref} = :hackney.get(metadata_url, [], "", [follow_redirect: true, connect_timeout: 30000, recv_timeout: 30000]) + {:ok, metadata_json} = :hackney.body(client_ref) + metadata_json |> Poison.decode!() end - defp filter_mp3(files) do - files |> Enum.filter(fn f -> Map.get(f, "format") =~ ~r/MP3/i end) + def parse(identifier, %{"metadata" => metadata, "files" => files}, extra) do + _image = files |> fetch_image(identifier) + + %{podcast: podcast_data(metadata, extra), items: items_data(files, identifier)} end - defp compose(files) do - files - |> Enum.map(&to_feed_item/1) + defp fetch_image(files, identifier) do + filename = files + |> Enum.filter(fn f -> f["source"] == "original" end) + |> Enum.filter(fn f -> f["format"] == "JPEG" end) #FIXME:! jpg, png, gif + |> List.first() + |> Map.get("name") + + Format.compile(@download_url, identifier: identifier, filename: filename) |> URI.encode() end - # - # Episode Name 2 - # - # http://podcast.example.com/episode2.mp4 - # - # Sat, 02 Jan 2016 16:00:00 PDT - # - # The full length episode 2 description - # - # - # - # http://podcast.example.com/episode2.mp4 - # - # 19:07 - # - # The full length episode 2 description - # - # - # - # comma,separated,key,words - # - # no - # -# %{ -# "album" => "Incontri al Piano Terra", -# "artist" => "APE Milano", -# "crc32" => "f1820595", -# "creator" => "APE Milano", -# "format" => "VBR MP3", -# "genre" => "podcast", -# "height" => "0", -# "length" => "3943.31", -# "md5" => "9ca26043a3e82e6f86c3a9309b88f4f5", -# "mtime" => "1590154757", -# "sha1" => "dcacfa46fcad1d656312784ad06886b5614c6420", -# "size" => "47148690", -# "title" => "Presentazione di Montagna femminile plurale con N1DM", -# "track" => "03", -# "width" => "0" -# } - - defp to_feed_item(file) do + defp podcast_data(metadata, extra) do %{ - title: file |> Map.get("title"), - link: "http://archive.org/download/incontri-a-piano-terra/" <> (file |> Map.get("filename")) |> URI.encode(), #FIXME:! identifier should by dynamic - pubDate: file |> Map.get("mtime") |> Integer.parse() |> elem(0) |> DateTime.from_unix!(:second), + title: metadata["title"], + description: metadata["description"], + webmaster: metadata["uploader"], + managingEditor: metadata["uploader"], + owner: %{ + name: metadata["creator"], + email: metadata["uploader"], + }, + keywords: metadata["subject"], + pubDate: metadata["publicdate"] |> NaiveDateTime.from_iso8601!() |> DateTime.from_naive!("Etc/UTC"), + lastBuildDate: metadata["addeddate"] |> NaiveDateTime.from_iso8601!() |> DateTime.from_naive!("Etc/UTC"), + author: metadata["creator"], + language: metadata["language"], + image: %{ + url: extra["image"]["url"], + title: extra["image"]["title"], + link: extra["image"]["link"], + }, + link: extra["link"], + category: extra["category"], + explicit: extra["explicit"], + } + end + + defp items_data(files, identifier) do + files + |> filter_audio_files() + |> Enum.map(fn f -> to_feed_item(f, identifier) end) + end + + defp filter_audio_files(files) do + files |> Enum.filter(fn f -> Map.get(f, "format") =~ ~r/MP3/i end) #FIXME:! mp3, ogg, boh + end + + defp to_feed_item(file, identifier) do + filename = Map.get(file, "name") + %{ + title: file["title"], description: "", - length: (file |> Map.get("length") |> Float.parse() |> elem(0)) * 100, - guid: "", - duration: "", + pubDate: file |> Map.get("mtime") |> Integer.parse() |> elem(0) |> DateTime.from_unix!(:second), + link: Format.compile(@download_url, identifier: identifier, filename: filename) |> URI.encode(), + length: (file |> Map.get("length") |> Float.parse() |> elem(0)) * 100 |> trunc(), summary: "", - image: "", + # image: "", #FIXME:! take the image from other files keywords: file |> Map.take(["album", "artist", "genre"]) |> Map.values(), explicit: "no", } end end - -# -# -# -# http://www.YourSite.com -# en-us -# ©2013 -# your@email.com (Your Name) -# your@email.com (Your Name) -# -# http://www.YourSite.com/ImageSize300X300.jpg -# Title or description of your logo -# http://www.YourSite.com -# -# -# Your Name -# your@email.com -# -# -# -# -# separate, by, comma, and, space -# no -# -# -# Sun, 01 Jan 2012 00:00:00 EST -# Verbose title of the podcast -# College, school, or department owning the podcast -# Verbose description of the podcast. -# Duplicate of above verbose description. -# Short description of the podcast - 255 character max. -# Thu, 02 Feb 2012 00:00:00 EST -# -# Verbose title of the episode -# Verbose description of the episode. -# Duplicate of above verbose description. -# Short description of the episode - 255 character max. -# -# -# http://www.YourSite.com/FILE.EXT -# H:MM:SS -# Thu, 02 Feb 2012 00:00:00 EST -# -# -# diff --git a/lib/podcast_feed/repo.ex b/lib/podcast_feed/repo.ex index 8113f15..db6e953 100644 --- a/lib/podcast_feed/repo.ex +++ b/lib/podcast_feed/repo.ex @@ -1,5 +1,5 @@ -defmodule PodcastFeed.Repo do - # use Ecto.Repo, - # otp_app: :podcast_feed, - # adapter: Ecto.Adapters.Postgres -end +# defmodule PodcastFeed.Repo do +# # use Ecto.Repo, +# # otp_app: :podcast_feed, +# # adapter: Ecto.Adapters.Postgres +# end diff --git a/lib/podcast_feed_web/controllers/feed_controller.ex b/lib/podcast_feed_web/controllers/feed_controller.ex index 043752a..6927dd4 100644 --- a/lib/podcast_feed_web/controllers/feed_controller.ex +++ b/lib/podcast_feed_web/controllers/feed_controller.ex @@ -2,9 +2,9 @@ defmodule PodcastFeedWeb.FeedController do use PodcastFeedWeb, :controller def apeMilano(conn, _params) do - items = PodcastFeed.archive() + %{podcast: podcast, items: items} = PodcastFeed.archive("incontri-a-piano-terra") conn |> put_resp_content_type("text/xml") - |> render("feed.xml", items: items) + |> render("feed.xml", podcast: podcast, items: items) end end diff --git a/lib/podcast_feed_web/endpoint.ex b/lib/podcast_feed_web/endpoint.ex index 98c7443..8601e3d 100644 --- a/lib/podcast_feed_web/endpoint.ex +++ b/lib/podcast_feed_web/endpoint.ex @@ -32,7 +32,7 @@ defmodule PodcastFeedWeb.Endpoint do socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket plug Phoenix.LiveReloader plug Phoenix.CodeReloader - plug Phoenix.Ecto.CheckRepoStatus, otp_app: :podcast_feed + # plug Phoenix.Ecto.CheckRepoStatus, otp_app: :podcast_feed end plug Phoenix.LiveDashboard.RequestLogger, diff --git a/lib/podcast_feed_web/templates/feed/feed.xml.eex b/lib/podcast_feed_web/templates/feed/feed.xml.eex index c345519..41b4c98 100644 --- a/lib/podcast_feed_web/templates/feed/feed.xml.eex +++ b/lib/podcast_feed_web/templates/feed/feed.xml.eex @@ -1,35 +1,34 @@ - http://www.ape-alveare.it/ - en-us + <%= @podcast.link %> + <%= @podcast.language %> ©2022 - your@email.com (Your Name) - your@email.com (Your Name) + <%= @podcast.webmaster %> + <%= @podcast.webmaster %> - http://www.ape-alveare.it/wp-content/themes/yootheme/cache/2018_logo_Ape_righe_trasparenza-d1aae6b9.png - Ape-Milano-logo - http://www.ape-alveare.it/ + <%= @podcast.image.url %> + <%= @podcast.image.title %> + <%= @podcast.image.link %> - Ape Milano - your@email.com + <%= @podcast.owner.name %> + <%= @podcast.owner.email %> - - + + - separate, by, comma, and, space - no - + <%= "FIXME!!!" %> + <%= @podcast.explicit %> + - Sun, 01 Jan 2012 00:00:00 EST - Verbose title of the podcast + <%= @podcast.pubDate |> Calendar.DateTime.Format.rfc2822 %> + <%= @podcast.title %> College, school, or department owning the podcast - Verbose description of the podcast. - Duplicate of above verbose description. - Short description of the podcast - 255 character max. - Thu, 02 Feb 2012 00:00:00 EST - + <%= @podcast.description %> + <%= @podcast.description %> + <%= @podcast.description %> + <%= @podcast.pubDate |> Calendar.DateTime.Format.rfc2822 %> <%= for item <- @items do %> <%= item.title %> @@ -43,6 +42,6 @@ <%= item.keywords %> <%= item.explicit %> - <%= end %> + <% end %> - + \ No newline at end of file diff --git a/lib/podcast_feed_web/views/feed_view.ex b/lib/podcast_feed_web/views/feed_view.ex index a07b348..bdb693c 100644 --- a/lib/podcast_feed_web/views/feed_view.ex +++ b/lib/podcast_feed_web/views/feed_view.ex @@ -2,6 +2,7 @@ defmodule PodcastFeedWeb.FeedView do use PodcastFeedWeb, :view def format_length(length) do + length |> IO.inspect parsed = length / 100 / 60 min = parsed |> trunc sec = parsed - min |> Float.floor(2) |> Float.to_string() |> String.split(".") |> Enum.at(1) diff --git a/mix.exs b/mix.exs index bd773a4..1a014e8 100644 --- a/mix.exs +++ b/mix.exs @@ -47,7 +47,9 @@ defmodule PodcastFeed.MixProject do {:plug_cowboy, "~> 2.0"}, {:elixir_xml_to_map, "~> 1.0"}, {:calendar, "~> 1.0.0"}, - {:distillery, "~> 2.0"} + {:distillery, "~> 2.0"}, + {:poison, "~> 3.1"}, + {:hackney, "~> 1.15"}, ] end @@ -62,7 +64,8 @@ defmodule PodcastFeed.MixProject do setup: ["deps.get", "ecto.setup", "cmd npm install --prefix assets"], "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], "ecto.reset": ["ecto.drop", "ecto.setup"], - test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"] + # test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"] + test: ["test"] ] end end diff --git a/mix.lock b/mix.lock index 064f5c3..0cfdc71 100644 --- a/mix.lock +++ b/mix.lock @@ -31,6 +31,7 @@ "plug": {:hex, :plug, "1.10.1", "c56a6d9da7042d581159bcbaef873ba9d87f15dce85420b0d287bca19f40f9bd", [: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: true]}], "hexpm", "b5cd52259817eb8a31f2454912ba1cff4990bca7811918878091cb2ab9e52cb8"}, "plug_cowboy": {:hex, :plug_cowboy, "2.2.1", "fcf58aa33227a4322a050e4783ee99c63c031a2e7f9a2eb7340d55505e17f30f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3b43de24460d87c0971887286e7a20d40462e48eb7235954681a20cee25ddeb6"}, "plug_crypto": {:hex, :plug_crypto, "1.1.2", "bdd187572cc26dbd95b87136290425f2b580a116d3fb1f564216918c9730d227", [:mix], [], "hexpm", "6b8b608f895b6ffcfad49c37c7883e8df98ae19c6a28113b02aa1e9c5b22d6b5"}, + "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, "postgrex": {:hex, :postgrex, "0.15.4", "5d691c25fc79070705a2ff0e35ce0822b86a0ee3c6fdb7a4fb354623955e1aed", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "306515b9d975fcb2478dc337a1d27dc3bf8af7cd71017c333fe9db3a3d211b0a"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm", "13104d7897e38ed7f044c4de953a6c28597d1c952075eb2e328bc6d6f2bfc496"}, diff --git a/test/podcast_feed/provider/archive/parser_test.exs b/test/podcast_feed/provider/archive/parser_test.exs new file mode 100644 index 0000000..760a6ee --- /dev/null +++ b/test/podcast_feed/provider/archive/parser_test.exs @@ -0,0 +1,55 @@ +defmodule PodcastFeed.Provider.Archive.ParserTest do + use ExUnit.Case + + alias PodcastFeed.Provider.Archive.Parser + + setup_all do + valid_json = "{\"created\":1590247789,\"d1\":\"ia601402.us.archive.org\",\"d2\":\"ia801402.us.archive.org\",\"dir\":\"/8/items/incontri-a-piano-terra\",\"files\":[{\"name\": \"metadata.json\",\"source\": \"original\",\"mtime\": \"1590258296\",\"size\": \"315\",\"md5\": \"a0c0e219cf3f13e54f2a4b3efef8e5c8\",\"crc32\": \"2d181b5c\",\"sha1\": \"8244b579a759edddd01c905dd11f8565e83d0898\",\"format\": \"JSON\"},{\"name\": \"cover.jpg\",\"source\": \"original\",\"mtime\": \"1590258445\",\"size\": \"10650\",\"md5\": \"15687b23e11f0099abbfe64eb1685c31\",\"crc32\": \"fbb1516a\",\"sha1\": \"98fa929c7554241cfa92bea8eba69b39c5d47603\",\"format\": \"JPEG\",\"rotation\": \"0\"},{\"name\":\"Confini mobili sulle alpi.mp3\",\"source\":\"original\",\"mtime\":\"1590135989\",\"size\":\"46933494\",\"md5\":\"e832ee9381a4f8af2d9727e2f49126ae\",\"crc32\":\"d709dd90\",\"sha1\":\"89c820a2dfd63cfbbf7aeefd191c653756b33fe3\",\"format\":\"VBR MP3\",\"length\":\"3902.35\",\"height\":\"0\",\"width\":\"0\",\"title\":\"Confini mobili sulle alpi (italian limes)\",\"creator\":\"APE Milano\",\"album\":\"Incontri a Piano Terra\",\"track\":\"02\",\"artist\":\"APE Milano\",\"genre\":\"podcast\"},{\"name\":\"Confini mobili sulle alpi.png\",\"source\":\"derivative\",\"format\":\"PNG\",\"original\":\"Confini mobili sulle alpi.mp3\",\"mtime\":\"1590137809\",\"size\":\"34656\",\"md5\":\"63893f9b00402a107682b5317e808523\",\"crc32\":\"b59ff609\",\"sha1\":\"a396716431cd0acedd243030093d0b31d792cfb3\"},{\"name\":\"Confini mobili sulle alpi_spectrogram.png\",\"source\":\"derivative\",\"format\":\"Spectrogram\",\"original\":\"Confini mobili sulle alpi.mp3\",\"mtime\":\"1590137854\",\"size\":\"273188\",\"md5\":\"557337665c6d9f962b2e91d169f25e1b\",\"crc32\":\"08b4b57c\",\"sha1\":\"88e088f9c4954aa8f0849b7e0d69cee8d7d42327\"}],\"files_count\":31,\"item_last_updated\":1590160774,\"item_size\":244544362,\"metadata\":{\"identifier\":\"incontri-a-piano-terra\",\"mediatype\":\"audio\",\"collection\":\"opensource_audio\",\"creator\":\"APE Milano\",\"description\":\"Qualche registrazione delle attivit\\u00e0 sociali che promuoviamo al Piano Terra di Milano\",\"language\":\"ita\",\"licenseurl\":\"https://creativecommons.org/licenses/by-nc-nd/4.0/\",\"scanner\":\"Internet Archive HTML5 Uploader 1.6.4\",\"subject\":[\"ape milano\",\"podcast\",\"montagna\"],\"title\":\"Incontri a Piano Terra\",\"uploader\":\"milanoape@gmail.com\",\"publicdate\":\"2020-05-22 08:30:21\",\"addeddate\":\"2020-05-22 08:30:21\",\"curation\":\"[curator]validator@archive.org[/curator][date]20200522085526[/date][comment]checked for malware[/comment]\"},\"server\":\"ia601402.us.archive.org\",\"uniq\":122833277,\"workable_servers\":[\"ia601402.us.archive.org\",\"ia801402.us.archive.org\"]}" + extra = "{\"link\": \"http://www.ape-alveare.it/\",\"image\": {\"url\": \"http://www.ape-alveare.it/wp-content/themes/yootheme/cache/2018_logo_Ape_righe_trasparenza-d1aae6b9.png\",\"title\": \"APE Milano\",\"link\": \"http://www.ape-alveare.it/\"},\"category\": \"Montagna\",\"explicit\": \"no\" }" + + {:ok, json: valid_json, extra: extra} + end + + test "Test that podcast data are correctly converted", state do + %{podcast: podcast} = Parser.parse("incontri-a-piano-terra", Poison.decode!(state[:json]), Poison.decode!(state[:extra])) + assert %{ + title: "Incontri a Piano Terra", + description: "Qualche registrazione delle attività sociali che promuoviamo al Piano Terra di Milano", + webmaster: "milanoape@gmail.com", + managingEditor: "milanoape@gmail.com", + owner: %{ + name: "APE Milano", + email: "milanoape@gmail.com", + }, + keywords: ["ape milano", "podcast", "montagna"], + pubDate: ~U[2020-05-22 08:30:21Z], + lastBuildDate: ~U[2020-05-22 08:30:21Z], + author: "APE Milano", + language: "ita", + image: %{ + url: "http://www.ape-alveare.it/wp-content/themes/yootheme/cache/2018_logo_Ape_righe_trasparenza-d1aae6b9.png", + title: "APE Milano", + link: "http://www.ape-alveare.it/", + }, + link: "http://www.ape-alveare.it/", + category: "Montagna", + explicit: "no", + } == podcast + end + + test "Test that items data are correctly converted", state do + %{items: items} = Parser.parse("incontri-a-piano-terra", Poison.decode!(state[:json]), Poison.decode!(state[:extra])) + assert [ + %{ + title: "Confini mobili sulle alpi (italian limes)", + description: "", + pubDate: ~U[2020-05-22 08:26:29Z], + link: "https://archive.org/download/incontri-a-piano-terra/Confini%20mobili%20sulle%20alpi.mp3", + length: 390235, + summary: "", + keywords: ["Incontri a Piano Terra", "APE Milano", "podcast"], + explicit: "no", + } + ] == items + end +end \ No newline at end of file diff --git a/test/podcast_feed/utility/format_test.exs b/test/podcast_feed/utility/format_test.exs new file mode 100644 index 0000000..12c4949 --- /dev/null +++ b/test/podcast_feed/utility/format_test.exs @@ -0,0 +1,9 @@ +defmodule PodcastFeed.Utility.FormatTest do + use ExUnit.Case + + alias PodcastFeed.Utility.Format + + test "Test placeholder are replaced" do + assert "http://foo/bar" == Format.compile("http://{host}/{path}", host: "foo", path: "bar") + end +end \ No newline at end of file diff --git a/test/support/channel_case.ex b/test/support/channel_case.ex index 7dd9fb2..e32c5f3 100644 --- a/test/support/channel_case.ex +++ b/test/support/channel_case.ex @@ -29,11 +29,11 @@ defmodule PodcastFeedWeb.ChannelCase do end setup tags do - :ok = Ecto.Adapters.SQL.Sandbox.checkout(PodcastFeed.Repo) + # :ok = Ecto.Adapters.SQL.Sandbox.checkout(PodcastFeed.Repo) - unless tags[:async] do - Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, {:shared, self()}) - end + # unless tags[:async] do + # Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, {:shared, self()}) + # end :ok end diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index 7581661..632ea27 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -32,11 +32,11 @@ defmodule PodcastFeedWeb.ConnCase do end setup tags do - :ok = Ecto.Adapters.SQL.Sandbox.checkout(PodcastFeed.Repo) + # :ok = Ecto.Adapters.SQL.Sandbox.checkout(PodcastFeed.Repo) - unless tags[:async] do - Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, {:shared, self()}) - end + # unless tags[:async] do + # Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, {:shared, self()}) + # end {:ok, conn: Phoenix.ConnTest.build_conn()} end diff --git a/test/support/data_case.ex b/test/support/data_case.ex index 06802db..d6dc3a4 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -20,19 +20,19 @@ defmodule PodcastFeed.DataCase do quote do alias PodcastFeed.Repo - import Ecto - import Ecto.Changeset - import Ecto.Query + # import Ecto + # import Ecto.Changeset + # import Ecto.Query import PodcastFeed.DataCase end end setup tags do - :ok = Ecto.Adapters.SQL.Sandbox.checkout(PodcastFeed.Repo) + # :ok = Ecto.Adapters.SQL.Sandbox.checkout(PodcastFeed.Repo) - unless tags[:async] do - Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, {:shared, self()}) - end + # unless tags[:async] do + # Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, {:shared, self()}) + # end :ok end @@ -46,10 +46,10 @@ defmodule PodcastFeed.DataCase do """ def errors_on(changeset) do - Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> - Regex.replace(~r"%{(\w+)}", message, fn _, key -> - opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() - end) - end) + # Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> + # Regex.replace(~r"%{(\w+)}", message, fn _, key -> + # opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() + # end) + # end) end end diff --git a/test/test_helper.exs b/test/test_helper.exs index 3597be3..5e46dbb 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1,2 +1,2 @@ ExUnit.start() -Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, :manual) +# Ecto.Adapters.SQL.Sandbox.mode(PodcastFeed.Repo, :manual) \ No newline at end of file