diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 9a8fefd5b..475404b87 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit` -# on 2026-07-28 07:06:57 UTC using RuboCop version 1.88.2. +# on 2026-07-28 07:23:34 UTC using RuboCop version 1.88.2. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -1059,46 +1059,6 @@ Style/StringConcatenation: - 'spec/features/admin/manage_sponsor_spec.rb' - 'spec/presenters/workshop_presenter_spec.rb' -# Offense count: 173 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Exclude: - - 'Gemfile' - - 'app/controllers/admin/chapters_controller.rb' - - 'app/controllers/events_controller.rb' - - 'app/mailers/member_mailer.rb' - - 'app/models/workshop.rb' - - 'lib/omniauth/strategies/codebar.rb' - - 'script/benchmark_events.rb' - - 'spec/components/event_card_component_spec.rb' - - 'spec/controllers/admin/invitations_controller_spec.rb' - - 'spec/controllers/admin/member_search_controller_spec.rb' - - 'spec/controllers/auth_services_controller_spec.rb' - - 'spec/controllers/members_controller_spec.rb' - - 'spec/fabricators/member_email_delivery_fabricator.rb' - - 'spec/features/accepting_invitation_spec.rb' - - 'spec/features/admin/manage_sponsor_spec.rb' - - 'spec/features/member_joining_spec.rb' - - 'spec/features/member_updating_details_spec.rb' - - 'spec/features/viewing_a_workshop_invitation_spec.rb' - - 'spec/features/viewing_a_workshop_spec.rb' - - 'spec/lib/services/flodesk_spec.rb' - - 'spec/lib/services/mailing_list_spec.rb' - - 'spec/lib/tasks/delete_member_rake_spec.rb' - - 'spec/lib/tasks/mailing_list_rake_spec.rb' - - 'spec/mailers/member_mailer_spec.rb' - - 'spec/mailers/previews/meeting_invitation_mailer_preview.rb' - - 'spec/models/event_spec.rb' - - 'spec/models/meeting_spec.rb' - - 'spec/models/workshop_spec.rb' - - 'spec/presenters/workshop_presenter_capacity_spec.rb' - - 'spec/serializers/workshop_calendar_spec.rb' - - 'spec/services/three_month_email_service_spec.rb' - - 'spec/support/select_from_tom_select.rb' - - 'spec/support/shared_examples/behaves_link_member_viewing_workshop.rb' - # Offense count: 10 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle, MinSize. diff --git a/Gemfile b/Gemfile index 2b0d4b1b0..59cb18f2d 100644 --- a/Gemfile +++ b/Gemfile @@ -132,4 +132,4 @@ gem 'scout_apm' gem 'carrierwave-aws', '~> 1.6' gem 'sitemap_generator', '~> 7.1' -gem "solid_cache", "~> 1.0" +gem 'solid_cache', '~> 1.0' diff --git a/app/controllers/admin/chapters_controller.rb b/app/controllers/admin/chapters_controller.rb index 3ee35731f..0e8aaf488 100644 --- a/app/controllers/admin/chapters_controller.rb +++ b/app/controllers/admin/chapters_controller.rb @@ -114,9 +114,9 @@ def set_chapter def member_emails(chapter, type) members = case type - when "students" + when 'students' chapter.students - when "coaches" + when 'coaches' chapter.coaches else chapter.members diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index aeecab00a..bb3efbfd4 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -101,7 +101,7 @@ def fetch_past_events def paginated_events(upcoming:) now = Time.zone.now page = (params[:page] || 1).to_i - direction = upcoming ? "ASC" : "DESC" + direction = upcoming ? 'ASC' : 'DESC' comparator = upcoming ? :gteq : :lt # Pure Arel subqueries — no ActiveRecord relation bind params to leak @@ -128,7 +128,7 @@ def paginated_events(upcoming:) # COUNT at DB level — single query count_query = Arel::SelectManager.new - count_query.from(union.as("events")) + count_query.from(union.as('events')) count_query.project(Arel.star.count) total = ActiveRecord::Base.connection.select_value(count_query.to_sql).to_i return nil if total.zero? @@ -139,7 +139,7 @@ def paginated_events(upcoming:) # Only 20 rows leave the database pagination_query = Arel::SelectManager.new - pagination_query.from(union.as("events")) + pagination_query.from(union.as('events')) pagination_query.project(:id, :event_type) pagination_query.order(Arel.sql("date_and_time #{direction}")) pagination_query.skip(pagy.offset).take(pagy.limit) @@ -152,23 +152,23 @@ def paginated_events(upcoming:) # with eager loading, preserving the UNION order. def load_events(rows) grouped = rows.each_with_object({}) do |row, hash| - (hash[row["event_type"]] ||= []) << row["id"].to_i + (hash[row['event_type']] ||= []) << row['id'].to_i end workshops = Workshop.includes(:chapter, :sponsors, :host, :permissions) - .where(id: grouped["Workshop"]) + .where(id: grouped['Workshop']) .to_a.index_by(&:id) - meetings = Meeting.includes(:venue).where(id: grouped["Meeting"]) + meetings = Meeting.includes(:venue).where(id: grouped['Meeting']) .to_a.index_by(&:id) events = Event.includes(:venue, :sponsors, :sponsorships, :permissions) - .where(id: grouped["Event"]) + .where(id: grouped['Event']) .to_a.index_by(&:id) rows.filter_map do |row| - case row["event_type"] - when "Workshop" then workshops[row["id"].to_i] - when "Meeting" then meetings[row["id"].to_i] - when "Event" then events[row["id"].to_i] + case row['event_type'] + when 'Workshop' then workshops[row['id'].to_i] + when 'Meeting' then meetings[row['id'].to_i] + when 'Event' then events[row['id'].to_i] end end end diff --git a/app/mailers/member_mailer.rb b/app/mailers/member_mailer.rb index e5161a17e..323a68ef5 100644 --- a/app/mailers/member_mailer.rb +++ b/app/mailers/member_mailer.rb @@ -6,7 +6,7 @@ class MemberMailer < ApplicationMailer def chaser @member = params[:member] - subject = "It’s been a while, how are you doing? ♥️" + subject = 'It’s been a while, how are you doing? ♥️' mail_to_member(@member, subject, 'hello@codebar.io', 'hello@codebar.io') do |format| format.html { render 'three_month_chaser' } end diff --git a/app/models/workshop.rb b/app/models/workshop.rb index f99665941..ed398a8e7 100644 --- a/app/models/workshop.rb +++ b/app/models/workshop.rb @@ -161,6 +161,6 @@ def rsvp_close_before_workshop_start return unless rsvp_closes_at && date_and_time return if rsvp_closes_at < date_and_time - errors.add(:rsvp_close_local_date, "must be before the workshop start time") + errors.add(:rsvp_close_local_date, 'must be before the workshop start time') end end diff --git a/lib/omniauth/strategies/codebar.rb b/lib/omniauth/strategies/codebar.rb index 234e822ec..1e61da0dd 100644 --- a/lib/omniauth/strategies/codebar.rb +++ b/lib/omniauth/strategies/codebar.rb @@ -187,7 +187,7 @@ def verify_jwt(token) nil end rescue JWT::ExpiredSignature - Rails.logger.warn "Codebar auth: JWT expired" + Rails.logger.warn 'Codebar auth: JWT expired' nil end diff --git a/script/benchmark_events.rb b/script/benchmark_events.rb index 91f721807..0afb189e2 100755 --- a/script/benchmark_events.rb +++ b/script/benchmark_events.rb @@ -1,17 +1,17 @@ #!/usr/bin/env ruby # Run: DB_NAME=codebar_dump bundle exec ruby script/benchmark_events.rb -ENV["RAILS_ENV"] ||= "development" -require_relative "../config/environment" -require "benchmark" +ENV['RAILS_ENV'] ||= 'development' +require_relative '../config/environment' +require 'benchmark' session = ActionDispatch::Integration::Session.new(Rails.application) -session.host = "localhost" +session.host = 'localhost' def measure(session, path) qc = 0 cb = ->(*, **) { qc += 1 } time = nil - ActiveSupport::Notifications.subscribed(cb, "sql.active_record") do + ActiveSupport::Notifications.subscribed(cb, 'sql.active_record') do time = Benchmark.measure { session.get(path) } end [time.real, qc] diff --git a/spec/components/event_card_component_spec.rb b/spec/components/event_card_component_spec.rb index 433864037..f831b365e 100644 --- a/spec/components/event_card_component_spec.rb +++ b/spec/components/event_card_component_spec.rb @@ -1,66 +1,66 @@ -require "rails_helper" -require "view_component/test_helpers" +require 'rails_helper' +require 'view_component/test_helpers' RSpec.describe EventCardComponent, type: :component do include ViewComponent::TestHelpers let(:chapter) { Fabricate(:chapter, active: true) } - context "with a workshop" do + context 'with a workshop' do let(:workshop) { Fabricate(:workshop, chapter: chapter) } let(:presenter) { WorkshopPresenter.new(workshop) } - it "renders the workshop card" do + it 'renders the workshop card' do render_inline(described_class.new(event_card: presenter)) expect(page).to have_css("[data-test='event']") expect(page).to have_link(presenter.to_s) expect(page).to have_text(presenter.date) end - it "does not render user-specific badges without a user" do + it 'does not render user-specific badges without a user' do render_inline(described_class.new(event_card: presenter)) - expect(page).to have_no_text("Attending") - expect(page).to have_no_text("Manage") + expect(page).to have_no_text('Attending') + expect(page).to have_no_text('Manage') end - it "renders chapter badge" do + it 'renders chapter badge' do render_inline(described_class.new(event_card: presenter)) expect(page).to have_link(chapter.name) end end - context "with a meeting" do + context 'with a meeting' do let(:meeting) { Fabricate(:meeting) } let(:presenter) { MeetingPresenter.new(meeting) } - it "renders the meeting card" do + it 'renders the meeting card' do render_inline(described_class.new(event_card: presenter)) expect(page).to have_css("[data-test='event']") expect(page).to have_link(presenter.name) end - it "renders venue image for meetings" do + it 'renders venue image for meetings' do render_inline(described_class.new(event_card: presenter)) expect(page).to have_css(%(img[alt="#{meeting.venue.name}"])) end - it "does not render sponsor logos for meetings" do + it 'does not render sponsor logos for meetings' do render_inline(described_class.new(event_card: presenter)) # Venue image has sponsor-sm class, so check for mx-1 spacing (used only by sponsors) - expect(page).to have_no_css(".mx-1") + expect(page).to have_no_css('.mx-1') end end - context "with an event" do + context 'with an event' do let(:event) { Fabricate(:event) } let(:presenter) { EventPresenter.new(event) } - it "renders the event card" do + it 'renders the event card' do render_inline(described_class.new(event_card: presenter)) expect(page).to have_css("[data-test='event']") expect(page).to have_link(event.name) end - it "renders sponsor logos for events" do + it 'renders sponsor logos for events' do sponsor = Fabricate(:sponsor) event.sponsors << sponsor render_inline(described_class.new(event_card: presenter)) @@ -68,22 +68,22 @@ end end - context "with a user" do + context 'with a user' do let(:workshop) { Fabricate(:workshop, chapter: chapter) } let(:presenter) { WorkshopPresenter.new(workshop) } let(:member) { Fabricate(:member) } - it "renders attending badge when user is attending (as presenter)" do + it 'renders attending badge when user is attending (as presenter)' do Fabricate(:workshop_invitation, workshop: workshop, member: member, attending: true) user_presenter = MemberPresenter.new(member) render_inline(described_class.new(event_card: presenter, user: user_presenter)) - expect(page).to have_text("Attending") + expect(page).to have_text('Attending') end - it "renders attending badge when raw Member is passed" do + it 'renders attending badge when raw Member is passed' do Fabricate(:workshop_invitation, workshop: workshop, member: member, attending: true) render_inline(described_class.new(event_card: presenter, user: member)) - expect(page).to have_text("Attending") + expect(page).to have_text('Attending') end end diff --git a/spec/controllers/admin/invitations_controller_spec.rb b/spec/controllers/admin/invitations_controller_spec.rb index 59bd91f3e..4858afba5 100644 --- a/spec/controllers/admin/invitations_controller_spec.rb +++ b/spec/controllers/admin/invitations_controller_spec.rb @@ -3,48 +3,48 @@ let(:workshop) { invitation.workshop } let(:admin) { Fabricate(:chapter_organiser) } - describe "PUT #update" do + describe 'PUT #update' do before do admin.add_role(:organiser, workshop.chapter) login admin - request.env["HTTP_REFERER"] = "/admin/member/3" + request.env['HTTP_REFERER'] = '/admin/member/3' end - it "Successfuly updates an invitation" do + it 'Successfuly updates an invitation' do expect(invitation.attending).to be_nil - put :update, params: { id: invitation.token, workshop_id: workshop.id, attending: "true" } + put :update, params: { id: invitation.token, workshop_id: workshop.id, attending: 'true' } expect(invitation.reload.attending).to be true - expect(flash[:notice]).to match("You have added") + expect(flash[:notice]).to match('You have added') end # While similar to the previous test, this specifically tests that organisers # have the ability to manually add a student to the workshop that has not # selected a tutorial. This is helpful for when a student shows up for a # workshop they have not have a spot — this happens from time to time. - it "Successfuly adds a user as attenting, even without a tutorial" do + it 'Successfuly adds a user as attenting, even without a tutorial' do invitation.update_attribute(:tutorial, nil) expect(invitation.automated_rsvp).to be_nil - put :update, params: { id: invitation.token, workshop_id: workshop.id, attending: "true" } + put :update, params: { id: invitation.token, workshop_id: workshop.id, attending: 'true' } invitation.reload expect(invitation.attending).to be true expect(invitation.automated_rsvp).to be true - expect(flash[:notice]).to match("You have added") + expect(flash[:notice]).to match('You have added') end - it "Records the organiser ID that overrides an invitations" do - put :update, params: { id: invitation.token, workshop_id: workshop.id, attending: "true" } + it 'Records the organiser ID that overrides an invitations' do + put :update, params: { id: invitation.token, workshop_id: workshop.id, attending: 'true' } invitation.reload expect(invitation.last_overridden_by_id).to be admin.id end end - describe "PUT #update with attended param" do + describe 'PUT #update with attended param' do let(:workshop) { Fabricate(:workshop, date_and_time: Time.zone.now - 1.day) } let(:invitation) { Fabricate(:workshop_invitation, workshop: workshop, attending: true) } let(:admin) { Fabricate(:chapter_organiser) } @@ -52,10 +52,10 @@ before do admin.add_role(:organiser, workshop.chapter) login admin - request.env["HTTP_REFERER"] = "/admin/workshop/#{workshop.id}" + request.env['HTTP_REFERER'] = "/admin/workshop/#{workshop.id}" end - it "renders the attendance row partial via XHR when verifying" do + it 'renders the attendance row partial via XHR when verifying' do put :update, params: { id: invitation.token, workshop_id: workshop.id, attended: true }, xhr: true expect(response).to have_http_status(:success) @@ -63,7 +63,7 @@ expect(invitation.reload.attended).to be true end - it "renders the attendance row partial via XHR when unverifying" do + it 'renders the attendance row partial via XHR when unverifying' do invitation.update!(attended: true) put :update, params: { id: invitation.token, workshop_id: workshop.id, attended: false }, xhr: true diff --git a/spec/controllers/admin/member_search_controller_spec.rb b/spec/controllers/admin/member_search_controller_spec.rb index bf2f4258b..5ebcda1b3 100644 --- a/spec/controllers/admin/member_search_controller_spec.rb +++ b/spec/controllers/admin/member_search_controller_spec.rb @@ -2,17 +2,17 @@ let(:member) { Fabricate.build(:member) } describe 'GET #index' do - context "when user is not logged in" do + context 'when user is not logged in' do before do get :index end - it "redirects to the home page" do + it 'redirects to the home page' do expect(response).to redirect_to(root_path) end end - context "when user is an admin" do + context 'when user is an admin' do let(:fake_relation) { instance_double('ActiveRecord::Relation') } let(:fake_juliet) { instance_double('Member', id: 1, name: 'Juliet', surname: 'Montague') } @@ -21,28 +21,28 @@ get :index end - it "shows user the search page" do + it 'shows user the search page' do expect(response).to have_http_status(:ok) end - context "and when admin user searches for a single existing user" do + context 'and when admin user searches for a single existing user' do before do allow(Member).to receive(:find_members_by_name).with('Juliet').and_return(fake_relation) allow(fake_relation).to receive(:select).with(any_args).and_return([fake_juliet]) - get :index, params: { member_search: { name: "Juliet", callback_url: root_path } } + get :index, params: { member_search: { name: 'Juliet', callback_url: root_path } } end - it "redirects to the calling service" do + it 'redirects to the calling service' do expect(response).to have_http_status(:found) uri = URI.parse(response.location) redirect_params = Rack::Utils.parse_nested_query(uri.query) - expect(redirect_params["member_pick"]["members"]).to eq(["1"]) + expect(redirect_params['member_pick']['members']).to eq(['1']) end end - context "and when an admin user searches and there are multiple results" do + context 'and when an admin user searches and there are multiple results' do let(:fake_romeo) { double('Member', id: 2, name: 'Romeo', surname: 'Capulet') } before do @@ -51,7 +51,7 @@ get :index, params: { member_search: { name: 'e', callback_url: root_path } } end - it "presents the found members on the index page" do + it 'presents the found members on the index page' do expect(response).to have_http_status(:ok) end end diff --git a/spec/controllers/auth_services_controller_spec.rb b/spec/controllers/auth_services_controller_spec.rb index 6e76484f6..ce3d5552b 100644 --- a/spec/controllers/auth_services_controller_spec.rb +++ b/spec/controllers/auth_services_controller_spec.rb @@ -1,20 +1,20 @@ RSpec.describe AuthServicesController do - describe "GET #new" do - it "redirects when referer is missing" do + describe 'GET #new' do + it 'redirects when referer is missing' do expected_referer_path = nil - request.env["HTTP_REFERER"] = expected_referer_path + request.env['HTTP_REFERER'] = expected_referer_path get :new - expect(response).to redirect_to("/auth/github") + expect(response).to redirect_to('/auth/github') expect(session[:referer_path]).to eq(expected_referer_path) end - it "redirects when referer is present" do - expected_referer_path = "workshops/42" - request.env["HTTP_REFERER"] = expected_referer_path + it 'redirects when referer is present' do + expected_referer_path = 'workshops/42' + request.env['HTTP_REFERER'] = expected_referer_path get :new - expect(response).to redirect_to("/auth/github") + expect(response).to redirect_to('/auth/github') expect(session[:referer_path]).to eq(expected_referer_path) end end diff --git a/spec/controllers/members_controller_spec.rb b/spec/controllers/members_controller_spec.rb index e4e7d5b69..d54c3fc5e 100644 --- a/spec/controllers/members_controller_spec.rb +++ b/spec/controllers/members_controller_spec.rb @@ -1,15 +1,15 @@ RSpec.describe MembersController do - describe "GET unsubscribe/#token" do - it "redirects to the subscription path when token is valid" do + describe 'GET unsubscribe/#token' do + it 'redirects to the subscription path when token is valid' do member = Fabricate(:member) get :unsubscribe, params: { token: member_token(member) } expect(response).to redirect_to(subscriptions_path) end - it "redirects to the root path when token is invalid" do - get :unsubscribe, params: { token: "foo" } + it 'redirects to the root path when token is invalid' do + get :unsubscribe, params: { token: 'foo' } expect(response).to redirect_to(root_path) - expect(flash[:notice]).to eq("Your token is invalid. ") + expect(flash[:notice]).to eq('Your token is invalid. ') end end end diff --git a/spec/fabricators/member_email_delivery_fabricator.rb b/spec/fabricators/member_email_delivery_fabricator.rb index f633b7a35..2b473815e 100644 --- a/spec/fabricators/member_email_delivery_fabricator.rb +++ b/spec/fabricators/member_email_delivery_fabricator.rb @@ -1,6 +1,6 @@ Fabricator(:member_email_delivery) do member(fabricator: :member) - subject("Chaser") - body("Lorem ipsum") - to(["test_email@address"]) + subject('Chaser') + body('Lorem ipsum') + to(['test_email@address']) end diff --git a/spec/features/accepting_invitation_spec.rb b/spec/features/accepting_invitation_spec.rb index fb6524946..07767ba69 100644 --- a/spec/features/accepting_invitation_spec.rb +++ b/spec/features/accepting_invitation_spec.rb @@ -102,7 +102,7 @@ click_on 'Update note' expect(page).to have_field('workshop_invitation_note', with: note) - expect(page).to have_text("Invitation details successfully updated.") + expect(page).to have_text('Invitation details successfully updated.') end end end diff --git a/spec/features/admin/manage_sponsor_spec.rb b/spec/features/admin/manage_sponsor_spec.rb index e642f601f..a21fac6b9 100644 --- a/spec/features/admin/manage_sponsor_spec.rb +++ b/spec/features/admin/manage_sponsor_spec.rb @@ -17,7 +17,7 @@ attach_file('Avatar', Rails.root + 'spec/support/codebar-logo.png') fill_in 'Student spots', with: 20 fill_in 'Coach spots', with: 10 - select "Bronze", from: "Level" + select 'Bronze', from: 'Level' click_on 'Create sponsor' diff --git a/spec/features/member_joining_spec.rb b/spec/features/member_joining_spec.rb index 79be504a1..8b1c67712 100644 --- a/spec/features/member_joining_spec.rb +++ b/spec/features/member_joining_spec.rb @@ -27,7 +27,7 @@ expect(page).to have_text "Surname can't be blank" expect(page).to have_text "Email address can't be blank" expect(page).to have_text "About you can't be blank" - expect(page).to have_text "You must select one option" + expect(page).to have_text 'You must select one option' end scenario 'A new member details are successfully captured' do diff --git a/spec/features/member_updating_details_spec.rb b/spec/features/member_updating_details_spec.rb index 698c81b85..b103dad37 100644 --- a/spec/features/member_updating_details_spec.rb +++ b/spec/features/member_updating_details_spec.rb @@ -12,7 +12,7 @@ click_on 'Save' expect(page).to have_text('Your details have been updated.') - expect(page).to have_css(".badge", text: "Vegetarian") + expect(page).to have_css('.badge', text: 'Vegetarian') end scenario 'A member adds a custom dietary restriction' do @@ -25,7 +25,7 @@ click_on 'Save' expect(page).to have_text('Your details have been updated.') - expect(page).to have_css(".badge", text: 'Peanut allergy') + expect(page).to have_css('.badge', text: 'Peanut allergy') member.reload expect(member.dietary_restrictions).to eq(['other']) expect(member.other_dietary_restrictions).to eq('peanut allergy') diff --git a/spec/features/viewing_a_workshop_invitation_spec.rb b/spec/features/viewing_a_workshop_invitation_spec.rb index 4d388977b..15e995783 100644 --- a/spec/features/viewing_a_workshop_invitation_spec.rb +++ b/spec/features/viewing_a_workshop_invitation_spec.rb @@ -50,7 +50,7 @@ end end - include_examples "viewing workshop details" + include_examples 'viewing workshop details' end context 'virtual workshop' do @@ -95,6 +95,6 @@ end end - include_examples "viewing workshop details" + include_examples 'viewing workshop details' end end diff --git a/spec/features/viewing_a_workshop_spec.rb b/spec/features/viewing_a_workshop_spec.rb index 291c6bcd3..086f8dc6e 100644 --- a/spec/features/viewing_a_workshop_spec.rb +++ b/spec/features/viewing_a_workshop_spec.rb @@ -24,11 +24,11 @@ end end - include_examples "viewing workshop details" + include_examples 'viewing workshop details' end describe '#actions' do - include_examples "viewing workshop actions" + include_examples 'viewing workshop actions' end end @@ -53,11 +53,11 @@ end end - include_examples "viewing workshop details" + include_examples 'viewing workshop details' end describe '#actions' do - include_examples "viewing workshop actions" + include_examples 'viewing workshop actions' end end end diff --git a/spec/lib/services/flodesk_spec.rb b/spec/lib/services/flodesk_spec.rb index ec7850fed..14d459b75 100644 --- a/spec/lib/services/flodesk_spec.rb +++ b/spec/lib/services/flodesk_spec.rb @@ -59,18 +59,18 @@ it 'confirms that a user is active and subscribed to a segment' do payload = { email: :email, - segment_ids: ["segment_id"] + segment_ids: ['segment_id'] } stub.get("/subscribers/#{payload[:email]}") do [200, {}, { - "id": "123456789", - "status": "active", - "email": "email", + "id": '123456789', + "status": 'active', + "email": 'email', "segments": [ { - "id": "segment_id", - "name": "codebar" + "id": 'segment_id', + "name": 'codebar' } ] }] @@ -84,18 +84,18 @@ it 'confirms that a user is active but not subscribed to a segment' do payload = { email: :email, - segment_ids: ["segment_id"] + segment_ids: ['segment_id'] } stub.get("/subscribers/#{payload[:email]}") do [200, {}, { - "id": "123456789", - "status": "active", - "email": "email", + "id": '123456789', + "status": 'active', + "email": 'email', "segments": [ { - "id": "some_other_segment_id", - "name": "not codebar" + "id": 'some_other_segment_id', + "name": 'not codebar' } ] }] @@ -109,18 +109,18 @@ it 'confirms that a user is not active' do payload = { email: :email, - segment_ids: ["segment_id"] + segment_ids: ['segment_id'] } stub.get("/subscribers/#{payload[:email]}") do [200, {}, { - "id": "123456789", - "status": "unsubscribed", - "email": "email", + "id": '123456789', + "status": 'unsubscribed', + "email": 'email', "segments": [ { - "id": "segment_id", - "name": "codebar" + "id": 'segment_id', + "name": 'codebar' } ] }] diff --git a/spec/lib/services/mailing_list_spec.rb b/spec/lib/services/mailing_list_spec.rb index 997114a4a..9120eaeb1 100644 --- a/spec/lib/services/mailing_list_spec.rb +++ b/spec/lib/services/mailing_list_spec.rb @@ -11,7 +11,7 @@ allow(ENV).to receive(:[]).and_call_original allow(ENV).to receive(:[]).with('FLODESK_KEY').and_return('test') allow(mailing_list).to receive(:client).and_return(client) - allow(Rails).to receive(:env).and_return("production".inquiry) + allow(Rails).to receive(:env).and_return('production'.inquiry) end context '#subscribe' do diff --git a/spec/lib/tasks/delete_member_rake_spec.rb b/spec/lib/tasks/delete_member_rake_spec.rb index b4bc8e357..38499d09f 100644 --- a/spec/lib/tasks/delete_member_rake_spec.rb +++ b/spec/lib/tasks/delete_member_rake_spec.rb @@ -5,8 +5,8 @@ allow($stdout).to receive(:puts) end - it "preloads the Rails environment" do - expect(task.prerequisites).to include "environment" + it 'preloads the Rails environment' do + expect(task.prerequisites).to include 'environment' end it 'when no email is provided' do diff --git a/spec/lib/tasks/mailing_list_rake_spec.rb b/spec/lib/tasks/mailing_list_rake_spec.rb index a5298fa13..3498121c6 100644 --- a/spec/lib/tasks/mailing_list_rake_spec.rb +++ b/spec/lib/tasks/mailing_list_rake_spec.rb @@ -1,6 +1,6 @@ RSpec.describe 'rake mailing_list:subscribe_active_members', type: :task do - it "preloads the Rails environment" do - expect(task.prerequisites).to include "environment" + it 'preloads the Rails environment' do + expect(task.prerequisites).to include 'environment' end it 'should run gracefully' do diff --git a/spec/mailers/member_mailer_spec.rb b/spec/mailers/member_mailer_spec.rb index 2fb16d590..f4ace5b85 100644 --- a/spec/mailers/member_mailer_spec.rb +++ b/spec/mailers/member_mailer_spec.rb @@ -168,8 +168,8 @@ end end - describe "#chaser" do - it "logs the sent email" do + describe '#chaser' do + it 'logs the sent email' do expect do described_class .with(member: member) @@ -180,7 +180,7 @@ log = MemberEmailDelivery.last! expect(log.member).to eq(member) - expect(log.subject).to eq("It’s been a while, how are you doing? ♥️") + expect(log.subject).to eq('It’s been a while, how are you doing? ♥️') expect(log.to).to eq([member.email]) end end diff --git a/spec/mailers/previews/meeting_invitation_mailer_preview.rb b/spec/mailers/previews/meeting_invitation_mailer_preview.rb index 706a3f68e..cc16a10ef 100644 --- a/spec/mailers/previews/meeting_invitation_mailer_preview.rb +++ b/spec/mailers/previews/meeting_invitation_mailer_preview.rb @@ -6,7 +6,7 @@ def invite # In the real work, MeetingInvitation should have been created already and a # token should have been assigned. The next lines are for testing purposes. invitation = MeetingInvitation.new(meeting: meeting, member: member) - invitation.token = "tokenExample28XIcd6IxQ" + invitation.token = 'tokenExample28XIcd6IxQ' MeetingInvitationMailer.invite(meeting, member, invitation) end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index e8e2edf7b..d81bd31e4 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -1,7 +1,7 @@ RSpec.describe Event do subject(:event) { Fabricate(:event) } - include_examples "Invitable", :invitation, :event + include_examples 'Invitable', :invitation, :event include_examples DateTimeConcerns, :event context 'validates' do @@ -16,7 +16,7 @@ it { is_expected.to validate_numericality_of(:coach_spaces) } it { is_expected.to validate_numericality_of(:student_spaces) } - context "#invitablility" do + context '#invitablility' do it 'does not validate if invitable false' do event.invitable = false event.coach_spaces = nil diff --git a/spec/models/meeting_spec.rb b/spec/models/meeting_spec.rb index 9a1b0dcb3..859377ac4 100644 --- a/spec/models/meeting_spec.rb +++ b/spec/models/meeting_spec.rb @@ -1,5 +1,5 @@ RSpec.describe Meeting do - include_examples "Invitable", :meeting_invitation, :meeting + include_examples 'Invitable', :meeting_invitation, :meeting include_examples DateTimeConcerns, :meeting context 'validations' do diff --git a/spec/models/workshop_spec.rb b/spec/models/workshop_spec.rb index 8b340c369..30928f04c 100644 --- a/spec/models/workshop_spec.rb +++ b/spec/models/workshop_spec.rb @@ -1,13 +1,13 @@ RSpec.describe Workshop do subject(:workshop) { Fabricate(:workshop) } - include_examples "Invitable", :workshop_invitation, :workshop + include_examples 'Invitable', :workshop_invitation, :workshop include_examples DateTimeConcerns, :workshop context 'validates' do it { is_expected.to validate_presence_of(:chapter_id) } - context "#date_and_time" do + context '#date_and_time' do it 'does not validate if chapter_id blank' do workshop.chapter_id = nil workshop.date_and_time = nil @@ -123,7 +123,7 @@ workshop.rsvp_closes_at = Time.zone.now + 2.hours workshop.valid? - expect(workshop.errors[:rsvp_close_local_date]).to include("must be before the workshop start time") + expect(workshop.errors[:rsvp_close_local_date]).to include('must be before the workshop start time') end it 'is valid when close time is before workshop start' do diff --git a/spec/presenters/workshop_presenter_capacity_spec.rb b/spec/presenters/workshop_presenter_capacity_spec.rb index a86a2a2bc..98bc80db4 100644 --- a/spec/presenters/workshop_presenter_capacity_spec.rb +++ b/spec/presenters/workshop_presenter_capacity_spec.rb @@ -18,7 +18,7 @@ expect(workshop.attending_students.count).to eq(2) expect(workshop.student_spaces).to eq(2) expect(presenter.event_student_spaces?).to eq(false), - "Expected event_student_spaces? to be false when at capacity (2/2), but got true" + 'Expected event_student_spaces? to be false when at capacity (2/2), but got true' end end @@ -33,7 +33,7 @@ expect(workshop.attending_students.count).to eq(1) expect(workshop.student_spaces).to eq(2) expect(presenter.event_student_spaces?).to eq(true), - "Expected event_student_spaces? to be true when spaces available (1/2), but got false" + 'Expected event_student_spaces? to be true when spaces available (1/2), but got false' end end @@ -57,7 +57,7 @@ expect(workshop_with_zero_spaces.student_spaces).to eq(0) expect(presenter_zero_spaces.student_spaces).to eq(20), 'Capacity should come from sponsor' expect(presenter_zero_spaces.event_student_spaces?).to eq(true), - "Expected event_student_spaces? to be true when sponsor has capacity (1/20), but got false" + 'Expected event_student_spaces? to be true when sponsor has capacity (1/20), but got false' end end end @@ -78,7 +78,7 @@ it 'returns false when no coach spaces are available' do expect(workshop.attending_coaches.count).to eq(2) expect(presenter.event_coach_spaces?).to eq(false), - "Expected event_coach_spaces? to be false when at capacity (2/2), but got true" + 'Expected event_coach_spaces? to be false when at capacity (2/2), but got true' end end @@ -92,7 +92,7 @@ it 'returns true when coach spaces are available' do expect(workshop.attending_coaches.count).to eq(1) expect(presenter.event_coach_spaces?).to eq(true), - "Expected event_coach_spaces? to be true when spaces available (1/2), but got false" + 'Expected event_coach_spaces? to be true when spaces available (1/2), but got false' end end @@ -116,7 +116,7 @@ expect(workshop_with_zero_spaces.coach_spaces).to eq(0) expect(presenter_zero_spaces.coach_spaces).to eq(10), 'Capacity should come from sponsor' expect(presenter_zero_spaces.event_coach_spaces?).to eq(true), - "Expected event_coach_spaces? to be true when sponsor has capacity (1/10), but got false" + 'Expected event_coach_spaces? to be true when sponsor has capacity (1/10), but got false' end end end diff --git a/spec/serializers/workshop_calendar_spec.rb b/spec/serializers/workshop_calendar_spec.rb index 804eef745..6677bbc31 100644 --- a/spec/serializers/workshop_calendar_spec.rb +++ b/spec/serializers/workshop_calendar_spec.rb @@ -46,7 +46,7 @@ expect(event.summary).to eq("codebar @ #{workshop.host.name}") expect(event.location.to_s).to eq(AddressPresenter.new(workshop.host.address).to_s) expect(event.url.to_s).to eq(invitation_url) - expect(event.description).to include("Declining or removing this event from your calendar does not update your invitation") + expect(event.description).to include('Declining or removing this event from your calendar does not update your invitation') expect(event.description).to include(invitation_url) end end diff --git a/spec/services/three_month_email_service_spec.rb b/spec/services/three_month_email_service_spec.rb index bd17f28a5..d1dc27f52 100644 --- a/spec/services/three_month_email_service_spec.rb +++ b/spec/services/three_month_email_service_spec.rb @@ -1,5 +1,5 @@ RSpec.describe ThreeMonthEmailService, type: :service do - describe "#send_chaser" do + describe '#send_chaser' do subject(:call) { described_class.send_chaser } around do |example| @@ -11,8 +11,8 @@ end let(:chapter) { Fabricate(:chapter) } - let(:students_group) { Fabricate(:group, name: "Students", chapter: chapter) } - let(:coaches_group) { Fabricate(:group, name: "Coaches", chapter: chapter) } + let(:students_group) { Fabricate(:group, name: 'Students', chapter: chapter) } + let(:coaches_group) { Fabricate(:group, name: 'Coaches', chapter: chapter) } let!(:eligible_student) do member = Fabricate(:member) @@ -21,7 +21,7 @@ :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 6.months.ago), - role: "Student", + role: 'Student', attended: true ) member @@ -41,7 +41,7 @@ :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago), - role: "Student", + role: 'Student', attended: true ) member @@ -54,7 +54,7 @@ :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 4.months.ago), - role: "Student", + role: 'Student', attended: true ) member @@ -85,60 +85,60 @@ :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 14.months.ago), - role: "Student", + role: 'Student', attended: true ) member end - it "emails only students who have not attended in the last 3 months and were not emailed before" do + it 'emails only students who have not attended in the last 3 months and were not emailed before' do expect { perform_enqueued_jobs { call } }.to change(MemberEmailDelivery, :count).by(2) expect(MemberEmailDelivery.where(member: eligible_student)).to exist expect(MemberEmailDelivery.where(member: student_with_old_attendance)).to exist end - it "does not email a member already present in member_email_deliveries" do + it 'does not email a member already present in member_email_deliveries' do expect { perform_enqueued_jobs { call } } .not_to change { MemberEmailDelivery.where(member: already_emailed_student).count } end - it "does not email students with a recent attended workshop" do + it 'does not email students with a recent attended workshop' do expect { perform_enqueued_jobs { call } } .not_to change { MemberEmailDelivery.where(member: student_with_recent_attendance).count } end - it "does not email members without a student subscription" do + it 'does not email members without a student subscription' do perform_enqueued_jobs { call } expect(MemberEmailDelivery.where(member: coach_member)).to be_empty expect(MemberEmailDelivery.where(member: unsubscribed_member)).to be_empty end - it "does not email banned students or students without accepted terms" do + it 'does not email banned students or students without accepted terms' do perform_enqueued_jobs { call } expect(MemberEmailDelivery.where(member: banned_student)).to be_empty expect(MemberEmailDelivery.where(member: student_without_toc)).to be_empty end - it "does not email students who have not attended in the past year" do + it 'does not email students who have not attended in the past year' do perform_enqueued_jobs { call } expect(MemberEmailDelivery.where(member: student_with_very_old_attendance)).to be_empty end - it "sends only one chaser for a member with multiple student subscriptions" do + it 'sends only one chaser for a member with multiple student subscriptions' do member = Fabricate(:member) other_chapter = Fabricate(:chapter) - other_students_group = Fabricate(:group, name: "Students", chapter: other_chapter) + other_students_group = Fabricate(:group, name: 'Students', chapter: other_chapter) Fabricate(:subscription, member: member, group: students_group) Fabricate(:subscription, member: member, group: other_students_group) Fabricate( :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 6.months.ago), - role: "Student", + role: 'Student', attended: true ) @@ -147,21 +147,21 @@ expect(MemberEmailDelivery.where(member: member).count).to eq(1) end - it "sends only one chaser for a member with multiple qualifying old attendances" do + it 'sends only one chaser for a member with multiple qualifying old attendances' do member = Fabricate(:member) Fabricate(:subscription, member: member, group: students_group) Fabricate( :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 5.months.ago), - role: "Student", + role: 'Student', attended: true ) Fabricate( :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 4.months.ago), - role: "Student", + role: 'Student', attended: true ) @@ -170,40 +170,40 @@ expect(MemberEmailDelivery.where(member: member).count).to eq(1) end - it "does not send chasers when there are no eligible members" do + it 'does not send chasers when there are no eligible members' do Fabricate( :workshop_invitation, member: eligible_student, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago), - role: "Student", + role: 'Student', attended: true ) Fabricate( :workshop_invitation, member: student_with_old_attendance, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago), - role: "Student", + role: 'Student', attended: true ) expect { perform_enqueued_jobs { call } }.not_to change(MemberEmailDelivery, :count) end - it "emails a student member who has recent attendance only as a coach" do + it 'emails a student member who has recent attendance only as a coach' do member = Fabricate(:member) Fabricate(:subscription, member: member, group: students_group) Fabricate( :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 6.months.ago), - role: "Student", + role: 'Student', attended: true ) Fabricate( :workshop_invitation, member: member, workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago), - role: "Coach", + role: 'Coach', attended: true ) diff --git a/spec/support/select_from_tom_select.rb b/spec/support/select_from_tom_select.rb index bb48a8e39..b11039a95 100644 --- a/spec/support/select_from_tom_select.rb +++ b/spec/support/select_from_tom_select.rb @@ -41,7 +41,7 @@ def select_from_tom_select(item_text, from:) # Click the matching option # Use JavaScript click to avoid element interception issues option = wrapper.find('.ts-dropdown .option', text: item_text, match: :prefer_exact) - page.execute_script("arguments[0].click();", option.native) + page.execute_script('arguments[0].click();', option.native) end # Remove an item from a TomSelect multi-select diff --git a/spec/support/shared_examples/behaves_link_member_viewing_workshop.rb b/spec/support/shared_examples/behaves_link_member_viewing_workshop.rb index 300abb5a0..90c1cd3ab 100644 --- a/spec/support/shared_examples/behaves_link_member_viewing_workshop.rb +++ b/spec/support/shared_examples/behaves_link_member_viewing_workshop.rb @@ -2,7 +2,7 @@ context workshop_type do let(:workshop) { Fabricate(workshop_type) } - scenario "allowed can manage" do + scenario 'allowed can manage' do member = Fabricate(member_type) login(member) visit workshop_path(workshop)