✂✂✂ Remove events (#15062)

* Remove events

* Fix schema

* Fix specs

* More removal
This commit is contained in:
Michael Kohl 2021-10-15 20:31:08 +07:00 committed by GitHub
parent 333775b831
commit a1f512e49e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 23 additions and 754 deletions

View file

@ -1,56 +0,0 @@
module Admin
class EventsController < ApplicationController
layout "admin"
include ApplicationHelper
EVENTS_ALLOWED_PARAMS = %i[
title category event_date starts_at ends_at
location_name cover_image location_url description_markdown published
host_name profile_image live_now
].freeze
def index
@events = Event.order(starts_at: :desc).page(params[:page]).per(20)
end
def new
@event = Event.new(
location_name: "#{URL.domain}/live",
location_url: app_url,
description_markdown: "*Description* *Pre-requisites:* *Bio*",
)
end
def edit
@event = Event.find(params[:id])
end
def create
@event = Event.new(event_params)
if @event.save
flash[:success] = "Successfully created event: #{@event.title}"
redirect_to admin_events_path
else
flash[:danger] = @event.errors.full_messages
render :new
end
end
def update
@event = Event.find(params[:id])
if @event.update(event_params)
flash[:success] = "#{@event.title} was successfully updated"
redirect_to admin_events_path
else
flash[:danger] = @event.errors.full_messages
render :edit
end
end
private
def event_params
params.require(:event).permit(EVENTS_ALLOWED_PARAMS)
end
end
end

View file

@ -1,15 +0,0 @@
class EventsController < ApplicationController
before_action :set_cache_control_headers, only: [:index]
# No authorization required for entirely public controller
def index
@events = Event.in_the_future_and_published.sort_by(&:starts_at)
@past_events = Event.in_the_past_and_published.sort_by(&:starts_at)
set_surrogate_key_header "events_index_page"
@past_events.reverse!
end
def show
@event = Event.find_by!(slug: params[:id])
end
end

View file

@ -1,49 +0,0 @@
class Event < ApplicationRecord
mount_uploader :cover_image, CoverImageUploader
mount_uploader :profile_image, ProfileImageUploader
validates :title, length: { maximum: 90 }
validates :location_url, url: { allow_blank: true, schemes: %w[https http] }
validate :end_time_after_start
validates :slug, presence: { if: :published? }, format: /\A[0-9a-z-]*\z/
before_validation :evaluate_markdown
before_validation :create_slug
after_save :bust_cache
scope :in_the_future_and_published, lambda {
where("starts_at > ?", Time.current)
.where(published: true)
}
scope :in_the_past_and_published, lambda {
where("starts_at < ?", Time.current)
.where(published: true)
}
private
def evaluate_markdown
self.description_html = MarkdownProcessor::Parser.new(description_markdown).evaluate_markdown
end
def end_time_after_start
if ends_at.nil? || starts_at.nil?
errors.add(:starts_at, "and ends_at must not be nil")
elsif ends_at < starts_at
errors.add(:ends_at, "must be after start date")
end
end
def create_slug
self.slug = title_to_slug if slug.blank? && title.present? && published
end
def title_to_slug
downcase = "#{id}-#{category}-#{title}"
"#{downcase.parameterize}-#{starts_at.strftime('%m-%d-%Y')}"
end
def bust_cache
Events::BustCacheWorker.perform_async
end
end

View file

@ -1,9 +0,0 @@
module EdgeCache
class BustEvents
def self.call
cache_bust = EdgeCache::Bust.new
cache_bust.call("/events")
cache_bust.call("/events?i=i")
end
end
end

View file

@ -1,2 +0,0 @@
class CoverImageUploader < BaseUploader
end

View file

@ -1,58 +0,0 @@
<div class="crayons-card p-6">
<%= form_for [:admin, @event] do |f| %>
<div class="crayons-field">
<%= f.label :cover_image, class: "crayons-field__label" %>
<%= f.file_field :cover_image, class: "crayons-field" %>
</div>
<div class="crayons-field">
<%= f.label :profile_image, class: "crayons-field__label" %> (for live notification):
<%= f.file_field :profile_image, class: "crayons-field" %>
<img src="<%= @event.profile_image_url %>" style="width: 25%;" alt="event profile image">
</div>
<div class="crayons-field">
<%= f.label :title, class: "crayons-field__label" %>
<%= f.text_field :title, maxlength: 90, size: 40, required: true, class: "crayons-textfield" %>
</div>
<div class="crayons-field">
<%= f.label :host_name, class: "crayons-field__label" %>
<%= f.text_field :host_name, size: 40, required: true, class: "crayons-textfield" %>
</div>
<div class="crayons-field">
<%= f.label :category, class: "crayons-field__label" %>
<%= f.select :category, ["AMA", "Workshop", "Talk", "Town Hall"], required: true, class: "crayons-select" %>
</div>
<div class="crayons-field">
<%= f.label :starts_at, class: "crayons-field__label" %>
<fieldset>
<%= f.datetime_select :starts_at, required: true, include_blank: true, start_year: Time.current.year, end_year: Time.current.year + 2, class: "crayons-select" %> UTC Time Only (4 hours ahead of eastern time)
</fieldset>
</div>
<div class="crayons-field">
<%= f.label :ends_at, class: "crayons-field__label" %>
<fieldset>
<%= f.datetime_select :ends_at, required: true, include_blank: true, start_year: Time.current.year, end_year: Time.current.year + 2, class: "crayons-select" %> UTC Time Only (4 hours ahead of eastern time)
</fieldset>
</div>
<div class="crayons-field">
<%= f.label :location_name, class: "crayons-field__label" %>
<%= f.text_field :location_name, required: true, class: "crayons-textfield" %>
</div>
<div class="crayons-field">
<%= f.label :location_url, class: "crayons-field__label" %>
<%= f.text_field :location_url, required: true, class: "crayons-textfield" %>
</div>
<div class="crayons-field">
<%= f.label :description_markdown, class: "crayons-field__label" %>
<%= f.text_area :description_markdown, size: "45x10", required: true, class: "crayons-textfield" %>
</div>
<div class="crayons-field">
<%= f.label :published, class: "crayons-field__label" %>
<%= f.check_box :published, class: "crayons-checkbox" %>
</div>
<div class="crayons-field">
<%= f.label :live_now, class: "crayons-field__label" %>
<%= f.check_box :live_now, class: "crayons-checkbox" %>
</div>
<%= f.submit class: "crayons-btn" %>
<% end %>
</div>

View file

@ -1,4 +0,0 @@
<div class="crayons-card p-6 mb-6">
<h2 class="crayons-title mb-6">Edit Event: <%= @event.title.to_s %></h2>
<%= render "event_form" %>
</div>

View file

@ -1,38 +0,0 @@
<header class="flex items-center mb-6">
<h2 class="crayons-title">Events</h2>
<%= link_to "New Event", new_admin_event_path, class: "ml-auto crayons-btn crayons-btn--s" %>
</header>
<br>
<div class="crayons-card p-6 pages__table">
<h3>Upcoming Events</h3>
<% @events.each do |event| %>
<% if event.starts_at.future? %>
<div class="flex py-2 items-center">
<%= event.title %>
<% if event.cover_image_url.present? %>
<img class="mx-auto mt-3" width="40" height="40" src="<%= event.cover_image_url %>" alt="event cover image" loading="lazy" />
<% end %>
<%= link_to "Edit", edit_admin_event_path(event.id), class: "ml-auto crayons-btn crayons-btn--s crayons-btn--secondary" %>
</div>
<hr>
<% end %>
<% end %>
</div>
<br>
<div class="crayons-card p-6 pages__table">
<h3>Past Events</h3>
<% @events.each do |event| %>
<% if !event.starts_at.future? %>
<div class="flex py-2 items-center">
<%= event.title %>
<% if event.cover_image_url.present? %>
<img class="mx-auto mt-3 justify-content-center" width="40" height="40" src="<%= event.cover_image_url %>" alt="event cover image" loading="lazy" />
<% end %>
<%= link_to "Edit", edit_admin_event_path(event.id), class: "ml-auto crayons-btn crayons-btn--s crayons-btn--secondary" %>
</div>
<hr>
<% end %>
<% end %>
</div>

View file

@ -1,4 +0,0 @@
<div class="crayons-card p-6 mb-6">
<h2 class="crayons-title mb-6">Create New Event</h2>
<%= render "event_form" %>
</div>

View file

@ -1,100 +0,0 @@
<style>
.container .event {
padding: 20px;
border: solid 2px #66e2d5;;
border-radius: 3px;
margin: 50px auto;
box-shadow: 5px 8px 0px #ccfff9;
font-size: 17px;
max-width: 700px;
font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
line-height: 145%;
}
.container .event-image {
max-width: 43%;
float: left;
margin-right: 20px;
}
.container .event-image img {
max-width: 100%;
border-radius: 3px;
left: 1px;
}
.event .event-details p {
margin: 5px;
}
.event .event-description p {
text-align: justify;
}
.event .event-details h3 {
margin: 0 0 .5em 0;
font-weight: 800;
font-size: 1.11em;
}
@media screen and (max-width: 900px) {
.container .body .event .event-image {
display: block;
max-width: 100%;
margin: 0 0 20px;
}
}
.copyx {
display: none !important;
}
.addeventatc {
visibility: hidden;
}
</style>
<div class="event">
<div class="event-image">
<img src="<%= optimized_image_url(event.cover_image_url, width: 500) %>" alt="event image" loading="lazy" />
</div>
<div class="event-details">
<h3><a href="/events/<%= event.slug %>"><%= event.category %>: <%= event.title %></a></h3>
<p>
Date: <span class="utc-date" data-datetime="<%= event.starts_at.strftime("%d %B %Y %H:%M UTC") %>">&nbsp;</span>
<br>
Time: <span class="utc-time" data-datetime="<%= event.starts_at.strftime("%d %B %Y %H:%M UTC") %>">&nbsp;</span>
- <span class="utc-time" data-datetime="<%= event.ends_at.strftime("%d %B %Y %H:%M UTC") %>">&nbsp;</span>
<br>
Location: <a href="<%= event.location_url %>"><%= event.location_name %></a>
</p>
<div title="Add to Calendar" class="addeventatc">
Add to Calendar
<span class="start utc"><%= event.starts_at.strftime("%d %B %Y %H:%M UTC") %></span>
<span class="end utc"><%= event.ends_at.strftime("%d %B %Y %H:%M UTC") %></span>
<span class="timezone">America/New_York</span>
<span class="title"><%= event.title %></span>
<span class="organizer"><%= community_name %></span>
<span class="organizer_email"><%= ForemInstance.email %></span>
<span class="calname">dev-event</span>
<span class="location"><%= event.location_url %></span>
<span class="alarm_reminder">15</span>
<span class="description">
<%= event.description_html&.html_safe %>
------
Link to attend - <%= event.location_url %>
</span>
</div>
</div>
<div class="event-description">
<%= event.description_html&.html_safe %>
</div>
</div>
<script>
window.addeventasync = function () {
addeventatc.register('button-dropdown-click', function (obj) {
ga('send', 'event', 'click', 'Add Event To Calendar', 'User: <%= user_signed_in? %>');
});
}
</script>

View file

@ -1,42 +0,0 @@
<%= content_for :page_meta do %>
<% title("#{community_name} EVENTS") %>
<link rel="canonical" href="<%= app_url("/events") %>" />
<meta name="description" content="<%= community_name %> Events">
<%= meta_keywords_default %>
<meta property="og:type" content="article" />
<meta property="og:url" content="<%= app_url("/events") %>" />
<meta property="og:title" content="<%= community_name %> Events" />
<meta property="og:description" content="Community events." />
<meta property="og:site_name" content="<%= community_name %>" />
<meta property="og:image" content="<%= Settings::General.main_social_image %>">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@<%= Settings::General.social_media_handles["twitter"] %>">
<meta name="twitter:title" content="<%= community_name %> Events">
<meta name="twitter:image:src" content="<%= Settings::General.main_social_image %>">
<% end %>
<script type="text/javascript" src="https://addevent.com/libs/atc/1.6.1/atc.min.js" async defer></script>
<div class="crayons-layout crayons-layout--limited-l">
<div class="crayons-card text-styles text-padding">
<h1 class="fs-3xl s:fs-4xl l:fs-5xl fw-bold s:fw-heavy lh-tight mb-4 mt-0">
Upcoming Events
</h1>
<%= render partial: "event", collection: @events, as: :event %>
<% if @events.none? %>
<div class="crayons-notice" aria-live="polite">
There are no upcoming events currently scheduled
</div>
<% end %>
<% if @past_events.any? %>
<h1>
Past Events
</h1>
<%= render partial: "event", collection: @past_events, as: :event %>
<% end %>
</div>
</div>

View file

@ -1,77 +0,0 @@
<%= content_for :page_meta do %>
<% title("#{@event.title} - #{community_name}") %>
<link rel="canonical" href="<%= app_url("/#{@event.slug}") %>" />
<meta name="description" content="<%= community_name %> | Events">
<%= meta_keywords_default %>
<meta property="og:type" content="article" />
<meta property="og:url" content="<%= app_url("/#{@event.slug}") %>" />
<meta property="og:title" content="<%= @event.title %>" />
<% if @event.cover_image.present? %>
<meta property="og:image" content="<%= @event.cover_image_url %>" />
<% else %>
<meta property="og:image" content="<%= Settings::General.main_social_image %>" />
<% end %>
<meta property="og:description" content="<%= truncate(strip_tags(@event.description_html), length: 140) %>" />
<meta property="og:site_name" content="<%= community_name %>" />
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@<%= Settings::General.social_media_handles["twitter"] %>">
<meta name="twitter:title" content="<%= truncate(strip_tags(@event.title), length: 70) %>">
<meta property="og:description" content="<%= truncate(strip_tags(@event.description_html), length: 140) %>" />
<% if @event.cover_image.present? %>
<meta name="twitter:image:src" content="<%= @event.cover_image_url %>">
<% else %>
<meta name="twitter:image:src" content="<%= Settings::General.main_social_image %>">
<% end %>
<% end %>
<div class="blank-space"></div>
<style>
.container .body .event {
border: none;
box-shadow: none;
margin-top: 0px;
}
.container .body .event h3 {
display: none;
}
.container .body h1 {
margin-bottom: 10px;
text-align: left;
}
.container .event .event-description {
text-align: justify;
}
.container .event .event-details {
font-size: 1.3em;
}
.addeventatc {
border: solid 1px #66e2d5;
}
.addeventatc:hover {
border: 1px solid #557de8;
}
</style>
<script type="text/javascript" src="https://addevent.com/libs/atc/1.6.1/atc.min.js" async defer></script>
<div class="container article">
<div style="height:30px">
</div>
<div class="body">
<h1 style="padding-left: 20px; font-weight: 500;"><%= @event.category %>: <%= @event.title %></h1>
<%= render "event", event: @event %>
<h3 style="text-align: center">
<span style="background-color: yellow; padding: 5px"><a href="/events"> All EVENTS </a></span></h3>
</div>
</div>

View file

@ -1,9 +0,0 @@
module Events
class BustCacheWorker < BustCacheBaseWorker
sidekiq_options queue: :low_priority
def perform
EdgeCache::BustEvents.call
end
end
end

View file

@ -166,7 +166,6 @@ Rails.application.routes.draw do
post "/update_or_create", to: "github_repos#update_or_create"
end
end
resources :events, only: %i[index show]
resources :videos, only: %i[index create new]
resources :video_states, only: [:create]
resources :twilio_tokens, only: [:show]
@ -313,8 +312,6 @@ Rails.application.routes.draw do
get "/badge", to: "pages#badge", as: :pages_badge
get "/💸", to: redirect("t/hiring")
get "/survey", to: redirect("https://dev.to/ben/final-thoughts-on-the-state-of-the-web-survey-44nn")
get "/events", to: "events#index"
get "/workshops", to: redirect("events")
get "/sponsors", to: "pages#sponsors"
get "/search", to: "stories/articles_search#index"
post "articles/preview", to: "articles#preview"

View file

@ -149,7 +149,6 @@ namespace :admin do
end
end
resources :consumer_apps, only: %i[index new create edit update destroy]
resources :events, only: %i[index create update new edit]
resources :listings, only: %i[index edit update destroy]
resources :listing_categories, only: %i[index edit update new create
destroy], path: "listings/categories"

View file

@ -0,0 +1,22 @@
class DropEvents < ActiveRecord::Migration[6.1]
def up
drop_table :events do |t|
t.string :category
t.string :cover_image
t.text :description_html
t.text :description_markdown
t.datetime :ends_at
t.string :host_name
t.boolean :live_now, default: false
t.string :location_name
t.string :location_url
t.string :profile_image
t.boolean :published
t.string :slug
t.datetime :starts_at
t.string :title
t.timestamps
end
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2021_10_08_170433) do
ActiveRecord::Schema.define(version: 2021_10_13_060449) do
# These are extensions that must be enabled in order to support this database
enable_extension "citext"
@ -496,25 +496,6 @@ ActiveRecord::Schema.define(version: 2021_10_08_170433) do
t.index ["user_id"], name: "index_email_authorizations_on_user_id"
end
create_table "events", force: :cascade do |t|
t.string "category"
t.string "cover_image"
t.datetime "created_at", null: false
t.text "description_html"
t.text "description_markdown"
t.datetime "ends_at"
t.string "host_name"
t.boolean "live_now", default: false
t.string "location_name"
t.string "location_url"
t.string "profile_image"
t.boolean "published"
t.string "slug"
t.datetime "starts_at"
t.string "title"
t.datetime "updated_at", null: false
end
create_table "feedback_messages", force: :cascade do |t|
t.bigint "affected_id"
t.string "category"

