From af601a3c2764d11fd27390c03360341085ae6b0b Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 12 Dec 2025 14:56:00 -0800 Subject: [PATCH 1/2] added spec coverage --- .github/workflows/ci.yml | 9 +++++++++ spec/actions/add_ons/filter_spec.rb | 12 ++++++++++++ spec/actions/clusters/filter_spec.rb | 12 ++++++++++++ spec/actions/projects/filter_spec.rb | 12 ++++++++++++ spec/actions/services/create_spec.rb | 14 ++++++++++++++ spec/rails_helper.rb | 3 +++ spec/spec_helper.rb | 22 +++++++++++++++++++--- 7 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 spec/actions/add_ons/filter_spec.rb create mode 100644 spec/actions/clusters/filter_spec.rb create mode 100644 spec/actions/projects/filter_spec.rb create mode 100644 spec/actions/services/create_spec.rb diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eadd69b8..bcd9ee52 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,10 +53,19 @@ jobs: env: RAILS_ENV: test DATABASE_URL: postgres://postgres:postgres@localhost:5432 + CI: true run: | bin/rails db:test:prepare bin/bundle exec rspec --exclude-pattern spec/system/local/**/*_spec.rb + - name: Upload coverage report + uses: actions/upload-artifact@v4 + if: always() + with: + name: coverage-report + path: coverage/ + if-no-files-found: ignore + - name: Keep screenshots from failed system tests uses: actions/upload-artifact@v4 if: failure() diff --git a/spec/actions/add_ons/filter_spec.rb b/spec/actions/add_ons/filter_spec.rb new file mode 100644 index 00000000..d6ed3b6d --- /dev/null +++ b/spec/actions/add_ons/filter_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +RSpec.describe AddOns::Filter do + it 'filters add_ons by name with case-insensitive ILIKE' do + cluster = create(:cluster) + redis = create(:add_on, cluster: cluster, name: 'redis-cache') + create(:add_on, cluster: cluster, name: 'postgres-db') + + expect(described_class.execute(params: { q: 'REDIS' }, add_ons: AddOn.all).add_ons).to eq([redis]) + expect(described_class.execute(params: { q: '' }, add_ons: AddOn.all).add_ons.count).to eq(2) + end +end diff --git a/spec/actions/clusters/filter_spec.rb b/spec/actions/clusters/filter_spec.rb new file mode 100644 index 00000000..b771db4b --- /dev/null +++ b/spec/actions/clusters/filter_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +RSpec.describe Clusters::Filter do + it 'filters clusters by name with case-insensitive ILIKE' do + account = create(:account) + prod = create(:cluster, account: account, name: 'production-us') + create(:cluster, account: account, name: 'staging-eu') + + expect(described_class.execute(params: { q: 'PROD' }, clusters: Cluster.all).clusters).to eq([prod]) + expect(described_class.execute(params: { q: '' }, clusters: Cluster.all).clusters.count).to eq(2) + end +end diff --git a/spec/actions/projects/filter_spec.rb b/spec/actions/projects/filter_spec.rb new file mode 100644 index 00000000..a1ff9ce6 --- /dev/null +++ b/spec/actions/projects/filter_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +RSpec.describe Projects::Filter do + it 'filters projects by name with case-insensitive ILIKE' do + cluster = create(:cluster) + api = create(:project, cluster: cluster, account: cluster.account, name: 'api-service') + create(:project, cluster: cluster, account: cluster.account, name: 'web-frontend') + + expect(described_class.execute(params: { q: 'API' }, projects: Project.all).projects).to eq([api]) + expect(described_class.execute(params: { q: '' }, projects: Project.all).projects.count).to eq(2) + end +end diff --git a/spec/actions/services/create_spec.rb b/spec/actions/services/create_spec.rb new file mode 100644 index 00000000..dba98053 --- /dev/null +++ b/spec/actions/services/create_spec.rb @@ -0,0 +1,14 @@ +require 'rails_helper' + +RSpec.describe Services::Create do + it 'saves the service with associations' do + project = create(:project) + service = build(:service, :cron_job, project: project) + + result = described_class.call(service, { service: {} }) + + expect(result).to be_success + expect(service).to be_persisted + expect(service.cron_schedule).to be_persisted + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 0d872414..c75a69b1 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -8,6 +8,7 @@ abort("The Rails environment is running in production mode!") if Rails.env.produ # that will avoid rails generators crashing because migrations haven't been run yet # return unless Rails.env.test? require 'rspec/rails' +require 'factory_bot_rails' require 'support/webmock' # Add additional requires below this line. Rails is not loaded until this point! @@ -34,6 +35,8 @@ rescue ActiveRecord::PendingMigrationError => e abort e.to_s.strip end RSpec.configure do |config| + config.include FactoryBot::Syntax::Methods + config.before(:suite) do DatabaseCleaner.clean_with(:truncation) end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ef8c8355..b249e056 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,23 @@ -require 'factory_bot_rails' require 'simplecov' -SimpleCov.start 'rails' + +SimpleCov.start 'rails' do + enable_coverage :branch + + add_filter '/spec/' + add_filter '/config/' + add_filter '/vendor/' + + add_group 'Models', 'app/models' + add_group 'Controllers', 'app/controllers' + add_group 'Services', 'app/services' + add_group 'Actions', 'app/actions' + add_group 'Jobs', 'app/jobs' + add_group 'Helpers', 'app/helpers' + + if ENV['CI'] + minimum_coverage line: 5, branch: 5 + end +end # This file was generated by the `rails generate rspec:install` command. Conventionally, all # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. @@ -18,7 +35,6 @@ SimpleCov.start 'rails' # # See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration RSpec.configure do |config| - config.include FactoryBot::Syntax::Methods # rspec-expectations config goes here. You can use an alternate # assertion/expectation library such as wrong or the stdlib/minitest # assertions if you prefer. From 0f9762164fe15ae424f6fe5aa94058d210c205a1 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 12 Dec 2025 14:56:33 -0800 Subject: [PATCH 2/2] fix lints --- spec/actions/add_ons/filter_spec.rb | 2 +- spec/actions/clusters/filter_spec.rb | 2 +- spec/actions/projects/filter_spec.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/actions/add_ons/filter_spec.rb b/spec/actions/add_ons/filter_spec.rb index d6ed3b6d..896e95a6 100644 --- a/spec/actions/add_ons/filter_spec.rb +++ b/spec/actions/add_ons/filter_spec.rb @@ -6,7 +6,7 @@ RSpec.describe AddOns::Filter do redis = create(:add_on, cluster: cluster, name: 'redis-cache') create(:add_on, cluster: cluster, name: 'postgres-db') - expect(described_class.execute(params: { q: 'REDIS' }, add_ons: AddOn.all).add_ons).to eq([redis]) + expect(described_class.execute(params: { q: 'REDIS' }, add_ons: AddOn.all).add_ons).to eq([ redis ]) expect(described_class.execute(params: { q: '' }, add_ons: AddOn.all).add_ons.count).to eq(2) end end diff --git a/spec/actions/clusters/filter_spec.rb b/spec/actions/clusters/filter_spec.rb index b771db4b..b04facbb 100644 --- a/spec/actions/clusters/filter_spec.rb +++ b/spec/actions/clusters/filter_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Clusters::Filter do prod = create(:cluster, account: account, name: 'production-us') create(:cluster, account: account, name: 'staging-eu') - expect(described_class.execute(params: { q: 'PROD' }, clusters: Cluster.all).clusters).to eq([prod]) + expect(described_class.execute(params: { q: 'PROD' }, clusters: Cluster.all).clusters).to eq([ prod ]) expect(described_class.execute(params: { q: '' }, clusters: Cluster.all).clusters.count).to eq(2) end end diff --git a/spec/actions/projects/filter_spec.rb b/spec/actions/projects/filter_spec.rb index a1ff9ce6..a86884cc 100644 --- a/spec/actions/projects/filter_spec.rb +++ b/spec/actions/projects/filter_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Projects::Filter do api = create(:project, cluster: cluster, account: cluster.account, name: 'api-service') create(:project, cluster: cluster, account: cluster.account, name: 'web-frontend') - expect(described_class.execute(params: { q: 'API' }, projects: Project.all).projects).to eq([api]) + expect(described_class.execute(params: { q: 'API' }, projects: Project.all).projects).to eq([ api ]) expect(described_class.execute(params: { q: '' }, projects: Project.all).projects.count).to eq(2) end end