Generated as part of Issue 1.1 — Audit Existing Test Coverage. This document records the baseline coverage numbers and identifies gaps to address before refactoring begins.
| Metric | Value |
|---|---|
| Line Coverage | 80.88% (1,696 / 2,097 relevant lines) |
| Branch Coverage | 80.59% (245 / 304 branches) |
| Test Count | 570 examples, 0 failures |
Coverage was collected with SimpleCov (~> 0.22.0) using COVERAGE=true bundle exec rake spec. The configuration lives in spec/spec_helper.rb and tracks
all files under lib/**/*.rb, with branch coverage enabled.
To regenerate this report locally:
COVERAGE=true bundle exec rake spec
# HTML report → coverage/index.html
# Machine-readable → coverage/.resultset.jsonThese files are never exercised by the current test suite.
| File | Relevant Lines | Notes |
|---|---|---|
lib/generators/sorcery/helpers.rb |
35 | Generator helper methods |
lib/generators/sorcery/install_generator.rb |
69 | Install generator logic |
lib/generators/sorcery/templates/initializer.rb |
7 | Template file |
lib/generators/sorcery/templates/migration/activity_logging.rb |
9 | Migration template |
lib/generators/sorcery/templates/migration/brute_force_protection.rb |
8 | Migration template |
lib/generators/sorcery/templates/migration/core.rb |
10 | Migration template |
lib/generators/sorcery/templates/migration/external.rb |
10 | Migration template |
lib/generators/sorcery/templates/migration/magic_login.rb |
8 | Migration template |
lib/generators/sorcery/templates/migration/remember_me.rb |
7 | Migration template |
lib/generators/sorcery/templates/migration/reset_password.rb |
9 | Migration template |
lib/generators/sorcery/templates/migration/user_activation.rb |
8 | Migration template |
lib/sorcery/adapters/mongoid_adapter.rb |
89 | Slated for removal in V1 (Active Record only) |
lib/sorcery/version.rb |
3 | Version constant |
| File | Line Coverage | Branch Coverage | Key Gaps |
|---|---|---|---|
lib/sorcery/providers/linkedin.rb |
31.6 % (12/38) | 0.0 % (0/4) | process_callback, get_user_hash, authorize_url untested |
lib/sorcery/providers/heroku.rb |
32.1 % (9/28) | 0.0 % (0/4) | process_callback, get_user_hash untested |
lib/sorcery/test_helpers/rails/request.rb |
45.5 % (5/11) | 100 % | login_user/logout_user helpers untested |
lib/sorcery/test_helpers/rails/integration.rb |
46.2 % (6/13) | 100 % | login_user/logout_user helpers untested |
lib/sorcery/providers/line.rb |
59.3 % (16/27) | 0.0 % (0/4) | process_callback, get_user_hash untested |
lib/sorcery/model/submodules/external.rb |
✅ All methods now tested (Stage 1.2) | ||
lib/sorcery/providers/jira.rb |
73.1 % (19/26) | 0.0 % (0/2) | process_callback, get_user_hash untested |
| File | Line Coverage | Branch Coverage | Key Gaps |
|---|---|---|---|
lib/sorcery/crypto_providers/bcrypt.rb |
80.6 % (25/31) | 25.0 % (1/4) | cost default, matches? edge case (nil/empty hash), reset method |
lib/sorcery/test_helpers/internal.rb |
84.2 % (32/38) | 100 % | Mongoid-related helpers untested (Mongoid slated for removal in V1) |
lib/sorcery/providers/github.rb |
86.2 % (25/29) | 50.0 % (3/6) | get_user_hash with organizations check |
lib/sorcery/protocols/oauth.rb |
87.5 % (14/16) | 100 % | One-time callback URL creation flow |
lib/sorcery/controller/submodules/external.rb |
89.5 % (94/105) | 72.2 % (13/18) | create_from_provider, build_from_provider, access_token accessor |
lib/sorcery.rb |
90.6 % (58/64) | 50.0 % (3/6) | Mongoid adapter loading path (slated for removal in V1), user_class error path |
lib/sorcery/providers/base.rb |
90.5 % (19/21) | 80.0 % (8/10) | Edge cases in auth_hash and original_callback_url |
lib/sorcery/test_helpers/rails/controller.rb |
91.7 % (11/12) | 100 % | One untested helper method |
lib/sorcery/adapters/active_record_adapter.rb |
92.6 % (50/54) | 70.0 % (7/10) | define_field length parameter, username_id_mapping edge case |
lib/sorcery/protocols/oauth2.rb |
93.3 % (14/15) | 100 % | One-time callback URL creation flow |
lib/sorcery/adapters/base_adapter.rb |
93.8 % (15/16) | 100 % | One NotImplementedError method |
lib/sorcery/controller/submodules/http_basic_auth.rb |
94.1 % (32/34) | 76.9 % (10/13) | Failed-auth realm response branch |
lib/sorcery/controller.rb |
94.6 % (87/92) | 95.8 % (23/24) | auto_login, after_login_lock callback, invalid user_class error |
lib/sorcery/controller/submodules/remember_me.rb |
94.9 % (37/39) | 87.5 % (7/8) | force_forget_me! path |
lib/sorcery/controller/config.rb |
95.2 % (20/21) | 83.3 % (5/6) | Safe-navigation edge case |
| File | Line Coverage | Branch Coverage |
|---|---|---|
lib/sorcery/crypto_providers/aes256.rb |
95.5 % (21/22) | 100 % |
lib/sorcery/test_helpers/internal/rails.rb |
96.4 % (27/28) | 100 % |
lib/sorcery/providers/instagram.rb |
96.7 % (29/30) | 50.0 % |
lib/sorcery/model/config.rb |
100 % | 100 % |
lib/sorcery/model.rb |
100 % | 100 % |
lib/sorcery/model/submodules/magic_login.rb |
100 % | 100 % |
lib/sorcery/model/submodules/reset_password.rb |
100 % | 100 % |
lib/sorcery/errors.rb |
100 % | 100 % |
lib/sorcery/model/temporary_token.rb |
100 % | 100 % |
lib/sorcery/model/submodules/user_activation.rb |
100 % | 100 % |
lib/sorcery/model/submodules/remember_me.rb |
100 % | 100 % |
lib/sorcery/model/submodules/activity_logging.rb |
100 % | 100 % |
lib/sorcery/model/submodules/brute_force_protection.rb |
100 % | 100 % |
lib/sorcery/controller/submodules/session_timeout.rb |
100 % | 85.7 % |
lib/sorcery/controller/submodules/brute_force_protection.rb |
100 % | 75.0 % |
lib/sorcery/controller/submodules/activity_logging.rb |
100 % | 90.0 % |
lib/sorcery/crypto_providers/common.rb |
100 % | 100 % |
lib/sorcery/crypto_providers/md5.rb |
100 % | 100 % |
lib/sorcery/crypto_providers/sha1.rb |
100 % | 100 % |
lib/sorcery/crypto_providers/sha256.rb |
100 % | 100 % |
lib/sorcery/crypto_providers/sha512.rb |
100 % | 100 % |
lib/sorcery/engine.rb |
100 % | 50.0 % |
| All remaining providers (VK, Facebook, Twitter, Google, Salesforce, PayPal, Slack, WeChat, Microsoft, Auth0, Discord, BattleNet) | 100 % | 50–100 % |
| Category | Lines Covered | Line Coverage | Priority |
|---|---|---|---|
| Generators | 0 / 180 | 0.0 % | Low — templates rarely change |
| Adapters | 65 / 159 | 40.9 % | Low — Mongoid adapter (0 %) is slated for removal in V1; only Active Record adapter needs coverage |
| Test Helpers | 81 / 102 | 79.4 % | Low — only used internally |
| Providers | 550 / 627 | 87.7 % | Medium — LinkedIn, Heroku, LINE, Jira have gaps |
| Other (sorcery.rb, version, errors) | 74 / 83 | 89.2 % | Low |
| Protocols (OAuth/OAuth2) | 28 / 31 | 90.3 % | Medium |
| Controller Submodules | 250 / 265 | 94.3 % | High — security-critical |
| Controller (Core) | 107 / 113 | 94.7 % | High — authentication core |
| Model Submodules | ✅ Complete — password/token handling | ||
| Model (Core) | ✅ Complete — password hashing core | ||
| Crypto Providers | 130 / 134 | 97.0 % | High — password hashing |
The following code paths are security-sensitive and must have complete test coverage before any refactoring begins.
Current coverage: 94.6 % line, 95.8 % branch
| Method / Path | Status | Gap |
|---|---|---|
login / authenticate |
✅ Covered | — |
logout |
✅ Covered | — |
logged_in? / current_user |
✅ Covered | — |
require_login (before_action) |
✅ Covered | — |
auto_login(user) |
Line 97 — sets @current_user without session |
|
login_user(user) (internal) |
✅ Covered | — |
after_login_lock callbacks |
Line 182 — callbacks after account lock | |
Invalid user_class error |
Line 188 — ArgumentError raise path |
Current coverage: BCrypt 80.6 %, all others 95–100 %
| Method / Path | Status | Gap |
|---|---|---|
BCrypt.encrypt |
✅ Covered | — |
BCrypt.matches? |
nil/empty hash edge case (lines 77–81) not tested | |
BCrypt.cost (default) |
Line 55 — default cost value | |
BCrypt.reset |
Line 99 — resets cost to nil | |
AES256.encrypt / matches? |
✅ Covered | — |
SHA1/256/512.encrypt / matches? |
✅ Covered | — |
MD5.encrypt / matches? |
✅ Covered | — |
Common shared module |
✅ Covered | — |
Current coverage: Session timeout 100 %, Remember Me 94.9 %
| Method / Path | Status | Gap |
|---|---|---|
Session creation (session[:user_id]) |
✅ Covered | — |
Session destruction (reset_sorcery_session) |
✅ Covered | — |
session_timeout (expiry check) |
✅ Covered | — |
remember_me (cookie set/auto-login) |
✅ Covered | — |
force_forget_me! path |
Lines 43–44 — forced session invalidation | |
remember_me_token cookie domain |
✅ Covered | — |
Current coverage: 100 % line, 100 % branch ✅
Current coverage: 100 % line, 100 % branch ✅
Current coverage: Model 100 % line/branch ✅, Controller 100 % (75 % branch)
Current coverage: Model 100 % ✅, Controller 89.5 %
Current coverage: 100 % line, 100 % branch ✅
Based on this audit, the following areas should be prioritized:
-
External/OAuth model submodule (67.4 %)— ✅ Completed in Stage 1.2 All model methods now at 100% line and branch coverage. -
BCrypt crypto provider (80.6 %) — The
matches?edge case with nil/empty hashes and thecost/resetmethods need tests. -
Controller external submodule (89.5 %) —
create_from_providerandbuild_from_providercontroller helpers need integration tests. -
OAuth providers — LinkedIn (31.6 %), Heroku (32.1 %), LINE (59.3 %), and Jira (73.1 %) have significant gaps in their
process_callbackandget_user_hashmethods. -
Controller core (94.6 %) —
auto_login,after_login_lockcallbacks, and the invaliduser_classerror path should be tested. -
Generator tests (0 %) — While low priority for refactoring safety, the install generator and migration templates are completely untested.