From caae5257f87831f701973992415d8b57a83942e1 Mon Sep 17 00:00:00 2001 From: Robert Fletcher Date: Tue, 3 Mar 2026 15:08:38 -0800 Subject: [PATCH] more system test coverage --- spec/system/archive_spec.rb | 33 ++++++++++++ spec/system/feed_edit_spec.rb | 28 ++++++++++ spec/system/feed_show_spec.rb | 35 ++++++++++++ spec/system/keyboard_shortcuts_spec.rb | 73 ++++++++++++++++++++++++++ spec/system/starred_spec.rb | 20 +++++++ spec/system/tutorial_spec.rb | 24 +++++++++ 6 files changed, 213 insertions(+) create mode 100644 spec/system/archive_spec.rb create mode 100644 spec/system/feed_edit_spec.rb create mode 100644 spec/system/feed_show_spec.rb create mode 100644 spec/system/keyboard_shortcuts_spec.rb create mode 100644 spec/system/starred_spec.rb create mode 100644 spec/system/tutorial_spec.rb diff --git a/spec/system/archive_spec.rb b/spec/system/archive_spec.rb new file mode 100644 index 000000000..163199800 --- /dev/null +++ b/spec/system/archive_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +RSpec.describe "archive" do + def create_read_stories(count) + count.times { create(:story, :read) } + end + + it "displays read stories" do + login_as(default_user) + create(:story, :read, title: "Old Story") + + visit(archive_path) + + expect(page).to have_content("Old Story") + end + + it "shows a message when no stories have been read" do + login_as(default_user) + + visit(archive_path) + + expect(page).to have_content("you haven't read any stories") + end + + it "paginates read stories" do + login_as(default_user) + create_read_stories(21) + + visit(archive_path) + + expect(page).to have_link("Next") + end +end diff --git a/spec/system/feed_edit_spec.rb b/spec/system/feed_edit_spec.rb new file mode 100644 index 000000000..f66a20749 --- /dev/null +++ b/spec/system/feed_edit_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +RSpec.describe "feeds/edit" do + def visit_edit_feed + feed = create(:feed) + visit("/feeds/#{feed.id}/edit") + end + + it "allows updating a feed name" do + login_as(default_user) + visit_edit_feed + + fill_in("Feed Name", with: "New Name") + click_on("Save") + + expect(page).to have_content("Updated the feed") + end + + it "allows updating a feed URL" do + login_as(default_user) + visit_edit_feed + + fill_in("Feed URL", with: "http://new.example.com") + click_on("Save") + + expect(page).to have_content("Updated the feed") + end +end diff --git a/spec/system/feed_show_spec.rb b/spec/system/feed_show_spec.rb new file mode 100644 index 000000000..0118e61ee --- /dev/null +++ b/spec/system/feed_show_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +RSpec.describe "feeds/show" do + def create_and_visit_feed(story_title: nil) + feed = create(:feed) + create(:story, feed:, title: story_title) if story_title + visit("/feed/#{feed.id}") + feed + end + + it "displays the feed name" do + login_as(default_user) + + feed = create_and_visit_feed + + expect(page).to have_content(feed.name) + end + + it "displays stories for the feed" do + login_as(default_user) + + create_and_visit_feed(story_title: "My Story") + + expect(page).to have_content("My Story") + end + + it "marks all stories as read" do + login_as(default_user) + create_and_visit_feed(story_title: "My Story") + + find_by_id("mark-all").click + + expect(page).to have_content("You've reached RSS Zero") + end +end diff --git a/spec/system/keyboard_shortcuts_spec.rb b/spec/system/keyboard_shortcuts_spec.rb new file mode 100644 index 000000000..b25de46a2 --- /dev/null +++ b/spec/system/keyboard_shortcuts_spec.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +RSpec.describe "keyboard shortcuts" do + after { visit(logout_path) } + + def create_stories_and_visit + create(:story, title: "First Story", body: "First Body") + create(:story, title: "Second Story", body: "Second Body") + visit(news_path) + end + + it "opens a story with j" do + login_as(default_user) + create_stories_and_visit + + send_keys("j") + + expect(page).to have_css("li.story.open") + end + + it "navigates up with k" do + login_as(default_user) + create_stories_and_visit + + send_keys("j", "j", "k") + + expect(page).to have_css("li.story.open", count: 1) + end + + it "moves cursor without opening with n" do + login_as(default_user) + create_stories_and_visit + + send_keys("n") + + expect(page).to have_css("li.story.cursor:not(.open)") + end + + it "moves cursor without opening with p" do + login_as(default_user) + create_stories_and_visit + send_keys("n", "n") + + send_keys("p") + + expect(page).to have_css("li.story.cursor:not(.open)") + end + + it "toggles a story open and closed with o" do + login_as(default_user) + create_stories_and_visit + send_keys("o") + + send_keys("o") + + expect(page).to have_no_css("li.story.open") + end + + def create_story_and_visit(title:) + create(:story, title:) + visit(news_path) + end + + it "stars the current story with s" do + login_as(default_user) + create_story_and_visit(title: "My Story") + send_keys("j", "s") + + visit(starred_path) + + expect(page).to have_content("My Story") + end +end diff --git a/spec/system/starred_spec.rb b/spec/system/starred_spec.rb new file mode 100644 index 000000000..2d05d745f --- /dev/null +++ b/spec/system/starred_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +RSpec.describe "starred" do + it "displays starred stories" do + login_as(default_user) + create(:story, :starred, title: "Fave Story") + + visit(starred_path) + + expect(page).to have_content("Fave Story") + end + + it "shows a message when no stories are starred" do + login_as(default_user) + + visit(starred_path) + + expect(page).to have_content("you haven't starred any stories") + end +end diff --git a/spec/system/tutorial_spec.rb b/spec/system/tutorial_spec.rb new file mode 100644 index 000000000..d9d0fce7a --- /dev/null +++ b/spec/system/tutorial_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +RSpec.describe "tutorial" do + def visit_tutorial + expect(CallableJob).to receive(:perform_later) + visit(setup_tutorial_path) + end + + it "displays the tutorial page" do + login_as(default_user) + + visit_tutorial + + expect(page).to have_content("Stringer is simple") + end + + it "displays sample stories" do + login_as(default_user) + + visit_tutorial + + expect(page).to have_content("Darin' Fireballs") + end +end