From bff6cd6985f834c3e0cc77e28bea104bb8b93700 Mon Sep 17 00:00:00 2001 From: Anna Buianova Date: Sat, 30 Nov 2019 00:16:19 +0300 Subject: [PATCH] Fix podcast episode validation error (#4967) [deploy] * Started fixing podcast episode bug * Fix the specs for create podcast episode --- app/services/podcasts/create_episode.rb | 7 +++++-- spec/services/podcasts/create_episode_spec.rb | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/services/podcasts/create_episode.rb b/app/services/podcasts/create_episode.rb index c2bccd9d2..1c90d10d2 100644 --- a/app/services/podcasts/create_episode.rb +++ b/app/services/podcasts/create_episode.rb @@ -25,8 +25,11 @@ module Podcasts Rails.logger.error("not a valid date: #{e}") end ep.body = item.body - ep.save! - ep + import_result = PodcastEpisode.import! [ep], on_duplicate_key_update: { + conflict_target: %i[media_url], + columns: %i[title slug subtitle summary website_url published_at reachable media_url https body] + } + PodcastEpisode.find(import_result.ids.first) end private diff --git a/spec/services/podcasts/create_episode_spec.rb b/spec/services/podcasts/create_episode_spec.rb index 8bcbae09e..3967208dd 100644 --- a/spec/services/podcasts/create_episode_spec.rb +++ b/spec/services/podcasts/create_episode_spec.rb @@ -70,4 +70,24 @@ RSpec.describe Podcasts::CreateEpisode, type: :service do expect(episode.reachable).to be true end end + + context "when attempting to create duplicate episodes" do + let(:rss_item) { RSS::Parser.parse("spec/support/fixtures/podcasts/developertea.rss", false).items.first } + let(:item) { Podcasts::EpisodeRssItem.from_item(rss_item) } + let!(:episode) { create(:podcast_episode, title: "outdated title", media_url: item.enclosure_url) } + + before do + stub_request(:head, item.enclosure_url).to_return(status: 200) + end + + it "updates existing episode" do + new_episode = described_class.call(podcast.id, item) + expect(new_episode.id).to eq(episode.id) + end + + it "updates columns" do + new_episode = described_class.call(podcast.id, item) + expect(new_episode.title).to eq(item.title) + end + end end