ubicloud/spec/prog/github/delete_cache_entries_spec.rb
Jeremy Evans 84eed0b842 Fix issues in the delete all cache entries prog implementation
Fixes and improvements to previous commit:

* Add delete_all_cache_entries to LOGGED_ACTIONS.
* Change optional initiated_at assemble argument from positional to keyword.
* Don't use repository_id as the id of the created strand.
* Remove unnecessary start label in prog.
* Only delete cache entries before initiated at.
* Add next_entry method to prog for easier mocking.
* Update flash notices used in route.
* Only mock when necessary in the specs.
* Simplify web and cli specs.
* Only use a transaction in the route if there are cache entries.
2025-11-18 09:35:36 +09:00

71 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require_relative "../../model/spec_helper"
RSpec.describe Prog::Github::DeleteCacheEntries do
let(:repository) { GithubRepository.create(name: "test") }
let(:dce) { described_class.new(described_class.assemble(repository.id)) }
let(:entries) {
Array.new(2) do
repository.add_cache_entry(
key: "k#{it}",
version: "v#{it}",
scope: "main",
upload_id: "upload-#{it}",
created_by: "3c9a861c-ab14-8218-a175-875ebb652f7b",
created_at: Time.now - 2 + it
)
end
}
describe ".assemble" do
it "creates a strand" do
st = described_class.assemble(repository.id)
expect(st.prog).to eq "Github::DeleteCacheEntries"
expect(st.label).to eq "delete_entries"
expect(st.stack[0]["subject_id"]).to eq repository.id
expect(Time.parse(st.stack[0]["initiated_at"])).to be_within(10).of(Time.now)
end
it "accepts an initiated_at Time" do
initiated_at = Time.utc(2025, 11, 12, 13, 14, 15)
st = described_class.assemble(repository.id, initiated_at:)
expect(st.prog).to eq "Github::DeleteCacheEntries"
expect(st.label).to eq "delete_entries"
expect(st.stack[0]["subject_id"]).to eq repository.id
expect(Time.parse(st.stack[0]["initiated_at"])).to eq initiated_at
end
end
describe "#delete_entries" do
it "deletes cache entry and naps until no cache entries are left" do
entries = self.entries
next_entries = entries.dup
dce.define_singleton_method(:next_entry) { next_entries.shift }
entries.each { it.define_singleton_method(:after_destroy) {} }
expect { dce.delete_entries }.to nap(0)
expect(entries[0]).not_to exist
expect(entries[1]).to exist
expect { dce.delete_entries }.to nap(0)
expect(entries[0]).not_to exist
expect(entries[1]).not_to exist
expect { dce.delete_entries }.to exit({"msg" => "all cache entries deleted"})
end
end
describe "#next_entry" do
it "returns next entry" do
entries = self.entries
expect(dce.next_entry).to eq entries[0]
entries[0].this.update(created_at: Time.now + 10)
expect(dce.next_entry).to eq entries[1]
entries[1].this.update(created_at: Time.now + 10)
expect(dce.next_entry).to be_nil
end
end
end