Add security-todo and beta-checklists, and some security rake tasks
This commit is contained in:
3
Gemfile
3
Gemfile
@@ -87,5 +87,8 @@ group :test do
|
||||
# Use system testing [https://guides.rubyonrails.org/testing.html#system-testing]
|
||||
gem "capybara"
|
||||
gem "selenium-webdriver"
|
||||
|
||||
# Code coverage analysis
|
||||
gem "simplecov", require: false
|
||||
end
|
||||
|
||||
|
||||
@@ -116,6 +116,7 @@ GEM
|
||||
debug (1.11.0)
|
||||
irb (~> 1.10)
|
||||
reline (>= 0.3.8)
|
||||
docile (1.4.1)
|
||||
dotenv (3.1.8)
|
||||
drb (2.2.3)
|
||||
ed25519 (1.4.0)
|
||||
@@ -345,6 +346,12 @@ GEM
|
||||
sentry-ruby (6.2.0)
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
simplecov (0.22.0)
|
||||
docile (~> 1.1)
|
||||
simplecov-html (~> 0.11)
|
||||
simplecov_json_formatter (~> 0.1)
|
||||
simplecov-html (0.13.2)
|
||||
simplecov_json_formatter (0.1.4)
|
||||
solid_cable (3.0.12)
|
||||
actioncable (>= 7.2)
|
||||
activejob (>= 7.2)
|
||||
@@ -464,6 +471,7 @@ DEPENDENCIES
|
||||
selenium-webdriver
|
||||
sentry-rails (~> 6.2)
|
||||
sentry-ruby (~> 6.2)
|
||||
simplecov
|
||||
solid_cable
|
||||
solid_cache
|
||||
solid_queue (~> 1.2)
|
||||
|
||||
57
README.md
57
README.md
@@ -521,6 +521,63 @@ user.revoke_all_consents!
|
||||
|
||||
---
|
||||
|
||||
## Testing & Security
|
||||
|
||||
### Running Tests
|
||||
|
||||
Clinch has comprehensive test coverage with 341 tests covering integration, models, controllers, services, and system tests.
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
bin/rails test
|
||||
|
||||
# Run specific test types
|
||||
bin/rails test:integration
|
||||
bin/rails test:models
|
||||
bin/rails test:controllers
|
||||
bin/rails test:system
|
||||
|
||||
# Run with code coverage report
|
||||
COVERAGE=1 bin/rails test
|
||||
# View coverage report at coverage/index.html
|
||||
```
|
||||
|
||||
### Security Scanning
|
||||
|
||||
Clinch uses multiple automated security tools to ensure code quality and security:
|
||||
|
||||
```bash
|
||||
# Run all security checks
|
||||
bin/rake security
|
||||
|
||||
# Individual security scans
|
||||
bin/brakeman --no-pager # Static security analysis
|
||||
bin/bundler-audit check --update # Dependency vulnerability scan
|
||||
bin/importmap audit # JavaScript dependency scan
|
||||
```
|
||||
|
||||
**CI/CD Integration:**
|
||||
All security scans run automatically on every pull request and push to main via GitHub Actions.
|
||||
|
||||
**Security Tools:**
|
||||
- **Brakeman** - Static analysis for Rails security vulnerabilities
|
||||
- **bundler-audit** - Checks gems for known CVEs
|
||||
- **SimpleCov** - Code coverage tracking
|
||||
- **RuboCop** - Code style and quality enforcement
|
||||
|
||||
**Current Status:**
|
||||
- ✅ All security scans passing
|
||||
- ✅ 341 tests, 1349 assertions, 0 failures
|
||||
- ✅ No known dependency vulnerabilities
|
||||
- ✅ Phases 1-4 security hardening complete (18+ vulnerabilities fixed)
|
||||
- 🟡 3 outstanding security issues (all MEDIUM/LOW priority)
|
||||
|
||||
**Security Documentation:**
|
||||
- [docs/security-todo.md](docs/security-todo.md) - Detailed vulnerability tracking and remediation history
|
||||
- [docs/beta-checklist.md](docs/beta-checklist.md) - Beta release readiness criteria
|
||||
|
||||
---
|
||||
|
||||
## Technology Stack
|
||||
|
||||
- **Rails 8.1** - Modern Rails with authentication generator
|
||||
|
||||
268
docs/beta-checklist.md
Normal file
268
docs/beta-checklist.md
Normal file
@@ -0,0 +1,268 @@
|
||||
# Beta Release Readiness Checklist
|
||||
|
||||
This checklist ensures Clinch meets security, quality, and documentation standards before moving from "experimental" to "Beta" status.
|
||||
|
||||
> **Security Implementation Status:** See [security-todo.md](security-todo.md) for detailed vulnerability tracking and fixes.
|
||||
> **Outstanding Security Issues:** 3 (all MEDIUM/LOW priority) - Phases 1-4 complete ✅
|
||||
|
||||
---
|
||||
|
||||
## Security Scanning
|
||||
|
||||
### Automated Security Tools
|
||||
- [x] **Brakeman** - Static security analysis for Rails
|
||||
- Status: ✅ Passing (2 weak warnings documented and accepted)
|
||||
- Command: `bin/brakeman --no-pager`
|
||||
- CI: Runs on every PR and push to main
|
||||
- Warnings documented in `config/brakeman.ignore`
|
||||
|
||||
- [x] **bundler-audit** - Dependency vulnerability scanning
|
||||
- Status: ✅ No vulnerabilities found
|
||||
- Command: `bin/bundler-audit check --update`
|
||||
- CI: Runs on every PR and push to main
|
||||
|
||||
- [x] **importmap audit** - JavaScript dependency scanning
|
||||
- CI: Runs on every PR and push to main
|
||||
|
||||
- [x] **Test Coverage** - SimpleCov integration
|
||||
- Command: `COVERAGE=1 bin/rails test`
|
||||
- Coverage report: `coverage/index.html`
|
||||
|
||||
### Security Features Implemented
|
||||
|
||||
#### Authentication
|
||||
- [x] Secure password storage (bcrypt with Rails defaults)
|
||||
- [x] TOTP 2FA with backup codes
|
||||
- [x] WebAuthn/Passkey support (FIDO2)
|
||||
- [x] Session management with device tracking
|
||||
- [x] Session revocation (individual and bulk)
|
||||
- [x] Remember me with configurable expiry
|
||||
- [x] Account invitation flow with expiring tokens
|
||||
- [x] Password reset with expiring tokens
|
||||
|
||||
#### OIDC Security
|
||||
- [x] Authorization code flow with PKCE support
|
||||
- [x] Refresh token rotation
|
||||
- [x] Token family tracking (detects replay attacks)
|
||||
- [x] All tokens HMAC-SHA256 hashed in database
|
||||
- [x] Configurable token expiry (access, refresh, ID)
|
||||
- [x] One-time use authorization codes
|
||||
- [x] Pairwise subject identifiers (privacy)
|
||||
- [x] ID tokens signed with RS256
|
||||
- [x] Token revocation endpoint (RFC 7009)
|
||||
- [x] Proper `at_hash` validation
|
||||
- [x] OIDC standard claims (auth_time, acr, azp)
|
||||
- [x] Automatic cleanup of expired tokens
|
||||
|
||||
#### Access Control
|
||||
- [x] Group-based authorization
|
||||
- [x] Application-level access control
|
||||
- [x] Admin vs. regular user roles
|
||||
- [x] User status management (active, disabled, pending)
|
||||
- [x] TOTP enforcement per-user
|
||||
- [x] ForwardAuth policy enforcement
|
||||
|
||||
#### Input Validation
|
||||
- [x] Strong parameter filtering
|
||||
- [x] URL validation for redirect URIs and landing URLs
|
||||
- [x] Email validation and normalization
|
||||
- [x] Slug validation (alphanumeric + hyphens)
|
||||
- [x] Domain pattern validation for ForwardAuth
|
||||
- [x] JSON parsing with error handling
|
||||
- [x] File upload validation (type, size for app icons)
|
||||
|
||||
#### Output Encoding
|
||||
- [x] HTML escaping by default (Rails 8)
|
||||
- [x] JSON encoding for API responses
|
||||
- [x] JWT encoding for ID tokens
|
||||
- [x] Proper content types for responses
|
||||
|
||||
#### Session Security
|
||||
- [x] Secure, httponly cookies
|
||||
- [x] SameSite cookie attribute
|
||||
- [x] Session timeout
|
||||
- [x] IP and User-Agent tracking
|
||||
- [x] CSRF protection
|
||||
|
||||
#### Cryptography
|
||||
- [x] SecureRandom for tokens
|
||||
- [x] bcrypt for passwords
|
||||
- [x] HMAC-SHA256 for token hashing
|
||||
- [x] RS256 for JWT signing
|
||||
- [x] Proper secret management (Rails credentials)
|
||||
|
||||
## Testing
|
||||
|
||||
### Test Coverage
|
||||
- [x] **341 tests** across integration, model, controller, service, and system tests
|
||||
- [x] **1349 assertions**
|
||||
- [x] **0 failures, 0 errors**
|
||||
|
||||
### Test Categories
|
||||
- [x] Integration tests (invitation flow, forward auth, WebAuthn, session security)
|
||||
- [x] Model tests (OIDC tokens, users, applications, groups, authorization codes)
|
||||
- [x] Controller tests (TOTP, sessions, passwords, OIDC flows, input validation)
|
||||
- [x] Service tests (JWT generation and validation)
|
||||
- [x] System tests (forward auth, WebAuthn security)
|
||||
|
||||
### Security-Critical Test Coverage
|
||||
- [x] OIDC authorization code flow
|
||||
- [x] PKCE flow
|
||||
- [x] Refresh token rotation
|
||||
- [x] Token replay attack detection
|
||||
- [x] Access control (group-based)
|
||||
- [x] Input validation
|
||||
- [x] Session security
|
||||
- [x] WebAuthn credential handling
|
||||
- [x] TOTP validation
|
||||
|
||||
## Code Quality
|
||||
|
||||
- [x] **RuboCop** - Code style and linting
|
||||
- Configuration: Rails Omakase
|
||||
- CI: Runs on every PR and push to main
|
||||
|
||||
- [x] **Documentation** - Comprehensive README
|
||||
- Feature documentation
|
||||
- Setup instructions
|
||||
- Configuration guide
|
||||
- Rails console guide
|
||||
- API/protocol documentation
|
||||
|
||||
## Production Readiness
|
||||
|
||||
### Configuration
|
||||
- [ ] Review all environment variables
|
||||
- [ ] Document required vs. optional configuration
|
||||
- [ ] Provide sensible defaults
|
||||
- [ ] Validate production SMTP configuration
|
||||
- [ ] Ensure OIDC private key generation process is documented
|
||||
|
||||
### Database
|
||||
- [x] Migrations are idempotent
|
||||
- [x] Indexes on foreign keys
|
||||
- [x] Proper constraints and validations
|
||||
- [x] SQLite production-ready (Rails 8)
|
||||
|
||||
### Performance
|
||||
- [ ] Review N+1 queries
|
||||
- [ ] Add database indexes where needed
|
||||
- [ ] Test with realistic data volumes
|
||||
- [ ] Review token cleanup job performance
|
||||
|
||||
### Deployment
|
||||
- [x] Docker support
|
||||
- [x] Docker Compose example
|
||||
- [ ] Production deployment guide
|
||||
- [ ] Backup and restore documentation
|
||||
- [ ] Migration strategy documentation
|
||||
|
||||
## Security Hardening
|
||||
|
||||
### Headers & CSP
|
||||
- [ ] Review Content Security Policy
|
||||
- [ ] HSTS configuration
|
||||
- [ ] X-Frame-Options
|
||||
- [ ] X-Content-Type-Options
|
||||
- [ ] Referrer-Policy
|
||||
|
||||
### Rate Limiting
|
||||
- [ ] Login attempt rate limiting
|
||||
- [ ] API endpoint rate limiting
|
||||
- [ ] Token endpoint rate limiting
|
||||
- [ ] Password reset rate limiting
|
||||
|
||||
### Secrets Management
|
||||
- [x] No secrets in code
|
||||
- [x] Rails credentials for sensitive data
|
||||
- [ ] Document secret rotation process
|
||||
- [ ] Document OIDC key rotation process
|
||||
|
||||
### Logging & Monitoring
|
||||
- [x] Sentry integration (optional)
|
||||
- [ ] Document what should be logged
|
||||
- [ ] Document what should NOT be logged (tokens, passwords)
|
||||
- [ ] Audit log for admin actions
|
||||
|
||||
## Known Limitations & Risks
|
||||
|
||||
### Documented Risks
|
||||
- [ ] Document that ForwardAuth requires same-domain setup
|
||||
- [ ] Document HTTPS requirement for production
|
||||
- [ ] Document backup code security (single-use, store securely)
|
||||
- [ ] Document admin password security requirements
|
||||
|
||||
### Future Security Enhancements
|
||||
- [ ] Rate limiting on authentication endpoints
|
||||
- [ ] Account lockout after N failed attempts
|
||||
- [ ] Admin audit logging
|
||||
- [ ] Security event notifications
|
||||
- [ ] Brute force detection
|
||||
- [ ] Suspicious login detection
|
||||
- [ ] IP allowlist/blocklist
|
||||
|
||||
## External Security Review
|
||||
|
||||
- [ ] Consider bug bounty or security audit
|
||||
- [ ] Penetration testing for OIDC flows
|
||||
- [ ] WebAuthn implementation review
|
||||
- [ ] Token security review
|
||||
|
||||
## Documentation for Users
|
||||
|
||||
- [ ] Security best practices guide
|
||||
- [ ] Incident response guide
|
||||
- [ ] Backup and disaster recovery guide
|
||||
- [ ] Upgrade guide
|
||||
- [ ] Breaking change policy
|
||||
|
||||
## Beta Release Criteria
|
||||
|
||||
To move from "experimental" to "Beta", the following must be completed:
|
||||
|
||||
**Critical (Required for Beta):**
|
||||
- [x] All automated security scans passing
|
||||
- [x] All tests passing
|
||||
- [x] Core features implemented and tested
|
||||
- [x] Basic documentation complete
|
||||
- [ ] At least one external security review or penetration test
|
||||
- [ ] Production deployment guide
|
||||
- [ ] Backup/restore documentation
|
||||
|
||||
**Important (Should have for Beta):**
|
||||
- [ ] Rate limiting on auth endpoints
|
||||
- [ ] Security headers configuration documented
|
||||
- [ ] Admin audit logging
|
||||
- [ ] Known limitations documented
|
||||
|
||||
**Nice to have (Can defer to post-Beta):**
|
||||
- [ ] Bug bounty program
|
||||
- [ ] Advanced monitoring/alerting
|
||||
- [ ] Automated security testing in CI beyond brakeman/bundler-audit
|
||||
|
||||
## Status Summary
|
||||
|
||||
**Current Status:** Pre-Beta / Experimental
|
||||
|
||||
**Strengths:**
|
||||
- ✅ Comprehensive security tooling in place
|
||||
- ✅ Strong test coverage (341 tests, 1349 assertions)
|
||||
- ✅ Modern security features (PKCE, token rotation, WebAuthn)
|
||||
- ✅ Clean security scans (brakeman, bundler-audit)
|
||||
- ✅ Well-documented codebase
|
||||
|
||||
**Before Beta Release:**
|
||||
- 🔶 External security review recommended
|
||||
- 🔶 Rate limiting implementation needed
|
||||
- 🔶 Production deployment documentation
|
||||
- 🔶 Security hardening checklist completion
|
||||
|
||||
**Recommendation:** Consider Beta status after:
|
||||
1. External security review or penetration testing
|
||||
2. Rate limiting implementation
|
||||
3. Production hardening documentation
|
||||
4. 1-2 months of real-world testing
|
||||
|
||||
---
|
||||
|
||||
Last updated: 2026-01-01
|
||||
154
docs/security-todo.md
Normal file
154
docs/security-todo.md
Normal file
@@ -0,0 +1,154 @@
|
||||
# Security Status
|
||||
|
||||
**Last Audit:** 2025-12-31
|
||||
**Target Users:** Self-hosters, small businesses
|
||||
|
||||
> **Beta Release Criteria:** See [beta-checklist.md](beta-checklist.md) for overall release readiness assessment.
|
||||
>
|
||||
> This document demonstrates our proactive approach to security through systematic vulnerability tracking and remediation.
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
| Phase | Status | Description |
|
||||
|-------|--------|-------------|
|
||||
| Phase 1-2 | ✅ Complete | Rate limiting, security headers, tests |
|
||||
| Phase 3 | ✅ Complete | Critical fixes (token DoS, plaintext storage, fail-open) |
|
||||
| Phase 4 | ✅ Complete | High priority (PKCE, WebAuthn, email re-auth, TOTP encryption) |
|
||||
| Phase 5 | 🟡 In Progress | Security enhancements |
|
||||
| Phase 6 | ⏳ Optional | Hardening & documentation |
|
||||
|
||||
---
|
||||
|
||||
## Outstanding Security Issues
|
||||
|
||||
---
|
||||
|
||||
### MEDIUM - Account Lockout Mechanism
|
||||
|
||||
**Files:** `app/controllers/sessions_controller.rb`, `app/models/user.rb`
|
||||
**Impact:** Brute force attack mitigation
|
||||
|
||||
**Implementation:**
|
||||
- Add `failed_login_attempts` and `locked_until` columns to users
|
||||
- Progressive delays: 5 attempts → 5s, 10 → 1min, 15 → 15min, 20+ → 1hr
|
||||
- Admin notification on lockout
|
||||
- Configurable via `MAX_LOGIN_ATTEMPTS` ENV
|
||||
|
||||
---
|
||||
|
||||
### MEDIUM - Per-Account Rate Limiting
|
||||
|
||||
**Files:** `app/controllers/sessions_controller.rb`, `config/initializers/rack_attack.rb`
|
||||
**Impact:** Distributed brute force prevention
|
||||
|
||||
**Current:** Global rate limiting only
|
||||
**Needed:** Add per-email rate limiting (10 failed attempts/email/hour)
|
||||
|
||||
---
|
||||
|
||||
### LOW - WebAuthn Clone Detection Action
|
||||
|
||||
**File:** `app/controllers/sessions_controller.rb:252-256`
|
||||
**Impact:** Cloned credential detection
|
||||
|
||||
**Current:** Logs warning on suspicious sign count
|
||||
**Improvement:** Block authentication, notify user/admin
|
||||
|
||||
---
|
||||
|
||||
## Configuration Choices (Not Vulnerabilities)
|
||||
|
||||
These are policy decisions for self-hosters, not security bugs:
|
||||
|
||||
| Item | Default | Notes |
|
||||
|------|---------|-------|
|
||||
| Session cookie domain | Root domain | Enables SSO across subdomains. Add `SECURE_SUBDOMAIN_ISOLATION` ENV to disable |
|
||||
| CSP policy | unsafe-inline, unsafe-eval | Required for Stimulus/Turbo. Audit JS to remove if needed |
|
||||
| Logout redirect validation | Allows query params | Per OAuth 2.0 spec. Document behavior |
|
||||
| Invitation token lifetime | 24 hours | Add `INVITATION_TOKEN_LIFETIME` ENV for high-security deployments |
|
||||
| Password minimum length | 8 chars | Add `PASSWORD_MIN_LENGTH` ENV, consider zxcvbn |
|
||||
| Admin self-demotion check | String comparison | Minor - use `.to_i` for integer comparison |
|
||||
|
||||
---
|
||||
|
||||
## Completed Fixes
|
||||
|
||||
### Phase 3 - Critical (December 2025)
|
||||
|
||||
**1. Token Lookup DoS** ✅
|
||||
- Problem: O(n) BCrypt comparisons on token lookup
|
||||
- Solution: HMAC-based token prefix for O(1) indexed lookup
|
||||
- Files: `token_prefixable.rb`, token models, migration
|
||||
|
||||
**2. Plaintext Token Storage** ✅
|
||||
- Problem: Access tokens stored in plaintext
|
||||
- Solution: Removed `token` column, use BCrypt digest only
|
||||
- Files: Migration, fixtures, tests
|
||||
|
||||
**3. Forward Auth Fail-Open** ✅
|
||||
- Problem: Unmatched domains allowed by default
|
||||
- Solution: Changed to fail-closed (403 for unconfigured domains)
|
||||
- Files: `forward_auth_controller.rb`
|
||||
|
||||
---
|
||||
|
||||
### Phase 4 - High Priority (December 2025)
|
||||
|
||||
**4. PKCE Enforcement** ✅
|
||||
- Problem: PKCE was optional
|
||||
- Solution: Per-app PKCE with mandatory enforcement for public clients
|
||||
- Files: Application model, OIDC controller, migration
|
||||
|
||||
**5. WebAuthn Info Disclosure** ✅
|
||||
- Problem: `/webauthn/check` leaked user_id and preferred_method
|
||||
- Solution: Minimal response, rate limiting (10/min), identical responses for non-existent users
|
||||
- Files: `webauthn_controller.rb`
|
||||
|
||||
**6. OIDC State URL Encoding** ✅
|
||||
- Problem: State parameter not consistently URL-encoded
|
||||
- Solution: `CGI.escape()` on all redirect URLs
|
||||
- Files: `oidc_controller.rb` (4 locations)
|
||||
|
||||
**7. Email Change Re-authentication** ✅
|
||||
- Problem: Email could be changed without password
|
||||
- Solution: Require current password for email changes
|
||||
- Files: `profiles_controller.rb`, view
|
||||
|
||||
**12. TOTP Secret Encryption** ✅
|
||||
- Problem: TOTP secrets stored in plaintext
|
||||
- Solution: Rails `encrypts` with keys derived from SECRET_KEY_BASE
|
||||
- Files: `user.rb`, `active_record_encryption.rb`
|
||||
|
||||
**13. WebAuthn Credential ID Enumeration** ✅
|
||||
- Problem: Global credential lookup allowed enumeration via 404 vs 403 responses
|
||||
- Solution: Scoped credential lookup to current user, identical responses
|
||||
- Files: `webauthn_controller.rb`, `webauthn_credential_enumeration_test.rb`
|
||||
|
||||
---
|
||||
|
||||
## Security Strengths
|
||||
|
||||
- **Token security:** HMAC prefix + BCrypt, no plaintext storage
|
||||
- **Authorization codes:** Pessimistic locking, single-use enforcement
|
||||
- **Refresh tokens:** Family tracking for rotation attack detection
|
||||
- **Reserved claims:** Validation prevents claim override attacks
|
||||
- **Rate limiting:** Applied on all authentication endpoints
|
||||
- **Forward auth:** Fail-closed by default
|
||||
- **TOTP:** AES-256-GCM encryption at rest
|
||||
- **Email changes:** Require password re-authentication
|
||||
- **Credential isolation:** Scoped lookups prevent enumeration attacks
|
||||
|
||||
---
|
||||
|
||||
## Audit History
|
||||
|
||||
| Date | Event |
|
||||
|------|-------|
|
||||
| 2025-12-31 | Credential ID enumeration fix (scoped lookups) |
|
||||
| 2025-12-31 | Security review - 1 new issue found (credential enumeration) |
|
||||
| 2025-12-31 | Phase 4 completed (PKCE, WebAuthn, email re-auth, TOTP) |
|
||||
| 2025-12-30 | Phase 3 completed (token DoS, plaintext storage, fail-open) |
|
||||
| 2025-12-30 | Comprehensive security audit - 18 issues identified |
|
||||
| Earlier | Phase 1-2 completed (rate limiting, headers, tests) |
|
||||
31
lib/tasks/security.rake
Normal file
31
lib/tasks/security.rake
Normal file
@@ -0,0 +1,31 @@
|
||||
namespace :security do
|
||||
desc "Run all security checks (brakeman + bundler-audit)"
|
||||
task all: :environment do
|
||||
Rake::Task["security:brakeman"].invoke
|
||||
Rake::Task["security:bundler_audit"].invoke
|
||||
end
|
||||
|
||||
desc "Run Brakeman static security scanner"
|
||||
task brakeman: :environment do
|
||||
puts "Running Brakeman security scanner..."
|
||||
system("bin/brakeman --no-pager") || abort("Brakeman found security issues!")
|
||||
end
|
||||
|
||||
desc "Run bundler-audit to check for vulnerable dependencies"
|
||||
task bundler_audit: :environment do
|
||||
puts "Running bundler-audit..."
|
||||
system("bin/bundler-audit check --update") || abort("bundler-audit found vulnerable dependencies!")
|
||||
end
|
||||
|
||||
desc "Generate code coverage report (requires tests to be run with COVERAGE=1)"
|
||||
task :coverage do
|
||||
puts "Running tests with coverage..."
|
||||
ENV["COVERAGE"] = "1"
|
||||
system("bin/rails test") || abort("Tests failed!")
|
||||
puts "\nCoverage report generated at coverage/index.html"
|
||||
end
|
||||
end
|
||||
|
||||
# Alias for convenience
|
||||
desc "Run all security checks"
|
||||
task security: "security:all"
|
||||
@@ -1,3 +1,22 @@
|
||||
# Code coverage must be started before loading application code
|
||||
if ENV["COVERAGE"]
|
||||
require "simplecov"
|
||||
SimpleCov.start "rails" do
|
||||
add_filter "/test/"
|
||||
add_filter "/config/"
|
||||
add_filter "/vendor/"
|
||||
|
||||
add_group "Models", "app/models"
|
||||
add_group "Controllers", "app/controllers"
|
||||
add_group "Services", "app/services"
|
||||
add_group "Jobs", "app/jobs"
|
||||
add_group "Mailers", "app/mailers"
|
||||
|
||||
# Minimum coverage thresholds (can be adjusted)
|
||||
# minimum_coverage 90
|
||||
end
|
||||
end
|
||||
|
||||
ENV["RAILS_ENV"] ||= "test"
|
||||
require_relative "../config/environment"
|
||||
require "rails/test_help"
|
||||
@@ -6,7 +25,8 @@ require_relative "test_helpers/session_test_helper"
|
||||
module ActiveSupport
|
||||
class TestCase
|
||||
# Run tests in parallel with specified workers
|
||||
parallelize(workers: :number_of_processors)
|
||||
# Disable parallelization when running coverage (SimpleCov incompatible with parallel tests)
|
||||
parallelize(workers: :number_of_processors) unless ENV["COVERAGE"]
|
||||
|
||||
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
|
||||
fixtures :all
|
||||
|
||||
Reference in New Issue
Block a user