View file

@ -1,9 +0,0 @@
FactoryBot.define do
factory :event do
title { Faker::Company.bs }
description_markdown { Faker::Hipster.paragraph(sentence_count: 2) }
starts_at { Time.current }
ends_at { 3660.seconds.from_now }
category { "AMA" }
end
end

View file

@ -1,33 +0,0 @@
require "rails_helper"
RSpec.describe Event, type: :model do
let(:event) { build(:event) }
it "rejects title with over 90 characters" do
event.title = Faker::Lorem.characters(number: 100)
expect(event).not_to be_valid
end
it "rejects invalid http url" do
event.location_url = "dev.to"
expect(event).not_to be_valid
end
it "rejects ends times that are earlier than start times" do
event.ends_at = event.starts_at - 1.minute
expect(event).not_to be_valid
end
it "creates slug for published events" do
event = build(:event, category: "ama", title: "yo", published: true)
event.validate!
expected_slug = "#{event.category}-#{event.title}-#{event.starts_at.strftime('%m-%d-%Y')}"
expect(event.slug).to eq(expected_slug)
end
it "triggers cache busting on save" do
sidekiq_assert_enqueued_jobs(1, queue: "low_priority") do
event.save
end
end
end

View file

@ -1,52 +0,0 @@
require "rails_helper"
RSpec.describe "/admin/apps/events", type: :request do
let(:event) { create(:event, title: "Hey") }
let(:admin) { create(:user, :super_admin) }
let(:params) do
{
event: {
title: "Hello, world!",
description_markdown: "This is an event",
starts_at: Time.current,
ends_at: 3660.seconds.from_now,
category: "Talk"
}
}
end
describe "PUT admin/apps/events" do
before do
sign_in(admin)
end
it "marks an event as not live now" do
event.update(live_now: true)
patch admin_event_path(event.id), params: { event: { live_now: "0" } }
expect(event.reload.live_now).to eq false
end
it "marks an event as live now" do
patch admin_event_path(event.id), params: { event: { live_now: "1" } }
expect(event.reload.live_now).to eq true
end
it "successfully updates the event title" do
expect do
patch admin_event_path(event.id), params: params
end.to change { event.reload.title }.to("Hello, world!")
end
end
describe "POST /admin/apps/events" do
let(:post_resource) { post admin_events_path, params: params }
before { sign_in admin }
it "successfully creates an event" do
expect do
post_resource
end.to change { Event.all.count }.by(1)
end
end
end

