Scoping the :listing routes to feature (#16406)

This commit builds on the conditional rendering of navigation links by
adding a routing constraint to all :listing routes.

The impact is, if we were to disable the listing feature (e.g.,
`FeatureFlag.disable(:listing_feature_enabled)`) all requests to `GET
/listings` (and those drawn in the [config/routes/listings.rb][1] file)
would return a 404 response.

Related to forem/rfcs#291, #16335, #16338, #16362.

Testing this change:

1. Start your local application (e.g. `$ bin/startup`)
2. Go to http://localhost:3000/listings
3. You should get a Successful response.
4. Now disable the feature (e.g. `$ bin/rails r \
   "FeatureFlag.disable(:listing_feature_enabled)"`)
5. Refresh http://localhost:3000/listings
6. You should get an `ActiveRecord::RecordNotFound` error; because the
   application is now looking for a user or org named "listings"; in other
   words we're not routing `GET "/listings"` to `listings#index` controller
   action.
7. Now enable the feature (e.g. `$ bin/rails r \
   "FeatureFlag.enable(:listing_feature_enabled)"`)
8. Refresh http://localhost:3000/listings
9. You should get a Successful response.
10. Goto 4

This commit is intended to be the penultimate change before we toggle
the listings section off by default.

[1]:c2ce2c32d5/config/routes/listing.rb (L1)
This commit is contained in:
Jeremy Friesen 2022-02-04 10:13:56 -05:00 committed by GitHub
parent a9cdb2bae2
commit 765df66084
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 1 deletions

View file

@ -26,7 +26,12 @@ Rails.application.routes.draw do
get "/locale/:locale", to: "stories#index"
draw :admin
draw :listing
# The lambda (e.g. `->`) allows for dynamic checking. In other words we check with each
# request.
constraints(->(_req) { Listing.feature_enabled? }) do
draw :listing
end
namespace :stories, defaults: { format: "json" } do
resource :feed, only: [:show] do

View file

@ -10,6 +10,22 @@ RSpec.describe "all routes", type: :routing do
end
end
describe "/listings" do
subject(:a_request) { { get: "/listings" } }
context "when enabled" do
before { allow(Listing).to receive(:feature_enabled?).and_return(true) }
it { is_expected.to route_to(controller: "listings", action: "index", locale: nil) }
end
context "when disabled" do
before { allow(Listing).to receive(:feature_enabled?).and_return(false) }
it { is_expected.not_to route_to(controller: "listings", action: "index", locale: nil) }
end
end
it "renders a podcast index if there is a podcast with the slug successfully" do
expect(get: "/#{podcast.slug}").to route_to(
controller: "stories",