From b36aad2d010208cfc49a18e321c677394d753c76 Mon Sep 17 00:00:00 2001
From: "M. Hakeem" <721462+mhakeem@users.noreply.github.com>
Date: Sun, 13 Sep 2026 08:00:19 +0000
Subject: [PATCH 01/12] Rebrand schedule for Rocky Mountain Ruby: Mon/Tue day
anchors + real RMR schedule
RMR runs Mon-Tue (Sep 28-29, 2026) vs BRR's Wed-Sat, so this replaces the
wed/thu/fri/sat/sun day-anchor scheme with sun/mon/tue throughout:
- config/schedule.yml: full replacement with the real 28-session RMR
schedule (fetched from their live Sessionize feed, embed xxmulsug),
plus 3 placeholder items (pre-conference meetup, Hack Day, a volunteer
slot) seeded hidden (is_public: false) since none of these are on
RMR's published schedule yet.
- ScheduleItem: DAY_META, CONFERENCE_DATES, and the `ordered` scope's SQL
CASE now use sun/mon/tue. HACK_DAY_SLUG -> "tue-hackday" so admin Hack
Projects (which does a hard find_by! on that slug) keeps working.
DEFAULT_PLAN_SLUGS emptied - RMR has no equivalent to BRR's one-off
"Mystery Activity" auto-add.
- db/seeds/schedule.rb: now reads per-item is_public/volunteer_capacity
from the YAML (needed for the hidden placeholders), and the obsolete-
slug cleanup list covers every prior BRR slug so reseeding a BRR-seeded
DB cleans up correctly.
- Two controller "new item" day defaults and two cosmetic form/doc
strings updated to match.
- 37 test files: day literals moved to valid anchors, HACK_DAY_SLUG
references fixed, the DEFAULT_PLAN_SLUGS coverage test rewritten to
stub the constant (since it's empty for RMR), and hardcoded 2026-04-30
dates moved to real September dates. Verified: full suite green.
See RMR_FORK_PLAN.md for the broader fork plan this is step 1 of.
---
.../admin/schedule_items_controller.rb | 2 +-
app/controllers/schedule_items_controller.rb | 2 +-
app/models/schedule_item.rb | 33 +-
app/views/admin/schedule_items/_form.html.erb | 4 +-
app/views/shared/_day_filter.html.erb | 2 +-
config/schedule.yml | 312 ++++++++----------
db/seeds/schedule.rb | 18 +-
.../admin/dashboard_controller_test.rb | 20 +-
.../embassy_applications_controller_test.rb | 4 +-
.../admin/hack_projects_controller_test.rb | 4 +-
.../lightning_talk_signups_controller_test.rb | 2 +-
.../admin/lightning_talks_controller_test.rb | 2 +-
.../admin/schedule_items_controller_test.rb | 60 ++--
.../admin/users_controller_test.rb | 18 +-
.../volunteer_signups_controller_test.rb | 4 +-
.../admin/volunteer_slots_controller_test.rb | 8 +-
.../admin/volunteers_controller_test.rb | 4 +-
.../embassy_bookings_controller_test.rb | 2 +-
.../lightning_talk_signups_controller_test.rb | 2 +-
.../meal_spot_rsvps_controller_test.rb | 6 +-
.../controllers/meal_spots_controller_test.rb | 6 +-
test/controllers/plan_controller_test.rb | 22 +-
.../controllers/plan_items_controller_test.rb | 26 +-
test/controllers/schedule_controller_test.rb | 6 +-
.../schedule_items_controller_test.rb | 14 +-
test/helpers/meal_spots_helper_test.rb | 2 +-
test/integration/hack_projects_test.rb | 6 +-
test/integration/plan_test.rb | 40 +--
test/integration/schedule_browsing_test.rb | 48 +--
test/models/embassy_booking_test.rb | 2 +-
test/models/lightning_talk_signup_test.rb | 4 +-
test/models/meal_spot_rsvp_test.rb | 8 +-
test/models/meal_spot_test.rb | 16 +-
test/models/meal_spot_transport_test.rb | 2 +-
test/models/plan_item_test.rb | 8 +-
test/models/schedule_item_test.rb | 33 +-
test/models/seed_test.rb | 58 +++-
test/models/user_test.rb | 52 +--
38 files changed, 438 insertions(+), 424 deletions(-)
diff --git a/app/controllers/admin/schedule_items_controller.rb b/app/controllers/admin/schedule_items_controller.rb
index 9281092..b5078f8 100644
--- a/app/controllers/admin/schedule_items_controller.rb
+++ b/app/controllers/admin/schedule_items_controller.rb
@@ -34,7 +34,7 @@ def index
def new
requested_kind = ScheduleItem.kinds.key?(params[:kind].to_s) ? params[:kind] : :talk
- @schedule_item = ScheduleItem.new(day: "fri", kind: requested_kind, is_public: true, flexible: false)
+ @schedule_item = ScheduleItem.new(day: "mon", kind: requested_kind, is_public: true, flexible: false)
end
def create
diff --git a/app/controllers/schedule_items_controller.rb b/app/controllers/schedule_items_controller.rb
index c4ee273..d622a55 100644
--- a/app/controllers/schedule_items_controller.rb
+++ b/app/controllers/schedule_items_controller.rb
@@ -3,7 +3,7 @@ class ScheduleItemsController < ApplicationController
def new
@schedule_item = current_user.created_schedule_items.build(
- day: params[:day] || "sat",
+ day: params[:day] || "mon",
flexible: false,
is_public: ActiveModel::Type::Boolean.new.cast(params.dig(:schedule_item, :is_public))
)
diff --git a/app/models/schedule_item.rb b/app/models/schedule_item.rb
index 486dba1..466d961 100644
--- a/app/models/schedule_item.rb
+++ b/app/models/schedule_item.rb
@@ -1,10 +1,11 @@
class ScheduleItem < ApplicationRecord
EMBASSY_MODES = %w[new_passport stamping passport_pickup].freeze
- HACK_DAY_SLUG = "sat-hackday"
+ HACK_DAY_SLUG = "tue-hackday"
DEFAULT_PLAN_KINDS = %w[talk reception].freeze
# One-off slugs that don't fit a default-plan kind but are still part of
- # the main programming every attendee is auto-RSVPed to.
- DEFAULT_PLAN_SLUGS = %w[thu-mystery].freeze
+ # the main programming every attendee is auto-RSVPed to. None for RMR
+ # currently — the BRR fork used this for a one-off "Mystery Activity".
+ DEFAULT_PLAN_SLUGS = [].freeze
belongs_to :created_by, class_name: "User", optional: true
has_many :plan_items, dependent: :destroy
@@ -34,19 +35,15 @@ class ScheduleItem < ApplicationRecord
validate :capacity_present_for_offered_modes, if: :embassy?
DAY_META = {
- "wed" => { label: "Wednesday", date: "April 29", subtitle: "Pre-Conference" },
- "thu" => { label: "Thursday", date: "April 30", subtitle: "Conference Day 1" },
- "fri" => { label: "Friday", date: "May 1", subtitle: "Conference Day 2" },
- "sat" => { label: "Saturday", date: "May 2", subtitle: "Activities & Ruby Embassy" },
- "sun" => { label: "Sunday", date: "May 3", subtitle: "Departures" }
+ "sun" => { label: "Sunday", date: "September 27", subtitle: "Pre-Conference" },
+ "mon" => { label: "Monday", date: "September 28", subtitle: "Conference Day 1" },
+ "tue" => { label: "Tuesday", date: "September 29", subtitle: "Conference Day 2" }
}.freeze
CONFERENCE_DATES = {
- "wed" => Date.new(2026, 4, 29),
- "thu" => Date.new(2026, 4, 30),
- "fri" => Date.new(2026, 5, 1),
- "sat" => Date.new(2026, 5, 2),
- "sun" => Date.new(2026, 5, 3)
+ "sun" => Date.new(2026, 9, 27),
+ "mon" => Date.new(2026, 9, 28),
+ "tue" => Date.new(2026, 9, 29)
}.freeze
private_constant :CONFERENCE_DATES
@@ -66,12 +63,10 @@ def self.upcoming_day_keys(today = Date.current)
order(
Arel.sql(
"CASE day " \
- "WHEN 'wed' THEN 1 " \
- "WHEN 'thu' THEN 2 " \
- "WHEN 'fri' THEN 3 " \
- "WHEN 'sat' THEN 4 " \
- "WHEN 'sun' THEN 5 " \
- "ELSE 6 END"
+ "WHEN 'sun' THEN 1 " \
+ "WHEN 'mon' THEN 2 " \
+ "WHEN 'tue' THEN 3 " \
+ "ELSE 4 END"
),
:sort_time
)
diff --git a/app/views/admin/schedule_items/_form.html.erb b/app/views/admin/schedule_items/_form.html.erb
index e88e3a5..362a764 100644
--- a/app/views/admin/schedule_items/_form.html.erb
+++ b/app/views/admin/schedule_items/_form.html.erb
@@ -74,7 +74,7 @@
<%= f.label :host_url, "Speaker profile URL", class: "label" %>
<%= f.url_field :host_url, class: "input",
- placeholder: "https://blueridgeruby.com/speakers/..." %>
+ placeholder: "https://rockymtnruby.dev/#program" %>
Optional. If set, the speaker's name links to this URL on /schedule and /plan.
Update this whenever you change the host so the link points to the right person.
@@ -102,7 +102,7 @@
<%= f.check_box :flexible %>
- <%= f.label :flexible, "Flexible / TBD (Saturday dashed treatment)" %>
+ <%= f.label :flexible, "Flexible / TBD (dashed treatment)" %>
diff --git a/app/views/shared/_day_filter.html.erb b/app/views/shared/_day_filter.html.erb
index b1116ee..8194755 100644
--- a/app/views/shared/_day_filter.html.erb
+++ b/app/views/shared/_day_filter.html.erb
@@ -1,7 +1,7 @@
<%#
locals:
base_path - String, e.g. admin_schedule_items_path
- selected_day - String or nil, the currently active day key ("wed", "thu", etc.)
+ selected_day - String or nil, the currently active day key ("sun", "mon", etc.)
%>
Day:
diff --git a/config/schedule.yml b/config/schedule.yml
index dd466dd..59aebdc 100644
--- a/config/schedule.yml
+++ b/config/schedule.yml
@@ -1,239 +1,215 @@
---
-# Blue Ridge Ruby 2025 conference schedule.
+# Rocky Mountain Ruby 2026 conference schedule.
# Item kinds: talk, lightning, embassy, activity, reception, meal, community, volunteer
# `flexible: true` renders the item with a dashed/TBD treatment.
-# Mirrors https://blueridgeruby.com/schedule — keep in sync if the public schedule changes.
+# `is_public: false` hides an item from the public /schedule (admins/volunteers still
+# see it) while still letting the schedule-item row exist for admin-only features
+# (e.g. Hack Day/Hack Projects) to hang off. Defaults to true when omitted.
+# Sessions sourced from the live Sessionize schedule (https://rockymtnruby.dev/schedule/,
+# embed xxmulsug) fetched 2026-09-13. Speakers have no individual profile pages on the
+# RMR site, so `host_url` is intentionally omitted — names render as plain text.
:days:
- - :anchor: wed
- :date: "April 29"
- :label: "Wednesday"
+ - :anchor: sun
+ :date: "September 27"
+ :label: "Sunday"
:subtitle: "Pre-Conference"
:items:
- - :id: wed-meetup
+ - :id: sun-meetup
:time: "7:00 PM"
:sort_time: 1900
- :title: "Pre-Conference Meetup"
+ :title: "Pre-Conference Meetup (TBD)"
:type: community
- :location: "Wicked Weed Brew Pub"
- :map_url: "https://maps.app.goo.gl/GJAhmx5Udz1FiitP8"
- :description: "We'll probably try to find a spot for all of us in the beer garden downstairs in the back."
+ :flexible: true
+ :is_public: false
+ :description: "Placeholder — not yet on the published RMR schedule. Confirm venue/time and flip to public before announcing."
- - :anchor: thu
- :date: "April 30"
- :label: "Thursday"
+ - :anchor: mon
+ :date: "September 28"
+ :label: "Monday"
:subtitle: "Conference Day 1"
:items:
- - :id: thu-registration
+ - :id: mon-checkin
:time: "8:00 AM"
:sort_time: 800
- :title: "Registration, Coffee, Light Snacks"
+ :title: "Check-In & Breakfast"
:type: reception
- - :id: thu-welcome
+ :location: "eTown Hall"
+ :map_url: "https://www.google.com/maps/search/?api=1&query=eTown+Hall+1535+Spruce+St+Boulder+CO+80302"
+ - :id: mon-opening
:time: "9:00 AM"
:sort_time: 900
- :title: "Welcome, Day 1"
+ :title: "Day One Opening"
:type: reception
- - :id: thu-talk-1
- :time: "9:30 AM"
- :sort_time: 930
- :host: "John Athayde"
- :host_url: "https://blueridgeruby.com/speakers/john-athayde/"
- :title: "Learning from Permaculture: Sustainable Software Development"
+ - :id: mon-talk-1
+ :time: "9:15 AM"
+ :sort_time: 915
+ :host: "Kevin Murphy"
+ :title: "InstiLLMent of Successful Practices in an Agentic World"
:type: talk
- - :id: thu-break-1
- :time: "10:00 AM"
- :sort_time: 1000
- :title: "Break"
- :type: reception
- - :id: thu-talk-2
- :time: "10:30 AM"
- :sort_time: 1030
- :host: "Joël Quenneville"
- :host_url: "https://blueridgeruby.com/speakers/joel-quenneville/"
- :title: "State is the First Decision You Never Made"
+ - :id: mon-talk-2
+ :time: "9:50 AM"
+ :sort_time: 950
+ :host: "Sonja Peterson"
+ :title: "Confident On-Call: Building Incident Response Skills as a Ruby Engineer"
:type: talk
- - :id: thu-break-2
- :time: "11:00 AM"
- :sort_time: 1100
+ - :id: mon-break-1
+ :time: "10:25 AM"
+ :sort_time: 1025
:title: "Break"
:type: reception
- - :id: thu-talk-3
+ - :id: mon-talk-3
+ :time: "10:55 AM"
+ :sort_time: 1055
+ :host: "Joel Hawksley"
+ :title: "Beyond Senior: Consider the staff path!"
+ :type: talk
+ - :id: mon-talk-4
:time: "11:30 AM"
:sort_time: 1130
- :host: "Ifat Ribon"
- :host_url: "https://blueridgeruby.com/speakers/ifat-ribon/"
- :title: "Yes, &…: Ruby's Secret Talent for Improvisation"
+ :host: "Nicolas Erlichman"
+ :title: "Modeling Class Hierarchies in Active Record"
:type: talk
- - :id: thu-lunch
+ - :id: mon-lunch
:time: "12:00 PM"
:sort_time: 1200
- :title: "Open Lunch"
+ :title: "Lunch"
:type: meal
:description: "(Coordinate on Slack)"
- - :id: thu-mystery
+ - :id: mon-talk-5
:time: "2:00 PM"
:sort_time: 1400
- :title: "Mystery Activity 👀"
- :type: community
- - :id: thu-break-3
- :time: "2:30 PM"
- :sort_time: 1430
- :title: "Break"
- :type: reception
- - :id: thu-talk-4
- :time: "3:00 PM"
- :sort_time: 1500
- :host: "Annie Kiley"
- :host_url: "https://blueridgeruby.com/speakers/annie-kiley/"
- :title: "How To Finish What You Start: Lessons From Actually Shipping a Big Refactor"
+ :host: "Fernando Perales"
+ :title: "Slowly We Rot: signs of a Rails app's decay"
+ :type: talk
+ - :id: mon-talk-6
+ :time: "2:35 PM"
+ :sort_time: 1435
+ :host: "Ben Reubenstein"
+ :title: "Commit for Good"
:type: talk
- - :id: thu-break-4
- :time: "3:30 PM"
- :sort_time: 1530
+ - :id: mon-break-2
+ :time: "3:05 PM"
+ :sort_time: 1505
:title: "Break"
:type: reception
- - :id: thu-talk-5
- :time: "4:00 PM"
- :sort_time: 1600
- :host: "Kevin Murphy"
- :host_url: "https://blueridgeruby.com/speakers/kevin-murphy/"
- :title: "InstiLLment of Successful Practices in an Agentic World"
+ - :id: mon-talk-7
+ :time: "3:35 PM"
+ :sort_time: 1535
+ :host: "Drew Bragg"
+ :title: "Your own AI Agent in ~400 lines of Ruby"
:type: talk
- - :id: thu-closing
- :time: "4:30 PM"
- :sort_time: 1630
- :title: "Closing, Day 1"
- :type: reception
- - :id: thu-dinner
+ - :id: mon-talk-8
+ :time: "4:10 PM"
+ :sort_time: 1610
+ :host: "Travis Turner"
+ :title: "Got AI ontological shock? No worries: UFOs, Theology, and Psychedelics with Ruby-Colored Reverence"
+ :type: talk
+ - :id: mon-happy-hour
:time: "5:00 PM"
:sort_time: 1700
- :title: "Open Dinner"
- :type: meal
- :description: "(Coordinate on Slack)"
- - :id: thu-roundtable
- :time: "7:00 PM"
- :sort_time: 1900
- :title: "Roundtable Discussion"
+ :title: "Game & Craft Happy Hour"
:type: community
- :location: "YMI Cultural Center"
+ :location: "eTown Hall"
- - :anchor: fri
- :date: "May 1"
- :label: "Friday"
+ - :anchor: tue
+ :date: "September 29"
+ :label: "Tuesday"
:subtitle: "Conference Day 2"
:items:
- - :id: fri-coffee
+ - :id: tue-checkin
:time: "8:00 AM"
:sort_time: 800
- :title: "Coffee, Light Snacks"
+ :title: "Check-In & Breakfast"
:type: reception
- - :id: fri-welcome
+ :location: "eTown Hall"
+ :map_url: "https://www.google.com/maps/search/?api=1&query=eTown+Hall+1535+Spruce+St+Boulder+CO+80302"
+ - :id: tue-opening
:time: "9:00 AM"
:sort_time: 900
- :title: "Welcome, Day 2"
+ :title: "Day Two Opening"
:type: reception
- - :id: fri-talk-1
- :time: "9:30 AM"
- :sort_time: 930
- :host: "Brooke Kuhlmann"
- :host_url: "https://blueridgeruby.com/speakers/brooke-kuhlmann/"
- :title: "Terminus: A Hanami + htmx web application for e-ink devices"
+ - :id: tue-talk-1
+ :time: "9:15 AM"
+ :sort_time: 915
+ :host: "Marco Roth"
+ :title: "Herb in Rails 8.2: Your ERB views, now HTML-aware"
:type: talk
- - :id: fri-break-1
- :time: "10:00 AM"
- :sort_time: 1000
- :title: "Break"
- :type: reception
- - :id: fri-talk-2
- :time: "10:30 AM"
- :sort_time: 1030
- :host: "Rachael Wright-Munn"
- :host_url: "https://blueridgeruby.com/speakers/rachael-wright-munn/"
- :title: "Your First Open-Source Contribution"
+ - :id: tue-talk-2
+ :time: "9:50 AM"
+ :sort_time: 950
+ :host: "Andrea Fomera"
+ :title: "High-Octane Onboarding: Ramping into a Rails Codebase with AI Agents"
:type: talk
- - :id: fri-break-2
- :time: "11:00 AM"
- :sort_time: 1100
+ - :id: tue-break-1
+ :time: "10:25 AM"
+ :sort_time: 1025
:title: "Break"
:type: reception
- - :id: fri-talk-3
+ - :id: tue-talk-3
+ :time: "10:55 AM"
+ :sort_time: 1055
+ :host: "Christine Seeman"
+ :title: "Optimize Your Mindset (Without Overclocking)"
+ :type: talk
+ - :id: tue-talk-4
:time: "11:30 AM"
:sort_time: 1130
- :host: "David Paluy"
- :host_url: "https://blueridgeruby.com/speakers/david-paluy/"
- :title: "LLM Telemetry as a First-Class Rails Concern"
+ :host: "Giovanni Panasiti"
+ :title: "Building an Agentic RAG in the Rails Way with RubyLLM"
:type: talk
- - :id: fri-lunch
+ - :id: tue-lunch
:time: "12:00 PM"
:sort_time: 1200
- :title: "Open Lunch"
+ :title: "Lunch"
:type: meal
:description: "(Coordinate on Slack)"
- - :id: fri-lightning
+ - :id: tue-talk-5
:time: "2:00 PM"
:sort_time: 1400
+ :host: "Ifat Ribon"
+ :title: "Fewer Tests, More Confidence: A Rails Testing Philosophy for the AI Era"
+ :type: talk
+ - :id: tue-break-2
+ :time: "2:30 PM"
+ :sort_time: 1430
+ :title: "Break"
+ :type: reception
+ - :id: tue-lightning
+ :time: "2:45 PM"
+ :sort_time: 1445
:title: "Lightning Talks"
:type: lightning
- :description: "8–10 Total"
- - :id: fri-break-3
- :time: "3:00 PM"
- :sort_time: 1500
+ - :id: tue-break-3
+ :time: "3:45 PM"
+ :sort_time: 1545
:title: "Break"
:type: reception
- - :id: fri-talk-4
- :time: "3:30 PM"
- :sort_time: 1530
- :host: "Christine Seeman"
- :host_url: "https://blueridgeruby.com/speakers/christine-seeman/"
- :title: "Optimize Your Mindset (Without Overclocking)"
+ - :id: tue-talk-6
+ :time: "4:15 PM"
+ :sort_time: 1615
+ :host: "Alan Ridlehoover"
+ :title: "Indispensable: What Human Programmers Can Learn from Human Computers"
:type: talk
- - :id: fri-break-4
- :time: "4:00 PM"
- :sort_time: 1600
- :title: "Break"
+ - :id: tue-closing
+ :time: "4:50 PM"
+ :sort_time: 1650
+ :title: "Closing Session"
:type: reception
- - :id: fri-talk-5
- :time: "4:30 PM"
- :sort_time: 1630
- :host: "Thomas Cannon"
- :host_url: "https://blueridgeruby.com/speakers/thomas-cannon/"
- :title: "5 ways to invest in yourself for the long haul"
- :type: talk
- - :id: fri-closing
+ - :id: tue-hackday
:time: "5:00 PM"
:sort_time: 1700
- :title: "Closing, Day 2"
- :type: reception
- - :id: fri-dinner
- :time: "5:30 PM"
- :sort_time: 1730
- :title: "Open Dinner"
- :type: meal
- :description: "(Coordinate on Slack)"
- - :id: fri-afterparty
- :time: "8:00 PM"
- :sort_time: 2000
- :title: "Afterparty"
- :type: community
- :location: "Burial Beer Co. South Slope"
-
- - :anchor: sat
- :date: "May 2"
- :label: "Saturday"
- :subtitle: "Hack Day & Ruby Embassy"
- :items:
- - :id: sat-hackday
- :time: "9:00 AM"
- :sort_time: 900
:title: "Hack Day"
:type: community
- :location: "YMI Cultural Center"
- :description: "Hack on projects, or just come and hang out! (Ends at 4:00 PM)"
- - :id: sat-dinner
- :time: "5:00 PM"
- :sort_time: 1700
- :title: "Informal Dinner"
- :type: activity
- :location: "Asheville Pizza South Slope"
- :description: "For those still in town, let's get dinner one last time!"
+ :flexible: true
+ :is_public: false
+ :description: "Placeholder — not on the published RMR schedule. Kept non-public so admin Hack Projects still works; flip to public if organizers decide to run it."
+ - :id: tue-volunteers
+ :time: "8:00 AM"
+ :sort_time: 800
+ :title: "Registration & Check-In Volunteers"
+ :type: volunteer
+ :volunteer_capacity: 4
+ :flexible: true
+ :is_public: false
+ :description: "Placeholder volunteer slot — not yet confirmed with organizers."
diff --git a/db/seeds/schedule.rb b/db/seeds/schedule.rb
index c3b370b..dab616f 100644
--- a/db/seeds/schedule.rb
+++ b/db/seeds/schedule.rb
@@ -23,13 +23,23 @@
record.description = item[:description]
record.kind = item[:type]
record.flexible = item[:flexible] || false
- record.is_public = true
+ record.is_public = item.fetch(:is_public, true)
+ record.volunteer_capacity = item[:volunteer_capacity]
record.created_by = nil
record.save!
end
end
-# Remove slugs that existed in earlier schedule versions but are no longer
-# part of the canonical schedule. Cascades to plan_items via dependent: :destroy.
-obsolete_slugs = %w[sat-morning sat-afternoon sat-evening sat-embassy-am sat-embassy-pm]
+# Remove slugs that existed in earlier schedule versions (including the prior
+# Blue Ridge Ruby fork) but are no longer part of the canonical schedule.
+# Cascades to plan_items via dependent: :destroy.
+obsolete_slugs = %w[
+ sat-morning sat-afternoon sat-evening sat-embassy-am sat-embassy-pm
+ wed-meetup thu-registration thu-welcome thu-talk-1 thu-break-1 thu-talk-2
+ thu-break-2 thu-talk-3 thu-lunch thu-mystery thu-break-3 thu-talk-4
+ thu-break-4 thu-talk-5 thu-closing thu-dinner thu-roundtable fri-coffee
+ fri-welcome fri-talk-1 fri-break-1 fri-talk-2 fri-break-2 fri-talk-3
+ fri-lunch fri-lightning fri-break-3 fri-talk-4 fri-break-4 fri-talk-5
+ fri-closing fri-dinner fri-afterparty sat-hackday sat-dinner
+]
ScheduleItem.where(slug: obsolete_slugs).destroy_all
diff --git a/test/controllers/admin/dashboard_controller_test.rb b/test/controllers/admin/dashboard_controller_test.rb
index 1561b8a..e31b925 100644
--- a/test/controllers/admin/dashboard_controller_test.rb
+++ b/test/controllers/admin/dashboard_controller_test.rb
@@ -29,7 +29,7 @@ class Admin::DashboardControllerTest < ActionDispatch::IntegrationTest
test "dashboard shows counts" do
# Seed a handful of items so counts are non-zero
- ScheduleItem.create!(day: "thu", title: "Count test", kind: :activity, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Count test", kind: :activity, is_public: true)
sign_in_as users(:jeremy)
get admin_root_path
@@ -38,10 +38,10 @@ class Admin::DashboardControllerTest < ActionDispatch::IntegrationTest
end
test "rsvps count excludes talks, reception, and volunteer kinds" do
- activity = ScheduleItem.create!(day: "thu", title: "Hike", kind: :activity)
- talk = ScheduleItem.create!(day: "thu", title: "Keynote", kind: :talk)
- reception = ScheduleItem.create!(day: "thu", title: "Welcome", kind: :reception)
- volunteer = ScheduleItem.create!(day: "thu", title: "Stamp", kind: :volunteer, volunteer_capacity: 5)
+ activity = ScheduleItem.create!(day: "mon", title: "Hike", kind: :activity)
+ talk = ScheduleItem.create!(day: "mon", title: "Keynote", kind: :talk)
+ reception = ScheduleItem.create!(day: "mon", title: "Welcome", kind: :reception)
+ volunteer = ScheduleItem.create!(day: "mon", title: "Stamp", kind: :volunteer, volunteer_capacity: 5)
activity.plan_items.create!(user: users(:attendee_one)) # counted
talk.plan_items.create!(user: users(:attendee_one)) # excluded
@@ -57,11 +57,11 @@ class Admin::DashboardControllerTest < ActionDispatch::IntegrationTest
end
test "volunteers needed count: empty volunteer slots on today or later days" do
- travel_to Date.new(2026, 4, 30) do # thu
- ScheduleItem.create!(day: "wed", title: "Past empty", kind: :volunteer, volunteer_capacity: 3)
- ScheduleItem.create!(day: "thu", title: "Today empty", kind: :volunteer, volunteer_capacity: 3)
- ScheduleItem.create!(day: "sat", title: "Future empty", kind: :volunteer, volunteer_capacity: 3)
- filled = ScheduleItem.create!(day: "thu", title: "Filled", kind: :volunteer, volunteer_capacity: 1)
+ travel_to Date.new(2026, 9, 28) do # mon
+ ScheduleItem.create!(day: "sun", title: "Past empty", kind: :volunteer, volunteer_capacity: 3)
+ ScheduleItem.create!(day: "mon", title: "Today empty", kind: :volunteer, volunteer_capacity: 3)
+ ScheduleItem.create!(day: "tue", title: "Future empty", kind: :volunteer, volunteer_capacity: 3)
+ filled = ScheduleItem.create!(day: "mon", title: "Filled", kind: :volunteer, volunteer_capacity: 1)
filled.plan_items.create!(user: users(:volunteer_one))
sign_in_as users(:jeremy)
diff --git a/test/controllers/admin/embassy_applications_controller_test.rb b/test/controllers/admin/embassy_applications_controller_test.rb
index a6b5088..c016f52 100644
--- a/test/controllers/admin/embassy_applications_controller_test.rb
+++ b/test/controllers/admin/embassy_applications_controller_test.rb
@@ -18,11 +18,11 @@ def create_application_for(user, schedule_item)
setup do
@passport_block = ScheduleItem.create!(
- day: "thu", title: "Passport Block", kind: :embassy, is_public: true,
+ day: "mon", title: "Passport Block", kind: :embassy, is_public: true,
offers_new_passport: true, new_passport_capacity: 4
)
@pickup_block = ScheduleItem.create!(
- day: "sat", title: "Pickup Block", kind: :embassy, is_public: true,
+ day: "tue", title: "Pickup Block", kind: :embassy, is_public: true,
offers_passport_pickup: true, passport_pickup_capacity: 2,
time_label: "2:00 PM", sort_time: 1400
)
diff --git a/test/controllers/admin/hack_projects_controller_test.rb b/test/controllers/admin/hack_projects_controller_test.rb
index 15211be..67bd687 100644
--- a/test/controllers/admin/hack_projects_controller_test.rb
+++ b/test/controllers/admin/hack_projects_controller_test.rb
@@ -3,8 +3,8 @@
class Admin::HackProjectsControllerTest < ActionDispatch::IntegrationTest
setup do
@hack_day = ScheduleItem.create!(
- slug: "sat-hackday",
- day: "sat",
+ slug: ScheduleItem::HACK_DAY_SLUG,
+ day: "tue",
time_label: "9:00 AM",
sort_time: 900,
title: "Hack Day",
diff --git a/test/controllers/admin/lightning_talk_signups_controller_test.rb b/test/controllers/admin/lightning_talk_signups_controller_test.rb
index 3992790..85ff2f6 100644
--- a/test/controllers/admin/lightning_talk_signups_controller_test.rb
+++ b/test/controllers/admin/lightning_talk_signups_controller_test.rb
@@ -4,7 +4,7 @@ class Admin::LightningTalkSignupsControllerTest < ActionDispatch::IntegrationTes
setup do
@admin = users(:jeremy)
@item = ScheduleItem.create!(
- day: "fri", title: "Lightning Talks", kind: :lightning,
+ day: "mon", title: "Lightning Talks", kind: :lightning,
sort_time: 1400, time_label: "2:00 PM", is_public: true
)
end
diff --git a/test/controllers/admin/lightning_talks_controller_test.rb b/test/controllers/admin/lightning_talks_controller_test.rb
index f3b2793..4b3f445 100644
--- a/test/controllers/admin/lightning_talks_controller_test.rb
+++ b/test/controllers/admin/lightning_talks_controller_test.rb
@@ -4,7 +4,7 @@ class Admin::LightningTalksControllerTest < ActionDispatch::IntegrationTest
setup do
@admin = users(:jeremy)
@item = ScheduleItem.create!(
- day: "fri", title: "Lightning Talks", kind: :lightning,
+ day: "mon", title: "Lightning Talks", kind: :lightning,
sort_time: 1400, time_label: "2:00 PM", is_public: true
)
end
diff --git a/test/controllers/admin/schedule_items_controller_test.rb b/test/controllers/admin/schedule_items_controller_test.rb
index fbc1ed0..04dc70a 100644
--- a/test/controllers/admin/schedule_items_controller_test.rb
+++ b/test/controllers/admin/schedule_items_controller_test.rb
@@ -4,7 +4,7 @@ class Admin::ScheduleItemsControllerTest < ActionDispatch::IntegrationTest
def valid_form_params(overrides = {})
{
schedule_item: {
- day: "fri",
+ day: "mon",
time_label: "9:00 AM",
sort_time: 900,
title: "Admin-created Talk",
@@ -35,7 +35,7 @@ def valid_form_params(overrides = {})
end
test "admin schedule index shows RSVPs column with kind-aware counts and small action buttons" do
- ScheduleItem.create!(day: "fri", time_label: "9:00 AM", sort_time: 900,
+ ScheduleItem.create!(day: "mon", time_label: "9:00 AM", sort_time: 900,
title: "Talk fixture", kind: "talk", is_public: true, flexible: false)
sign_in_as users(:jeremy)
get admin_schedule_items_path
@@ -67,7 +67,7 @@ def valid_form_params(overrides = {})
end
test "admin can edit any item's kind" do
- item = ScheduleItem.create!(day: "thu", title: "Original", kind: :activity, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Original", kind: :activity, is_public: true)
sign_in_as users(:jeremy)
patch admin_schedule_item_path(item), params: valid_form_params(kind: "talk", title: "Changed")
@@ -78,7 +78,7 @@ def valid_form_params(overrides = {})
test "admin can delete items (including user-created ones)" do
user_item = users(:attendee_one).created_schedule_items.create!(
- day: "sat", title: "Attendee's activity", kind: :activity, is_public: true
+ day: "mon", title: "Attendee's activity", kind: :activity, is_public: true
)
sign_in_as users(:jeremy)
@@ -88,7 +88,7 @@ def valid_form_params(overrides = {})
end
test "delete cascades associated plan_items" do
- item = ScheduleItem.create!(day: "thu", title: "Cascade test", kind: :activity, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Cascade test", kind: :activity, is_public: true)
users(:attendee_one).plan_items.create!(schedule_item: item)
users(:volunteer_one).plan_items.create!(schedule_item: item)
@@ -99,7 +99,7 @@ def valid_form_params(overrides = {})
end
test "admin edit form renders host as a select with existing user names" do
- item = ScheduleItem.create!(day: "thu", title: "Test talk", kind: :talk, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Test talk", kind: :talk, is_public: true)
sign_in_as users(:jeremy)
get edit_admin_schedule_item_path(item)
@@ -113,7 +113,7 @@ def valid_form_params(overrides = {})
test "admin index shows item descriptions when present" do
ScheduleItem.create!(
- day: "thu",
+ day: "mon",
title: "Admin desc",
description: "Short admin-visible description.",
kind: :activity,
@@ -125,7 +125,7 @@ def valid_form_params(overrides = {})
end
test "admin edit form preserves an external speaker host value as a sticky option" do
- item = ScheduleItem.create!(day: "thu", title: "Keynote", host: "John Athayde", kind: :talk, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Keynote", host: "John Athayde", kind: :talk, is_public: true)
sign_in_as users(:jeremy)
get edit_admin_schedule_item_path(item)
@@ -136,7 +136,7 @@ def valid_form_params(overrides = {})
test "admin edit form exposes a host_url field so name and link stay paired" do
item = ScheduleItem.create!(
- day: "thu", title: "Keynote", host: "John Athayde",
+ day: "mon", title: "Keynote", host: "John Athayde",
host_url: "https://blueridgeruby.com/speakers/john-athayde/",
kind: :talk, is_public: true
)
@@ -149,7 +149,7 @@ def valid_form_params(overrides = {})
test "admin update persists host_url alongside host" do
item = ScheduleItem.create!(
- day: "thu", title: "Keynote", host: "John Athayde",
+ day: "mon", title: "Keynote", host: "John Athayde",
host_url: "https://blueridgeruby.com/speakers/john-athayde/",
kind: :talk, is_public: true
)
@@ -175,7 +175,7 @@ def valid_form_params(overrides = {})
end
test "admin can update an item's audience" do
- item = ScheduleItem.create!(day: "thu", title: "Update test", kind: :talk, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Update test", kind: :talk, is_public: true)
assert_equal "everyone", item.audience
sign_in_as users(:jeremy)
@@ -184,8 +184,8 @@ def valid_form_params(overrides = {})
end
test "admin index remembers kind filter across param-less revisits" do
- ScheduleItem.create!(day: "fri", title: "Filter-talk", kind: :talk, is_public: true)
- ScheduleItem.create!(day: "fri", title: "Filter-meal", kind: :meal, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Filter-talk", kind: :talk, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Filter-meal", kind: :meal, is_public: true)
sign_in_as users(:jeremy)
get admin_schedule_items_path, params: { kind: "talk" }
@@ -198,22 +198,22 @@ def valid_form_params(overrides = {})
end
test "admin index remembers day filter across param-less revisits" do
- ScheduleItem.create!(day: "fri", title: "Friday-only", kind: :talk, is_public: true)
- ScheduleItem.create!(day: "sat", title: "Saturday-only", kind: :talk, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Monday-only", kind: :talk, is_public: true)
+ ScheduleItem.create!(day: "tue", title: "Tuesday-only", kind: :talk, is_public: true)
sign_in_as users(:jeremy)
- get admin_schedule_items_path, params: { day: "fri" }
- assert_match "Friday-only", response.body
- assert_no_match "Saturday-only", response.body
+ get admin_schedule_items_path, params: { day: "mon" }
+ assert_match "Monday-only", response.body
+ assert_no_match "Tuesday-only", response.body
get admin_schedule_items_path
- assert_match "Friday-only", response.body
- assert_no_match "Saturday-only", response.body
+ assert_match "Monday-only", response.body
+ assert_no_match "Tuesday-only", response.body
end
test "admin index clears persisted kind filter when 'All' sends empty kind" do
- ScheduleItem.create!(day: "fri", title: "Clear-talk", kind: :talk, is_public: true)
- ScheduleItem.create!(day: "fri", title: "Clear-meal", kind: :meal, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Clear-talk", kind: :talk, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Clear-meal", kind: :meal, is_public: true)
sign_in_as users(:jeremy)
get admin_schedule_items_path, params: { kind: "talk" }
@@ -228,8 +228,8 @@ def valid_form_params(overrides = {})
end
test "admin index hides passed items by default and shows them with show_past=1" do
- upcoming = ScheduleItem.create!(day: "fri", title: "Still upcoming", kind: :talk, is_public: true)
- finished = ScheduleItem.create!(day: "fri", title: "Already done", kind: :talk, is_public: true, passed: true)
+ upcoming = ScheduleItem.create!(day: "mon", title: "Still upcoming", kind: :talk, is_public: true)
+ finished = ScheduleItem.create!(day: "mon", title: "Already done", kind: :talk, is_public: true, passed: true)
sign_in_as users(:jeremy)
get admin_schedule_items_path
@@ -242,8 +242,8 @@ def valid_form_params(overrides = {})
end
test "admin index remembers show_past across param-less revisits" do
- upcoming = ScheduleItem.create!(day: "fri", title: "Persist-upcoming", kind: :talk, is_public: true)
- finished = ScheduleItem.create!(day: "fri", title: "Persist-done", kind: :talk, is_public: true, passed: true)
+ upcoming = ScheduleItem.create!(day: "mon", title: "Persist-upcoming", kind: :talk, is_public: true)
+ finished = ScheduleItem.create!(day: "mon", title: "Persist-done", kind: :talk, is_public: true, passed: true)
sign_in_as users(:jeremy)
get admin_schedule_items_path, params: { show_past: "1" }
@@ -255,7 +255,7 @@ def valid_form_params(overrides = {})
end
test "admin toggle_passed flips the boolean" do
- item = ScheduleItem.create!(day: "thu", title: "Toggle target", kind: :talk, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Toggle target", kind: :talk, is_public: true)
assert_equal false, item.passed
sign_in_as users(:jeremy)
@@ -267,7 +267,7 @@ def valid_form_params(overrides = {})
end
test "non-admin cannot toggle_passed" do
- item = ScheduleItem.create!(day: "thu", title: "Locked", kind: :talk, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Locked", kind: :talk, is_public: true)
sign_in_as users(:attendee_one)
patch toggle_passed_admin_schedule_item_path(item)
assert_response :not_found
@@ -275,8 +275,8 @@ def valid_form_params(overrides = {})
end
test "admin filter survives edit→update→redirect" do
- keep = ScheduleItem.create!(day: "fri", title: "Survives-talk", kind: :talk, is_public: true)
- other = ScheduleItem.create!(day: "fri", title: "Hidden-meal", kind: :meal, is_public: true)
+ keep = ScheduleItem.create!(day: "mon", title: "Survives-talk", kind: :talk, is_public: true)
+ other = ScheduleItem.create!(day: "mon", title: "Hidden-meal", kind: :meal, is_public: true)
sign_in_as users(:jeremy)
get admin_schedule_items_path, params: { kind: "talk" }
diff --git a/test/controllers/admin/users_controller_test.rb b/test/controllers/admin/users_controller_test.rb
index 4c26d14..0b59aa2 100644
--- a/test/controllers/admin/users_controller_test.rb
+++ b/test/controllers/admin/users_controller_test.rb
@@ -18,7 +18,7 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
test "admin show page lists the user's plan items" do
alice = users(:attendee_one)
item = ScheduleItem.create!(
- day: "fri",
+ day: "mon",
title: "Alice planned activity",
kind: :activity,
is_public: true,
@@ -34,9 +34,9 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
test "admin show hides passed plan items by default and shows them with show_past=1" do
alice = users(:attendee_one)
- upcoming = ScheduleItem.create!(day: "fri", title: "Show-upcoming", kind: :activity,
+ upcoming = ScheduleItem.create!(day: "mon", title: "Show-upcoming", kind: :activity,
is_public: true, time_label: "10:00 AM", sort_time: 1000)
- finished = ScheduleItem.create!(day: "fri", title: "Show-done", kind: :activity,
+ finished = ScheduleItem.create!(day: "mon", title: "Show-done", kind: :activity,
is_public: true, time_label: "11:00 AM", sort_time: 1100, passed: true)
alice.plan_items.create!(schedule_item: upcoming)
alice.plan_items.create!(schedule_item: finished)
@@ -54,15 +54,15 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
test "admin show page hides talks and receptions from the plan section" do
alice = users(:attendee_one)
talk = ScheduleItem.create!(
- day: "fri", title: "Default Talk", kind: :talk,
+ day: "mon", title: "Default Talk", kind: :talk,
is_public: true, time_label: "10:00 AM", sort_time: 1000
)
reception = ScheduleItem.create!(
- day: "fri", title: "Default Reception", kind: :reception,
+ day: "mon", title: "Default Reception", kind: :reception,
is_public: true, time_label: "6:00 PM", sort_time: 1800
)
activity = ScheduleItem.create!(
- day: "sat", title: "Optional Activity", kind: :activity,
+ day: "tue", title: "Optional Activity", kind: :activity,
is_public: true, time_label: "2:00 PM", sort_time: 1400
)
alice.plan_items.create!(schedule_item: talk)
@@ -89,7 +89,7 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
test "show page lists events the user is hosting under Hosting" do
alice = users(:attendee_one)
ScheduleItem.create!(
- day: "fri",
+ day: "mon",
title: "Alice hosted session",
host: alice.full_name,
kind: :talk,
@@ -108,7 +108,7 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
test "show page surfaces an embassy plan item under its own section" do
alice = users(:attendee_one)
embassy = ScheduleItem.create!(
- day: "sat",
+ day: "tue",
title: "Alice embassy slot",
kind: :embassy,
is_public: true,
@@ -129,7 +129,7 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest
test "embassy plan items do not appear in the generic plan section" do
alice = users(:attendee_one)
embassy = ScheduleItem.create!(
- day: "sat",
+ day: "tue",
title: "Only embassy item",
kind: :embassy,
is_public: true,
diff --git a/test/controllers/admin/volunteer_signups_controller_test.rb b/test/controllers/admin/volunteer_signups_controller_test.rb
index 03096fe..783424c 100644
--- a/test/controllers/admin/volunteer_signups_controller_test.rb
+++ b/test/controllers/admin/volunteer_signups_controller_test.rb
@@ -3,7 +3,7 @@
class Admin::VolunteerSignupsControllerTest < ActionDispatch::IntegrationTest
setup do
@slot = ScheduleItem.create!(
- day: "fri", title: "Stamp passports",
+ day: "mon", title: "Stamp passports",
kind: :volunteer, is_public: true, volunteer_capacity: 2
)
end
@@ -49,7 +49,7 @@ class Admin::VolunteerSignupsControllerTest < ActionDispatch::IntegrationTest
end
test "admin cannot use this endpoint for non-volunteer-kind items (scoped finder)" do
- talk = ScheduleItem.create!(day: "fri", title: "A talk", kind: :talk, is_public: true)
+ talk = ScheduleItem.create!(day: "mon", title: "A talk", kind: :talk, is_public: true)
sign_in_as users(:jeremy)
assert_no_difference -> { PlanItem.count } do
post admin_volunteer_signups_path,
diff --git a/test/controllers/admin/volunteer_slots_controller_test.rb b/test/controllers/admin/volunteer_slots_controller_test.rb
index 1829c87..c4183d0 100644
--- a/test/controllers/admin/volunteer_slots_controller_test.rb
+++ b/test/controllers/admin/volunteer_slots_controller_test.rb
@@ -9,7 +9,7 @@ class Admin::VolunteerSlotsControllerTest < ActionDispatch::IntegrationTest
test "admin sees the slot index with capacity status" do
ScheduleItem.create!(
- day: "fri", title: "Stamp passports",
+ day: "mon", title: "Stamp passports",
kind: :volunteer, is_public: true, volunteer_capacity: 3
)
@@ -22,7 +22,7 @@ class Admin::VolunteerSlotsControllerTest < ActionDispatch::IntegrationTest
test "admin show page lists signups + add form" do
slot = ScheduleItem.create!(
- day: "fri", title: "Stamp passports",
+ day: "mon", title: "Stamp passports",
kind: :volunteer, is_public: true, volunteer_capacity: 3
)
slot.plan_items.create!(user: users(:volunteer_one))
@@ -35,7 +35,7 @@ class Admin::VolunteerSlotsControllerTest < ActionDispatch::IntegrationTest
end
test "admin show page returns 404 for non-volunteer-kind item" do
- talk = ScheduleItem.create!(day: "fri", title: "A talk", kind: :talk, is_public: true)
+ talk = ScheduleItem.create!(day: "mon", title: "A talk", kind: :talk, is_public: true)
sign_in_as users(:jeremy)
get admin_volunteer_slot_path(talk)
assert_response :not_found
@@ -43,7 +43,7 @@ class Admin::VolunteerSlotsControllerTest < ActionDispatch::IntegrationTest
test "admin show page hides add form when slot is full" do
slot = ScheduleItem.create!(
- day: "fri", title: "Cleanup",
+ day: "mon", title: "Cleanup",
kind: :volunteer, is_public: true, volunteer_capacity: 1
)
slot.plan_items.create!(user: users(:volunteer_one))
diff --git a/test/controllers/admin/volunteers_controller_test.rb b/test/controllers/admin/volunteers_controller_test.rb
index 28ab2de..4911d28 100644
--- a/test/controllers/admin/volunteers_controller_test.rb
+++ b/test/controllers/admin/volunteers_controller_test.rb
@@ -9,7 +9,7 @@ class Admin::VolunteersControllerTest < ActionDispatch::IntegrationTest
test "admin sees volunteer list with slot counts" do
slot = ScheduleItem.create!(
- day: "fri", title: "Stamp passports",
+ day: "mon", title: "Stamp passports",
kind: :volunteer, is_public: true, volunteer_capacity: 3
)
slot.plan_items.create!(user: users(:volunteer_one))
@@ -22,7 +22,7 @@ class Admin::VolunteersControllerTest < ActionDispatch::IntegrationTest
test "admin show page renders volunteer's slots and assign form" do
slot = ScheduleItem.create!(
- day: "fri", title: "Stamp passports",
+ day: "mon", title: "Stamp passports",
kind: :volunteer, is_public: true, volunteer_capacity: 3
)
slot.plan_items.create!(user: users(:volunteer_one))
diff --git a/test/controllers/embassy_bookings_controller_test.rb b/test/controllers/embassy_bookings_controller_test.rb
index 51b66eb..0661bf8 100644
--- a/test/controllers/embassy_bookings_controller_test.rb
+++ b/test/controllers/embassy_bookings_controller_test.rb
@@ -3,7 +3,7 @@
class EmbassyBookingsControllerTest < ActionDispatch::IntegrationTest
setup do
@block = ScheduleItem.create!(
- day: "thu", title: "Embassy Block", kind: :embassy, is_public: true,
+ day: "mon", title: "Embassy Block", kind: :embassy, is_public: true,
offers_new_passport: true, new_passport_capacity: 2,
offers_stamping: true, stamping_capacity: 1,
offers_passport_pickup: true, passport_pickup_capacity: 1,
diff --git a/test/controllers/lightning_talk_signups_controller_test.rb b/test/controllers/lightning_talk_signups_controller_test.rb
index e3c4f5c..9b38785 100644
--- a/test/controllers/lightning_talk_signups_controller_test.rb
+++ b/test/controllers/lightning_talk_signups_controller_test.rb
@@ -3,7 +3,7 @@
class LightningTalkSignupsControllerTest < ActionDispatch::IntegrationTest
setup do
@item = ScheduleItem.create!(
- day: "fri", title: "Lightning Talks", kind: :lightning,
+ day: "mon", title: "Lightning Talks", kind: :lightning,
sort_time: 1400, time_label: "2:00 PM", is_public: true
)
end
diff --git a/test/controllers/meal_spot_rsvps_controller_test.rb b/test/controllers/meal_spot_rsvps_controller_test.rb
index 211cbf8..212d581 100644
--- a/test/controllers/meal_spot_rsvps_controller_test.rb
+++ b/test/controllers/meal_spot_rsvps_controller_test.rb
@@ -2,7 +2,7 @@
class MealSpotRsvpsControllerTest < ActionDispatch::IntegrationTest
setup do
- @meal = ScheduleItem.create!(day: "thu", title: "Lunch", kind: :meal, is_public: true)
+ @meal = ScheduleItem.create!(day: "mon", title: "Lunch", kind: :meal, is_public: true)
@spot_a = @meal.meal_spots.create!(name: "Hattie B's", created_by: users(:attendee_one))
@spot_b = @meal.meal_spots.create!(name: "Pinewood", created_by: users(:attendee_one))
@walking_a = @spot_a.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
@@ -181,11 +181,11 @@ class MealSpotRsvpsControllerTest < ActionDispatch::IntegrationTest
rsvp = @walking_a.rsvps.create!(user: user)
rsvp.update_columns(contact_method: nil)
- other_activity = ScheduleItem.create!(day: "sat", title: "Hike", kind: :activity, is_public: true)
+ other_activity = ScheduleItem.create!(day: "tue", title: "Hike", kind: :activity, is_public: true)
other_pi = user.plan_items.create!(schedule_item: other_activity)
other_pi.update_columns(contact_method: nil)
- set_activity = ScheduleItem.create!(day: "sat", title: "Bike", kind: :activity, is_public: true)
+ set_activity = ScheduleItem.create!(day: "tue", title: "Bike", kind: :activity, is_public: true)
set_pi = user.plan_items.create!(schedule_item: set_activity, contact_method: "explicit")
patch schedule_item_meal_spot_rsvp_path(@meal, @spot_a, rsvp),
diff --git a/test/controllers/meal_spots_controller_test.rb b/test/controllers/meal_spots_controller_test.rb
index 9b8381e..4372487 100644
--- a/test/controllers/meal_spots_controller_test.rb
+++ b/test/controllers/meal_spots_controller_test.rb
@@ -2,8 +2,8 @@
class MealSpotsControllerTest < ActionDispatch::IntegrationTest
setup do
- @meal = ScheduleItem.create!(day: "thu", title: "Lunch", kind: :meal, is_public: true)
- @talk = ScheduleItem.create!(day: "thu", title: "Keynote", kind: :talk, is_public: true)
+ @meal = ScheduleItem.create!(day: "mon", title: "Lunch", kind: :meal, is_public: true)
+ @talk = ScheduleItem.create!(day: "mon", title: "Keynote", kind: :talk, is_public: true)
end
test "anonymous index redirects to sign-in" do
@@ -155,7 +155,7 @@ class MealSpotsControllerTest < ActionDispatch::IntegrationTest
# ----- Hosted meals -----------------------------------------------------
def hosted_meal
- @hosted_meal ||= ScheduleItem.create!(day: "thu", title: "Welcome dinner", kind: :meal,
+ @hosted_meal ||= ScheduleItem.create!(day: "mon", title: "Welcome dinner", kind: :meal,
is_public: true, host: "Alice",
location: "Pleasant Garden Inn",
map_url: "https://maps.app.goo.gl/x")
diff --git a/test/controllers/plan_controller_test.rb b/test/controllers/plan_controller_test.rb
index 547c714..718be15 100644
--- a/test/controllers/plan_controller_test.rb
+++ b/test/controllers/plan_controller_test.rb
@@ -3,9 +3,9 @@
class PlanControllerTest < ActionDispatch::IntegrationTest
test "index hides passed items from the user's plan by default" do
alice = users(:attendee_one)
- upcoming = ScheduleItem.create!(day: "fri", title: "Alice-upcoming", kind: :activity,
+ upcoming = ScheduleItem.create!(day: "mon", title: "Alice-upcoming", kind: :activity,
is_public: true, time_label: "10:00 AM", sort_time: 1000)
- finished = ScheduleItem.create!(day: "fri", title: "Alice-done", kind: :activity,
+ finished = ScheduleItem.create!(day: "mon", title: "Alice-done", kind: :activity,
is_public: true, time_label: "11:00 AM", sort_time: 1100, passed: true)
alice.plan_items.create!(schedule_item: upcoming)
alice.plan_items.create!(schedule_item: finished)
@@ -18,26 +18,26 @@ class PlanControllerTest < ActionDispatch::IntegrationTest
test "index hides a day section when all the user's plan items on that day are passed" do
alice = users(:attendee_one)
- fri_done = ScheduleItem.create!(day: "fri", title: "Fri-only-passed", kind: :activity,
+ sun_done = ScheduleItem.create!(day: "sun", title: "Sun-only-passed", kind: :activity,
is_public: true, time_label: "11:00 AM", sort_time: 1100, passed: true)
- sat_upcoming = ScheduleItem.create!(day: "sat", title: "Sat-still-here", kind: :activity,
+ mon_upcoming = ScheduleItem.create!(day: "mon", title: "Mon-still-here", kind: :activity,
is_public: true, time_label: "10:00 AM", sort_time: 1000)
- alice.plan_items.create!(schedule_item: fri_done)
- alice.plan_items.create!(schedule_item: sat_upcoming)
+ alice.plan_items.create!(schedule_item: sun_done)
+ alice.plan_items.create!(schedule_item: mon_upcoming)
sign_in_as alice
get plan_path
- assert_no_match "Friday", response.body
- assert_match "Saturday", response.body
+ assert_no_match "Sunday", response.body
+ assert_match "Monday", response.body
get plan_path, params: { show_past: "1" }
- assert_match "Friday", response.body
- assert_match "Saturday", response.body
+ assert_match "Sunday", response.body
+ assert_match "Monday", response.body
end
test "index shows passed items when show_past=1" do
alice = users(:attendee_one)
- finished = ScheduleItem.create!(day: "fri", title: "Alice-done-visible", kind: :activity,
+ finished = ScheduleItem.create!(day: "mon", title: "Alice-done-visible", kind: :activity,
is_public: true, time_label: "11:00 AM", sort_time: 1100, passed: true)
alice.plan_items.create!(schedule_item: finished)
diff --git a/test/controllers/plan_items_controller_test.rb b/test/controllers/plan_items_controller_test.rb
index 164e9f2..9d3d6bb 100644
--- a/test/controllers/plan_items_controller_test.rb
+++ b/test/controllers/plan_items_controller_test.rb
@@ -4,7 +4,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
setup do
@item = ScheduleItem.create!(
slug: "test-talk",
- day: "thu",
+ day: "mon",
title: "Test Talk",
kind: :talk,
is_public: true
@@ -71,11 +71,11 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
plan = user.plan_items.create!(schedule_item: @item)
plan.update_columns(contact_method: nil)
- blank_other = ScheduleItem.create!(day: "fri", title: "Hike", kind: :activity, is_public: true)
+ blank_other = ScheduleItem.create!(day: "mon", title: "Hike", kind: :activity, is_public: true)
blank_pi = user.plan_items.create!(schedule_item: blank_other)
blank_pi.update_columns(contact_method: nil)
- set_other = ScheduleItem.create!(day: "fri", title: "Bike", kind: :activity, is_public: true)
+ set_other = ScheduleItem.create!(day: "mon", title: "Bike", kind: :activity, is_public: true)
set_pi = user.plan_items.create!(schedule_item: set_other, contact_method: "preset")
patch plan_item_path(plan), params: { plan_item: { contact_method: "Discord: alice" } }
@@ -108,7 +108,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on a passport_pickup plan_item is refused (admin-only cancel)" do
pickup_block = ScheduleItem.create!(
- day: "sat", title: "Pickup", kind: :embassy, is_public: true,
+ day: "tue", title: "Pickup", kind: :embassy, is_public: true,
offers_passport_pickup: true, passport_pickup_capacity: 2,
time_label: "2:00 PM", sort_time: 1400
)
@@ -125,7 +125,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "attendee POST to a volunteers_only item returns 404 (visibility guard)" do
hidden = ScheduleItem.create!(
- slug: "vol-only", day: "fri", title: "Vol-only briefing",
+ slug: "vol-only", day: "mon", title: "Vol-only briefing",
kind: :volunteer, is_public: true, audience: "volunteers_only",
volunteer_capacity: 3
)
@@ -139,7 +139,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "volunteer can RSVP to a volunteers_only item" do
hidden = ScheduleItem.create!(
- slug: "vol-only", day: "fri", title: "Vol-only briefing",
+ slug: "vol-only", day: "mon", title: "Vol-only briefing",
kind: :volunteer, is_public: true, audience: "volunteers_only",
volunteer_capacity: 3
)
@@ -166,7 +166,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on plan_item with submitted embassy application does NOT destroy" do
sign_in_as users(:attendee_one)
embassy_item = ScheduleItem.create!(
- slug: "embassy-block", day: "sat", title: "Embassy Block",
+ slug: "embassy-block", day: "tue", title: "Embassy Block",
kind: :embassy, is_public: true, offers_new_passport: true, new_passport_capacity: 10
)
plan = users(:attendee_one).plan_items.create!(schedule_item: embassy_item)
@@ -190,7 +190,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on plan_item with submitted embassy application returns 403 turbo_stream" do
sign_in_as users(:attendee_one)
embassy_item = ScheduleItem.create!(
- slug: "embassy-block", day: "sat", title: "Embassy Block",
+ slug: "embassy-block", day: "tue", title: "Embassy Block",
kind: :embassy, is_public: true, offers_new_passport: true, new_passport_capacity: 10
)
plan = users(:attendee_one).plan_items.create!(schedule_item: embassy_item)
@@ -208,7 +208,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on plan_item with draft embassy application DOES destroy" do
sign_in_as users(:attendee_one)
embassy_item = ScheduleItem.create!(
- slug: "embassy-block", day: "sat", title: "Embassy Block",
+ slug: "embassy-block", day: "tue", title: "Embassy Block",
kind: :embassy, is_public: true, offers_new_passport: true, new_passport_capacity: 10
)
plan = users(:attendee_one).plan_items.create!(schedule_item: embassy_item)
@@ -226,7 +226,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on stamping embassy booking (no application) DOES destroy" do
sign_in_as users(:attendee_one)
embassy_item = ScheduleItem.create!(
- slug: "embassy-stamp", day: "sat", title: "Embassy Stamping",
+ slug: "embassy-stamp", day: "tue", title: "Embassy Stamping",
kind: :embassy, is_public: true, offers_stamping: true, stamping_capacity: 10
)
plan = users(:attendee_one).plan_items.create!(schedule_item: embassy_item)
@@ -244,7 +244,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on a meal plan_item with an active spot RSVP does NOT destroy" do
sign_in_as users(:attendee_one)
- meal = ScheduleItem.create!(slug: "thu-lunch", day: "thu", title: "Open Lunch",
+ meal = ScheduleItem.create!(slug: "mon-lunch", day: "mon", title: "Open Lunch",
kind: :meal, is_public: true)
spot = meal.meal_spots.create!(name: "Hattie Hot Chicken", created_by: users(:attendee_one))
transport = spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
@@ -262,7 +262,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on a meal plan_item with an active spot RSVP returns 403 turbo_stream" do
sign_in_as users(:attendee_one)
- meal = ScheduleItem.create!(slug: "thu-lunch", day: "thu", title: "Open Lunch",
+ meal = ScheduleItem.create!(slug: "mon-lunch", day: "mon", title: "Open Lunch",
kind: :meal, is_public: true)
spot = meal.meal_spots.create!(name: "Hattie Hot Chicken", created_by: users(:attendee_one))
transport = spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
@@ -276,7 +276,7 @@ class PlanItemsControllerTest < ActionDispatch::IntegrationTest
test "DELETE on a meal plan_item without an RSVP DOES destroy" do
sign_in_as users(:attendee_one)
- meal = ScheduleItem.create!(slug: "thu-lunch", day: "thu", title: "Open Lunch",
+ meal = ScheduleItem.create!(slug: "mon-lunch", day: "mon", title: "Open Lunch",
kind: :meal, is_public: true)
plan = users(:attendee_one).plan_items.create!(schedule_item: meal)
diff --git a/test/controllers/schedule_controller_test.rb b/test/controllers/schedule_controller_test.rb
index 7c26a19..f33d9ef 100644
--- a/test/controllers/schedule_controller_test.rb
+++ b/test/controllers/schedule_controller_test.rb
@@ -2,9 +2,9 @@
class ScheduleControllerTest < ActionDispatch::IntegrationTest
test "index hides passed items by default" do
- upcoming = ScheduleItem.create!(day: "fri", title: "Public-upcoming", kind: :activity,
+ upcoming = ScheduleItem.create!(day: "mon", title: "Public-upcoming", kind: :activity,
is_public: true, time_label: "10:00 AM", sort_time: 1000)
- finished = ScheduleItem.create!(day: "fri", title: "Public-done", kind: :activity,
+ finished = ScheduleItem.create!(day: "mon", title: "Public-done", kind: :activity,
is_public: true, time_label: "11:00 AM", sort_time: 1100, passed: true)
sign_in_as users(:attendee_one)
@@ -14,7 +14,7 @@ class ScheduleControllerTest < ActionDispatch::IntegrationTest
end
test "index shows passed items when show_past=1" do
- finished = ScheduleItem.create!(day: "fri", title: "Public-done-visible", kind: :activity,
+ finished = ScheduleItem.create!(day: "mon", title: "Public-done-visible", kind: :activity,
is_public: true, time_label: "11:00 AM", sort_time: 1100, passed: true)
sign_in_as users(:attendee_one)
diff --git a/test/controllers/schedule_items_controller_test.rb b/test/controllers/schedule_items_controller_test.rb
index e5dbe22..8211618 100644
--- a/test/controllers/schedule_items_controller_test.rb
+++ b/test/controllers/schedule_items_controller_test.rb
@@ -4,7 +4,7 @@ class ScheduleItemsControllerTest < ActionDispatch::IntegrationTest
def valid_form_params(overrides = {})
{
schedule_item: {
- day: "sat",
+ day: "mon",
time_label: "6:00 PM",
sort_time: 1800,
title: "Dinner with crew",
@@ -49,11 +49,11 @@ def valid_form_params(overrides = {})
test "Turbo Stream create appends item to day container and resets the form frame" do
sign_in_as users(:attendee_one)
post schedule_items_path,
- params: valid_form_params(day: "sat", title: "Turbo Dinner", is_public: false),
+ params: valid_form_params(day: "mon", title: "Turbo Dinner", is_public: false),
headers: { "Accept" => "text/vnd.turbo-stream.html" }
assert_response :success
- assert_match %r{}, response.body
- assert_match %r{}, response.body
+ assert_match %r{}, response.body
+ assert_match %r{}, response.body
assert_match "Turbo Dinner", response.body
end
@@ -76,7 +76,7 @@ def valid_form_params(overrides = {})
test "attendee can update their own item but kind stays activity" do
sign_in_as users(:attendee_one)
item = users(:attendee_one).created_schedule_items.create!(
- day: "thu", title: "Mine", kind: :activity, is_public: true
+ day: "mon", title: "Mine", kind: :activity, is_public: true
)
patch schedule_item_path(item), params: valid_form_params(title: "Updated", kind: "talk")
@@ -87,7 +87,7 @@ def valid_form_params(overrides = {})
test "attendee gets 404 editing another user's item" do
other_item = users(:volunteer_one).created_schedule_items.create!(
- day: "thu", title: "Not yours", kind: :activity, is_public: true
+ day: "mon", title: "Not yours", kind: :activity, is_public: true
)
sign_in_as users(:attendee_one)
@@ -102,7 +102,7 @@ def valid_form_params(overrides = {})
test "DELETE route does not exist" do
sign_in_as users(:attendee_one)
item = users(:attendee_one).created_schedule_items.create!(
- day: "thu", title: "Mine", kind: :activity, is_public: true
+ day: "mon", title: "Mine", kind: :activity, is_public: true
)
delete "/schedule_items/#{item.id}"
diff --git a/test/helpers/meal_spots_helper_test.rb b/test/helpers/meal_spots_helper_test.rb
index bca54ac..4a1e983 100644
--- a/test/helpers/meal_spots_helper_test.rb
+++ b/test/helpers/meal_spots_helper_test.rb
@@ -2,7 +2,7 @@
class MealSpotsHelperTest < ActionView::TestCase
setup do
- @meal = ScheduleItem.create!(day: "thu", title: "Lunch", kind: :meal, is_public: true)
+ @meal = ScheduleItem.create!(day: "mon", title: "Lunch", kind: :meal, is_public: true)
@host = users(:attendee_one)
@spot = @meal.meal_spots.create!(name: "Pinewood", created_by: @host)
@walking = @spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
diff --git a/test/integration/hack_projects_test.rb b/test/integration/hack_projects_test.rb
index 6fcea2e..662e108 100644
--- a/test/integration/hack_projects_test.rb
+++ b/test/integration/hack_projects_test.rb
@@ -3,8 +3,8 @@
class HackProjectsTest < ActionDispatch::IntegrationTest
setup do
@hack_day = ScheduleItem.create!(
- slug: "sat-hackday",
- day: "sat",
+ slug: ScheduleItem::HACK_DAY_SLUG,
+ day: "tue",
time_label: "9:00 AM",
sort_time: 900,
title: "Hack Day",
@@ -152,7 +152,7 @@ class HackProjectsTest < ActionDispatch::IntegrationTest
test "vic cannot host a project on a non-hack-day schedule item" do
other = ScheduleItem.create!(
- slug: "thu-other", day: "thu", time_label: "1pm", sort_time: 1300,
+ slug: "mon-other", day: "mon", time_label: "1pm", sort_time: 1300,
title: "Other", kind: :community, is_public: true
)
diff --git a/test/integration/plan_test.rb b/test/integration/plan_test.rb
index 9bbb02c..9e50fd7 100644
--- a/test/integration/plan_test.rb
+++ b/test/integration/plan_test.rb
@@ -3,8 +3,8 @@
class PlanTest < ActionDispatch::IntegrationTest
setup do
@talk = ScheduleItem.create!(
- slug: "thu-plan-talk",
- day: "thu",
+ slug: "mon-plan-talk",
+ day: "mon",
time_label: "10:00 AM",
sort_time: 1000,
title: "Planned Talk",
@@ -13,8 +13,8 @@ class PlanTest < ActionDispatch::IntegrationTest
is_public: true
)
@activity = ScheduleItem.create!(
- slug: "sat-plan-act",
- day: "sat",
+ slug: "tue-plan-act",
+ day: "tue",
time_label: "2:00 PM",
sort_time: 1400,
title: "Planned Activity",
@@ -45,16 +45,16 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan orders items by day then sort_time" do
alice = users(:attendee_one)
- alice.plan_items.create!(schedule_item: @activity) # Saturday
- alice.plan_items.create!(schedule_item: @talk) # Thursday
+ alice.plan_items.create!(schedule_item: @activity) # Tuesday
+ alice.plan_items.create!(schedule_item: @talk) # Monday
sign_in_as alice
get plan_path
- thu_idx = response.body.index("Planned Talk")
- sat_idx = response.body.index("Planned Activity")
- assert thu_idx && sat_idx
- assert thu_idx < sat_idx, "Thursday item should appear before Saturday item"
+ mon_idx = response.body.index("Planned Talk")
+ tue_idx = response.body.index("Planned Activity")
+ assert mon_idx && tue_idx
+ assert mon_idx < tue_idx, "Monday item should appear before Tuesday item"
end
test "/plan shows notes for plan_items that have them" do
@@ -70,7 +70,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan shows item descriptions when present" do
alice = users(:attendee_one)
item = ScheduleItem.create!(
- day: "fri",
+ day: "mon",
time_label: "2:00 PM",
sort_time: 1400,
title: "Planned Item With Description",
@@ -87,7 +87,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan meal cards show 'Get or host a ride' when no transports exist" do
alice = users(:attendee_one)
- meal = ScheduleItem.create!(day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ meal = ScheduleItem.create!(day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
alice.plan_items.create!(schedule_item: meal)
@@ -98,7 +98,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan meal cards count transports, not spots — hosted meal with canonical spot but no transport" do
alice = users(:attendee_one)
- hosted = ScheduleItem.create!(day: "thu", time_label: "6:00 PM", sort_time: 1800,
+ hosted = ScheduleItem.create!(day: "mon", time_label: "6:00 PM", sort_time: 1800,
title: "Welcome dinner", kind: :meal, is_public: true,
host: "Alice", location: "Pleasant Garden Inn")
MealSpot.canonical_for_hosted!(hosted)
@@ -112,7 +112,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan hides the remove × button on a meal once the user has a spot RSVP" do
alice = users(:attendee_one)
- meal = ScheduleItem.create!(day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ meal = ScheduleItem.create!(day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
spot = meal.meal_spots.create!(name: "Hattie Hot Chicken", created_by: alice)
transport = spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
@@ -127,7 +127,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan still shows the remove × button on a meal when the user has no spot RSVP" do
alice = users(:attendee_one)
- meal = ScheduleItem.create!(day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ meal = ScheduleItem.create!(day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
alice.plan_items.create!(schedule_item: meal)
@@ -140,13 +140,13 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan meal cards show the user's spot details when RSVPd" do
alice = users(:attendee_one)
- meal = ScheduleItem.create!(day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ meal = ScheduleItem.create!(day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
spot = meal.meal_spots.create!(name: "Hattie Hot Chicken", created_by: alice,
map_url: "https://maps.app.goo.gl/x",
meet_up_spot: "hotel lobby",
contact_info: "DM Alice on Slack")
- transport = spot.transports.create!(mode: :driving, departs_at: Time.zone.local(2026, 4, 30, 12, 15), seats_offered: 3)
+ transport = spot.transports.create!(mode: :driving, departs_at: Time.zone.local(2026, 9, 28, 12, 15), seats_offered: 3)
transport.rsvps.create!(user: alice)
sign_in_as alice
@@ -176,7 +176,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan shows yellow Processing badge on embassy card while application is submitted but not yet ready" do
alice = users(:attendee_one)
passport_block = ScheduleItem.create!(
- day: "thu", time_label: "9:00 AM", sort_time: 900,
+ day: "mon", time_label: "9:00 AM", sort_time: 900,
title: "Passport Block", kind: :embassy, is_public: true,
offers_new_passport: true, new_passport_capacity: 4
)
@@ -202,7 +202,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan shows green READY badge on embassy card once application.ready_at is set" do
alice = users(:attendee_one)
passport_block = ScheduleItem.create!(
- day: "thu", time_label: "9:00 AM", sort_time: 900,
+ day: "mon", time_label: "9:00 AM", sort_time: 900,
title: "Passport Block", kind: :embassy, is_public: true,
offers_new_passport: true, new_passport_capacity: 4
)
@@ -230,7 +230,7 @@ class PlanTest < ActionDispatch::IntegrationTest
test "/plan shows Received badge on embassy card once passport_received_at is set" do
alice = users(:attendee_one)
passport_block = ScheduleItem.create!(
- day: "thu", time_label: "9:00 AM", sort_time: 900,
+ day: "mon", time_label: "9:00 AM", sort_time: 900,
title: "Passport Block", kind: :embassy, is_public: true,
offers_new_passport: true, new_passport_capacity: 4
)
diff --git a/test/integration/schedule_browsing_test.rb b/test/integration/schedule_browsing_test.rb
index 80e83c0..a3d049a 100644
--- a/test/integration/schedule_browsing_test.rb
+++ b/test/integration/schedule_browsing_test.rb
@@ -4,7 +4,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
setup do
@talk = ScheduleItem.create!(
slug: "test-talk",
- day: "thu",
+ day: "mon",
time_label: "10:00 AM",
sort_time: 1000,
title: "A Talk About Tests",
@@ -14,7 +14,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
)
@activity = ScheduleItem.create!(
slug: "test-activity",
- day: "sat",
+ day: "tue",
time_label: "TBD",
sort_time: 1000,
title: "Group Bike Ride",
@@ -24,7 +24,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
)
@embassy = ScheduleItem.create!(
slug: "test-embassy",
- day: "thu",
+ day: "mon",
time_label: "9:00 AM",
sort_time: 900,
title: "Welcome",
@@ -35,7 +35,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
)
@private_item = ScheduleItem.create!(
slug: "test-private",
- day: "thu",
+ day: "mon",
time_label: "7:00 PM",
sort_time: 1900,
title: "Secret Dinner",
@@ -81,7 +81,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
test "descriptions render on schedule items when present" do
ScheduleItem.create!(
slug: "desc-test",
- day: "thu",
+ day: "mon",
time_label: "10:00 AM",
sort_time: 1000,
title: "Item with details",
@@ -94,22 +94,22 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
assert_match "Bring a notebook and questions for the speaker.", response.body
end
- test "days are rendered in conference order (wed, thu, fri, sat)" do
+ test "days are rendered in conference order (sun, mon, tue)" do
sign_in_as users(:attendee_one)
get schedule_path
body = response.body
- thu_index = body.index("Thursday")
- sat_index = body.index("Saturday")
- assert thu_index, "Thursday header should render"
- assert sat_index, "Saturday header should render"
- assert thu_index < sat_index, "Thursday should render before Saturday"
+ mon_index = body.index("Monday")
+ tue_index = body.index("Tuesday")
+ assert mon_index, "Monday header should render"
+ assert tue_index, "Tuesday header should render"
+ assert mon_index < tue_index, "Monday should render before Tuesday"
end
test "attendees do not see volunteers_only items on /schedule" do
ScheduleItem.create!(
slug: "volunteer-briefing",
- day: "fri", time_label: "8:00 AM", sort_time: 800,
+ day: "mon", time_label: "8:00 AM", sort_time: 800,
title: "Volunteer Briefing",
kind: :volunteer, is_public: true, audience: "volunteers_only",
volunteer_capacity: 3
@@ -122,7 +122,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
test "volunteers see volunteers_only items on /schedule" do
ScheduleItem.create!(
slug: "volunteer-briefing",
- day: "fri", time_label: "8:00 AM", sort_time: 800,
+ day: "mon", time_label: "8:00 AM", sort_time: 800,
title: "Volunteer Briefing",
kind: :volunteer, is_public: true, audience: "volunteers_only",
volunteer_capacity: 3
@@ -135,7 +135,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
test "admins see volunteers_only items on /schedule" do
ScheduleItem.create!(
slug: "volunteer-briefing",
- day: "fri", time_label: "8:00 AM", sort_time: 800,
+ day: "mon", time_label: "8:00 AM", sort_time: 800,
title: "Volunteer Briefing",
kind: :volunteer, is_public: true, audience: "volunteers_only",
volunteer_capacity: 3
@@ -205,7 +205,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
# ----- Meal rides summary on /schedule ---------------------------------
test "meal cards on /schedule show 'Suggest a spot' for non-hosted meals with no rides" do
- ScheduleItem.create!(slug: "thu-lunch", day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ ScheduleItem.create!(slug: "mon-lunch", day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
sign_in_as users(:attendee_one)
get schedule_path
@@ -215,11 +215,11 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
end
test "meal cards on /schedule list spots and compact transport info when rides exist" do
- meal = ScheduleItem.create!(slug: "thu-lunch", day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ meal = ScheduleItem.create!(slug: "mon-lunch", day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
spot = meal.meal_spots.create!(name: "Hattie Hot Chicken", created_by: users(:attendee_one),
map_url: "https://maps.app.goo.gl/x")
- transport = spot.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 4, 30, 12, 15))
+ transport = spot.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 9, 28, 12, 15))
transport.rsvps.create!(user: users(:attendee_one))
sign_in_as users(:attendee_one)
@@ -234,10 +234,10 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
end
test "meal cards on /schedule hide private spots from non-creators" do
- meal = ScheduleItem.create!(slug: "thu-lunch", day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ meal = ScheduleItem.create!(slug: "mon-lunch", day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
private_spot = meal.meal_spots.create!(name: "Solo bowl", created_by: users(:attendee_one), is_public: false)
- private_spot.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 4, 30, 12, 0))
+ private_spot.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 9, 28, 12, 0))
sign_in_as users(:volunteer_one)
get schedule_path
@@ -246,10 +246,10 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
end
test "meal cards on /schedule hide private spots even for the creator" do
- meal = ScheduleItem.create!(slug: "thu-lunch", day: "thu", time_label: "12:00 PM", sort_time: 1200,
+ meal = ScheduleItem.create!(slug: "mon-lunch", day: "mon", time_label: "12:00 PM", sort_time: 1200,
title: "Open Lunch", kind: :meal, is_public: true)
private_spot = meal.meal_spots.create!(name: "Solo bowl", created_by: users(:attendee_one), is_public: false)
- private_spot.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 4, 30, 12, 0))
+ private_spot.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 9, 28, 12, 0))
sign_in_as users(:attendee_one)
get schedule_path
@@ -257,7 +257,7 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
end
test "hosted meal with canonical spot but no transports shows 'No rides yet' placeholder" do
- hosted = ScheduleItem.create!(slug: "thu-dinner", day: "thu", time_label: "6:00 PM", sort_time: 1800,
+ hosted = ScheduleItem.create!(slug: "mon-dinner", day: "mon", time_label: "6:00 PM", sort_time: 1800,
title: "Welcome dinner", kind: :meal, is_public: true,
host: "Alice", location: "Pleasant Garden Inn")
MealSpot.canonical_for_hosted!(hosted)
@@ -269,11 +269,11 @@ class ScheduleBrowsingTest < ActionDispatch::IntegrationTest
end
test "hosted meal hides the canonical spot's name (already shown as the meal's location)" do
- hosted = ScheduleItem.create!(slug: "thu-dinner", day: "thu", time_label: "6:00 PM", sort_time: 1800,
+ hosted = ScheduleItem.create!(slug: "mon-dinner", day: "mon", time_label: "6:00 PM", sort_time: 1800,
title: "Welcome dinner", kind: :meal, is_public: true,
host: "Alice", location: "Pleasant Garden Inn")
canonical = MealSpot.canonical_for_hosted!(hosted)
- transport = canonical.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 4, 30, 18, 0))
+ transport = canonical.transports.create!(mode: :walking, departs_at: Time.zone.local(2026, 9, 28, 18, 0))
transport.rsvps.create!(user: users(:attendee_one))
sign_in_as users(:attendee_one)
diff --git a/test/models/embassy_booking_test.rb b/test/models/embassy_booking_test.rb
index 373411a..b3813e8 100644
--- a/test/models/embassy_booking_test.rb
+++ b/test/models/embassy_booking_test.rb
@@ -3,7 +3,7 @@
class EmbassyBookingTest < ActiveSupport::TestCase
setup do
@item = ScheduleItem.create!(
- day: "thu", title: "Embassy Block", kind: :embassy, is_public: true,
+ day: "mon", title: "Embassy Block", kind: :embassy, is_public: true,
offers_new_passport: true, new_passport_capacity: 4,
offers_passport_pickup: true, passport_pickup_capacity: 2
)
diff --git a/test/models/lightning_talk_signup_test.rb b/test/models/lightning_talk_signup_test.rb
index 001b2d3..7724e17 100644
--- a/test/models/lightning_talk_signup_test.rb
+++ b/test/models/lightning_talk_signup_test.rb
@@ -3,7 +3,7 @@
class LightningTalkSignupTest < ActiveSupport::TestCase
def lightning_item(overrides = {})
ScheduleItem.create!({
- day: "fri",
+ day: "mon",
title: "Lightning Talks",
kind: :lightning,
sort_time: 1400,
@@ -13,7 +13,7 @@ def lightning_item(overrides = {})
end
def non_lightning_item
- ScheduleItem.create!(day: "fri", title: "Regular Talk", kind: :talk, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Regular Talk", kind: :talk, is_public: true)
end
test "rejects signup for non-lightning schedule item" do
diff --git a/test/models/meal_spot_rsvp_test.rb b/test/models/meal_spot_rsvp_test.rb
index 5972fad..212f29f 100644
--- a/test/models/meal_spot_rsvp_test.rb
+++ b/test/models/meal_spot_rsvp_test.rb
@@ -2,7 +2,7 @@
class MealSpotRsvpTest < ActiveSupport::TestCase
def setup
- @meal = ScheduleItem.create!(day: "thu", title: "Lunch", kind: :meal, is_public: true)
+ @meal = ScheduleItem.create!(day: "mon", title: "Lunch", kind: :meal, is_public: true)
@spot_a = @meal.meal_spots.create!(name: "Hattie B's", created_by: users(:attendee_one))
@spot_b = @meal.meal_spots.create!(name: "Pinewood", created_by: users(:attendee_one))
@walking_a = @spot_a.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
@@ -48,7 +48,7 @@ def setup
end
test "the same user can RSVP to spots for different meals" do
- other_meal = ScheduleItem.create!(day: "fri", title: "Lunch 2", kind: :meal, is_public: true)
+ other_meal = ScheduleItem.create!(day: "mon", title: "Lunch 2", kind: :meal, is_public: true)
other_spot = other_meal.meal_spots.create!(name: "Anywhere", created_by: users(:attendee_one))
other_transport = other_spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
@@ -68,7 +68,7 @@ def setup
end
test "new RSVP inherits contact_method from user's last RSVP when blank" do
- other_meal = ScheduleItem.create!(day: "fri", title: "Lunch 2", kind: :meal, is_public: true)
+ other_meal = ScheduleItem.create!(day: "mon", title: "Lunch 2", kind: :meal, is_public: true)
other_spot = other_meal.meal_spots.create!(name: "Anywhere", created_by: users(:volunteer_one))
other_transport = other_spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
other_transport.rsvps.create!(user: users(:volunteer_one), contact_method: "555-existing")
@@ -78,7 +78,7 @@ def setup
end
test "new RSVP keeps explicit contact_method when given" do
- other_meal = ScheduleItem.create!(day: "fri", title: "Lunch 2", kind: :meal, is_public: true)
+ other_meal = ScheduleItem.create!(day: "mon", title: "Lunch 2", kind: :meal, is_public: true)
other_spot = other_meal.meal_spots.create!(name: "Anywhere", created_by: users(:volunteer_one))
other_transport = other_spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
other_transport.rsvps.create!(user: users(:volunteer_one), contact_method: "555-OLD")
diff --git a/test/models/meal_spot_test.rb b/test/models/meal_spot_test.rb
index f798fbd..de2a22a 100644
--- a/test/models/meal_spot_test.rb
+++ b/test/models/meal_spot_test.rb
@@ -2,7 +2,7 @@
class MealSpotTest < ActiveSupport::TestCase
def meal
- @meal ||= ScheduleItem.create!(day: "thu", title: "Lunch", kind: :meal, is_public: true)
+ @meal ||= ScheduleItem.create!(day: "mon", title: "Lunch", kind: :meal, is_public: true)
end
def build_spot(name: "Hattie B's", creator: users(:attendee_one))
@@ -10,7 +10,7 @@ def build_spot(name: "Hattie B's", creator: users(:attendee_one))
end
test "rejects spots whose parent isn't a meal" do
- talk = ScheduleItem.create!(day: "thu", title: "Keynote", kind: :talk, is_public: true)
+ talk = ScheduleItem.create!(day: "mon", title: "Keynote", kind: :talk, is_public: true)
spot = talk.meal_spots.build(name: "Anywhere", created_by: users(:attendee_one))
assert_not spot.valid?
assert_includes spot.errors[:schedule_item], "must be a meal event"
@@ -50,7 +50,7 @@ def build_spot(name: "Hattie B's", creator: users(:attendee_one))
# ----- Canonical spot for hosted meals ----------------------------------
test "canonical_for_hosted! creates one spot mirroring the meal's location" do
- hosted = ScheduleItem.create!(day: "thu", title: "Welcome dinner", kind: :meal,
+ hosted = ScheduleItem.create!(day: "mon", title: "Welcome dinner", kind: :meal,
is_public: true, host: "Alice",
location: "Pleasant Garden Inn",
map_url: "https://maps.app.goo.gl/x")
@@ -63,7 +63,7 @@ def build_spot(name: "Hattie B's", creator: users(:attendee_one))
end
test "canonical_for_hosted! falls back to host when location is blank" do
- hosted = ScheduleItem.create!(day: "thu", title: "Pop-up brunch", kind: :meal,
+ hosted = ScheduleItem.create!(day: "mon", title: "Pop-up brunch", kind: :meal,
is_public: true, host: "Alice's place",
host_url: "https://maps.app.goo.gl/y")
@@ -73,7 +73,7 @@ def build_spot(name: "Hattie B's", creator: users(:attendee_one))
end
test "canonical_for_hosted! is idempotent" do
- hosted = ScheduleItem.create!(day: "thu", title: "Welcome dinner", kind: :meal,
+ hosted = ScheduleItem.create!(day: "mon", title: "Welcome dinner", kind: :meal,
is_public: true, host: "Alice",
location: "Pleasant Garden Inn")
@@ -84,7 +84,7 @@ def build_spot(name: "Hattie B's", creator: users(:attendee_one))
end
test "canonical_for_hosted? returns true only for nil-creator spots on hosted meals" do
- hosted = ScheduleItem.create!(day: "thu", title: "Welcome dinner", kind: :meal,
+ hosted = ScheduleItem.create!(day: "mon", title: "Welcome dinner", kind: :meal,
is_public: true, host: "Alice",
location: "Pleasant Garden Inn")
canonical = MealSpot.canonical_for_hosted!(hosted)
@@ -95,7 +95,7 @@ def build_spot(name: "Hattie B's", creator: users(:attendee_one))
end
test "editable_by? on a canonical (nil-creator) spot allows admins only" do
- hosted = ScheduleItem.create!(day: "thu", title: "Welcome dinner", kind: :meal,
+ hosted = ScheduleItem.create!(day: "mon", title: "Welcome dinner", kind: :meal,
is_public: true, host: "Alice",
location: "Pleasant Garden Inn")
canonical = MealSpot.canonical_for_hosted!(hosted)
@@ -106,7 +106,7 @@ def build_spot(name: "Hattie B's", creator: users(:attendee_one))
end
test "transfer_ownership_if_creator_left! is a no-op for canonical spots" do
- hosted = ScheduleItem.create!(day: "thu", title: "Welcome dinner", kind: :meal,
+ hosted = ScheduleItem.create!(day: "mon", title: "Welcome dinner", kind: :meal,
is_public: true, host: "Alice",
location: "Pleasant Garden Inn")
canonical = MealSpot.canonical_for_hosted!(hosted)
diff --git a/test/models/meal_spot_transport_test.rb b/test/models/meal_spot_transport_test.rb
index 9d1e008..8ed939c 100644
--- a/test/models/meal_spot_transport_test.rb
+++ b/test/models/meal_spot_transport_test.rb
@@ -2,7 +2,7 @@
class MealSpotTransportTest < ActiveSupport::TestCase
def setup
- @meal = ScheduleItem.create!(day: "thu", title: "Dinner", kind: :meal, is_public: true)
+ @meal = ScheduleItem.create!(day: "mon", title: "Dinner", kind: :meal, is_public: true)
@spot = @meal.meal_spots.create!(name: "Pinewood", created_by: users(:attendee_one))
end
diff --git a/test/models/plan_item_test.rb b/test/models/plan_item_test.rb
index 100bf88..94fef8d 100644
--- a/test/models/plan_item_test.rb
+++ b/test/models/plan_item_test.rb
@@ -2,7 +2,7 @@
class PlanItemTest < ActiveSupport::TestCase
def build_schedule_item
- ScheduleItem.create!(day: "thu", title: "Some Item", kind: :activity, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Some Item", kind: :activity, is_public: true)
end
test "belongs_to user and schedule_item" do
@@ -35,7 +35,7 @@ def build_schedule_item
test "cannot create plan_item for a full volunteer slot" do
slot = ScheduleItem.create!(
- day: "thu", title: "Stamp passports",
+ day: "mon", title: "Stamp passports",
kind: :volunteer, is_public: true, volunteer_capacity: 1
)
PlanItem.create!(user: users(:volunteer_one), schedule_item: slot)
@@ -47,7 +47,7 @@ def build_schedule_item
test "non-full volunteer slot accepts a signup" do
slot = ScheduleItem.create!(
- day: "thu", title: "Stamp passports",
+ day: "mon", title: "Stamp passports",
kind: :volunteer, is_public: true, volunteer_capacity: 2
)
plan = PlanItem.new(user: users(:volunteer_one), schedule_item: slot)
@@ -69,7 +69,7 @@ def build_schedule_item
earlier = build_schedule_item
user.plan_items.create!(schedule_item: earlier, contact_method: "Discord: alice#0001")
- later = ScheduleItem.create!(day: "fri", title: "Other", kind: :activity, is_public: true)
+ later = ScheduleItem.create!(day: "mon", title: "Other", kind: :activity, is_public: true)
plan = user.plan_items.create!(schedule_item: later)
assert_equal "Discord: alice#0001", plan.contact_method
end
diff --git a/test/models/schedule_item_test.rb b/test/models/schedule_item_test.rb
index 2b5f6ea..e4a9ab7 100644
--- a/test/models/schedule_item_test.rb
+++ b/test/models/schedule_item_test.rb
@@ -3,7 +3,7 @@
class ScheduleItemTest < ActiveSupport::TestCase
def valid_attrs(overrides = {})
{
- day: "thu",
+ day: "mon",
title: "Test Item",
kind: :activity,
is_public: true
@@ -147,18 +147,18 @@ def valid_attrs(overrides = {})
end
test "ordered scope orders by day then sort_time" do
- wed_am = ScheduleItem.create!(valid_attrs(day: "wed", sort_time: 900, title: "Wed AM"))
- wed_pm = ScheduleItem.create!(valid_attrs(day: "wed", sort_time: 1800, title: "Wed PM"))
- thu_am = ScheduleItem.create!(valid_attrs(day: "thu", sort_time: 900, title: "Thu AM"))
- ordered = ScheduleItem.where(id: [ wed_am.id, wed_pm.id, thu_am.id ]).ordered
- assert_equal [ wed_am, wed_pm, thu_am ], ordered.to_a
+ mon_am = ScheduleItem.create!(valid_attrs(day: "mon", sort_time: 900, title: "Mon AM"))
+ mon_pm = ScheduleItem.create!(valid_attrs(day: "mon", sort_time: 1800, title: "Mon PM"))
+ tue_am = ScheduleItem.create!(valid_attrs(day: "tue", sort_time: 900, title: "Tue AM"))
+ ordered = ScheduleItem.where(id: [ mon_am.id, mon_pm.id, tue_am.id ]).ordered
+ assert_equal [ mon_am, mon_pm, tue_am ], ordered.to_a
end
- test "ordered scope places Sunday after Saturday" do
- sat = ScheduleItem.create!(valid_attrs(day: "sat", sort_time: 1800, title: "Sat PM"))
- sun = ScheduleItem.create!(valid_attrs(day: "sun", sort_time: 900, title: "Sun AM brunch"))
- ordered = ScheduleItem.where(id: [ sat.id, sun.id ]).ordered
- assert_equal [ sat, sun ], ordered.to_a
+ test "ordered scope places Monday after Sunday" do
+ sun = ScheduleItem.create!(valid_attrs(day: "sun", sort_time: 1800, title: "Sun PM"))
+ mon = ScheduleItem.create!(valid_attrs(day: "mon", sort_time: 900, title: "Mon AM"))
+ ordered = ScheduleItem.where(id: [ sun.id, mon.id ]).ordered
+ assert_equal [ sun, mon ], ordered.to_a
end
test "DAY_META includes Sunday" do
@@ -167,12 +167,11 @@ def valid_attrs(overrides = {})
end
test "upcoming_day_keys returns conference days on or after the given date" do
- assert_equal %w[wed thu fri sat sun], ScheduleItem.upcoming_day_keys(Date.new(2026, 4, 27))
- assert_equal %w[wed thu fri sat sun], ScheduleItem.upcoming_day_keys(Date.new(2026, 4, 29))
- assert_equal %w[thu fri sat sun], ScheduleItem.upcoming_day_keys(Date.new(2026, 4, 30))
- assert_equal %w[fri sat sun], ScheduleItem.upcoming_day_keys(Date.new(2026, 5, 1))
- assert_equal %w[sun], ScheduleItem.upcoming_day_keys(Date.new(2026, 5, 3))
- assert_equal [], ScheduleItem.upcoming_day_keys(Date.new(2026, 5, 4))
+ assert_equal %w[sun mon tue], ScheduleItem.upcoming_day_keys(Date.new(2026, 9, 26))
+ assert_equal %w[sun mon tue], ScheduleItem.upcoming_day_keys(Date.new(2026, 9, 27))
+ assert_equal %w[mon tue], ScheduleItem.upcoming_day_keys(Date.new(2026, 9, 28))
+ assert_equal %w[tue], ScheduleItem.upcoming_day_keys(Date.new(2026, 9, 29))
+ assert_equal [], ScheduleItem.upcoming_day_keys(Date.new(2026, 9, 30))
end
test "passed defaults to false" do
diff --git a/test/models/seed_test.rb b/test/models/seed_test.rb
index 5bee301..eb7b2b6 100644
--- a/test/models/seed_test.rb
+++ b/test/models/seed_test.rb
@@ -20,13 +20,15 @@ class SeedTest < ActiveSupport::TestCase
assert User.find_by(email: "katyasarmientodev@gmail.com").admin?
end
- test "seed upserts every YAML row as a public ScheduleItem" do
+ test "seed upserts every YAML row as a ScheduleItem, public unless flagged otherwise" do
Rails.application.load_seed
- yaml_count = YAML.load_file(Rails.root.join("config/schedule.yml"), permitted_classes: [ Symbol ])[:days]
- .sum { |d| d[:items].size }
- assert_equal yaml_count, ScheduleItem.count
- assert_equal yaml_count, ScheduleItem.public_items.count
+ yaml_days = YAML.load_file(Rails.root.join("config/schedule.yml"), permitted_classes: [ Symbol ])[:days]
+ yaml_items = yaml_days.sum { |d| d[:items].size }
+ yaml_hidden = yaml_days.sum { |d| d[:items].count { |i| i[:is_public] == false } }
+
+ assert_equal yaml_items, ScheduleItem.count
+ assert_equal yaml_items - yaml_hidden, ScheduleItem.public_items.count
end
test "seed is idempotent for schedule_items" do
@@ -39,45 +41,67 @@ class SeedTest < ActiveSupport::TestCase
test "seeded talks carry title (topic) and host (speaker)" do
Rails.application.load_seed
- talk = ScheduleItem.find_by(slug: "thu-talk-1")
- assert_equal "John Athayde", talk.host
- assert talk.title.start_with?("Learning from Permaculture"), "talk title should be the topic, not the speaker"
+ talk = ScheduleItem.find_by(slug: "mon-talk-1")
+ assert_equal "Kevin Murphy", talk.host
+ assert talk.title.start_with?("InstiLLMent"), "talk title should be the topic, not the speaker"
assert talk.talk?
end
- test "seeded reception items (registration/welcome/breaks/coffee/closing) are kind: reception" do
+ test "seeded reception items (check-in/opening/breaks/closing) are kind: reception" do
Rails.application.load_seed
- %w[thu-registration thu-welcome thu-break-1 thu-closing fri-coffee fri-welcome fri-closing].each do |slug|
+ %w[mon-checkin mon-opening mon-break-1 tue-checkin tue-opening tue-closing].each do |slug|
item = ScheduleItem.find_by(slug: slug)
assert_equal "reception", item.kind, "#{slug} should be kind: reception"
end
end
- test "seeded meal items (lunches and dinners) are kind: meal" do
+ test "seeded meal items (lunches) are kind: meal" do
Rails.application.load_seed
- %w[thu-lunch thu-dinner fri-lunch fri-dinner].each do |slug|
+ %w[mon-lunch tue-lunch].each do |slug|
item = ScheduleItem.find_by(slug: slug)
assert_equal "meal", item.kind, "#{slug} should be kind: meal"
end
end
- test "seeded community items (in-event participatory + offsite social) are kind: community" do
+ test "seeded community items (socials + placeholders) are kind: community" do
Rails.application.load_seed
- %w[wed-meetup thu-mystery thu-roundtable fri-afterparty sat-hackday].each do |slug|
+ %w[sun-meetup mon-happy-hour tue-hackday].each do |slug|
item = ScheduleItem.find_by(slug: slug)
assert_equal "community", item.kind, "#{slug} should be kind: community"
end
end
- test "seeded activity items (external with capacity concerns) are kind: activity" do
+ test "seeded lightning talks slot is kind: lightning" do
Rails.application.load_seed
- %w[sat-dinner].each do |slug|
+ item = ScheduleItem.find_by(slug: "tue-lightning")
+ assert_equal "lightning", item.kind
+ end
+
+ test "placeholder items (pre-conference, hack day, volunteers) are seeded but hidden from the public schedule" do
+ Rails.application.load_seed
+
+ %w[sun-meetup tue-hackday tue-volunteers].each do |slug|
item = ScheduleItem.find_by(slug: slug)
- assert_equal "activity", item.kind, "#{slug} should be kind: activity"
+ assert item.present?, "#{slug} should be seeded"
+ assert_not item.is_public?, "#{slug} should not be public yet"
end
end
+
+ test "hack day slug matches ScheduleItem::HACK_DAY_SLUG so admin Hack Projects resolves" do
+ Rails.application.load_seed
+
+ assert ScheduleItem.exists?(slug: ScheduleItem::HACK_DAY_SLUG)
+ end
+
+ test "volunteer placeholder carries a volunteer_capacity" do
+ Rails.application.load_seed
+
+ item = ScheduleItem.find_by(slug: "tue-volunteers")
+ assert item.volunteer?
+ assert item.volunteer_capacity.present?
+ end
end
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
index 8d96a78..2e6363e 100644
--- a/test/models/user_test.rb
+++ b/test/models/user_test.rb
@@ -3,7 +3,7 @@
class UserTest < ActiveSupport::TestCase
test "destroying user destroys their plan_items" do
user = users(:attendee_one)
- item = ScheduleItem.create!(day: "thu", title: "Destroy test", kind: :activity, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Destroy test", kind: :activity, is_public: true)
user.plan_items.create!(schedule_item: item)
assert_difference -> { PlanItem.count }, -1 do
@@ -14,7 +14,7 @@ class UserTest < ActiveSupport::TestCase
test "destroying user nullifies created_schedule_items (items survive)" do
creator = users(:attendee_one)
item = ScheduleItem.create!(
- day: "thu",
+ day: "mon",
title: "Creator-owned",
kind: :activity,
is_public: true,
@@ -29,19 +29,19 @@ class UserTest < ActiveSupport::TestCase
test "planned_schedule_items returns items on user's plan" do
user = users(:attendee_one)
- item = ScheduleItem.create!(day: "fri", title: "Planned", kind: :talk, is_public: true)
+ item = ScheduleItem.create!(day: "mon", title: "Planned", kind: :talk, is_public: true)
user.plan_items.create!(schedule_item: item)
assert_includes user.planned_schedule_items, item
end
test "new user is auto-RSVPed to all default-plan items" do
- talk = ScheduleItem.create!(day: "thu", title: "Default Talk", kind: :talk, is_public: true)
- reception = ScheduleItem.create!(day: "thu", title: "Default Reception", kind: :reception, is_public: true)
- activity = ScheduleItem.create!(day: "sat", title: "Optional Activity", kind: :activity, is_public: true)
- private_talk = ScheduleItem.create!(day: "thu", title: "Private Talk", kind: :talk, is_public: false)
+ talk = ScheduleItem.create!(day: "mon", title: "Default Talk", kind: :talk, is_public: true)
+ reception = ScheduleItem.create!(day: "mon", title: "Default Reception", kind: :reception, is_public: true)
+ activity = ScheduleItem.create!(day: "tue", title: "Optional Activity", kind: :activity, is_public: true)
+ private_talk = ScheduleItem.create!(day: "mon", title: "Private Talk", kind: :talk, is_public: false)
volunteers_only_reception = ScheduleItem.create!(
- day: "thu", title: "Crew Reception", kind: :reception,
+ day: "mon", title: "Crew Reception", kind: :reception,
is_public: true, audience: "volunteers_only"
)
@@ -55,23 +55,33 @@ class UserTest < ActiveSupport::TestCase
end
test "new user is auto-RSVPed to slug-allowlisted items even when kind isn't a default" do
- mystery = ScheduleItem.create!(
- slug: "thu-mystery", day: "thu", title: "Mystery Activity",
+ # DEFAULT_PLAN_SLUGS is empty for the current (RMR) schedule — this fork
+ # has no one-off item that needs force-adding. Stub it so the general
+ # mechanism (added for BRR's "Mystery Activity") still has coverage
+ # independent of whatever the seeded schedule happens to contain.
+ allowlisted = ScheduleItem.create!(
+ slug: "test-oneoff", day: "mon", title: "One-off Activity",
kind: :community, is_public: true
)
other_community = ScheduleItem.create!(
- slug: "wed-meetup", day: "wed", title: "Pre-Conference Meetup",
+ slug: "test-other-community", day: "sun", title: "Other Community Item",
kind: :community, is_public: true
)
+ ScheduleItem.send(:remove_const, :DEFAULT_PLAN_SLUGS)
+ ScheduleItem.const_set(:DEFAULT_PLAN_SLUGS, %w[test-oneoff].freeze)
+
user = User.create!(email: "mystery@example.com", first_name: "M", last_name: "Y")
- assert_includes user.planned_schedule_items, mystery, "slug-allowlisted item should be auto-added"
+ assert_includes user.planned_schedule_items, allowlisted, "slug-allowlisted item should be auto-added"
assert_not_includes user.planned_schedule_items, other_community, "other community items should not auto-add"
+ ensure
+ ScheduleItem.send(:remove_const, :DEFAULT_PLAN_SLUGS)
+ ScheduleItem.const_set(:DEFAULT_PLAN_SLUGS, [].freeze)
end
test "materialize_default_plan_items is idempotent" do
- ScheduleItem.create!(day: "thu", title: "Default Talk", kind: :talk, is_public: true)
+ ScheduleItem.create!(day: "mon", title: "Default Talk", kind: :talk, is_public: true)
user = User.create!(email: "idem@example.com", first_name: "I", last_name: "D")
assert_no_difference -> { user.plan_items.count } do
@@ -86,11 +96,11 @@ class UserTest < ActiveSupport::TestCase
test "last_rsvp_contact_method picks the most recent value across meals and activities" do
user = users(:attendee_one)
- activity = ScheduleItem.create!(day: "thu", title: "Hike", kind: :activity, is_public: true)
+ activity = ScheduleItem.create!(day: "mon", title: "Hike", kind: :activity, is_public: true)
plan = user.plan_items.create!(schedule_item: activity, contact_method: "older value")
plan.update_columns(updated_at: 2.days.ago)
- meal = ScheduleItem.create!(day: "thu", title: "Lunch", kind: :meal, is_public: true)
+ meal = ScheduleItem.create!(day: "mon", title: "Lunch", kind: :meal, is_public: true)
spot = meal.meal_spots.create!(name: "Pinewood", created_by: users(:volunteer_one))
transport = spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
transport.rsvps.create!(user: user, contact_method: "newer value")
@@ -100,10 +110,10 @@ class UserTest < ActiveSupport::TestCase
test "last_rsvp_contact_method ignores blank entries" do
user = users(:attendee_one)
- activity = ScheduleItem.create!(day: "thu", title: "Hike", kind: :activity, is_public: true)
+ activity = ScheduleItem.create!(day: "mon", title: "Hike", kind: :activity, is_public: true)
user.plan_items.create!(schedule_item: activity, contact_method: "real value")
- other = ScheduleItem.create!(day: "fri", title: "Other", kind: :activity, is_public: true)
+ other = ScheduleItem.create!(day: "mon", title: "Other", kind: :activity, is_public: true)
user.plan_items.create!(schedule_item: other, contact_method: "")
assert_equal "real value", user.last_rsvp_contact_method
@@ -111,13 +121,13 @@ class UserTest < ActiveSupport::TestCase
test "propagate_contact_to_blank_rsvps! fills only blank meal RSVPs and plan_items" do
user = users(:attendee_one)
- blank_activity = ScheduleItem.create!(day: "thu", title: "Hike", kind: :activity, is_public: true)
- set_activity = ScheduleItem.create!(day: "fri", title: "Bike", kind: :activity, is_public: true)
+ blank_activity = ScheduleItem.create!(day: "mon", title: "Hike", kind: :activity, is_public: true)
+ set_activity = ScheduleItem.create!(day: "mon", title: "Bike", kind: :activity, is_public: true)
blank_pi = user.plan_items.create!(schedule_item: blank_activity)
blank_pi.update_columns(contact_method: nil)
set_pi = user.plan_items.create!(schedule_item: set_activity, contact_method: "explicit")
- meal = ScheduleItem.create!(day: "thu", title: "Lunch", kind: :meal, is_public: true)
+ meal = ScheduleItem.create!(day: "mon", title: "Lunch", kind: :meal, is_public: true)
spot = meal.meal_spots.create!(name: "Pinewood", created_by: users(:volunteer_one))
transport = spot.transports.create!(mode: :walking, departs_at: 1.hour.from_now)
blank_rsvp = transport.rsvps.create!(user: user)
@@ -132,7 +142,7 @@ class UserTest < ActiveSupport::TestCase
test "propagate_contact_to_blank_rsvps! is a no-op for blank input" do
user = users(:attendee_one)
- activity = ScheduleItem.create!(day: "thu", title: "Hike", kind: :activity, is_public: true)
+ activity = ScheduleItem.create!(day: "mon", title: "Hike", kind: :activity, is_public: true)
pi = user.plan_items.create!(schedule_item: activity)
pi.update_columns(contact_method: nil)
From 6d2cfc19e66be89427160c13d83d426c051e44e5 Mon Sep 17 00:00:00 2001
From: "M. Hakeem" <721462+mhakeem@users.noreply.github.com>
Date: Sun, 13 Sep 2026 09:47:50 +0000
Subject: [PATCH 02/12] Rebrand copy, config, seeds, and passport PDF for Rocky
Mountain Ruby
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Replaces every Blue Ridge Ruby / Asheville reference in text, links, and
config with Rocky Mountain Ruby / Boulder equivalents, verified against
rockymtnruby.dev and rockymtnruby/site.
- config/application.rb, production.rb: Mountain time zone, app.rockymtnruby.dev
APP_HOST fallback.
- Mailer from-address, REGISTER_URL, and EMBASSY_HOURS updated.
- Navbar, footer, dashboard, sessions, error pages, organizer note, and the
annual report all repoint at real rockymtnruby.dev paths (boulder-guide,
schedule, tickets, code-of-conduct, sponsorship, socials). Ashevillagers
card kept as a commented-out reference rather than deleted. Nonprofit
claim in the footer removed (RMR is not a 501c3) but kept commented out
for reference.
- Passport PDF (app/services/passport_application_pdf.rb): header, legal
copy, and glossary now read Rocky Mountain Ruby Embassy / Boulder, CO;
form code bumped to Rev. 2026-09.
- db/seeds.rb: admin list is now Katya + the RMR organizer (spike@rockymtnruby.dev);
Jeremy removed entirely, personal gmail admin seed removed (added manually
instead).
- db/seeds/embassy_questions.rb: notary/affidavit copy reworded for RMR.
- Updated the handful of tests that hardcoded the old admin emails,
BRR speaker URLs, and the branded 404 link.
Known gap (not fixed here): no schedule item has kind: embassy, so the
embassy booking/passport-application flow and the annual report have no
real data to exercise yet — needs a seeded placeholder plus admin
configuration before launch.
---
app/assets/stylesheets/application.css | 4 +--
app/controllers/sessions_controller.rb | 2 +-
app/helpers/application_helper.rb | 4 +--
app/helpers/embassy_questions_helper.rb | 4 +--
app/mailers/application_mailer.rb | 2 +-
app/services/passport_application_pdf.rb | 12 ++++-----
app/views/dashboard/show.html.erb | 8 +++---
app/views/embassy_applications/new.html.erb | 2 +-
app/views/embassy_applications/show.html.erb | 2 +-
app/views/embassy_bookings/create.html.erb | 2 +-
app/views/embassy_bookings/new.html.erb | 2 +-
.../errors/internal_server_error.html.erb | 2 +-
app/views/errors/not_found.html.erb | 2 +-
.../errors/unprocessable_content.html.erb | 2 +-
app/views/pages/home.html.erb | 2 +-
app/views/report/index.html.erb | 2 +-
app/views/sessions/new.html.erb | 6 ++---
app/views/sessions/not_registered.html.erb | 6 ++---
app/views/shared/_footer.html.erb | 25 ++++++++++---------
app/views/shared/_navbar.html.erb | 20 +++++++--------
app/views/shared/_organizer_note.html.erb | 6 ++---
config/application.rb | 2 +-
config/environments/production.rb | 4 +--
db/seeds.rb | 8 +++---
db/seeds/embassy_questions.rb | 6 ++---
.../admin/schedule_items_controller_test.rb | 10 ++++----
test/controllers/errors_controller_test.rb | 2 +-
test/fixtures/users.yml | 6 ++---
test/models/seed_test.rb | 15 +++++++----
29 files changed, 89 insertions(+), 81 deletions(-)
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
index ae6c6e3..68cbb56 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.css
@@ -1,5 +1,5 @@
/* ============================================================
- * Ruby Embassy — plain CSS that mirrors the blueridgeruby.com
+ * Ruby Embassy — plain CSS that mirrors the rockymtnruby.dev
* styling. The HTML uses the same Tailwind-style class names
* the real site uses, so the markup is copy-paste compatible.
* Only the specific utilities used on that page are defined.
@@ -448,7 +448,7 @@ hr {
}
-/* ---------- Schedule day sections (blueridgeruby.com style) -- */
+/* ---------- Schedule day sections (rockymtnruby.dev style) -- */
.schedule-day {
margin-bottom: 5rem;
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index aac4486..d23aa20 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -1,7 +1,7 @@
class SessionsController < ApplicationController
skip_before_action :authenticate_user!, only: %i[new create callback]
- REGISTER_URL = "https://blueridgeruby.com/#register".freeze
+ REGISTER_URL = "https://rockymtnruby.dev/tickets/".freeze
def new
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index bcb1ff4..7a8ad12 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -37,8 +37,8 @@ def location_or_map_link(item)
end
end
- # Renders a talk's host as a link to their blueridgeruby.com speaker page
- # when host_url is set, otherwise as plain text. Returns nil if no host.
+ # Renders a talk's host as a link to their speaker page (host_url) when
+ # set, otherwise as plain text. Returns nil if no host.
def speaker_link(item)
return nil if item.host.blank?
if item.host_url.present?
diff --git a/app/helpers/embassy_questions_helper.rb b/app/helpers/embassy_questions_helper.rb
index 08a6574..bab728c 100644
--- a/app/helpers/embassy_questions_helper.rb
+++ b/app/helpers/embassy_questions_helper.rb
@@ -19,8 +19,8 @@ module EmbassyQuestionsHelper
].freeze
EMBASSY_HOURS = [
- "Thursday, April 30 · 9:00 AM – 4:30 PM",
- "Friday, May 1 · 9:00 AM – 5:00 PM"
+ "Monday, September 28 · 9:00 AM – 4:30 PM",
+ "Tuesday, September 29 · 9:00 AM – 5:00 PM"
].freeze
SECTION_META = {
diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb
index 790f33a..6d362ec 100644
--- a/app/mailers/application_mailer.rb
+++ b/app/mailers/application_mailer.rb
@@ -1,4 +1,4 @@
class ApplicationMailer < ActionMailer::Base
- default from: "hello@blueridgeruby.com"
+ default from: "noreply@rockymtnruby.dev"
layout "mailer"
end
diff --git a/app/services/passport_application_pdf.rb b/app/services/passport_application_pdf.rb
index 2704511..f512684 100644
--- a/app/services/passport_application_pdf.rb
+++ b/app/services/passport_application_pdf.rb
@@ -20,7 +20,7 @@
# For blank-batch printing, pass `application: nil, count: N` to render
# N applications back-to-back in one document.
class PassportApplicationPdf
- FORM_CODE = "Form RE-1 (Rev. 2026-04)".freeze
+ FORM_CODE = "Form RE-1 (Rev. 2026-09)".freeze
PAGE_SIZE = "LETTER".freeze
MARGIN = 36
LONG_LINE_HEIGHT = 9.5
@@ -355,7 +355,7 @@ def render_header(pdf, application, title: "RUBY EMBASSY · APPLICATION FOR PASS
pdf.font_size 8
pdf.text FORM_CODE, align: :right, style: :bold, size: 7
pdf.text title, size: 11, style: :bold, align: :center
- pdf.text "Blue Ridge Ruby Embassy · Asheville, NC", size: 7.5, align: :center, style: :italic
+ pdf.text "Rocky Mountain Ruby Embassy · Boulder, CO", size: 7.5, align: :center, style: :italic
pdf.move_down 3
pdf.stroke_horizontal_rule
pdf.move_down 3
@@ -406,16 +406,16 @@ def metadata_row(pdf, pairs)
[
"EMBASSY ORDINANCES (EXCERPTED)",
[
- "§1. Validity. This application shall remain valid for the duration of Blue Ridge Ruby 2026 and may not be transferred to any subsequent calendar year, conference, or commemorative gathering. Validity does not survive the expiration of the lead maintainer's patience.",
+ "§1. Validity. This application shall remain valid for the duration of Rocky Mountain Ruby 2026 and may not be transferred to any subsequent calendar year, conference, or commemorative gathering. Validity does not survive the expiration of the lead maintainer's patience.",
"§2. Discretion. The Embassy reserves sole and absolute discretion to deny issuance for cause, including but not limited to: insufficient ceremony, ill-fitting suspenders, or a documented hatred of the Ruby programming language.",
"§3. Truthfulness. Falsified declarations may result in revocation of Ruby Embassy privileges for up to three (3) event days and forfeiture of any commemorative stamps so obtained. Repeat offenders may be required to write a sincere apology in YAML.",
"§4. Notary Conduct. The Applicant shall conduct themselves with reasonable courtesy toward the Notary. Bribery of the Notary is strictly prohibited unless said bribery consists of coffee, in which case discretion is advised.",
- "§5. Right of Appeal. Applicants whose stamping is denied may request review by writing to noreply@blueridgeruby.com. Review proceedings, where granted, are conducted ex parte and concluded summarily.",
+ "§5. Right of Appeal. Applicants whose stamping is denied may request review by writing to noreply@rockymtnruby.dev. Review proceedings, where granted, are conducted ex parte and concluded summarily.",
"§6. Liability. The Embassy assumes no liability for stamping-related psychological distress, including but not limited to: imposter syndrome, premature optimization, or the realization that one has been pronouncing \"RubyGems\" wrong this entire time.",
"§7. Decorum. The Applicant shall maintain decorum throughout proceedings, defined for purposes of this ordinance as: not laughing audibly during the stamping, not narrating the Notary's signature in real time, and not attempting to high-five the Attaché unless reciprocity is clearly indicated.",
"§8. Documentation. The Applicant must retain a copy of the stamped Passport for a period of not less than seven (7) calendar days, after which the document may be displayed on the Applicant's mantel, refrigerator, or other location of comparable ceremony.",
"§9. Reciprocal Recognition. The Embassy shall, upon request and at the Attaché's discretion, recognize Passports issued by sister Ruby Embassies hosted at other regional and international Ruby gatherings, subject to verification of the issuing event's standing.",
- "§10. Jurisdiction. Disputes arising under these ordinances shall be adjudicated within the geographic boundaries of Asheville, North Carolina, or wherever good coffee can be reasonably procured, whichever is more convenient.",
+ "§10. Jurisdiction. Disputes arising under these ordinances shall be adjudicated within the geographic boundaries of Boulder, Colorado, or wherever good coffee can be reasonably procured, whichever is more convenient.",
"§11. Force Majeure. The Embassy shall not be held liable for failures caused by acts of God, acts of CDN, deprecated dependencies, expired SSL certificates, or the abrupt unavailability of the lead maintainer.",
"§12. Amendments. These ordinances may be amended at any time by the Embassy Attaché, with or without notice, retroactively if necessary, and the Applicant hereby acknowledges this fact in advance and without further objection.",
"§13. Counterparts. This document may be executed in counterparts, each of which shall be deemed an original, even when neither is, in fact, an original.",
@@ -434,7 +434,7 @@ def metadata_row(pdf, pairs)
"\"Applicant\" means the natural person identified in Section 1 of this Application, including any pseudonyms, callsigns, GitHub handles, or other documented aliases.",
"\"Attaché\" means the duly appointed representative of the Embassy on premises during the three (3) event days, identifiable by official Embassy lanyard and a faintly weary expression.",
"\"Business Gems\" means three (3) RubyGems published open source by Embassy personnel and listed on rubygems.org, irrespective of download count, semantic versioning practices, or whether such Gems remain actively maintained.",
- "\"Embassy\" means the Blue Ridge Ruby Embassy at Blue Ridge Ruby 2026, including all temporary structures, designated tables, hallway corners, and adjacent vibe zones.",
+ "\"Embassy\" means the Rocky Mountain Ruby Embassy at Rocky Mountain Ruby 2026, including all temporary structures, designated tables, hallway corners, and adjacent vibe zones.",
"\"Notary\" means any attendee meeting the criteria set forth in Box A.1 of the Addendum, voluntarily acting in such capacity for purposes of this Application only.",
"\"Passport\" means the formal document issued by the Embassy bearing one or more stamps of recognition, accompanied by such ceremony as the Attaché deems appropriate.",
"\"Stamping\" means the act of applying said stamp to said Passport, performed by the Attaché in the presence of the Applicant and any onlookers who happen to be present.",
diff --git a/app/views/dashboard/show.html.erb b/app/views/dashboard/show.html.erb
index 62197b6..9897733 100644
--- a/app/views/dashboard/show.html.erb
+++ b/app/views/dashboard/show.html.erb
@@ -27,7 +27,7 @@
<%= link_to schedule_path, class: "action-card" do %>
See the schedule
-
Browse all four days of talks, activities, and Ruby Embassy blocks.
+
Browse all three days of talks, activities, and Ruby Embassy blocks.
→
<% end %>
@@ -49,14 +49,16 @@
→
<% end %>
+ <%#
Get your Ashevillager
Make your Ashevillager and join the locals you might run into around town.
↗
+ %>
-
- Explore Asheville
+
+ Explore Boulder
Local picks for food, coffee, hikes, and things to do off-schedule.
↗
diff --git a/app/views/embassy_applications/new.html.erb b/app/views/embassy_applications/new.html.erb
index 4000777..e934a73 100644
--- a/app/views/embassy_applications/new.html.erb
+++ b/app/views/embassy_applications/new.html.erb
@@ -8,7 +8,7 @@