View file

@ -1,33 +0,0 @@
require "rails_helper"
RSpec.describe "Events", type: :request do
let(:event) { create(:event, published: true) }
describe "GET events" do
it "returns index page" do
event
get "/events"
expect(response.body).to include("#{community_name} EVENTS")
expect(response.body).to include(event.title)
end
it "does not include unpublished events" do
unpublished_event = create(:event, published: false)
get "/events"
expect(response.body).not_to include(unpublished_event.title)
end
end
describe "GET events#show" do
it "returns event show page" do
get "/events/#{event.slug}"
expect(response.body).to include event.title
end
it "renders not_found" do
expect do
get "/events/NotSlug-#{event.slug}"
end.to raise_error(ActiveRecord::RecordNotFound)
end
end
end

View file

@ -1,26 +0,0 @@
require "rails_helper"
RSpec.describe EdgeCache::BustEvents, type: :service do
let(:cache_bust) { instance_double(EdgeCache::Bust) }
let(:paths) do
[
"/events",
"/events?i=i",
]
end
before do
allow(EdgeCache::Bust).to receive(:new).and_return(cache_bust)
paths.each do |path|
allow(cache_bust).to receive(:call).with(path).once
end
end
it "busts the cache" do
described_class.call
paths.each do |path|
expect(cache_bust).to have_received(:call).with(path).once
end
end
end

