- Introduced endpoints for user management, including CRUD operations, pagination, and password management. - Added new schema validations for user updates, password strength, pagination, and standardized error responses. - Integrated custom exception handling for a consistent API error experience. - Refined CORS settings: restricted methods and allowed headers, added header exposure, and preflight caching. - Optimized database: added indexes on `is_active` and `is_superuser` fields, updated column types, enforced constraints, and set defaults. - Updated `Dockerfile` to improve security by using a non-root user and adding a health check for the application. - Enhanced tests for database initialization, user operations, and exception handling to ensure better coverage.
1 line
54 KiB
JSON
1 line
54 KiB
JSON
{"meta": {"format": 3, "version": "7.11.0", "timestamp": "2025-10-30T08:46:39.770690", "branch_coverage": false, "show_contexts": false}, "files": {"app/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/alembic/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/alembic/env.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 30, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 30, "excluded_lines": 0}, "missing_lines": [1, 2, 3, 5, 6, 8, 11, 13, 16, 17, 20, 24, 28, 29, 33, 36, 39, 51, 52, 59, 60, 63, 70, 76, 77, 81, 82, 85, 86, 88], "excluded_lines": [], "functions": {"run_migrations_offline": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [51, 52, 59, 60], "excluded_lines": []}, "run_migrations_online": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [70, 76, 77, 81, 82], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 21, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 21, "excluded_lines": 0}, "missing_lines": [1, 2, 3, 5, 6, 8, 11, 13, 16, 17, 20, 24, 28, 29, 33, 36, 39, 63, 85, 86, 88], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 30, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 30, "excluded_lines": 0}, "missing_lines": [1, 2, 3, 5, 6, 8, 11, 13, 16, 17, 20, 24, 28, 29, 33, 36, 39, 51, 52, 59, 60, 63, 70, 76, 77, 81, 82, 85, 86, 88], "excluded_lines": []}}}, "app/alembic/versions/38bf9e7e74b3_add_all_initial_models.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 14, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 14, "excluded_lines": 0}, "missing_lines": [8, 10, 11, 12, 15, 16, 17, 18, 21, 23, 37, 42, 44, 45], "excluded_lines": [], "functions": {"upgrade": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [23, 37], "excluded_lines": []}, "downgrade": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [44, 45], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 10, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 10, "excluded_lines": 0}, "missing_lines": [8, 10, 11, 12, 15, 16, 17, 18, 21, 42], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 14, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 14, "excluded_lines": 0}, "missing_lines": [8, 10, 11, 12, 15, 16, 17, 18, 21, 23, 37, 42, 44, 45], "excluded_lines": []}}}, "app/alembic/versions/7396957cbe80_initial_empty_migration.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 11, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 11, "excluded_lines": 0}, "missing_lines": [8, 10, 11, 15, 16, 17, 18, 21, 22, 25, 26], "excluded_lines": [], "functions": {"upgrade": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [22], "excluded_lines": []}, "downgrade": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [26], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0}, "missing_lines": [8, 10, 11, 15, 16, 17, 18, 21, 25], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 11, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 11, "excluded_lines": 0}, "missing_lines": [8, 10, 11, 15, 16, 17, 18, 21, 22, 25, 26], "excluded_lines": []}}}, "app/alembic/versions/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/api/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/api/dependencies/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/api/dependencies/auth.py": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 10, 13, 16, 33, 35, 38, 39, 40, 45, 46, 51, 53, 54, 59, 60, 67, 82, 83, 87, 90, 105, 106, 110, 113, 136, 151, 152, 154, 155, 156, 157, 158, 159, 160, 161], "summary": {"covered_lines": 42, "num_statements": 48, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [126, 127, 129, 130, 131, 133], "excluded_lines": [], "functions": {"get_current_user": {"executed_lines": [33, 35, 38, 39, 40, 45, 46, 51, 53, 54, 59, 60], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "get_current_active_user": {"executed_lines": [82, 83, 87], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "get_current_superuser": {"executed_lines": [105, 106, 110], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "get_optional_token": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [126, 127, 129, 130, 131, 133], "excluded_lines": []}, "get_optional_current_user": {"executed_lines": [151, 152, 154, 155, 156, 157, 158, 159, 160, 161], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 10, 13, 16, 67, 90, 113, 136], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 3, 4, 5, 6, 8, 9, 10, 13, 16, 33, 35, 38, 39, 40, 45, 46, 51, 53, 54, 59, 60, 67, 82, 83, 87, 90, 105, 106, 110, 113, 136, 151, 152, 154, 155, 156, 157, 158, 159, 160, 161], "summary": {"covered_lines": 42, "num_statements": 48, "percent_covered": 87.5, "percent_covered_display": "88", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [126, 127, 129, 130, 131, 133], "excluded_lines": []}}}, "app/api/main.py": {"executed_lines": [1, 3, 5, 6], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 3, 5, 6], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 3, 5, 6], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/api/routes/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/api/routes/auth.py": {"executed_lines": [2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 22, 24, 25, 28, 31, 32, 33, 44, 45, 46, 47, 48, 49, 61, 62, 63, 74, 76, 79, 80, 81, 88, 89, 90, 92, 94, 95, 97, 98, 112, 113, 114, 161, 162, 163, 174, 175, 176, 177, 178, 179, 184, 185, 186, 199, 200, 201, 213, 214, 221, 222, 223, 224, 225, 237, 238, 239, 248], "summary": {"covered_lines": 70, "num_statements": 96, "percent_covered": 72.91666666666667, "percent_covered_display": "73", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [53, 54, 55, 103, 105, 106, 125, 126, 128, 129, 136, 139, 144, 145, 146, 147, 148, 153, 154, 155, 191, 192, 193, 229, 230, 231], "excluded_lines": [], "functions": {"register_user": {"executed_lines": [44, 45, 46, 47, 48, 49], "summary": {"covered_lines": 6, "num_statements": 9, "percent_covered": 66.66666666666667, "percent_covered_display": "67", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [53, 54, 55], "excluded_lines": []}, "login": {"executed_lines": [74, 76, 79, 80, 81, 88, 89, 90, 92, 94, 95, 97, 98], "summary": {"covered_lines": 13, "num_statements": 16, "percent_covered": 81.25, "percent_covered_display": "81", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [103, 105, 106], "excluded_lines": []}, "login_oauth": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 14, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 14, "excluded_lines": 0}, "missing_lines": [125, 126, 128, 129, 136, 139, 144, 145, 146, 147, 148, 153, 154, 155], "excluded_lines": []}, "refresh_token": {"executed_lines": [174, 175, 176, 177, 178, 179, 184, 185, 186], "summary": {"covered_lines": 9, "num_statements": 12, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [191, 192, 193], "excluded_lines": []}, "change_password": {"executed_lines": [213, 214, 221, 222, 223, 224, 225], "summary": {"covered_lines": 7, "num_statements": 10, "percent_covered": 70.0, "percent_covered_display": "70", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [229, 230, 231], "excluded_lines": []}, "get_current_user_info": {"executed_lines": [248], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 22, 24, 25, 28, 31, 32, 33, 61, 62, 63, 112, 113, 114, 161, 162, 163, 199, 200, 201, 237, 238, 239], "summary": {"covered_lines": 34, "num_statements": 34, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 22, 24, 25, 28, 31, 32, 33, 44, 45, 46, 47, 48, 49, 61, 62, 63, 74, 76, 79, 80, 81, 88, 89, 90, 92, 94, 95, 97, 98, 112, 113, 114, 161, 162, 163, 174, 175, 176, 177, 178, 179, 184, 185, 186, 199, 200, 201, 213, 214, 221, 222, 223, 224, 225, 237, 238, 239, 248], "summary": {"covered_lines": 70, "num_statements": 96, "percent_covered": 72.91666666666667, "percent_covered_display": "73", "missing_lines": 26, "excluded_lines": 0}, "missing_lines": [53, 54, 55, 103, 105, 106, 125, 126, 128, 129, 136, 139, 144, 145, 146, 147, 148, 153, 154, 155, 191, 192, 193, 229, 230, 231], "excluded_lines": []}}}, "app/core/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/core/auth.py": {"executed_lines": [1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 17, 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 37, 39, 42, 44, 47, 63, 64, 66, 69, 78, 79, 82, 88, 91, 105, 108, 110, 118, 124, 127, 143, 144, 151, 152, 155, 156, 159, 160, 162, 164, 165, 166, 167, 171, 181, 182, 183, 185], "summary": {"covered_lines": 57, "num_statements": 59, "percent_covered": 96.61016949152543, "percent_covered_display": "97", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [106, 168], "excluded_lines": [], "functions": {"verify_password": {"executed_lines": [39], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "get_password_hash": {"executed_lines": [44], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "create_access_token": {"executed_lines": [63, 64, 66, 69, 78, 79, 82, 88], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "create_refresh_token": {"executed_lines": [105, 108, 110, 118, 124], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [106], "excluded_lines": []}, "decode_token": {"executed_lines": [143, 144, 151, 152, 155, 156, 159, 160, 162, 164, 165, 166, 167], "summary": {"covered_lines": 13, "num_statements": 14, "percent_covered": 92.85714285714286, "percent_covered_display": "93", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [168], "excluded_lines": []}, "get_token_data": {"executed_lines": [181, 182, 183, 185], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 17, 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 37, 42, 47, 91, 127, 171], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AuthError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "TokenExpiredError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "TokenInvalidError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "TokenMissingClaimError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 17, 20, 21, 22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 37, 39, 42, 44, 47, 63, 64, 66, 69, 78, 79, 82, 88, 91, 105, 108, 110, 118, 124, 127, 143, 144, 151, 152, 155, 156, 159, 160, 162, 164, 165, 166, 167, 171, 181, 182, 183, 185], "summary": {"covered_lines": 57, "num_statements": 59, "percent_covered": 96.61016949152543, "percent_covered_display": "97", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [106, 168], "excluded_lines": []}}}, "app/core/config.py": {"executed_lines": [1, 2, 3, 4, 7, 8, 9, 10, 13, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 32, 33, 34, 36, 37, 43, 44, 45, 46, 49, 54, 55, 56, 59, 62, 66, 71, 72, 73, 76, 77, 79, 80, 81, 86, 87, 92, 95, 97, 98, 99, 101, 102, 104, 105, 108, 109, 110, 116, 117, 118, 120, 121, 125, 127, 135], "summary": {"covered_lines": 66, "num_statements": 67, "percent_covered": 98.50746268656717, "percent_covered_display": "99", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [93], "excluded_lines": [], "functions": {"Settings.database_url": {"executed_lines": [43, 44, 45, 46], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Settings.validate_secret_key": {"executed_lines": [76, 77, 79, 80, 81, 86, 87, 92, 95], "summary": {"covered_lines": 9, "num_statements": 10, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [93], "excluded_lines": []}, "Settings.validate_superuser_password": {"executed_lines": [101, 102, 104, 105, 108, 109, 110, 116, 117, 118, 120, 121, 125], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 7, 8, 9, 10, 13, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 32, 33, 34, 36, 37, 49, 54, 55, 56, 59, 62, 66, 71, 72, 73, 97, 98, 99, 127, 135], "summary": {"covered_lines": 40, "num_statements": 40, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"Settings": {"executed_lines": [43, 44, 45, 46, 76, 77, 79, 80, 81, 86, 87, 92, 95, 101, 102, 104, 105, 108, 109, 110, 116, 117, 118, 120, 121, 125], "summary": {"covered_lines": 26, "num_statements": 27, "percent_covered": 96.29629629629629, "percent_covered_display": "96", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [93], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 7, 8, 9, 10, 13, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 32, 33, 34, 36, 37, 49, 54, 55, 56, 59, 62, 66, 71, 72, 73, 97, 98, 99, 127, 135], "summary": {"covered_lines": 40, "num_statements": 40, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/core/database.py": {"executed_lines": [2, 3, 4, 5, 6, 7, 9, 12, 15, 16, 17, 19, 20, 21, 24, 27, 28, 51, 52, 55], "summary": {"covered_lines": 20, "num_statements": 24, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [56, 57, 58, 60], "excluded_lines": [], "functions": {"compile_jsonb_sqlite": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "compile_uuid_sqlite": {"executed_lines": [21], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "create_production_engine": {"executed_lines": [28], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "get_db": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [56, 57, 58, 60], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 5, 6, 7, 9, 12, 15, 16, 19, 20, 24, 27, 51, 52, 55], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [2, 3, 4, 5, 6, 7, 9, 12, 15, 16, 17, 19, 20, 21, 24, 27, 28, 51, 52, 55], "summary": {"covered_lines": 20, "num_statements": 24, "percent_covered": 83.33333333333333, "percent_covered_display": "83", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [56, 57, 58, 60], "excluded_lines": []}}}, "app/crud/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/crud/base.py": {"executed_lines": [1, 2, 3, 4, 5, 7, 8, 9, 12, 13, 20, 22, 23, 25, 28, 30, 38, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 58, 59, 60, 61, 62], "summary": {"covered_lines": 32, "num_statements": 39, "percent_covered": 82.05128205128206, "percent_covered_display": "82", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [31, 32, 33, 34, 35, 36, 49], "excluded_lines": [], "functions": {"CRUDBase.__init__": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "CRUDBase.get": {"executed_lines": [23], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "CRUDBase.get_multi": {"executed_lines": [28], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "CRUDBase.create": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 6, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 6, "excluded_lines": 0}, "missing_lines": [31, 32, 33, 34, 35, 36], "excluded_lines": []}, "CRUDBase.update": {"executed_lines": [45, 46, 47, 50, 51, 52, 53, 54, 55, 56], "summary": {"covered_lines": 10, "num_statements": 11, "percent_covered": 90.9090909090909, "percent_covered_display": "91", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [49], "excluded_lines": []}, "CRUDBase.remove": {"executed_lines": [59, 60, 61, 62], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 5, 7, 8, 9, 12, 13, 22, 25, 30, 38, 58], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CRUDBase": {"executed_lines": [20, 23, 28, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 59, 60, 61, 62], "summary": {"covered_lines": 17, "num_statements": 24, "percent_covered": 70.83333333333333, "percent_covered_display": "71", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [31, 32, 33, 34, 35, 36, 49], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 5, 7, 8, 9, 12, 13, 22, 25, 30, 38, 58], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/crud/user.py": {"executed_lines": [2, 3, 4, 5, 6, 7, 10, 11, 12, 14, 15, 24, 25, 26, 27, 29, 36, 39, 42, 46, 48, 49, 51, 52, 56], "summary": {"covered_lines": 25, "num_statements": 28, "percent_covered": 89.28571428571429, "percent_covered_display": "89", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [37, 43, 44], "excluded_lines": [], "functions": {"CRUDUser.get_by_email": {"executed_lines": [12], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "CRUDUser.create": {"executed_lines": [15, 24, 25, 26, 27], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "CRUDUser.update": {"executed_lines": [36, 39, 42, 46], "summary": {"covered_lines": 4, "num_statements": 7, "percent_covered": 57.142857142857146, "percent_covered_display": "57", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [37, 43, 44], "excluded_lines": []}, "CRUDUser.is_active": {"executed_lines": [49], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "CRUDUser.is_superuser": {"executed_lines": [52], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 5, 6, 7, 10, 11, 14, 29, 48, 51, 56], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"CRUDUser": {"executed_lines": [12, 15, 24, 25, 26, 27, 36, 39, 42, 46, 49, 52], "summary": {"covered_lines": 12, "num_statements": 15, "percent_covered": 80.0, "percent_covered_display": "80", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [37, 43, 44], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 5, 6, 7, 10, 11, 14, 29, 48, 51, 56], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/init_db.py": {"executed_lines": [2, 3, 4, 5, 6, 7, 8, 10, 13, 21, 22, 24, 25, 30, 32, 34, 35, 36, 39, 47, 48, 50, 52, 53, 54, 57], "summary": {"covered_lines": 26, "num_statements": 38, "percent_covered": 68.42105263157895, "percent_covered_display": "68", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [59, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 76], "excluded_lines": [], "functions": {"init_db": {"executed_lines": [21, 22, 24, 25, 30, 32, 34, 35, 36, 39, 47, 48, 50, 52, 53, 54], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 5, 6, 7, 8, 10, 13, 57], "summary": {"covered_lines": 10, "num_statements": 22, "percent_covered": 45.45454545454545, "percent_covered_display": "45", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [59, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 76], "excluded_lines": []}}, "classes": {"": {"executed_lines": [2, 3, 4, 5, 6, 7, 8, 10, 13, 21, 22, 24, 25, 30, 32, 34, 35, 36, 39, 47, 48, 50, 52, 53, 54, 57], "summary": {"covered_lines": 26, "num_statements": 38, "percent_covered": 68.42105263157895, "percent_covered_display": "68", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [59, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 76], "excluded_lines": []}}}, "app/main.py": {"executed_lines": [1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 23, 25, 26, 33, 34, 37, 47, 48, 50, 53, 56, 59, 62, 66, 69, 72, 74, 77, 78, 79, 93, 101, 113, 121, 124, 125, 126, 127, 131, 132, 133, 134, 138, 139, 141, 147], "summary": {"covered_lines": 52, "num_statements": 53, "percent_covered": 98.11320754716981, "percent_covered_display": "98", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [63], "excluded_lines": [], "functions": {"add_security_headers": {"executed_lines": [50, 53, 56, 59, 62, 66, 69, 72, 74], "summary": {"covered_lines": 9, "num_statements": 10, "percent_covered": 90.0, "percent_covered_display": "90", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [63], "excluded_lines": []}, "root": {"executed_lines": [79], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "health_check": {"executed_lines": [113, 121, 124, 125, 126, 127, 131, 132, 133, 134, 138, 139, 141], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 23, 25, 26, 33, 34, 37, 47, 48, 77, 78, 93, 101, 147], "summary": {"covered_lines": 29, "num_statements": 29, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 23, 25, 26, 33, 34, 37, 47, 48, 50, 53, 56, 59, 62, 66, 69, 72, 74, 77, 78, 79, 93, 101, 113, 121, 124, 125, 126, 127, 131, 132, 133, 134, 138, 139, 141, 147], "summary": {"covered_lines": 52, "num_statements": 53, "percent_covered": 98.11320754716981, "percent_covered_display": "98", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [63], "excluded_lines": []}}}, "app/models/__init__.py": {"executed_lines": [1, 6, 7, 10, 11], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 6, 7, 10, 11], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 6, 7, 10, 11], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/models/base.py": {"executed_lines": [1, 2, 4, 5, 8, 11, 12, 13, 14, 18, 19, 20], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [1, 2, 4, 5, 8, 11, 12, 13, 14, 18, 19, 20], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"TimestampMixin": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "UUIDMixin": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 8, 11, 12, 13, 14, 18, 19, 20], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/models/user.py": {"executed_lines": [1, 2, 4, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"User.__repr__": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"User": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 19], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/schemas/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/schemas/users.py": {"executed_lines": [2, 3, 4, 5, 7, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 31, 32, 33, 35, 37, 39, 41, 44, 45, 46, 47, 48, 49, 50, 51, 52, 56, 60, 68, 70, 74, 78, 81, 84, 85, 86, 87, 88, 89, 91, 94, 95, 96, 97, 98, 99, 101, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, 116, 117, 118, 121, 122, 123, 126, 127, 128, 130, 131, 132, 143, 144, 145, 148, 149], "summary": {"covered_lines": 85, "num_statements": 100, "percent_covered": 85.0, "percent_covered_display": "85", "missing_lines": 15, "excluded_lines": 0}, "missing_lines": [36, 38, 40, 53, 57, 71, 75, 79, 134, 135, 136, 137, 138, 139, 140], "excluded_lines": [], "functions": {"UserBase.validate_phone_number": {"executed_lines": [19, 20, 22, 23, 24], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "UserCreate.password_strength": {"executed_lines": [35, 37, 39, 41], "summary": {"covered_lines": 4, "num_statements": 7, "percent_covered": 57.142857142857146, "percent_covered_display": "57", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [36, 38, 40], "excluded_lines": []}, "UserUpdate.validate_phone_number": {"executed_lines": [52, 56, 60, 68, 70, 74, 78, 81], "summary": {"covered_lines": 8, "num_statements": 13, "percent_covered": 61.53846153846154, "percent_covered_display": "62", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [53, 57, 71, 75, 79], "excluded_lines": []}, "PasswordReset.password_strength": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [134, 135, 136, 137, 138, 139, 140], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 5, 7, 10, 11, 12, 13, 14, 16, 17, 18, 27, 28, 29, 31, 32, 33, 44, 45, 46, 47, 48, 49, 50, 51, 84, 85, 86, 87, 88, 89, 91, 94, 95, 96, 97, 98, 99, 101, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, 116, 117, 118, 121, 122, 123, 126, 127, 128, 130, 131, 132, 143, 144, 145, 148, 149], "summary": {"covered_lines": 68, "num_statements": 68, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"UserBase": {"executed_lines": [19, 20, 22, 23, 24], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "UserCreate": {"executed_lines": [35, 37, 39, 41], "summary": {"covered_lines": 4, "num_statements": 7, "percent_covered": 57.142857142857146, "percent_covered_display": "57", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [36, 38, 40], "excluded_lines": []}, "UserUpdate": {"executed_lines": [52, 56, 60, 68, 70, 74, 78, 81], "summary": {"covered_lines": 8, "num_statements": 13, "percent_covered": 61.53846153846154, "percent_covered_display": "62", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [53, 57, 71, 75, 79], "excluded_lines": []}, "UserInDB": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "UserResponse": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Token": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "TokenPayload": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "TokenData": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "PasswordReset": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [134, 135, 136, 137, 138, 139, 140], "excluded_lines": []}, "LoginRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RefreshTokenRequest": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 5, 7, 10, 11, 12, 13, 14, 16, 17, 18, 27, 28, 29, 31, 32, 33, 44, 45, 46, 47, 48, 49, 50, 51, 84, 85, 86, 87, 88, 89, 91, 94, 95, 96, 97, 98, 99, 101, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, 116, 117, 118, 121, 122, 123, 126, 127, 128, 130, 131, 132, 143, 144, 145, 148, 149], "summary": {"covered_lines": 68, "num_statements": 68, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/services/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/services/auth_service.py": {"executed_lines": [2, 3, 4, 6, 8, 16, 17, 19, 22, 23, 24, 27, 28, 30, 31, 43, 45, 46, 48, 49, 51, 52, 54, 56, 57, 69, 70, 71, 74, 77, 87, 88, 89, 91, 93, 94, 105, 112, 117, 121, 126, 127, 142, 144, 146, 149, 150, 153, 154, 155, 158, 160, 161, 162, 164, 165, 181, 182, 183, 186, 187, 190, 191, 193], "summary": {"covered_lines": 62, "num_statements": 62, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AuthService.authenticate_user": {"executed_lines": [43, 45, 46, 48, 49, 51, 52, 54], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AuthService.create_user": {"executed_lines": [69, 70, 71, 74, 77, 87, 88, 89, 91], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AuthService.create_tokens": {"executed_lines": [105, 112, 117, 121], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AuthService.refresh_tokens": {"executed_lines": [142, 144, 146, 149, 150, 153, 154, 155, 158, 160, 161, 162], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AuthService.change_password": {"executed_lines": [181, 182, 183, 186, 187, 190, 191, 193], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 6, 8, 16, 17, 19, 22, 23, 24, 27, 28, 30, 31, 56, 57, 93, 94, 126, 127, 164, 165], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AuthenticationError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AuthService": {"executed_lines": [43, 45, 46, 48, 49, 51, 52, 54, 69, 70, 71, 74, 77, 87, 88, 89, 91, 105, 112, 117, 121, 142, 144, 146, 149, 150, 153, 154, 155, 158, 160, 161, 162, 181, 182, 183, 186, 187, 190, 191, 193], "summary": {"covered_lines": 41, "num_statements": 41, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [2, 3, 4, 6, 8, 16, 17, 19, 22, 23, 24, 27, 28, 30, 31, 56, 57, 93, 94, 126, 127, 164, 165], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/utils/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "app/utils/auth_test_utils.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 27, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 27, "excluded_lines": 0}, "missing_lines": [5, 7, 8, 9, 11, 12, 15, 35, 36, 39, 42, 43, 44, 47, 50, 67, 70, 73, 88, 91, 94, 107, 110, 120, 127, 128, 129], "excluded_lines": [], "functions": {"create_test_auth_client": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [35, 36, 39, 42, 43, 44, 47], "excluded_lines": []}, "create_test_optional_auth_client": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [67, 70], "excluded_lines": []}, "create_test_superuser_client": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [88, 91], "excluded_lines": []}, "create_test_unauthenticated_client": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [107], "excluded_lines": []}, "cleanup_test_client_auth": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 4, "excluded_lines": 0}, "missing_lines": [120, 127, 128, 129], "excluded_lines": []}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 11, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 11, "excluded_lines": 0}, "missing_lines": [5, 7, 8, 9, 11, 12, 15, 50, 73, 94, 110], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 27, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 27, "excluded_lines": 0}, "missing_lines": [5, 7, 8, 9, 11, 12, 15, 35, 36, 39, 42, 43, 44, 47, 50, 67, 70, 73, 88, 91, 94, 107, 110, 120, 127, 128, 129], "excluded_lines": []}}}, "app/utils/security.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 30, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 30, "excluded_lines": 1}, "missing_lines": [8, 9, 10, 11, 12, 13, 15, 18, 38, 46, 49, 54, 60, 61, 63, 66, 85, 87, 88, 91, 92, 95, 96, 100, 101, 104, 105, 107, 109, 110], "excluded_lines": [67], "functions": {"create_upload_token": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 7, "excluded_lines": 0}, "missing_lines": [38, 46, 49, 54, 60, 61, 63], "excluded_lines": []}, "verify_upload_token": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 14, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 14, "excluded_lines": 1}, "missing_lines": [85, 87, 88, 91, 92, 95, 96, 100, 101, 104, 105, 107, 109, 110], "excluded_lines": [67]}, "": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 9, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 9, "excluded_lines": 0}, "missing_lines": [8, 9, 10, 11, 12, 13, 15, 18, 66], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 30, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 30, "excluded_lines": 1}, "missing_lines": [8, 9, 10, 11, 12, 13, 15, 18, 38, 46, 49, 54, 60, 61, 63, 66, 85, 87, 88, 91, 92, 95, 96, 100, 101, 104, 105, 107, 109, 110], "excluded_lines": [67]}}}, "app/utils/test_utils.py": {"executed_lines": [1, 2, 3, 4, 5, 7, 9, 11, 13, 20, 22, 25, 28, 31, 38, 40, 43, 46, 48, 59, 77], "summary": {"covered_lines": 21, "num_statements": 29, "percent_covered": 72.41379310344827, "percent_covered_display": "72", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [50, 56, 61, 63, 64, 66, 74, 79], "excluded_lines": [], "functions": {"get_test_engine": {"executed_lines": [13, 20], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "setup_test_db": {"executed_lines": [25, 28, 31, 38], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "teardown_test_db": {"executed_lines": [43, 46], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "get_async_test_engine": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 2, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [50, 56], "excluded_lines": []}, "setup_async_test_db": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 5, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 5, "excluded_lines": 0}, "missing_lines": [61, 63, 64, 66, 74], "excluded_lines": []}, "teardown_async_test_db": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 1, "percent_covered": 0.0, "percent_covered_display": "0", "missing_lines": 1, "excluded_lines": 0}, "missing_lines": [79], "excluded_lines": []}, "": {"executed_lines": [1, 2, 3, 4, 5, 7, 9, 11, 22, 40, 48, 59, 77], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 3, 4, 5, 7, 9, 11, 13, 20, 22, 25, 28, 31, 38, 40, 43, 46, 48, 59, 77], "summary": {"covered_lines": 21, "num_statements": 29, "percent_covered": 72.41379310344827, "percent_covered_display": "72", "missing_lines": 8, "excluded_lines": 0}, "missing_lines": [50, 56, 61, 63, 64, 66, 74, 79], "excluded_lines": []}}}}, "totals": {"covered_lines": 591, "num_statements": 788, "percent_covered": 75.0, "percent_covered_display": "75", "missing_lines": 197, "excluded_lines": 1}} |