Skip to content

Commit

Permalink
Add tests; move podcast/episode specific code and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
cavis committed Feb 13, 2024
1 parent c704fe2 commit bcf1947
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 47 deletions.
2 changes: 1 addition & 1 deletion app/models/concerns/release_episodes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ module ReleaseEpisodes
FROM episode_publish_times
LEFT JOIN latest_queue_times USING (podcast_id)
WHERE publish_time <= NOW()
AND publish_time > latest_queue_time
AND (latest_queue_time IS NULL OR publish_time > latest_queue_time)
SQL

included do
Expand Down
116 changes: 116 additions & 0 deletions test/models/concerns/release_episodes_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
require "test_helper"

class ReleaseEpisodesTest < ActiveSupport::TestCase
let(:episode) { create(:episode, published_at: 30.minutes.from_now) }
let(:podcast) { episode.podcast }
let(:feed) { podcast.default_feed }

describe ".to_release" do
it "returns episodes/podcasts that need release" do
assert_empty Episode.to_release
assert_empty Podcast.to_release

episode.update!(published_at: 1.minute.ago)
assert_equal [episode], Episode.to_release
assert_equal [podcast], Podcast.to_release

# queue item < published_at - still needs release
PublishingQueueItem.create!(podcast: podcast, created_at: 1.hour.ago)
assert_equal [episode], Episode.to_release
assert_equal [podcast], Podcast.to_release

# queue item > published_at - we're good!
PublishingQueueItem.create!(podcast: podcast, created_at: 1.minute.from_now)
assert_empty Episode.to_release
assert_empty Podcast.to_release
end

it "handles negative feed offsets" do
feed.update!(episode_offset_seconds: -300)
assert_empty Episode.to_release
assert_empty Podcast.to_release

episode.update!(published_at: 4.minutes.from_now)
assert_equal [episode], Episode.to_release
assert_equal [podcast], Podcast.to_release

# add a queue item, and we're good
PublishingQueueItem.create!(podcast: podcast)
assert_empty Episode.to_release
assert_empty Podcast.to_release
end

it "handles positive feed offsets" do
feed.update!(episode_offset_seconds: 300)
assert_empty Episode.to_release
assert_empty Podcast.to_release

episode.update!(published_at: 4.minutes.ago)
assert_empty Episode.to_release
assert_empty Podcast.to_release

episode.update!(published_at: 6.minutes.ago)
assert_equal [episode], Episode.to_release
assert_equal [podcast], Podcast.to_release

# add a queue item, and we're good
PublishingQueueItem.create!(podcast: podcast)
assert_empty Episode.to_release
assert_empty Podcast.to_release
end

it "does not care about non-published_at or deleted data" do
episode.update!(published_at: 1.minute.ago)
assert_equal [episode], Episode.to_release
assert_equal [podcast], Podcast.to_release

episode.update!(published_at: nil)
assert_empty Episode.to_release
assert_empty Podcast.to_release

episode.update!(published_at: 1.minutes.ago, deleted_at: Time.now)
assert_empty Episode.to_release
assert_empty Podcast.to_release

episode.update!(deleted_at: nil)
feed.update!(deleted_at: Time.now)
assert_empty Episode.to_release
assert_empty Podcast.to_release
end
end

describe ".release!" do
it "publishes podcasts and updates published_at" do
podcast.update!(published_at: 1.hour.ago)
episode.update!(published_at: 10.minutes.ago)
episode2 = create(:episode, podcast: podcast, published_at: 1.minute.ago)

publish_calls = []

Podcast.stub_any_instance(:publish!, -> { publish_calls << self }) do
Podcast.release!
end

assert_equal [podcast], publish_calls
assert_equal podcast.published_at, episode2.published_at
end

it "cleans up dead publishing pipelines" do
obj = Minitest::Mock.new
obj.expect :call, nil
PublishingPipelineState.stub(:expire_pipelines!, obj) do
Podcast.release!
end
obj.verify
end

it "retries latest publishing pipelines with errors" do
obj = Minitest::Mock.new
obj.expect :call, nil
PublishingPipelineState.stub(:retry_failed_pipelines!, obj) do
Podcast.release!
end
obj.verify
end
end
end
26 changes: 0 additions & 26 deletions test/models/episode_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -218,32 +218,6 @@
end
end

describe "release episodes" do
let(:podcast) { episode.podcast }

before do
day_ago = 1.day.ago
podcast.update_columns(updated_at: day_ago)
episode.update_columns(updated_at: day_ago, published_at: 1.hour.ago)
end

it "lists episodes to release" do
assert_operator podcast.last_build_date, :<, episode.published_at
episodes = Episode.episodes_to_release
assert_equal episodes.size, 1
assert_equal episodes.first, episode
end

it "updates feed published date after release" do
assert_operator podcast.published_at, :<, episode.published_at
episodes = Episode.episodes_to_release
assert_equal episodes.first, episode
Episode.release_episodes!
podcast.reload
assert_equal podcast.published_at.to_i, episode.published_at.to_i
end
end

describe "prx story" do
let(:story) do
msg = json_file(:prx_story_small)
Expand Down
20 changes: 0 additions & 20 deletions test/models/podcast_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,26 +79,6 @@
refute_equal StartPublishingPipelineJob, podcast.publish!.class
end
end

describe ".release!" do
it "cleans up dead publishing pipelines" do
obj = Minitest::Mock.new
obj.expect :call, nil
PublishingPipelineState.stub(:expire_pipelines!, obj) do
Podcast.release!
end
obj.verify
end

it "retries latest publishing pipelines with errors" do
obj = Minitest::Mock.new
obj.expect :call, nil
PublishingPipelineState.stub(:retry_failed_pipelines!, obj) do
Podcast.release!
end
obj.verify
end
end
end

describe "episode limit" do
Expand Down

0 comments on commit bcf1947

Please sign in to comment.