View file

@ -1,38 +0,0 @@
require "rails_helper"
require "date"
RSpec.describe "Admin creates new event", type: :system do
let(:admin) { create(:user, :super_admin) }
before do
sign_in admin
visit new_admin_event_path
end
def select_date_and_time(year, month, date, hour, min, field_name)
select year, from: "event[#{field_name}(1i)]"
select month, from: "event[#{field_name}(2i)]"
select date, from: "event[#{field_name}(3i)]"
select hour, from: "event[#{field_name}(4i)]"
select min, from: "event[#{field_name}(5i)]"
end
def create_and_publish_event
fill_in("Title", with: "Workshop Title")
select_date_and_time(Time.current.year.to_s, "December", "30", "15", "30", "starts_at")
select_date_and_time(Time.current.year.to_s, "December", "30", "16", "30", "ends_at")
check("event[published]")
click_button("Create Event")
end
it "loads /admin/apps/events" do
expect(page).to have_content("New Event")
end
it "loads published events on /events" do
create_and_publish_event
visit "/events"
expect(page).to have_content("Workshop Title")
end
end

View file

@ -1,63 +0,0 @@
require "rails_helper"
require "carrierwave/test/matchers"
require "exifr/jpeg"
describe CoverImageUploader, type: :uploader do
include CarrierWave::Test::Matchers
let(:image_jpg) { fixture_file_upload("800x600.jpg", "image/jpeg") }
let(:image_png) { fixture_file_upload("800x600.png", "image/png") }
let(:image_webp) { fixture_file_upload("800x600.webp", "image/webp") }
let(:image_with_gps) { fixture_file_upload("image_gps_data.jpg", "image/jpeg") }
let(:event) { create(:event) }
# we need a new uploader before each test, and since the uploader is not a model
# we can recreate it quickly in memory with `let!`
let!(:uploader) { described_class.new(event, :cover_image) }
before do
described_class.include CarrierWave::MiniMagick # needed for processing
described_class.enable_processing = true
end
after do
described_class.enable_processing = false
uploader.remove!
end
it "stores files in the correct directory" do
expect(uploader.store_dir).to eq("uploads/event/cover_image/#{event.id}")
end
describe "formats" do
it "permits a set of extensions" do
expect(uploader.extension_allowlist).to eq(%w[jpg jpeg jpe gif png ico bmp dng])
end
it "permits jpegs" do
uploader.store!(image_jpg)
expect(uploader).to be_format("jpeg")
end
it "permits pngs" do
uploader.store!(image_png)
expect(uploader).to be_format("png")
end
it "rejects unsupported formats like webp" do
expect { uploader.store!(image_webp) }.to raise_error(CarrierWave::IntegrityError)
end
end
describe "exif removal" do
it "removes EXIF and GPS data on upload" do
expect(EXIFR::JPEG.new(image_with_gps.path).exif?).to be(true)
expect(EXIFR::JPEG.new(image_with_gps.path).gps.present?).to be(true)
event.cover_image = image_with_gps
event.save!
expect(EXIFR::JPEG.new(event.cover_image.path).exif?).to be(false)
expect(EXIFR::JPEG.new(event.cover_image.path).gps.present?).to be(false)
end
end
end

View file

@ -1,13 +0,0 @@
require "rails_helper"
RSpec.describe Events::BustCacheWorker do
include_examples "#enqueues_on_correct_queue", "low_priority"
describe "#perform" do
it "busts cache" do
allow(EdgeCache::BustEvents).to receive(:call)
described_class.new.perform
expect(EdgeCache::BustEvents).to have_received(:call)
end
end
end