Test Report

Run ID: 26129738867-py3.12 • Generated: 2026-05-19 22:44:24 • Duration: 117.14s
Plugin: v0.2.1 (a03dbe622cdc018f89b74731aed91adf1a582867) [dirty]
Repo: v0.2.1 (2a88727b06f5a1dcbf1fc5bede7192229a3bb73f)
93.04%
Total Coverage
623
Total Tests
623
Passed
0
Failed
0
Skipped
0
XFailed
0
XPassed
0
Errors

Source Coverage

File Stmts Miss Cover % Covered Lines Missed Lines
src/pytest_llm_report/_git_info.py 2 0 2 100.0% 2-3 -
src/pytest_llm_report/aggregation.py 121 6 115 95.04% 13, 15-19, 21, 36, 39, 45, 47, 53-54, 56-58, 60, 62-65, 70, 74-75, 78-81, 85, 88-90, 94, 104, 110, 113-115, 117-121, 123-124, 129, 131-132, 134-135, 138-139, 145-147, 149, 152, 155, 158, 160, 162, 176, 178, 182, 184, 186, 196, 198-202, 204-205, 208, 210, 219, 231, 233-247, 249, 251, 259-260, 262-263, 265, 267-269, 273, 276-277, 279-280, 283, 285-286, 288, 290-291, 295 67, 91-92, 111, 206, 217
src/pytest_llm_report/cache.py 47 3 44 93.62% 13, 15-19, 21, 27, 33, 39-41, 43, 53, 55-56, 58, 60-62, 68-69, 78, 86, 88, 90, 92, 94, 97, 103, 107, 118-119, 121, 123, 129, 132-136, 141, 144, 153 64-65, 130
src/pytest_llm_report/collector.py 111 1 110 99.1% 19, 21-22, 24, 26-27, 33-34, 45-50, 52, 58, 60-62, 69, 78-79, 81, 90, 93-94, 96, 99-104, 106-107, 109-112, 114-119, 121-122, 124, 127-128, 130, 132-133, 135-137, 140-141, 143, 155, 163-164, 167-169, 171, 173, 181-182, 185-189, 191, 198-200, 202, 209-210, 212-214, 216, 218, 227-228, 230-236, 238, 241, 250-252, 254, 261, 264-265, 268-269, 271, 277, 279, 285 239
src/pytest_llm_report/context_util.py 53 3 50 94.34% 13-15, 18, 27, 29-31, 33, 35-36, 38-41, 47-49, 51-52, 55-59, 61-62, 64, 66-69, 72, 81-82, 86, 88-90, 93, 96, 108, 111, 124, 126-127, 129-130, 133, 135 53, 83-84
src/pytest_llm_report/coverage_map.py 135 6 129 95.56% 13, 15-17, 19-22, 30, 38, 44-45, 47, 58-60, 64, 72-73, 83, 86, 88-90, 92, 94-96, 98, 101-104, 106-108, 114, 116, 118, 121-122, 127-128, 131-135, 137-140, 144-146, 148, 150, 152-153, 156, 160-162, 165, 167-168, 173, 176, 178-184, 187-189, 191, 196, 199-200, 202, 204, 216-217, 220, 224-225, 228-234, 236, 239, 241, 243-244, 246-250, 252-254, 257, 259-260, 263-264, 271, 273-274, 276-279, 281-283, 285, 299-300, 302, 308 62, 123, 125, 157, 221, 251
src/pytest_llm_report/errors.py 36 0 36 100.0% 8-9, 12, 25-28, 31-36, 39-42, 45-46, 49-51, 54-55, 64-66, 68, 70, 73, 77-79, 83, 132, 142 -
src/pytest_llm_report/llm/__init__.py 3 0 3 100.0% 4-5, 7 -
src/pytest_llm_report/llm/annotator.py 154 21 133 86.36% 4, 6-10, 12-15, 21-22, 25-30, 33, 47-48, 50-52, 56, 58-59, 65, 67-68, 70, 73-74, 76, 84, 86-90, 95-96, 98-99, 106-107, 112-113, 116, 121-126, 130, 132, 134, 137, 144, 156, 181-182, 184, 186, 188-189, 199, 211, 213-216, 221-223, 226, 249-252, 254-255, 260, 262, 264-267, 269-270, 277-279, 281, 283-284, 289-290, 292-293, 298-301, 303, 306, 329-332, 334, 336, 342, 344, 350-351, 353-354, 356-359, 361-362, 367-368, 370, 376-379, 381 77-81, 160-168, 173, 286-287, 345, 364-365, 371
src/pytest_llm_report/llm/base.py 131 6 125 95.42% 13, 15-18, 20, 30, 33, 47, 50, 53, 59, 65-66, 68, 87-88, 96, 101, 103, 105, 128, 134-135, 137-138, 149, 155, 157, 163, 165, 174, 176, 185-186, 188, 191-198, 200, 202, 212, 214-217, 219-222, 224, 232, 243, 245, 247, 264, 266-267, 270-272, 274-275, 277, 279, 283, 286, 290-291, 294-295, 298-299, 305, 307-308, 310, 312, 314, 316, 325-326, 329-331, 333-334, 337-339, 342-347, 351, 353, 359-360, 363-364, 367-369, 372, 384, 386, 388-389, 391-392, 394, 396-397, 399, 401-402, 404, 406 91-92, 230, 284, 292, 296
src/pytest_llm_report/llm/batching.py 90 4 86 95.56% 8, 10-13, 20, 23-24, 27-29, 31-32, 34, 36-37, 39, 44, 53-55, 58, 67-68, 70, 73, 92-93, 95, 97, 103-106, 108-110, 112, 122-123, 126-128, 136, 139, 156-157, 160, 162, 164-167, 170-176, 181-185, 187-188, 190, 192-194, 196-197, 203-206, 209-210, 213-214, 216-218, 222, 224 158, 207, 211, 220
src/pytest_llm_report/llm/gemini.py 325 7 318 97.85% 7, 9-13, 15-16, 23-27, 30-34, 37-42, 44-46, 48-50, 52, 57-63, 65-70, 72-73, 75-78, 80-85, 87-89, 91-97, 99-114, 121-122, 125, 128, 134-135, 137-141, 143-144, 146, 164-166, 173-175, 178, 181-182, 184, 186-189, 191-192, 198-206, 208-210, 212-213, 215, 218, 221-230, 232-233, 235-237, 239-243, 246-247, 249-252, 254-255, 259, 261, 263, 268, 272-276, 279-281, 283, 288-293, 295, 299-305, 308-309, 311-312, 318-319, 322, 326, 332-333, 335, 339-343, 345-349, 352-353, 358-359, 366-367, 369, 383, 385-386, 390, 410, 413-415, 418-422, 424-427, 432, 434-435, 437, 441-444, 446, 449-463, 469, 471-473, 475-478, 480, 486, 488-491, 493, 495, 497-498, 502-508, 511, 514-516, 518-521, 523-528, 534, 537, 539-543, 547-548, 550-559, 562-564, 567-570, 574 115-117, 298, 310, 313-314
src/pytest_llm_report/llm/litellm_provider.py 77 1 76 98.7% 8, 10, 12-13, 21, 31, 37-38, 41-42, 44, 51, 60-62, 64, 82-83, 89, 92, 95-96, 98, 100-101, 104, 106-107, 112, 114, 116, 120, 122, 124-126, 129-130, 132, 135, 137, 139, 141-142, 144, 148, 170, 182-183, 186-188, 190, 192-193, 196-198, 204, 206, 211, 213, 215, 221-222, 224, 227-231, 234, 236, 242-243, 245 207
src/pytest_llm_report/llm/noop.py 13 0 13 100.0% 8, 10, 12-13, 20, 26, 32, 34, 51, 53, 59, 61, 67 -
src/pytest_llm_report/llm/ollama.py 72 1 71 98.61% 7, 9, 11-12, 18, 24, 42-43, 49, 52-53, 55, 58, 60-61, 63-67, 70, 74-77, 83, 85-86, 92, 94, 96-98, 100-101, 103, 107, 113-114, 116-118, 122, 128, 130, 138, 140, 142-144, 149-150, 156, 158, 160-162, 165-167, 172-173, 178, 180, 190, 192-193, 204, 209, 211-212 90
src/pytest_llm_report/llm/schemas.py 36 1 35 97.22% 8, 10-12, 16, 22, 38, 42-44, 46-47, 50-53, 55, 58-59, 62-65, 67-68, 77, 84, 90, 94-98, 102, 130 39
src/pytest_llm_report/llm/token_refresh.py 71 0 71 100.0% 7, 9-14, 17, 20, 23-24, 36-39, 41-43, 47, 59-60, 63-66, 69-72, 74, 83, 85-88, 90-91, 93, 101-103, 107-109, 111, 113-116, 120, 132-136, 139-140, 143-145, 148-150, 153-156, 158, 160-162 -
src/pytest_llm_report/llm/utils.py 33 2 31 93.94% 4, 6, 9, 20, 23, 42-43, 46-47, 51-53, 55-56, 66, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 90, 93-94, 96, 98 48, 78
src/pytest_llm_report/models.py 253 0 253 100.0% 17-18, 20, 23, 26-27, 36-38, 40, 42, 49-50, 59-61, 63, 65, 72-73, 86-92, 94, 96, 107-108, 120-126, 128, 130, 135-143, 146-147, 169-185, 187-188, 190, 192, 194, 201-224, 227-228, 236-237, 239, 241, 247-248, 257-259, 261, 263, 270-271, 280-282, 284, 286, 290-292, 295-296, 333-362, 364-372, 374, 376, 394-417, 419-437, 440-441, 455-463, 465, 467, 477-479, 482-483, 500-510, 512, 518, 520, 526-540 -
src/pytest_llm_report/options.py 268 57 211 78.73% 122, 170, 199, 202-204, 209-211, 217-219, 225-227, 233-235, 241-242, 245-254, 257-259, 265-267, 271-274, 276, 284, 293, 308, 311-312, 320-325, 327, 332-337, 340-345, 348-349, 352-353, 356-357, 360-369, 372-375, 378-393, 396-397, 400-405, 408-409, 412-413, 416-421, 426-427, 430-431, 436-439, 444-447, 449, 451, 453, 460-461, 463-464, 466-467, 470-475, 479, 482-495, 498, 502-503, 507, 510, 514-515, 519-520, 524, 527, 531, 534-536, 540-541, 545-546, 550, 553, 557, 560, 564-565, 569, 572-574, 578, 581-584, 587, 591-592, 596, 599-608, 611, 613 13-15, 21-22, 98-102, 105-107, 110-115, 118-121, 138-139, 142-149, 152-155, 158-160, 163-166, 169, 180-184, 187-188, 191, 193, 278, 287, 296
src/pytest_llm_report/plugin.py 182 24 158 86.81% 41, 44, 50, 56, 62, 68, 74, 81, 90, 96, 102, 108, 114, 122, 128, 134, 142, 148, 155, 161, 169, 176, 185, 192, 199, 208, 215, 223, 229, 235, 241, 247, 254, 260, 268, 274, 283, 289, 297, 304, 311, 328, 332, 336, 342-343, 346-347, 349, 351, 354-356, 362-363, 371-372, 399-400, 403-404, 407, 410-411, 413-414, 417-418, 420, 422-426, 429-430, 432, 434, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-466, 468, 470-473, 476-477, 485-487, 491-494, 497, 499, 502-507, 509, 512-514, 516-521, 523, 534-535, 558-559, 562-563, 566-568, 579-580, 583, 586-587, 590-592, 602-603, 606-608, 619-620, 623, 626, 628-629 13, 15-18, 20-21, 23, 29-32, 35, 319, 377, 481-482, 488, 548-549, 571, 595, 611-612
src/pytest_llm_report/prompts.py 110 3 107 97.27% 13, 15-17, 24, 27, 33, 35, 49, 52, 55, 58-61, 63, 65, 67, 78-79, 82-84, 86-87, 92, 94-95, 98-101, 103-112, 114, 116, 118, 139-140, 142-144, 147, 152-153, 155-157, 159-161, 163-164, 166-167, 170-171, 173, 177, 180, 189, 192-194, 196-197, 201, 203, 216-217, 219-220, 223-228, 231-232, 235-237, 239-240, 242-247, 249, 251, 268, 275, 284-287 80, 185, 233
src/pytest_llm_report/render.py 65 6 59 90.77% 13, 15-16, 18, 24, 30-31, 34, 40, 42, 50-51, 53, 56, 65-67, 70, 79, 87, 90, 99, 101-102, 107, 110, 121-124, 126-129, 131-134, 140-142, 147, 155-157, 159, 172-177, 191, 210-211, 224, 267, 269, 285 148-149, 212, 217-218, 222
src/pytest_llm_report/report_writer.py 167 3 164 98.2% 13, 15-25, 27-29, 46, 55, 58, 67-68, 76, 83-84, 89, 98-100, 102, 105-108, 110, 113, 116, 127-128, 130, 142, 150, 156-158, 160, 186-189, 192, 197-199, 202-203, 211, 222-223, 226-227, 230-231, 233, 235, 254, 256-259, 262-264, 266, 268, 310, 319, 321-322, 324-335, 337, 339, 347, 350-352, 355-356, 359-361, 364, 367, 375, 383, 385-386, 389, 392, 395, 398, 406, 408-409, 415, 417, 419, 421-432, 439, 441-442, 444-446, 454-458, 460, 462, 465, 468-469, 471, 477-481, 487-488, 495, 502, 504, 506-508, 510, 513-514, 516, 522-523 135-137
src/pytest_llm_report/util/fs.py 34 1 33 97.06% 11, 13-14, 17, 30, 33, 36, 39, 42, 45, 55-56, 58-60, 63-65, 67, 70, 79, 82, 100, 103, 111-113, 116-117, 119-121, 123 40
src/pytest_llm_report/util/hashing.py 36 0 36 100.0% 12, 14-17, 23, 32, 35, 44-48, 51, 61, 64, 73-74, 76-78, 80-81, 86, 96, 103-104, 107, 113-114, 116-121 -
src/pytest_llm_report/util/ranges.py 33 0 33 100.0% 12, 15, 29-30, 33, 35-37, 39-40, 42, 45-47, 50, 52, 55, 65-67, 70, 81-82, 84-91, 93, 95 -
src/pytest_llm_report/util/time.py 16 0 16 100.0% 4, 6, 9, 15, 18, 27, 30, 39-44, 46-48 -

Per Test Details

📄 tests/test_adaptive_prompts.py 9 tests
PASSED tests/test_adaptive_prompts.py::TestComplexityEstimation::test_complex_test_high_complexity
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 17 lines (ranges: 65-66, 185, 188, 191-198, 200, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestComplexityEstimation::test_empty_source_zero_complexity
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 185-186, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestComplexityEstimation::test_simple_test_low_complexity
2ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 17 lines (ranges: 65-66, 185, 188, 191-198, 200, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestConfigValidation::test_invalid_prompt_tier
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-261, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestConfigValidation::test_valid_prompt_tiers
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 26 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestPromptTierSelection::test_auto_tier_complex_test
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 23 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-220, 222, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestPromptTierSelection::test_auto_tier_simple_test
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 23 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestPromptTierSelection::test_minimal_tier_override
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 9 lines (ranges: 65-66, 212, 214-215, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_adaptive_prompts.py::TestPromptTierSelection::test_standard_tier_override
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 10 lines (ranges: 65-66, 212, 214, 216-217, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_aggregation.py 10 tests
PASSED tests/test_aggregation.py::TestAggregator::test_aggregate_all_policy
2ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 71 lines (ranges: 53, 56-57, 60, 62-64, 74-75, 78-81, 85, 88-90, 94-101, 110, 113-114, 117-121, 123, 129, 131-132, 134-135, 138, 145, 158, 160, 162-167, 169, 171-173, 184, 231, 233-237, 249, 259, 262-263, 265, 267, 290-293, 295)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_aggregate_dir_not_exists
3ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 8 lines (ranges: 53, 56-58, 110, 113-115)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_aggregate_latest_policy
3ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 79 lines (ranges: 53, 56-57, 60, 65, 70, 74-75, 78-81, 85, 88-90, 94-101, 110, 113-114, 117-121, 123, 129, 131-132, 134-135, 138, 145, 158, 160, 162-167, 169, 171-173, 184, 196, 198-202, 204-205, 208, 231, 233-237, 249, 259, 262-263, 265, 267, 290-293, 295)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_aggregate_no_dir_configured
1ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 3 lines (ranges: 45, 53-54)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_aggregate_no_reports
1ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 10 lines (ranges: 53, 56-58, 110, 113-114, 117-118, 184)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_aggregate_with_coverage_and_llm_annotations
2ms 🛡️ 4
Coverage
src/pytest_llm_report/aggregation.py 87 lines (ranges: 53, 56-57, 60, 65, 70, 74-75, 78-81, 85, 88-90, 94-101, 110, 113-114, 117-121, 123, 129, 131-132, 134-135, 138-141, 145-147, 149-150, 152-153, 155, 158, 160, 162-167, 169, 171-173, 184, 196, 198-202, 208, 231, 233-237, 249, 259, 262-263, 265, 267, 290-293, 295)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 40 lines (ranges: 42-45, 65-68, 130-133, 135-137, 139, 141-143, 190, 194-199, 201, 203, 205, 207, 210-214, 216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_aggregate_with_source_coverage
1ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 67 lines (ranges: 53, 56-57, 60, 65, 70, 74-75, 78-81, 85, 88-90, 94-101, 110, 113-114, 117-121, 123, 129, 131-132, 162-169, 171-173, 184, 196, 198-200, 208, 231, 233-234, 249, 259, 262-263, 265, 267, 290-293, 295)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_load_coverage_from_source
2ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 19 lines (ranges: 259-260, 262-263, 265, 267-271, 273, 276-277, 279-280, 283, 285-286, 288)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_recalculate_summary
1ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 17 lines (ranges: 231, 233-247, 249)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_aggregation.py::TestAggregator::test_skips_invalid_json
2ms 🛡️ 3
Coverage
src/pytest_llm_report/aggregation.py 72 lines (ranges: 53, 56-57, 60, 65, 70, 74-75, 78-81, 85, 88-90, 94-101, 110, 113-114, 117-121, 123-124, 129, 131-132, 162-167, 169, 171-173, 176, 178-180, 182, 184, 196, 198-200, 208, 231, 233-234, 249, 259, 262-263, 265, 267, 290-293, 295)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_aggregation_maximal.py 1 tests
PASSED tests/test_aggregation_maximal.py::TestAggregationMaximal::test_recalculate_summary_coverage
1ms 🛡️ 4
Coverage
src/pytest_llm_report/aggregation.py 10 lines (ranges: 45, 231, 233-239, 249)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_annotator.py 13 tests
PASSED tests/test_annotator.py::TestAnnotateTests::test_batch_optimization_message
1ms 🛡️ 5
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 98 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-91, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-255, 257-258, 260, 262, 264, 269-274, 277-279, 281, 283-284, 289-290, 292-295, 298, 303)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_cached_progress_reporting
1ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 50 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-89, 95-96, 98-99, 106-108, 112-113, 116, 121-128, 130, 134, 156, 181-182, 184, 211, 213-219, 221, 223)
src/pytest_llm_report/llm/batching.py 18 lines (ranges: 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_cached_tests_are_skipped
1ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 95 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-87, 95-96, 98-99, 106-108, 112-113, 116, 121-124, 130, 132, 134, 137-141, 144-151, 156, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-255, 257-258, 260, 262, 264, 269-274, 277-279, 281, 283-284, 289-290, 292, 298, 303)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_concurrent_annotation
2ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 90 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-87, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188-196, 213-219, 221, 223, 329-332, 334, 336-340, 342, 344, 350-351, 353-354, 356-359, 361-362, 367-368, 370, 376, 381)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_concurrent_annotation_handles_failures
2ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 94 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-87, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188-196, 213-219, 221-223, 329-332, 334, 336-340, 342, 344, 350-351, 353-354, 356-359, 361-362, 367-368, 370, 376-379, 381)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_progress_reporting
2ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 96 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-89, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-255, 257-258, 260, 262, 264, 269-274, 277-279, 281, 283-284, 289-290, 292-295, 298, 303)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_reports_progress_messages
1ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 96 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-89, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-255, 257-258, 260, 262, 264, 269-274, 277-279, 281, 283-284, 289-290, 292-295, 298, 303)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_respects_opt_out_and_limit
1ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 91 lines (ranges: 47, 50-51, 58-59, 65, 67-68, 73-74, 76, 84, 86-87, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-255, 257-258, 260, 262, 264, 269-274, 277-279, 281, 283-284, 289-290, 292, 298, 303)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_respects_rate_limit
1ms 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 94 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-87, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-257, 260, 262, 264-267, 269-274, 277-279, 281, 283-284, 289-290, 292, 298, 303)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_sequential_annotation
12.00s 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 94 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-87, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-255, 257-258, 260, 262, 264-267, 269-274, 277-279, 281, 283-284, 289-290, 292, 298, 303)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_sequential_annotation_error_tracking
24.00s 🛡️ 6
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 98 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-87, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221-223, 249-252, 254-255, 257-258, 260, 262, 264-267, 269-274, 277-279, 281, 283-284, 289-290, 292, 298-301, 303)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_skips_if_disabled
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 2 lines (ranges: 47-48)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_annotator.py::TestAnnotateTests::test_skips_if_provider_unavailable
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/annotator.py 7 lines (ranges: 47, 50-54, 56)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_base_coverage_v2.py 2 tests
PASSED tests/test_base_coverage_v2.py::test_base_parse_response_malformed_json_after_extract
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 10 lines (ranges: 65-66, 325-326, 329-330, 333-334, 359-360)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_coverage_v2.py::test_base_parse_response_non_string_fields
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 22 lines (ranges: 65-66, 325-326, 329-330, 333-334, 337-339, 342-346, 351, 353-357)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_base_maximal.py 9 tests
PASSED tests/test_base_maximal.py::TestGetProvider::test_get_gemini_provider
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 10 lines (ranges: 65-66, 384, 386, 388, 391, 396, 401-402, 404)
src/pytest_llm_report/llm/gemini.py 9 lines (ranges: 134-135, 137-141, 143-144)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestGetProvider::test_get_invalid_provider
2ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 7 lines (ranges: 384, 386, 388, 391, 396, 401, 406)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestGetProvider::test_get_litellm_provider
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 9 lines (ranges: 65-66, 384, 386, 388, 391, 396-397, 399)
src/pytest_llm_report/llm/litellm_provider.py 3 lines (ranges: 37-38, 41)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestGetProvider::test_get_noop_provider
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 6 lines (ranges: 65-66, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestGetProvider::test_get_ollama_provider
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 384, 386, 388, 391-392, 394)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestLlmProviderDefaults::test_available_caches_result
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 6 lines (ranges: 65-66, 134-135, 137-138)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestLlmProviderDefaults::test_get_model_name_defaults_to_config
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 3 lines (ranges: 65-66, 163)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestLlmProviderDefaults::test_get_rate_limits_defaults_to_none
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 3 lines (ranges: 65-66, 155)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_base_maximal.py::TestLlmProviderDefaults::test_is_local_defaults_to_false
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 3 lines (ranges: 65-66, 174)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_batching.py 17 tests
PASSED tests/test_batching.py::TestBuildBatchPrompt::test_context_files_included
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 35 lines (ranges: 34, 39, 156-157, 160, 162, 181-185, 187-188, 190, 192-194, 196-200, 203-206, 209-210, 213-214, 216-218, 222, 224)
src/pytest_llm_report/llm/utils.py 28 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestBuildBatchPrompt::test_parametrized_batch_prompt
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 24 lines (ranges: 34, 39-40, 156-157, 160, 162, 164-168, 170-177, 187-188, 190, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestBuildBatchPrompt::test_single_test_prompt
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 15 lines (ranges: 34, 39, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestComputeSourceHash::test_consistent_hash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 2 lines (ranges: 67, 70)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestComputeSourceHash::test_different_source_different_hash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 2 lines (ranges: 67, 70)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestComputeSourceHash::test_empty_source
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 2 lines (ranges: 67-68)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestConfigValidation::test_batch_max_tests_minimum
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 27 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271-273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestConfigValidation::test_context_line_padding_non_negative
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 27 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273-274, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestConfigValidation::test_invalid_context_compression
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-269, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestConfigValidation::test_valid_context_compression
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 26 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestGetBaseNodeid::test_nested_params
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 2 lines (ranges: 53-54)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestGetBaseNodeid::test_parametrized_nodeid
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 2 lines (ranges: 53-54)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestGetBaseNodeid::test_simple_nodeid
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 2 lines (ranges: 53, 55)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestGroupTestsForBatching::test_batch_max_size_respected
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 24 lines (ranges: 53-54, 67-68, 92-93, 95, 103-106, 108-110, 122-123, 126-132, 136)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestGroupTestsForBatching::test_batching_disabled
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 6 lines (ranges: 92-93, 95, 97-99)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestGroupTestsForBatching::test_parametrized_tests_grouped
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 27 lines (ranges: 34, 39-40, 53-54, 67, 70, 92-93, 95, 103-106, 108-110, 122-123, 126-132, 136)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_batching.py::TestGroupTestsForBatching::test_single_tests_no_grouping
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/batching.py 18 lines (ranges: 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_cache.py 7 tests
PASSED tests/test_cache.py::TestHashSource::test_consistent_hash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_cache.py::TestHashSource::test_different_source_different_hash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_cache.py::TestHashSource::test_hash_length
1ms 🛡️ 3
Coverage
src/pytest_llm_report/cache.py 1 lines (ranges: 153)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_cache.py::TestLlmCache::test_clear
1ms 🛡️ 4
Coverage
src/pytest_llm_report/cache.py 26 lines (ranges: 39-41, 53, 55-56, 86, 90, 92, 94, 97-101, 103, 118-119, 121, 129, 132-136, 141)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_cache.py::TestLlmCache::test_does_not_cache_errors
1ms 🛡️ 4
Coverage
src/pytest_llm_report/cache.py 11 lines (ranges: 39-41, 53, 55-56, 86, 88, 118-119, 121)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_cache.py::TestLlmCache::test_get_missing
1ms 🛡️ 4
Coverage
src/pytest_llm_report/cache.py 9 lines (ranges: 39-41, 53, 55-56, 118-119, 121)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_cache.py::TestLlmCache::test_set_and_get
1ms 🛡️ 4
Coverage
src/pytest_llm_report/cache.py 28 lines (ranges: 39-41, 53, 55, 58, 60-62, 68-73, 86, 90, 92, 94, 97-101, 103, 118-119, 121)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_collector.py 11 tests
PASSED tests/test_collector.py::TestCollectorCollectionErrors::test_collection_error_structure
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestCollectorCollectionErrors::test_get_collection_errors_initially_empty
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 15 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 285)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestCollectorMarkerExtraction::test_llm_context_override_default_none
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestCollectorMarkerExtraction::test_llm_opt_out_default_false
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestCollectorOutputCapture::test_capture_enabled_by_default
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestCollectorOutputCapture::test_capture_max_chars_default
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestCollectorXfailHandling::test_xfail_failed_is_xfailed
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 36 lines (ranges: 90, 93-94, 96, 99, 110-112, 114-118, 124, 127, 140, 155-159, 163, 167, 171, 209-210, 212, 216, 227-228, 230-234, 238)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestCollectorXfailHandling::test_xfail_passed_is_xpassed
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 26 lines (ranges: 90, 93-94, 96, 99, 110-112, 114-115, 124, 127, 140, 155-159, 163, 167, 171, 209-210, 212-214)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestTestCollector::test_create_collector
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestTestCollector::test_get_results_sorted
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 15 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 277)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector.py::TestTestCollector::test_handle_collection_finish
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 78-79, 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_collector_maximal.py 14 tests
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_capture_output_disabled_via_handle_report
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 36 lines (ranges: 90, 93-94, 96, 99, 110-112, 114-118, 124, 127-128, 130, 140, 155-159, 163, 167, 171, 209-210, 227-228, 230-234, 238)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_capture_output_stderr
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 18 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 261, 264, 268-269)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_capture_output_stdout
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 18 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 261, 264-265, 268)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_capture_output_truncated
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 18 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 261, 264-265, 268)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_create_result_with_item_markers
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 35 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 155-159, 163-164, 167-169, 171, 181-182, 185-189, 198-200, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_extract_error_repr_crash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 22 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 227-228, 230-234, 238)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_extract_error_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 22 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 227-228, 230-234, 238)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_extract_skip_reason_fallback
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 250, 252)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_extract_skip_reason_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 250-251)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorInternals::test_extract_skip_reason_tuple
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 250-251)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorReportHandling::test_handle_collection_report_failure
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 21 lines (ranges: 58, 60-65, 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorReportHandling::test_handle_runtest_rerun
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 42 lines (ranges: 90, 93-94, 96, 99, 110-112, 114-118, 124, 127-128, 130, 140-141, 155-159, 163, 167, 171, 209-210, 227-228, 230-234, 238, 261, 264-265, 268-269)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorReportHandling::test_handle_runtest_setup_failure
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 36 lines (ranges: 90, 93-94, 96, 99-103, 109-112, 114-115, 124, 127, 140, 155-159, 163, 167, 171, 209-210, 227-228, 230-234, 238)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_collector_maximal.py::TestCollectorReportHandling::test_handle_runtest_teardown_failure
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 38 lines (ranges: 90, 93-94, 96, 99, 110-112, 114-115, 124, 127-128, 130, 132-133, 135-137, 140, 155-159, 163, 167, 171, 209-210, 227-228, 230-234, 238)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_context_compression.py 12 tests
PASSED tests/test_context_compression.py::TestConfigValidation::test_invalid_compression_mode
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-269, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_compression.py::TestConfigValidation::test_negative_padding_invalid
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 27 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273-274, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_compression.py::TestConfigValidation::test_valid_compression_modes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 26 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_compression.py::TestConfigValidation::test_zero_padding_valid
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 26 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_compression.py::TestContextCompression::test_compression_enabled_by_default
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_compression.py::TestContextCompression::test_compression_mode_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_compression.py::TestContextCompression::test_line_padding_default
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_compression.py::TestExtractCoveredLines::test_contiguous_lines_no_gap
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 23 lines (ranges: 33, 216, 219-220, 223-228, 231-232, 235-237, 239-240, 242, 244-247, 249)
PASSED tests/test_context_compression.py::TestExtractCoveredLines::test_empty_coverage
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 3 lines (ranges: 33, 216-217)
PASSED tests/test_context_compression.py::TestExtractCoveredLines::test_extract_multiple_ranges
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 24 lines (ranges: 33, 216, 219-220, 223-228, 231-232, 235-237, 239-240, 242-247, 249)
PASSED tests/test_context_compression.py::TestExtractCoveredLines::test_extract_single_line
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 23 lines (ranges: 33, 216, 219-220, 223-228, 231-232, 235-237, 239-240, 242, 244-247, 249)
PASSED tests/test_context_compression.py::TestExtractCoveredLines::test_padding_boundary
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 23 lines (ranges: 33, 216, 219-220, 223-228, 231-232, 235-237, 239-240, 242, 244-247, 249)
📄 tests/test_context_limits.py 4 tests
PASSED tests/test_context_limits.py::test_no_truncation_needed
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 24 lines (ranges: 243, 245, 264, 266, 270-272, 274, 277, 279-280, 283, 286, 290-291, 294-295, 298-299, 305, 307-308, 312, 314)
src/pytest_llm_report/llm/utils.py 28 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_limits.py::test_smart_distribution
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 25 lines (ranges: 243, 245, 264, 266, 270-272, 274, 277, 279-280, 283, 286, 290-291, 294-295, 298-299, 305, 307-308, 310, 312, 314)
src/pytest_llm_report/llm/utils.py 32 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 90-91, 93-94, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_limits.py::test_splitting_logic
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 24 lines (ranges: 243, 245, 264, 266, 270-272, 274, 277, 279-280, 283, 286, 290-291, 294-295, 298-299, 305, 307, 310, 312, 314)
src/pytest_llm_report/llm/utils.py 30 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 90-91, 93-94, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_limits.py::test_truncation_logic
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 9 lines (ranges: 243, 245, 264, 266, 270-272, 274-275)
src/pytest_llm_report/llm/utils.py 1 lines (ranges: 20)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_context_util.py 28 tests
PASSED tests/test_context_util.py::TestCollapseEmptyLines::test_collapse_three_empty_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 1 lines (ranges: 108)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestCollapseEmptyLines::test_many_empty_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 1 lines (ranges: 108)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestCollapseEmptyLines::test_preserve_two_empty_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 1 lines (ranges: 108)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestCollapseEmptyLines::test_single_newline
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 1 lines (ranges: 108)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_always_collapses_empty_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 6 lines (ranges: 108, 124, 126, 129, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_combined_optimization
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 45 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-59, 61-62, 64, 66-69, 81-82, 86, 88-90, 93, 108, 124, 126-127, 129-130, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_default_strips_docs_only
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 36 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-56, 58-59, 61-62, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_empty_source
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_source_with_only_whitespace
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_strip_both
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 44 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-56, 58-59, 61-62, 64, 66-69, 81-82, 86, 88-90, 93, 108, 124, 126-127, 129-130, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_strip_comments_only
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 14 lines (ranges: 81-82, 86, 88-90, 93, 108, 124, 126, 129-130, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestOptimizeContext::test_strip_neither
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 6 lines (ranges: 108, 124, 126, 129, 133, 135)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_comment_after_string_with_hash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_escaped_quotes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_mixed_quotes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_no_comments
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_preserve_hash_in_double_quoted_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_preserve_hash_in_single_quoted_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_strip_simple_comment
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripComments::test_strip_standalone_comment
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 7 lines (ranges: 81-82, 86, 88-90, 93)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_handles_syntax_error_gracefully
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 4 lines (ranges: 27, 29-31)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_multiple_docstrings
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 30 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-59, 61-62, 64, 66-69)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_preserves_multiline_data_strings
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 29 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-56, 58-59, 61-62, 64, 66-69)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_preserves_regular_strings
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 25 lines (ranges: 27, 29, 33, 35-36, 38-45, 49, 51-52, 55-56, 58, 61, 64, 66-69)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_preserves_strings_in_structures
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 27 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-56, 58, 61, 64, 66-69)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_strip_multiline_docstring
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 29 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-56, 58-59, 61-62, 64, 66-69)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_strip_triple_double_quoted_docstring
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 29 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-56, 58-59, 61-62, 64, 66-69)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_context_util.py::TestStripDocstrings::test_strip_triple_single_quoted_docstring
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 29 lines (ranges: 27, 29, 33, 35-36, 38-45, 47-49, 51-52, 55-56, 58-59, 61-62, 64, 66-69)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_coverage_boosters.py 3 tests
PASSED tests/test_coverage_boosters.py::TestCoverageBoosters::test_gemini_model_parsing_edge_cases
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 19 lines (ranges: 134-135, 137-141, 143-144, 476, 478, 524-531)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_boosters.py::TestCoverageBoosters::test_gemini_rate_limiter_edge_math
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 35 lines (ranges: 39-42, 45-46, 48, 52-54, 66, 68-70, 81-82, 84, 87-88, 92-93, 95-96, 100-101, 103, 105, 107-114)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_boosters.py::TestCoverageBoosters::test_models_to_dict_variants
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 47 lines (ranges: 96-103, 130-133, 135, 137-139, 141, 143, 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_coverage_map.py 7 tests
PASSED tests/test_coverage_map.py::TestCoverageMapper::test_create_mapper
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 2 lines (ranges: 44-45)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map.py::TestCoverageMapper::test_get_warnings
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 3 lines (ranges: 44-45, 308)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map.py::TestCoverageMapper::test_map_coverage_no_coverage_file
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map.py::TestCoverageMapperContextExtraction::test_extract_nodeid_all_phases
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 11 lines (ranges: 44-45, 216, 220, 224-225, 228-229, 231, 233, 236)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map.py::TestCoverageMapperContextExtraction::test_extract_nodeid_empty_context
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 4 lines (ranges: 44-45, 216-217)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map.py::TestCoverageMapperContextExtraction::test_extract_nodeid_filters_setup
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 9 lines (ranges: 44-45, 216, 220, 224-225, 228-230)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map.py::TestCoverageMapperContextExtraction::test_extract_nodeid_with_run_phase
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 11 lines (ranges: 44-45, 216, 220, 224-225, 228-229, 231, 233, 236)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_coverage_map_coverage.py 17 tests
PASSED tests/test_coverage_map_coverage.py::TestExtractContexts::test_contexts_by_lineno_exception
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 29 lines (ranges: 44-45, 118, 121-122, 127, 131-135, 137-140, 144, 148, 150, 152, 156, 160-162, 167-170, 199, 202)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116, 123)
PASSED tests/test_coverage_map_coverage.py::TestExtractContexts::test_no_measured_files
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 7 lines (ranges: 44-45, 118, 121-122, 127-128)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestExtractContexts::test_skip_non_python_files
2ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 14 lines (ranges: 44-45, 118, 121-122, 127, 131-135, 144-146)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestLoadCoverageData::test_coverage_not_installed
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 2 lines (ranges: 44-45)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestLoadCoverageData::test_no_coverage_file
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 9 lines (ranges: 44-45, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestMapSourceCoverage::test_analysis_exception_handling
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 22 lines (ranges: 44-45, 243-244, 246-248, 250, 252-254, 259, 261, 263-268, 271, 299-300)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116, 123)
PASSED tests/test_coverage_map_coverage.py::TestMapSourceCoverage::test_empty_statements
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 18 lines (ranges: 44-45, 243-244, 246-248, 250, 252-254, 259-261, 273-274, 299-300)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116, 123)
PASSED tests/test_coverage_map_coverage.py::TestMapSourceCoverage::test_include_test_files_when_not_configured
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 32 lines (ranges: 44-45, 243-244, 246-248, 250, 252, 259-261, 273, 276-279, 281-283, 285-293, 295, 299-300)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 17 lines (ranges: 30, 33, 36, 39, 42, 55, 58-60, 63-64, 100, 103, 111-112, 116, 123)
src/pytest_llm_report/util/ranges.py 13 lines (ranges: 29, 33, 35-37, 39-40, 42, 50, 52, 65-67)
PASSED tests/test_coverage_map_coverage.py::TestMapSourceCoverage::test_skip_non_python_files
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 10 lines (ranges: 44-45, 243-244, 246-249, 299-300)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestMapSourceCoverage::test_skip_test_files_when_configured
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 15 lines (ranges: 44-45, 243-244, 246-248, 250, 252-255, 257, 299-300)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116, 123)
PASSED tests/test_coverage_map_coverage.py::TestPhaseFiltering::test_extract_nodeid_all_phase_config
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 11 lines (ranges: 44-45, 216, 220, 224-225, 228-229, 231, 233, 236)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestPhaseFiltering::test_extract_nodeid_empty_string
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 4 lines (ranges: 44-45, 216-217)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestPhaseFiltering::test_extract_nodeid_none
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 4 lines (ranges: 44-45, 216-217)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestPhaseFiltering::test_extract_nodeid_run_phase_default
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 216, 220, 224-225, 228-231, 233, 236)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestPhaseFiltering::test_extract_nodeid_setup_phase_config
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 216, 220, 224-225, 228-229, 231-233, 236)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestPhaseFiltering::test_extract_nodeid_teardown_phase_config
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 216, 220, 224-225, 228-229, 231, 233-234, 236)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_coverage.py::TestPhaseFiltering::test_extract_nodeid_without_pipe
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 6 lines (ranges: 44-45, 216, 220, 224, 239)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_coverage_map_maximal.py 9 tests
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_extract_contexts_full_logic
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 57 lines (ranges: 44-45, 118, 121-122, 127, 131-135, 137-140, 144, 148, 150, 152-153, 156, 160-163, 165, 167-168, 173, 176, 178-184, 187-189, 191-194, 196, 199-200, 202, 216, 220, 224-225, 228-229, 231, 233, 236)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 17 lines (ranges: 30, 33, 36, 39, 42, 55, 58-60, 63-64, 100, 103, 111-112, 116, 123)
src/pytest_llm_report/util/ranges.py 13 lines (ranges: 29, 33, 35-37, 39-40, 42, 50, 52, 65-67)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_extract_contexts_no_contexts
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 14 lines (ranges: 44-45, 118, 121-122, 127, 131-135, 144-146)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_extract_nodeid_variants
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 14 lines (ranges: 44-45, 216, 220, 224-225, 228-229, 231-234, 236, 239)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_load_coverage_data_no_files
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 9 lines (ranges: 44-45, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_load_coverage_data_read_error
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 17 lines (ranges: 44-45, 72-73, 83, 86, 88, 92, 94-96, 107-111, 114)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_load_coverage_data_with_parallel_files
2ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 15 lines (ranges: 44-45, 72-73, 83, 86, 88, 92, 94, 98, 101-104, 106)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_map_coverage_no_data
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 5 lines (ranges: 44-45, 58-60)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_map_source_coverage_analysis_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 22 lines (ranges: 44-45, 243-244, 246-248, 250, 252-254, 259, 261, 263-268, 271, 299-300)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116, 123)
PASSED tests/test_coverage_map_maximal.py::TestCoverageMapperMaximal::test_map_source_coverage_comprehensive
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/coverage_map.py 32 lines (ranges: 44-45, 243-244, 246-248, 250, 252, 259-261, 273, 276-279, 281-283, 285-293, 295, 299-300)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 17 lines (ranges: 30, 33, 36, 39, 42, 55, 58-60, 63-64, 100, 103, 111-112, 116, 123)
src/pytest_llm_report/util/ranges.py 14 lines (ranges: 29, 33, 35-37, 39-40, 45-47, 50, 52, 65-66)
📄 tests/test_errors.py 3 tests
PASSED tests/test_errors.py::test_make_warning
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_errors.py::test_warning_code_values
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_errors.py::test_warning_to_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 8 lines (ranges: 70-71, 73-75, 77-79)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_errors_maximal.py 6 tests
PASSED tests/test_errors_maximal.py::TestMakeWarning::test_make_warning_known_code
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_errors_maximal.py::TestMakeWarning::test_make_warning_unknown_code
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_errors_maximal.py::TestMakeWarning::test_make_warning_with_detail
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_errors_maximal.py::TestWarningCodes::test_codes_are_strings
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_errors_maximal.py::TestWarningDataClass::test_warning_to_dict_no_detail
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_errors_maximal.py::TestWarningDataClass::test_warning_to_dict_with_detail
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 8 lines (ranges: 70-71, 73-75, 77-79)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_fs.py 12 tests
PASSED tests/test_fs.py::TestIsPythonFile::test_non_python_file
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 1 lines (ranges: 79)
PASSED tests/test_fs.py::TestIsPythonFile::test_python_file
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 1 lines (ranges: 79)
PASSED tests/test_fs.py::TestMakeRelative::test_makes_path_relative
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 55, 58-60, 63-64)
PASSED tests/test_fs.py::TestMakeRelative::test_returns_normalized_with_no_base
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 7 lines (ranges: 30, 33, 36, 39, 42, 55-56)
PASSED tests/test_fs.py::TestNormalizePath::test_already_normalized
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 5 lines (ranges: 30, 33, 36, 39, 42)
PASSED tests/test_fs.py::TestNormalizePath::test_forward_slashes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 5 lines (ranges: 30, 33, 36, 39, 42)
PASSED tests/test_fs.py::TestNormalizePath::test_strips_trailing_slash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 5 lines (ranges: 30, 33, 36, 39, 42)
PASSED tests/test_fs.py::TestShouldSkipPath::test_custom_exclude_patterns
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 15 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116-117, 119-121, 123)
PASSED tests/test_fs.py::TestShouldSkipPath::test_normal_path
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116, 123)
PASSED tests/test_fs.py::TestShouldSkipPath::test_skips_git
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
PASSED tests/test_fs.py::TestShouldSkipPath::test_skips_pycache
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
PASSED tests/test_fs.py::TestShouldSkipPath::test_skips_venv
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
📄 tests/test_fs_coverage.py 15 tests
PASSED tests/test_fs_coverage.py::TestIsPythonFile::test_is_python_file_false
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 1 lines (ranges: 79)
PASSED tests/test_fs_coverage.py::TestIsPythonFile::test_is_python_file_true
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 1 lines (ranges: 79)
PASSED tests/test_fs_coverage.py::TestMakeRelative::test_make_relative_path_not_under_base
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 12 lines (ranges: 30, 33, 36, 39, 42, 55, 58-60, 63, 65, 67)
PASSED tests/test_fs_coverage.py::TestMakeRelative::test_make_relative_success
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 55, 58-60, 63-64)
PASSED tests/test_fs_coverage.py::TestMakeRelative::test_make_relative_with_none_base
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 7 lines (ranges: 30, 33, 36, 39, 42, 55-56)
PASSED tests/test_fs_coverage.py::TestNormalizePath::test_normalize_path_backslashes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 5 lines (ranges: 30, 33, 36, 39, 42)
PASSED tests/test_fs_coverage.py::TestNormalizePath::test_normalize_path_path_object
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 5 lines (ranges: 30, 33, 36, 39, 42)
PASSED tests/test_fs_coverage.py::TestNormalizePath::test_normalize_path_trailing_slash
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 5 lines (ranges: 30, 33, 36, 39, 42)
PASSED tests/test_fs_coverage.py::TestShouldSkipPath::test_should_not_skip_regular_path
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 11 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116, 123)
PASSED tests/test_fs_coverage.py::TestShouldSkipPath::test_should_skip_git
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
PASSED tests/test_fs_coverage.py::TestShouldSkipPath::test_should_skip_path_starting_with_skip_dir
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
PASSED tests/test_fs_coverage.py::TestShouldSkipPath::test_should_skip_pycache
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
PASSED tests/test_fs_coverage.py::TestShouldSkipPath::test_should_skip_site_packages
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
PASSED tests/test_fs_coverage.py::TestShouldSkipPath::test_should_skip_venv
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 10 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-113)
PASSED tests/test_fs_coverage.py::TestShouldSkipPath::test_should_skip_with_exclude_patterns
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/fs.py 15 lines (ranges: 30, 33, 36, 39, 42, 100, 103, 111-112, 116-117, 119-121, 123)
📄 tests/test_gemini_provider.py 25 tests
PASSED tests/test_gemini_provider.py::TestGeminiCoverageGaps::test_annotate_loop_daily_limit_hit
3ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 22 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/gemini.py 50 lines (ranges: 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-227, 232-233, 318-320, 340, 343, 471-473)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiCoverageGaps::test_annotation_exceptions_coverage
2ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 22 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/gemini.py 100 lines (ranges: 32-34, 39-42, 45-46, 48, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-210, 221-224, 228-230, 232-233, 235-236, 239-244, 263-265, 268, 293, 295, 299-303, 318-320, 340, 343, 471-473)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiCoverageGaps::test_coverage_gaps
175ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 27 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-331)
src/pytest_llm_report/llm/gemini.py 173 lines (ranges: 39-42, 45-46, 48, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181-182, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-236, 239-244, 246, 249-250, 252, 254-255, 259, 340, 343, 346, 348-356, 358-361, 363-364, 366-367, 435, 437-439, 441-442, 449-455, 457, 459, 461-466, 471-473, 476-478, 497-498, 502-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-564, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-52, 55)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiCoverageGaps::test_parse_preferred_models_coverage
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 13 lines (ranges: 134-135, 137-141, 143-144, 524-527)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiCoverageGaps::test_prune_daily_requests
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 10 lines (ranges: 39-42, 81-82, 84, 87-89)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiCoverageGaps::test_tpm_available_fallback
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 4 lines (ranges: 39-42)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProvider::test_annotate_import_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 14 lines (ranges: 134-135, 137-141, 143-144, 164-165, 167-169)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProvider::test_annotate_no_token
2ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 22 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/gemini.py 21 lines (ranges: 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-188)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProvider::test_annotate_rate_limit_retry
4ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 19 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221)
src/pytest_llm_report/llm/gemini.py 214 lines (ranges: 32-34, 39-42, 45-46, 48, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-237, 239-244, 246, 249-250, 252, 261, 263-265, 299-300, 304-306, 308-309, 340-343, 346-349, 352-356, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413-416, 418-422, 424-425, 432, 435, 437-439, 441-444, 449-452, 463-466, 471-473, 476-478, 497-498, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569, 574)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProvider::test_annotate_success
149ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 19 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221)
src/pytest_llm_report/llm/gemini.py 208 lines (ranges: 39-42, 45-46, 48, 52-54, 66, 68-70, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-236, 239-244, 246-247, 249-252, 261, 340-343, 346-349, 352-356, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413, 418-422, 424-430, 432, 435, 437-439, 441-444, 449-452, 463-466, 471-473, 476-478, 497-498, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567-568, 574)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProvider::test_availability
2ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 12 lines (ranges: 134-135, 137-141, 143-144, 332-333, 335)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProviderDetailed::test_annotate_retry_exceptions
60.00s 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 22 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/gemini.py 111 lines (ranges: 39-42, 45-46, 48, 52-54, 73, 76-78, 81-84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-210, 221-224, 228-230, 232-233, 235-237, 239-244, 263-265, 268, 272-276, 279-281, 283-286, 288-292, 318-320, 322-323, 340, 343, 471-473)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProviderDetailed::test_annotate_retry_loop_coverage
3ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 27 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-331)
src/pytest_llm_report/llm/gemini.py 97 lines (ranges: 39-42, 45-46, 48, 52-54, 66, 68-70, 73, 76-78, 81-82, 84, 87-88, 92-94, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-210, 212-213, 215-216, 218, 222-224, 228-230, 232, 235-236, 239-244, 246-247, 249-252, 254, 259, 340, 343, 471-473)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-52, 55)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProviderDetailed::test_ensure_rate_limits_error
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 27 lines (ranges: 134-135, 137-141, 143-144, 346, 348-356, 358-361, 363-364, 366-367)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProviderDetailed::test_fetch_available_models_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 15 lines (ranges: 134-135, 137-141, 143-144, 537, 539-541, 544-545)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProviderDetailed::test_fetch_available_models_invalid_json
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 34 lines (ranges: 134-135, 137-141, 143-144, 476-477, 537, 539-543, 547-548, 550-559, 562-563, 567, 569, 574)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProviderDetailed::test_get_max_context_tokens_calls_ensure
2ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 3 lines (ranges: 65-66, 163)
src/pytest_llm_report/llm/gemini.py 15 lines (ranges: 134-135, 137-141, 143-144, 486, 488-491, 493)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiProviderDetailed::test_parse_rate_limits_types
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 24 lines (ranges: 134-135, 137-141, 143-144, 449-457, 459-460, 463-466)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiRateLimiter::test_prune_logic
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 11 lines (ranges: 39-42, 81-85, 87-88)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiRateLimiter::test_record_tokens_invalid
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 6 lines (ranges: 39-42, 66-67)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiRateLimiter::test_rpd_limit
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 18 lines (ranges: 39-42, 45-46, 48-50, 73, 76-78, 81-82, 84, 87-88)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiRateLimiter::test_rpm_limit
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 27 lines (ranges: 39-42, 45-46, 48, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-97, 100-102)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiRateLimiter::test_seconds_until_tpm_available_branches
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 18 lines (ranges: 39-42, 100-101, 103-114)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiRateLimiter::test_wait_for_slot_daily_limit_exceeded
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 24 lines (ranges: 32-34, 39-42, 45-46, 48-50, 58-60, 73, 76-78, 81-82, 84, 87-88)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_gemini_provider.py::TestGeminiRateLimiter::test_wait_for_slot_sleeps
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/gemini.py 18 lines (ranges: 39-42, 58-59, 61-63, 73, 76-78, 81-82, 84, 87-88)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_hashing.py 13 tests
PASSED tests/test_hashing.py::TestComputeConfigHash::test_different_config
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 8 lines (ranges: 96-101, 103-104)
PASSED tests/test_hashing.py::TestComputeConfigHash::test_returns_short_hash
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 8 lines (ranges: 96-101, 103-104)
PASSED tests/test_hashing.py::TestComputeFileSha256::test_consistent_with_bytes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 6 lines (ranges: 32, 44-48)
PASSED tests/test_hashing.py::TestComputeFileSha256::test_hashes_file
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 5 lines (ranges: 44-48)
PASSED tests/test_hashing.py::TestComputeHmac::test_different_key
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 1 lines (ranges: 61)
PASSED tests/test_hashing.py::TestComputeHmac::test_with_key
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 1 lines (ranges: 61)
PASSED tests/test_hashing.py::TestComputeSha256::test_consistent
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 1 lines (ranges: 32)
PASSED tests/test_hashing.py::TestComputeSha256::test_length
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 1 lines (ranges: 32)
PASSED tests/test_hashing.py::TestGetDependencySnapshot::test_includes_pytest
61ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 8 lines (ranges: 113-114, 116-121)
PASSED tests/test_hashing.py::TestGetDependencySnapshot::test_returns_dict
63ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 8 lines (ranges: 113-114, 116-121)
PASSED tests/test_hashing.py::TestLoadHmacKey::test_loads_key
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 5 lines (ranges: 73, 76-77, 80-81)
PASSED tests/test_hashing.py::TestLoadHmacKey::test_missing_key_file
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 4 lines (ranges: 73, 76-78)
PASSED tests/test_hashing.py::TestLoadHmacKey::test_no_key_file
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/hashing.py 2 lines (ranges: 73-74)
📄 tests/test_integration_gate.py 16 tests
PASSED tests/test_integration_gate.py::TestConfigDefaults::test_aggregation_defaults
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestConfigDefaults::test_capture_failed_output_default_true
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestConfigDefaults::test_context_mode_default_minimal
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestConfigDefaults::test_llm_not_enabled_by_default
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 4 lines (ranges: 123, 171, 284, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestConfigDefaults::test_omit_tests_default_true
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestConfigDefaults::test_provider_default_none
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestConfigDefaults::test_secret_exclude_globs
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestFullPipeline::test_deterministic_output
6ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 80 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 122 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_integration_gate.py::TestFullPipeline::test_empty_test_suite
5ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/models.py 62 lines (ranges: 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528-530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 123 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202-206, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_integration_gate.py::TestFullPipeline::test_html_report_generation
30ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 118 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_integration_gate.py::TestFullPipeline::test_json_report_generation
51ms 🛡️ 7
Coverage
src/pytest_llm_report/_git_info.py 2 lines (ranges: 2-3)
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 80 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 138 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-329, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_integration_gate.py::TestSchemaCompatibility::test_report_root_has_required_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 54 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestSchemaCompatibility::test_run_meta_has_aggregation_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 29 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestSchemaCompatibility::test_run_meta_has_status_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 29 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestSchemaCompatibility::test_schema_version_defined
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_integration_gate.py::TestSchemaCompatibility::test_test_case_has_required_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 19 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_litellm_retry_coverage.py 4 tests
PASSED tests/test_litellm_retry_coverage.py::TestLiteLLMTokenRefreshRetry::test_all_retries_exhausted
2.00s 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/litellm_provider.py 39 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 135, 139, 141-142, 144-145, 170-174, 176-178, 182, 186-187, 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_litellm_retry_coverage.py::TestLiteLLMTokenRefreshRetry::test_non_401_error_no_force_refresh
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/litellm_provider.py 38 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 135, 139, 141, 144-145, 170-174, 176-178, 182, 186-187, 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_litellm_retry_coverage.py::TestLiteLLMTokenRefreshRetry::test_retry_succeeds_after_transient_error
6.00s 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 47 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 135, 139, 141-142, 170-174, 176-178, 182, 186-187, 190, 192-193, 196-201, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_litellm_retry_coverage.py::TestLiteLLMTokenRefreshRetry::test_token_refresh_on_401
5.25s 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 54 lines (ranges: 37-38, 41-42, 44-48, 60-61, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 135, 139, 141-142, 170-174, 176-178, 182, 186-188, 190, 192-193, 196-201, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/llm/token_refresh.py 28 lines (ranges: 59-60, 63-66, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_llm.py 9 tests
PASSED tests/test_llm.py::TestGetProvider::test_gemini_returns_provider
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 10 lines (ranges: 65-66, 384, 386, 388, 391, 396, 401-402, 404)
src/pytest_llm_report/llm/gemini.py 9 lines (ranges: 134-135, 137-141, 143-144)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestGetProvider::test_litellm_returns_provider
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 9 lines (ranges: 65-66, 384, 386, 388, 391, 396-397, 399)
src/pytest_llm_report/llm/litellm_provider.py 3 lines (ranges: 37-38, 41)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestGetProvider::test_none_returns_noop
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 6 lines (ranges: 65-66, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestGetProvider::test_ollama_returns_provider
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 384, 386, 388, 391-392, 394)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestGetProvider::test_unknown_raises
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 7 lines (ranges: 384, 386, 388, 391, 396, 401, 406)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestLlmProviderContract::test_noop_implements_interface
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestNoopProvider::test_annotate_returns_empty
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 87-89, 97-98, 105)
src/pytest_llm_report/llm/noop.py 2 lines (ranges: 32, 51)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestNoopProvider::test_get_model_name_empty
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/noop.py 2 lines (ranges: 32, 67)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm.py::TestNoopProvider::test_is_available
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 5 lines (ranges: 65-66, 134, 137-138)
src/pytest_llm_report/llm/noop.py 2 lines (ranges: 32, 59)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_llm_contract.py 13 tests
PASSED tests/test_llm_contract.py::TestAnnotationSchema::test_required_fields
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestAnnotationSchema::test_schema_from_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/schemas.py 5 lines (ranges: 77-81)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestAnnotationSchema::test_schema_handles_empty
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/schemas.py 5 lines (ranges: 77-81)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestAnnotationSchema::test_schema_handles_partial
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/schemas.py 5 lines (ranges: 77-81)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestAnnotationSchema::test_schema_has_required_fields
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestAnnotationSchema::test_schema_to_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 90-92, 94-96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestNoopProvider::test_noop_from_factory
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 6 lines (ranges: 65-66, 384, 386, 388-389)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestNoopProvider::test_noop_is_llm_provider
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestNoopProvider::test_noop_returns_empty_annotation
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 87-89, 97-98, 105)
src/pytest_llm_report/llm/noop.py 2 lines (ranges: 32, 51)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestProviderContract::test_annotate_returns_annotation
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 87-89, 97-98, 105)
src/pytest_llm_report/llm/noop.py 2 lines (ranges: 32, 51)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestProviderContract::test_provider_handles_empty_code
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 87-89, 97-98, 105)
src/pytest_llm_report/llm/noop.py 2 lines (ranges: 32, 51)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestProviderContract::test_provider_handles_none_context
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 8 lines (ranges: 65-66, 87-89, 97-98, 105)
src/pytest_llm_report/llm/noop.py 2 lines (ranges: 32, 51)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_contract.py::TestProviderContract::test_provider_has_annotate_method
1ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 15 lines (ranges: 65-66, 384, 386, 388-389, 391-392, 394, 396-397, 399, 401-402, 404)
src/pytest_llm_report/llm/gemini.py 9 lines (ranges: 134-135, 137-141, 143-144)
src/pytest_llm_report/llm/litellm_provider.py 3 lines (ranges: 37-38, 41)
src/pytest_llm_report/llm/noop.py 1 lines (ranges: 32)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_llm_providers.py 52 tests
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_handles_context_too_large
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/gemini.py 187 lines (ranges: 39-42, 45-46, 48, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-236, 239-244, 263-265, 299, 311-312, 340-343, 346-349, 352-356, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 435, 437-439, 441-444, 449-452, 463-466, 471-473, 476-478, 497-498, 502-505, 507-508, 511, 514-516, 518-521, 524-525, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569-571, 574)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_missing_dependency
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/gemini.py 34 lines (ranges: 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-195, 471-473, 497-498, 502-503, 537)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_missing_token
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/gemini.py 21 lines (ranges: 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-188)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_records_tokens
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/gemini.py 220 lines (ranges: 39-42, 45-46, 48, 52-54, 66, 68-70, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-101, 103, 105, 107-109, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-236, 239-244, 246-247, 249-252, 261, 340-343, 346-349, 352-356, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413, 418-422, 424-430, 432, 435, 437-439, 441-444, 449-455, 457, 459-460, 463-466, 471-473, 476-478, 497-498, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569-571, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_retries_on_rate_limit
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/gemini.py 216 lines (ranges: 32-34, 39-42, 45-46, 48, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-236, 239-244, 246, 249-250, 252, 261, 263-265, 299-300, 304-306, 308-309, 340-343, 346-349, 352, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413-416, 418-422, 424-425, 432, 435, 437-439, 441-444, 449-455, 457-458, 463-466, 471-473, 476-478, 497-498, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569-571, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_rotates_models_on_daily_limit
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/gemini.py 210 lines (ranges: 39-42, 45-46, 48-50, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-230, 232, 235-236, 239-244, 246, 249-250, 252, 261, 340-343, 346-349, 352-356, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413, 418-422, 424-425, 432, 435, 437-439, 441-444, 449-455, 457, 459, 461-466, 471-473, 476-478, 497-499, 502-505, 507-508, 511, 514-516, 518-521, 524, 526-527, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567-571, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_skips_on_daily_limit
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 47 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/gemini.py 216 lines (ranges: 39-42, 45-46, 48-50, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-230, 232-233, 235-236, 239-244, 246, 249-250, 252, 261, 318-320, 340-343, 346-349, 352-356, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413, 418-422, 424-425, 432, 435, 437-439, 441-444, 449-455, 457, 459, 461-466, 471-473, 476-478, 497-499, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569-571, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_annotate_success_with_mock_response
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/gemini.py 209 lines (ranges: 39-42, 45-46, 48-49, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-101, 103, 105, 107-109, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-236, 239-244, 246, 249-250, 252, 261, 340-343, 346-349, 352, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413, 418-422, 424-425, 432, 435, 437-439, 441-444, 449-455, 457-466, 471-473, 476-478, 497-498, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569-571, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_exhausted_model_recovers_after_24h
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 47 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/gemini.py 222 lines (ranges: 39-42, 45-46, 48-50, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-210, 212-213, 215-216, 218, 222-230, 232-233, 235-236, 239-244, 246, 249-250, 252, 261, 318-320, 340-343, 346-349, 352-356, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413, 418-422, 424-425, 432, 435, 437-439, 441-444, 449-455, 457, 459, 461-466, 471-473, 476-478, 497-499, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569-571, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_fetch_available_models_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/gemini.py 68 lines (ranges: 134-135, 137-141, 143-144, 346, 348-349, 352-356, 358-361, 363-364, 366-367, 435, 437-439, 441-444, 449-452, 463-466, 476, 478, 497-498, 502-508, 511, 514-516, 518-521, 524-525, 537, 539-541, 544-545)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestGeminiProvider::test_model_list_refreshes_after_interval
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/gemini.py 201 lines (ranges: 39-42, 45-46, 48, 52-54, 73, 76-78, 81-82, 84, 87-88, 92-93, 95-96, 100-102, 134-135, 137-141, 143-144, 164-166, 173-175, 178, 181, 184, 186-187, 189, 191-192, 198-206, 208-209, 222-224, 228-230, 232, 235-236, 239-244, 246, 249-250, 252, 261, 340-343, 346-349, 352, 358-361, 363-364, 366-367, 383, 385-388, 390-403, 406, 410-411, 413, 418-422, 424-425, 432, 435, 437-439, 441-444, 449-455, 457-458, 463-466, 471-473, 476-478, 497-499, 502-505, 507-508, 511, 514-516, 518-521, 524, 526, 528-531, 537, 539-543, 547-548, 550-552, 554-555, 557-559, 562-563, 567, 569-571, 574)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_401_retry_with_token_refresh
1ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 50 lines (ranges: 37-38, 41-42, 44-48, 60-61, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 122, 124-127, 170-174, 176-178, 182, 186-188, 190, 192-193, 196, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/llm/token_refresh.py 28 lines (ranges: 59-60, 63, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156, 160-162)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_annotate_handles_completion_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/litellm_provider.py 34 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116, 120, 135, 137, 170-174, 176-178, 182, 186-187, 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_annotate_invalid_key_assertions
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 43 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346-348)
src/pytest_llm_report/llm/litellm_provider.py 35 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 170-174, 176-178, 182, 186-187, 190, 192-193, 196, 204, 206, 211)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_annotate_missing_dependency
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 9 lines (ranges: 65-66, 87-89, 97-99, 105)
src/pytest_llm_report/llm/litellm_provider.py 8 lines (ranges: 37-38, 41, 82-86)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_annotate_success_with_mock_response
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 34 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 170-174, 176-178, 182, 186-187, 190, 192-193, 196, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_annotate_with_prompt_override
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 37 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 34 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95-96, 100-101, 104, 106-107, 112, 170-174, 176-178, 182, 186-187, 190, 192-193, 196, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_annotate_with_token_usage
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 39 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 170-174, 176-178, 182, 186-187, 190, 192-193, 196-201, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_api_base_passthrough
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 35 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 170-174, 176-178, 182-183, 186-187, 190, 192-193, 196, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_api_key_passthrough
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 35 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 170-174, 176-178, 182, 186-188, 190, 192-193, 196, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_auth_error_without_refresher
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/litellm_provider.py 36 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 122, 132-133, 170-174, 176-178, 182, 186-187, 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_auth_retry_fails_on_second_attempt
2.00s 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/litellm_provider.py 51 lines (ranges: 37-38, 41-42, 44-48, 60-61, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 122, 124-127, 129-130, 132-133, 141-142, 170-174, 176-178, 182, 186-188, 190)
src/pytest_llm_report/llm/token_refresh.py 31 lines (ranges: 59-60, 63-66, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156, 160-162)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_context_too_long_error
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 16 lines (ranges: 65-66, 325-326, 329-330, 333-334, 337-339, 342, 344, 346-348)
src/pytest_llm_report/llm/litellm_provider.py 3 lines (ranges: 37-38, 41)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_get_max_context_tokens_dict_format
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/litellm_provider.py 10 lines (ranges: 37-38, 41, 221-222, 224, 227-228, 230-231)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_get_max_context_tokens_fallback_on_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/litellm_provider.py 10 lines (ranges: 37-38, 41, 221-222, 224, 227, 232-234)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_get_max_context_tokens_success
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/litellm_provider.py 9 lines (ranges: 37-38, 41, 221-222, 224, 227-229)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_is_available_with_module
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 5 lines (ranges: 65-66, 134, 137-138)
src/pytest_llm_report/llm/litellm_provider.py 6 lines (ranges: 37-38, 41, 242-243, 245)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_token_refresh_integration
1ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 41 lines (ranges: 37-38, 41-42, 44-48, 60-61, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 170-174, 176-178, 182, 186-188, 190, 192-193, 196, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/llm/token_refresh.py 25 lines (ranges: 59-60, 63, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestLiteLLMProvider::test_transient_error_retry
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/litellm_provider.py 42 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95, 98, 100-101, 104, 106-107, 112, 114, 116-117, 120, 135, 139, 141-142, 170-174, 176-178, 182, 186-187, 190, 192-193, 196, 204, 213)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_annotate_fallbacks_on_context_length_error
1ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 70 lines (ranges: 65-66, 87-89, 97-99, 101, 103, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 243, 245, 264, 266-267, 270-272, 274, 277, 279-280, 283, 286, 290-291, 294-295, 298-299, 305, 307-308, 312, 314, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/ollama.py 27 lines (ranges: 42-43, 49, 52, 55, 58, 60-61, 63-67, 71-72, 83, 85-86, 92, 138, 140, 142-144, 175-176, 178)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/llm/utils.py 28 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 96, 98)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_annotate_handles_call_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 29 lines (ranges: 65-66, 87-89, 97-99, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/ollama.py 18 lines (ranges: 42-43, 49, 52, 55, 58, 60-61, 63-65, 94, 97-98, 100-101, 103-104)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_annotate_missing_httpx
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 9 lines (ranges: 65-66, 87-89, 97-99, 105)
src/pytest_llm_report/llm/ollama.py 5 lines (ranges: 42-46)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_annotate_runtime_error_immediate_fail
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 22 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267)
src/pytest_llm_report/llm/ollama.py 13 lines (ranges: 42-43, 49, 52, 55, 58, 60-61, 63-65, 94, 96)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_annotate_success_full_flow
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/ollama.py 34 lines (ranges: 42-43, 49, 52, 55, 58, 60-61, 63-67, 71-72, 83, 92, 190, 192-200, 204-207, 209, 211-212)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_annotate_with_prompt_override
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 37 lines (ranges: 65-66, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/ollama.py 34 lines (ranges: 42-43, 49, 52-53, 58, 60-61, 63-67, 71-72, 83, 92, 190, 192-200, 204-207, 209, 211-212)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_annotate_with_token_usage
1ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 46 lines (ranges: 65-66, 87-89, 97-98, 105, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 264, 266-267, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/ollama.py 40 lines (ranges: 42-43, 49, 52, 55, 58, 60-61, 63-67, 71, 74-80, 83, 92, 190, 192-200, 204-207, 209, 211-212)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_call_ollama_success
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 17 lines (ranges: 190, 192-200, 204-207, 209, 211-212)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_call_ollama_uses_default_model
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 17 lines (ranges: 190, 192-200, 204-207, 209, 211-212)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_check_availability_failure
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 6 lines (ranges: 113-114, 116-117, 119-120)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_check_availability_non_200
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 5 lines (ranges: 113-114, 116-118)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_check_availability_success
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 5 lines (ranges: 113-114, 116-118)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_get_max_context_tokens_context_length_key
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 16 lines (ranges: 138, 140, 142-147, 149-150, 156, 165-167, 172-173)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_get_max_context_tokens_fallback_on_error
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 11 lines (ranges: 138, 140, 142-147, 175-176, 178)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_get_max_context_tokens_from_model_info
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 16 lines (ranges: 138, 140, 142-147, 149-150, 156, 165-167, 172-173)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_get_max_context_tokens_from_parameters
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 15 lines (ranges: 138, 140, 142-147, 149-150, 156, 158, 160-162)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_get_max_context_tokens_non_200_status
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 10 lines (ranges: 138, 140, 142-147, 149, 178)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_is_local_returns_true
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 2 lines (ranges: 65-66)
src/pytest_llm_report/llm/ollama.py 1 lines (ranges: 128)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_parse_response_invalid_json
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 7 lines (ranges: 65-66, 325-326, 329-331)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-52, 55)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_parse_response_invalid_key_assertions
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 16 lines (ranges: 65-66, 325-326, 329-330, 333-334, 337-339, 342, 344, 346-348)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_parse_response_json_in_code_fence
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 20 lines (ranges: 65-66, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/schemas.py 6 lines (ranges: 38, 42-44, 46-47)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_parse_response_json_in_plain_fence
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 20 lines (ranges: 65-66, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/schemas.py 6 lines (ranges: 38, 42-44, 46-47)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_providers.py::TestOllamaProvider::test_parse_response_success
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/base.py 20 lines (ranges: 65-66, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_llm_utils.py 6 tests
PASSED tests/test_llm_utils.py::test_distribute_token_budget_constrained
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/utils.py 32 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 90-91, 93-94, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_utils.py::test_distribute_token_budget_empty
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/utils.py 2 lines (ranges: 42-43)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_utils.py::test_distribute_token_budget_fair_share
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/utils.py 30 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 90-91, 93-94, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_utils.py::test_distribute_token_budget_max_files
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/utils.py 28 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_utils.py::test_distribute_token_budget_sufficient
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/utils.py 28 lines (ranges: 20, 42, 46-47, 51-53, 55-60, 66-67, 70-71, 73, 75, 77, 79, 81-82, 84, 86-87, 96, 98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_llm_utils.py::test_estimate_tokens
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/utils.py 1 lines (ranges: 20)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_models.py 29 tests
PASSED tests/test_models.py::TestArtifactEntry::test_to_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 4 lines (ranges: 263-266)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestCollectionError::test_to_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 3 lines (ranges: 241-243)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestCoverageEntry::test_to_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 4 lines (ranges: 65-68)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestLlmAnnotation::test_empty_annotation
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestLlmAnnotation::test_to_dict_minimal
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 9 lines (ranges: 130-133, 135, 137, 139, 141, 143)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestLlmAnnotation::test_to_dict_with_all_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 11 lines (ranges: 130-133, 135-137, 139-141, 143)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestReportRoot::test_default_report
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 54 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestReportRoot::test_report_with_collection_errors
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 58 lines (ranges: 241-243, 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526-528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestReportRoot::test_report_with_warnings
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/models.py 55 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528-530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestReportRoot::test_tests_sorted_by_nodeid
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 73 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestReportWarning::test_to_dict_with_detail
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 8 lines (ranges: 70-71, 73-75, 77-79)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestReportWarning::test_to_dict_without_detail
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestRunMeta::test_aggregation_fields_present
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 39 lines (ranges: 286-288, 290-292, 376-392, 394, 397, 399, 402, 405, 407, 409, 411-417, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestRunMeta::test_llm_fields_excluded_when_disabled
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 29 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestRunMeta::test_llm_traceability_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 43 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419-431, 433, 435, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestRunMeta::test_non_aggregated_excludes_source_reports
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 29 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestRunMeta::test_run_meta_to_dict_full
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 49 lines (ranges: 286-288, 290-292, 376-392, 394-417, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestRunMeta::test_run_status_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 29 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestSchemaVersion::test_schema_version_format
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestSchemaVersion::test_schema_version_in_report_root
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 54 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestSourceCoverageEntry::test_to_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 8 lines (ranges: 96-103)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestSourceReport::test_to_dict_minimal
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 5 lines (ranges: 286-288, 290, 292)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestSourceReport::test_to_dict_with_run_id
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 6 lines (ranges: 286-288, 290-292)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestSummary::test_to_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 11 lines (ranges: 467-475, 477, 479)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestTestCaseResult::test_minimal_result
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 19 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestTestCaseResult::test_result_with_coverage
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 24 lines (ranges: 65-68, 190, 194-199, 201, 203, 205, 207, 210-212, 214, 216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestTestCaseResult::test_result_with_llm_opt_out
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 20 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214-216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestTestCaseResult::test_result_with_rerun
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 21 lines (ranges: 190, 194-199, 201, 203, 205, 207-210, 212, 214, 216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models.py::TestTestCaseResult::test_result_without_rerun_excludes_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 19 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_models_coverage.py 15 tests
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_all_optional_fields
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/models.py 76 lines (ranges: 96-103, 241-243, 263-266, 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526-540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_artifacts
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 59 lines (ranges: 263-266, 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530-532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_collection_errors
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 58 lines (ranges: 241-243, 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526-528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_custom_metadata
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 55 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534-536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_hmac_signature
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 55 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538-540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_sha256
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 55 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536-538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_source_coverage
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 63 lines (ranges: 96-103, 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532-534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestReportRootToDict::test_to_dict_with_warnings
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/models.py 55 lines (ranges: 376-392, 394, 397, 399, 402, 405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528-530, 532, 534, 536, 538, 540)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestSummaryToDict::test_to_dict_with_coverage_total_percent
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 12 lines (ranges: 467-475, 477-479)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestSummaryToDict::test_to_dict_without_coverage_total_percent
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 11 lines (ranges: 467-475, 477, 479)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestTestCaseResultToDict::test_to_dict_with_all_optional_fields
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 42 lines (ranges: 65-68, 130-133, 135, 137, 139, 141, 143, 190, 194-199, 201-207, 210-224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestTestCaseResultToDict::test_to_dict_with_captured_stderr
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 20 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220-222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestTestCaseResultToDict::test_to_dict_with_captured_stdout
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 20 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218-220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestTestCaseResultToDict::test_to_dict_with_param_summary
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 21 lines (ranges: 190, 194-199, 201, 203-207, 210, 212, 214, 216, 218, 220, 222, 224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_models_coverage.py::TestTestCaseResultToDict::test_to_dict_with_requirements
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 20 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222-224)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_options.py 21 tests
PASSED tests/test_options.py::TestConfig::test_default_exclude_globs
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_default_redact_patterns
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_default_values
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_get_default_config
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 293)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_is_llm_enabled
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_validate_invalid_aggregate_policy
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-221, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_validate_invalid_context_mode
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-213, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_validate_invalid_include_phase
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-229, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_validate_invalid_provider
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 28 lines (ranges: 123, 171, 199, 202-205, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_validate_numeric_ranges
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 31 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245-254, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestConfig::test_validate_valid_config
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 26 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_aggregation_options
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 89 lines (ranges: 123, 171, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599-607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_batch_flag_conflict
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 85 lines (ranges: 123, 171, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_config_missing_pyproject
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 85 lines (ranges: 123, 171, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_coverage_source
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 86 lines (ranges: 123, 171, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607-608, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_defaults
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 85 lines (ranges: 123, 171, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_from_cli_overrides_pyproject
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 132 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482-484, 486, 488, 490, 492-494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_from_cli_provider_override
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 133 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460-461, 463-464, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_from_cli_retries
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 86 lines (ranges: 123, 171, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494-495, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_from_pyproject
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 134 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-336, 340, 342, 344, 348, 352, 356, 360-362, 364, 366, 368, 372, 374, 378, 380, 382-384, 386-388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options.py::TestLoadConfig::test_load_token_optimization_options
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 88 lines (ranges: 123, 171, 308, 311-312, 320-322, 460, 463, 466, 470-474, 476-477, 479, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_options_coverage.py 47 tests
PASSED tests/test_options_coverage.py::TestCliOverrides::test_cli_dependency_snapshot
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 92 lines (ranges: 123, 171, 308, 311-312, 320-322, 460-461, 463-464, 466-467, 470-474, 476-477, 479, 482, 484, 486, 488, 490-492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestCliOverrides::test_cli_evidence_bundle
5ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 92 lines (ranges: 123, 171, 308, 311-312, 320-322, 460-461, 463-464, 466-467, 470-474, 476-477, 479, 482, 484, 486, 488-490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestCliOverrides::test_cli_report_json
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 92 lines (ranges: 123, 171, 308, 311-312, 320-322, 460-461, 463-464, 466-467, 470-474, 476-477, 479, 482, 484-486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestCliOverrides::test_cli_report_pdf
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 92 lines (ranges: 123, 171, 308, 311-312, 320-322, 460-461, 463-464, 466-467, 470-474, 476-477, 479, 482, 484, 486-488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestConfigValidationCoverage::test_validate_invalid_token_output_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-237, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestConfigValidationCoverage::test_validate_token_refresh_interval_too_short
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 27 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241-242, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestConfigValidationCoverage::test_validate_valid_litellm_config
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 26 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_aggregate_include_history
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438-440, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_aggregate_policy_from_pyproject
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436-438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_all_config_keys_combined
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 150 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-337, 340-346, 348-350, 352-354, 356-357, 360-369, 372-375, 378-392, 396, 400, 402, 404, 408-410, 412-413, 416-422, 426-428, 430-432, 436-440, 444-447, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_cache_dir
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390-392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_cache_ttl_seconds
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388-390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_capture_failed_output
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418-420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_capture_output_max_chars
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420-422, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_context_bytes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362-364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_context_exclude_globs
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368-369, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_context_file_limit
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364-366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_context_include_globs
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366-368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_hmac_key_file
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446-447, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_include_param_values
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372-374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_include_phase
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412-413, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_include_pytest_invocation
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426-428, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_invocation_redact_patterns
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430-432, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_litellm_api_base
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340-342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_litellm_api_key
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342-344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_litellm_token_json_key
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342, 344, 348, 352, 356-357, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_litellm_token_output_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 111 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342, 344, 348, 352-354, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_litellm_token_refresh_command
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 111 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342, 344-346, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_litellm_token_refresh_interval
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 111 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342, 344, 348-350, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_malformed_pyproject
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 73 lines (ranges: 123, 171, 308, 311-312, 320-325, 449, 451, 453-456, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_max_concurrency
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380-382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_max_tests
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378-380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_metadata_file
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444-446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_ollama_host
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336-337, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_omit_tests_from_coverage
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 110 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408-410, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_param_value_max_chars
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374-375, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_report_collect_only
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416-418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectLoadingCoverage::test_load_timeout_seconds
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 109 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384-386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectTokenOptimization::test_load_batch_max_tests
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 130 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400-402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectTokenOptimization::test_load_batch_parametrized_tests
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 131 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396-398, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectTokenOptimization::test_load_context_compression
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 130 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402-404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectTokenOptimization::test_load_context_line_padding
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 130 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404-405, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestPyprojectTokenOptimization::test_load_prompt_tier
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 130 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332, 334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392-393, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 502, 504-505, 507, 511-512, 514, 516-517, 519, 521-522, 524, 528-529, 531, 534-535, 537-538, 540, 542-543, 545, 547-548, 550-551, 554-555, 557-558, 561-562, 564, 566-567, 569, 572-573, 575-576, 578, 581-584, 588-589, 591, 593-594, 596, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestValidationCoverageExtended::test_validate_batch_max_tests_too_small
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 27 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271-273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestValidationCoverageExtended::test_validate_context_line_padding_negative
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 27 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273-274, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestValidationCoverageExtended::test_validate_invalid_context_compression
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-269, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_options_coverage.py::TestValidationCoverageExtended::test_validate_invalid_prompt_tier
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 29 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-261, 265-266, 271, 273, 276)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_plugin_integration.py 14 tests
PASSED tests/test_plugin_integration.py::TestPluginConfigLoading::test_config_defaults
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 122 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-337, 340, 342, 344, 348, 352, 356, 360-362, 364, 366, 368, 372, 374, 378-380, 382, 384-386, 388, 390, 392, 396, 400, 402, 404, 408-410, 412-413, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460-461, 463, 466, 470, 472-473, 476-477, 482-488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603-605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_integration.py::TestPluginConfigLoading::test_markers_exist_in_config
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_both_json_and_html_outputs
72ms 🛡️ 8
Coverage
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 75 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 91 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 122 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_collection_finish_counts_items
45ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 75 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 110 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_creates_nested_directory
43ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 11 lines (ranges: 70-71, 73-75, 77, 79, 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528-530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 116 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-484, 502, 504, 506-508, 510, 513)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_fixture_error_captured
47ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 50 lines (ranges: 78-79, 90, 93-94, 96, 99-103, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 227-228, 230-236, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201-203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 115 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324, 326, 328, 330, 332, 334-335, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_makereport_captures_all_outcomes
138ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 59 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 106-107, 109-112, 114-118, 124, 127, 132-133, 140-141, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 227-228, 230-236, 250-251, 261, 264, 268, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201-203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 114 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-329, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_no_report_when_disabled
41ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 89 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 250 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403-404, 558-559, 562-563, 566-568, 579, 583, 602-603, 619-620)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_pdf_option_enables_plugin
460ms 🛡️ 8
Coverage
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486-488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 110 lines (ranges: 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226, 230-231, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 408, 417, 419, 421-423, 431-436, 439, 441-442, 455, 460, 462, 465-469, 477-478)
PASSED tests/test_plugin_integration.py::TestPluginHooksWithPytester::test_session_start_records_time
45ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 75 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 110 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_plugin_integration.py::TestPluginIntegration::test_llm_context_marker
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_integration.py::TestPluginIntegration::test_llm_opt_out_marker
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_integration.py::TestPluginIntegration::test_requirement_marker
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_integration.py::TestReportGeneration::test_report_writer_integration
31ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 81 lines (ranges: 190, 194-199, 201-203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 136 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-327, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
📄 tests/test_plugin_maximal.py 26 tests
PASSED tests/test_plugin_maximal.py::TestPluginCollectReport::test_pytest_collectreport_disabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 10 lines (ranges: 558-559, 562, 566-568, 579-580, 586-587)
PASSED tests/test_plugin_maximal.py::TestPluginCollectReport::test_pytest_collectreport_enabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 12 lines (ranges: 558-559, 562, 566-568, 579-580, 586, 590-592)
PASSED tests/test_plugin_maximal.py::TestPluginCollectReport::test_pytest_collectreport_no_session
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 8 lines (ranges: 558-559, 562, 566-568, 579, 583)
PASSED tests/test_plugin_maximal.py::TestPluginCollectReport::test_pytest_collectreport_session_none
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 8 lines (ranges: 558-559, 562, 566-568, 579, 583)
PASSED tests/test_plugin_maximal.py::TestPluginConfigure::test_pytest_configure_llm_enabled_warning
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 136 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-325, 327-328, 332-336, 340, 342, 344, 348, 352, 356, 360-362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 30 lines (ranges: 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362-364, 366-367, 371-373, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginConfigure::test_pytest_configure_validation_errors
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 135 lines (ranges: 123, 171, 199, 202-205, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 25 lines (ranges: 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-358, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginConfigure::test_pytest_configure_worker_skip
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 17 lines (ranges: 328-330, 332-334, 336-338, 342-343, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginConfigureFallback::test_pytest_configure_fallback_load
2ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 30 lines (ranges: 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362-364, 366-367, 371-373, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginLoadConfig::test_load_config_cli_overrides_pyproject
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 122 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-334, 336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460-461, 463-464, 466-467, 470, 472-473, 476-477, 482-494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599-607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginLoadConfig::test_load_config_from_pyproject
104ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 112 lines (ranges: 123, 171, 308, 311-312, 320-325, 327-328, 332-336, 340, 342, 344, 348, 352, 356, 360-362, 364, 366, 368, 372, 374, 378, 380, 382-384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginMaximal::test_terminal_summary_disabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 9 lines (ranges: 399, 403-404, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginMaximal::test_terminal_summary_worker_skip
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 8 lines (ranges: 399-400, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginMaximal::testload_config
3ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 69 lines (ranges: 123, 171, 308, 311-312, 320-322, 460-461, 463-464, 466-467, 470, 472-473, 476-477, 482-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginRuntest::test_runtest_makereport_disabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 7 lines (ranges: 558-559, 562-563, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginRuntest::test_runtest_makereport_enabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginSessionHooks::test_pytest_collection_finish_disabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 8 lines (ranges: 558-559, 562, 566-568, 602-603)
PASSED tests/test_plugin_maximal.py::TestPluginSessionHooks::test_pytest_collection_finish_enabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 10 lines (ranges: 558-559, 562, 566-568, 602, 606-608)
PASSED tests/test_plugin_maximal.py::TestPluginSessionHooks::test_pytest_sessionstart_disabled
1ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 8 lines (ranges: 558-559, 562, 566-568, 619-620)
PASSED tests/test_plugin_maximal.py::TestPluginSessionHooks::test_pytest_sessionstart_enabled
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 11 lines (ranges: 558-559, 562, 566-568, 619, 623, 626, 628-629)
PASSED tests/test_plugin_maximal.py::TestPluginTerminalSummary::test_pytest_addoption
2ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 220 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginTerminalSummary::test_pytest_addoption_no_ini
2ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 220 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginTerminalSummary::test_terminal_summary_coverage_calculation
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 277, 285)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 53 lines (ranges: 399, 403, 407, 410, 429-430, 432, 434, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-466, 468, 470-473, 485-486, 491-492, 534-544, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginTerminalSummary::test_terminal_summary_llm_enabled
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 277, 285)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 66 lines (ranges: 399, 403, 407, 410, 429-430, 432, 434, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485-486, 491-494, 497, 499, 502-504, 512-514, 516, 523-531, 534-544, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginTerminalSummary::test_terminal_summary_no_collector
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 277, 285)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 45 lines (ranges: 399, 403, 407, 410, 429-430, 432, 434, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginTerminalSummary::test_terminal_summary_with_aggregation
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 21 lines (ranges: 399, 403, 407, 410-411, 413-414, 417-418, 420, 422-426, 558-559, 562, 566-568)
PASSED tests/test_plugin_maximal.py::TestPluginTerminalSummaryErrors::test_terminal_summary_coverage_error
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 16 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210, 277, 285)
src/pytest_llm_report/options.py 3 lines (ranges: 123, 171, 284)
src/pytest_llm_report/plugin.py 52 lines (ranges: 399, 403, 407, 410, 429-430, 432, 434, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-466, 476-479, 485-486, 491-492, 534-544, 558-559, 562, 566-568)
📄 tests/test_prompts.py 7 tests
PASSED tests/test_prompts.py::TestContextAssembler::test_assemble_balanced_context
5ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 63 lines (ranges: 33, 49, 52, 55, 58, 60-61, 65, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-112, 116, 139, 142-145, 147-148, 152-153, 155-156, 159-160, 163, 166-167, 170-171, 173-174, 177, 181-182, 189, 192-193, 196-197, 201, 284-285, 287)
PASSED tests/test_prompts.py::TestContextAssembler::test_assemble_complete_context
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 38 lines (ranges: 33, 49, 52, 55, 58, 60, 63, 65, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-112, 116, 139-140, 268-272)
PASSED tests/test_prompts.py::TestContextAssembler::test_assemble_minimal_context
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 30 lines (ranges: 33, 49, 52, 55, 58-59, 65, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-112, 116)
PASSED tests/test_prompts.py::TestContextAssembler::test_balanced_context_limits
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 46 lines (ranges: 33, 49, 52, 55, 58, 60-61, 65, 78-79, 82-84, 139, 142-145, 147-148, 152-153, 155-156, 159-160, 163, 166-167, 170-171, 173-174, 177, 181-182, 189, 192-194, 196-197, 201, 284-285, 287)
PASSED tests/test_prompts.py::TestContextAssembler::test_complete_context_limits_override
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 50 lines (ranges: 33, 49, 52, 55, 58, 60, 63, 65, 78-79, 82-84, 139, 142-145, 147-148, 152-153, 155-156, 159-160, 163, 166-167, 170-171, 173-174, 177, 181-182, 189, 192-193, 196-197, 201, 268-272, 284-285, 287)
PASSED tests/test_prompts.py::TestContextAssembler::test_get_test_source_edge_cases
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 26 lines (ranges: 33, 78-79, 82-84, 86-87, 92, 94-95, 98-101, 103-112, 116)
PASSED tests/test_prompts.py::TestContextAssembler::test_should_exclude
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 1 lines (ranges: 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 5 lines (ranges: 33, 284-287)
📄 tests/test_prompts_coverage.py 12 tests
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_assemble_minimal_mode
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 29 lines (ranges: 33, 49, 52, 55, 58-59, 65, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-109, 111-112, 116)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_assemble_with_context_override
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 62 lines (ranges: 33, 49, 52, 55, 58, 60-61, 65, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-109, 111-112, 116, 139, 142-145, 147-148, 152-153, 155-156, 159-160, 163, 166-167, 170-171, 173-174, 177, 181-182, 189, 192-193, 196-197, 201, 284-285, 287)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_balanced_context_excludes_patterns
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 1 lines (ranges: 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 20 lines (ranges: 33, 139, 142-145, 147-148, 152-153, 155-156, 159-160, 163-164, 201, 284-286)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_balanced_context_file_not_exists
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 16 lines (ranges: 33, 139, 142-145, 147-148, 152-153, 155-156, 159-161, 201)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_balanced_context_max_bytes_limit
11ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 34 lines (ranges: 33, 139, 142-145, 147-148, 152-153, 155-156, 159-160, 163, 166-167, 170-171, 173-174, 177, 181-182, 189, 192-194, 196-197, 201, 284-285, 287)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_balanced_context_no_coverage
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 3 lines (ranges: 33, 139-140)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_balanced_context_reaches_max_bytes_before_file
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 35 lines (ranges: 33, 139, 142-145, 147-148, 152-153, 155-157, 159-160, 163, 166-167, 170-171, 173-174, 177, 181-182, 189, 192-194, 196-197, 201, 284-285, 287)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_complete_context_delegates_to_balanced
1ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/context_util.py 17 lines (ranges: 27, 29, 33, 35-36, 64, 66-69, 108, 124, 126-127, 129, 133, 135)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 38 lines (ranges: 33, 139, 142-145, 147-148, 152-153, 155-156, 159-160, 163, 166-167, 170-171, 173-174, 177, 181-182, 189, 192-193, 196-197, 201, 268-272, 284-285, 287)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_get_test_source_empty_nodeid
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 9 lines (ranges: 33, 78-79, 82-83, 86-89)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_get_test_source_extraction_stops_at_next_def
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 25 lines (ranges: 33, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-112, 114, 116)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_get_test_source_file_not_exists
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 6 lines (ranges: 33, 78-79, 82-84)
PASSED tests/test_prompts_coverage.py::TestContextAssemblerEdgeCases::test_get_test_source_with_class
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/prompts.py 25 lines (ranges: 33, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-112, 114, 116)
📄 tests/test_ranges.py 13 tests
PASSED tests/test_ranges.py::TestCompressRanges::test_consecutive_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 12 lines (ranges: 29, 33, 35-37, 39-40, 42, 50, 52, 65, 67)
PASSED tests/test_ranges.py::TestCompressRanges::test_duplicates
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 12 lines (ranges: 29, 33, 35-37, 39-40, 42, 50, 52, 65, 67)
PASSED tests/test_ranges.py::TestCompressRanges::test_empty_list
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 2 lines (ranges: 29-30)
PASSED tests/test_ranges.py::TestCompressRanges::test_mixed_ranges
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 16 lines (ranges: 29, 33, 35-37, 39-40, 42, 45-47, 50, 52, 65-67)
PASSED tests/test_ranges.py::TestCompressRanges::test_non_consecutive_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 14 lines (ranges: 29, 33, 35-37, 39-40, 45-47, 50, 52, 65-66)
PASSED tests/test_ranges.py::TestCompressRanges::test_single_line
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 10 lines (ranges: 29, 33, 35-37, 39, 50, 52, 65-66)
PASSED tests/test_ranges.py::TestCompressRanges::test_two_consecutive
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 12 lines (ranges: 29, 33, 35-37, 39-40, 42, 50, 52, 65, 67)
PASSED tests/test_ranges.py::TestCompressRanges::test_unsorted_input
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 16 lines (ranges: 29, 33, 35-37, 39-40, 42, 45-47, 50, 52, 65-67)
PASSED tests/test_ranges.py::TestExpandRanges::test_empty_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 2 lines (ranges: 81-82)
PASSED tests/test_ranges.py::TestExpandRanges::test_mixed
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 11 lines (ranges: 81, 84-91, 93, 95)
PASSED tests/test_ranges.py::TestExpandRanges::test_range
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 10 lines (ranges: 81, 84-91, 95)
PASSED tests/test_ranges.py::TestExpandRanges::test_roundtrip
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 27 lines (ranges: 29, 33, 35-37, 39-40, 42, 45-47, 50, 52, 65-67, 81, 84-91, 93, 95)
PASSED tests/test_ranges.py::TestExpandRanges::test_single_number
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/ranges.py 7 lines (ranges: 81, 84-87, 93, 95)
📄 tests/test_render.py 9 tests
PASSED tests/test_render.py::TestFormatDuration::test_milliseconds
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 2 lines (ranges: 65, 67)
PASSED tests/test_render.py::TestFormatDuration::test_seconds
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 2 lines (ranges: 65-66)
PASSED tests/test_render.py::TestOutcomeToCssClass::test_all_outcomes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 8 lines (ranges: 79-85, 87)
PASSED tests/test_render.py::TestOutcomeToCssClass::test_unknown_outcome
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 8 lines (ranges: 79-85, 87)
PASSED tests/test_render.py::TestRenderFallbackHtml::test_renders_basic_report
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 57 lines (ranges: 65-67, 79-85, 87, 121-124, 126-127, 131-132, 155-157, 159-167, 172-174, 210-211, 224, 257-264, 267, 269, 271-277, 280-281, 285)
PASSED tests/test_render.py::TestRenderFallbackHtml::test_renders_coverage
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 57 lines (ranges: 65, 67, 79-85, 87, 121-124, 126-129, 131-132, 155-156, 159-167, 172-174, 210-211, 224, 257-264, 267, 269, 271-277, 280-281, 285)
PASSED tests/test_render.py::TestRenderFallbackHtml::test_renders_llm_annotation
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 64 lines (ranges: 65, 67, 79-85, 87, 121-124, 126-127, 131-134, 136-137, 140-142, 144, 147, 155-156, 159-167, 172-174, 210-211, 224, 257-264, 267, 269, 271-277, 280-281, 285)
PASSED tests/test_render.py::TestRenderFallbackHtml::test_renders_source_coverage
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 68 lines (ranges: 65, 67, 79-85, 87, 121-124, 126-127, 131-132, 155-156, 159-167, 172-178, 180-186, 191, 206, 210-211, 224, 257-264, 267, 269, 271-277, 280-281, 285)
PASSED tests/test_render.py::TestRenderFallbackHtml::test_renders_xpass_summary
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 55 lines (ranges: 65, 67, 79-85, 87, 121-124, 126-127, 131-132, 155-156, 159-167, 172-174, 210-211, 224, 257-264, 267, 269, 271-277, 280-281, 285)
📄 tests/test_report_writer.py 19 tests
PASSED tests/test_report_writer.py::TestComputeSha256::test_different_content
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 1 lines (ranges: 55)
PASSED tests/test_report_writer.py::TestComputeSha256::test_empty_bytes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 1 lines (ranges: 55)
PASSED tests/test_report_writer.py::TestReportWriter::test_build_run_meta
4ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 72 lines (ranges: 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307)
PASSED tests/test_report_writer.py::TestReportWriter::test_build_summary_all_outcomes
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 19 lines (ranges: 156-158, 319, 321-322, 324-335, 337)
PASSED tests/test_report_writer.py::TestReportWriter::test_build_summary_counts
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 13 lines (ranges: 156-158, 319, 321-322, 324-329, 337)
PASSED tests/test_report_writer.py::TestReportWriter::test_create_writer
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 3 lines (ranges: 156-158)
PASSED tests/test_report_writer.py::TestReportWriter::test_write_report_assembles_tests
4ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 98 lines (ranges: 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-327, 337)
PASSED tests/test_report_writer.py::TestReportWriter::test_write_report_includes_coverage_percent
5ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 98 lines (ranges: 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-199, 202-206, 211-218, 222, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321, 337)
PASSED tests/test_report_writer.py::TestReportWriter::test_write_report_includes_source_coverage
4ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 97 lines (ranges: 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202-206, 211-218, 222, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321, 337)
PASSED tests/test_report_writer.py::TestReportWriter::test_write_report_merges_coverage
4ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 99 lines (ranges: 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186-189, 192-193, 197-198, 202, 211-218, 222, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_atomic_write_fallback
5ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/models.py 62 lines (ranges: 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528-530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 130 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202-206, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513-514, 516-519, 522-523)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_creates_directory_if_missing
6ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/errors.py 7 lines (ranges: 70-71, 73-75, 77, 79)
src/pytest_llm_report/models.py 81 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528-530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 128 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-484, 502, 504, 506-508, 510, 513)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_ensure_dir_failure
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 12 lines (ranges: 156-158, 477-480, 487-491)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_git_info_failure
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 9 lines (ranges: 67-73, 85-86)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_write_html_creates_file
30ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 120 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-327, 337, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_write_html_includes_xfail_summary
30ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 123 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324, 326, 328, 330-333, 337, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_write_json_creates_file
5ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 80 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 122 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_write_pdf_creates_file
32ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 130 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226, 230-231, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 408, 417, 419, 421-430, 441-442, 444-450, 455, 460, 462, 465-469, 477-478)
PASSED tests/test_report_writer.py::TestReportWriterWithFiles::test_write_pdf_missing_playwright_warns
5ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 103 lines (ranges: 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226, 230-231, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 408-412, 415)
📄 tests/test_report_writer_coverage.py 10 tests
PASSED tests/test_report_writer_coverage.py::TestGetGitInfo::test_git_info_from_nonexistent_path
2ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 9 lines (ranges: 67-73, 85-86)
PASSED tests/test_report_writer_coverage.py::TestGetGitInfo::test_git_info_from_valid_repo
4ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 16 lines (ranges: 67-74, 76-81, 83-84)
PASSED tests/test_report_writer_coverage.py::TestGetPluginGitInfo::test_plugin_git_info_fallback
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 3 lines (ranges: 127-128, 130)
PASSED tests/test_report_writer_coverage.py::TestGetPluginGitInfo::test_plugin_git_info_returns_values
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 3 lines (ranges: 127-128, 130)
PASSED tests/test_report_writer_coverage.py::TestReportWriterAtomicWrite::test_atomic_write_fallback
24ms 🛡️ 5
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 80 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 122 lines (ranges: 55, 67-74, 76-81, 83-84, 98-99, 102, 105-108, 110, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_report_writer_coverage.py::TestReportWriterPDF::test_pdf_playwright_exception
89ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 26 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65-67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 28 lines (ranges: 156-158, 408, 417, 419, 421-423, 431-436, 439, 441-442, 455, 460, 462, 465-469, 477-478)
PASSED tests/test_report_writer_coverage.py::TestReportWriterPDF::test_pdf_playwright_not_installed
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 9 lines (ranges: 156-158, 408-412, 415)
PASSED tests/test_report_writer_coverage.py::TestReportWriterPDF::test_resolve_html_source_creates_temp
25ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 26 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65-67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 11 lines (ranges: 156-158, 455, 460, 462, 465-469)
PASSED tests/test_report_writer_coverage.py::TestReportWriterPDF::test_resolve_html_source_missing_html_file
25ms 🛡️ 6
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/render.py 26 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65-67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 13 lines (ranges: 156-158, 455-457, 460, 462, 465-469)
PASSED tests/test_report_writer_coverage.py::TestReportWriterPDF::test_resolve_html_source_uses_existing
1ms 🛡️ 4
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 2 lines (ranges: 123, 171)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/report_writer.py 7 lines (ranges: 156-158, 455-458)
📄 tests/test_schemas.py 2 tests
PASSED tests/test_schemas.py::TestAnnotationSchema::test_from_dict_full
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/schemas.py 5 lines (ranges: 77-81)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_schemas.py::TestAnnotationSchema::test_to_dict_full
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/schemas.py 8 lines (ranges: 90-92, 94-98)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_smoke_pytester.py 15 tests
PASSED tests/test_smoke_pytester.py::TestBasicReportGeneration::test_html_report_created
69ms 🛡️ 8
Coverage
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482-484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 106 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestBasicReportGeneration::test_html_summary_counts_all_statuses
100ms 🛡️ 8
Coverage
src/pytest_llm_report/collector.py 69 lines (ranges: 78-79, 90, 93-94, 96, 99-104, 106-107, 109-112, 114-119, 121-122, 124, 127, 132-133, 140-141, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 212-214, 216, 227-228, 230-236, 250-251, 261, 264, 268, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482-484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 116 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-335, 337, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestBasicReportGeneration::test_json_report_created
51ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 55 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-118, 124, 127, 132-133, 140-141, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 227-228, 230-236, 261, 264, 268, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201-203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 112 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-327, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestBasicReportGeneration::test_llm_annotations_in_report
45ms 🛡️ 14
Coverage
src/pytest_llm_report/cache.py 20 lines (ranges: 39-41, 53, 55-56, 86, 90, 92, 94, 97-101, 103, 118-119, 121, 153)
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/llm/annotator.py 96 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-89, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221, 223, 249-252, 254-255, 257-258, 260, 262, 264, 269-274, 277-279, 281, 283-284, 289-290, 292-295, 298, 303)
src/pytest_llm_report/llm/base.py 55 lines (ranges: 65-66, 87-89, 97, 105, 134, 137-138, 155, 163, 174, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 325-326, 329-330, 333-334, 337-339, 342, 344, 346, 351, 353-357, 384, 386, 388, 391, 396-397, 399)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/llm/litellm_provider.py 43 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95-96, 100-101, 104, 106-107, 112, 170-174, 176-178, 182, 186-187, 190, 192-193, 196, 204, 213, 221-222, 224, 227-229, 242-243, 245)
src/pytest_llm_report/llm/schemas.py 7 lines (ranges: 38, 42-43, 50-53)
src/pytest_llm_report/models.py 103 lines (ranges: 130-133, 135-137, 139, 141, 143, 190, 194-199, 201, 203, 205, 207, 210, 212-214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419-437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 136 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-325, 327-328, 332-336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 316 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362-364, 366-367, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-494, 497, 499, 502-506, 509, 512-514, 516-517, 523-531, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/prompts.py 29 lines (ranges: 33, 49, 52, 55, 58-59, 65, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-109, 111-112, 116)
src/pytest_llm_report/report_writer.py 115 lines (ranges: 55, 67-73, 85-86, 98-99, 102, 105-108, 113, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-296, 298-299, 301-302, 304-305, 307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestBasicReportGeneration::test_llm_error_is_reported
72ms 🛡️ 14
Coverage
src/pytest_llm_report/cache.py 12 lines (ranges: 39-41, 53, 55-56, 86, 88, 118-119, 121, 153)
src/pytest_llm_report/collector.py 39 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/llm/annotator.py 100 lines (ranges: 47, 50-51, 58-59, 65, 67, 70, 73-74, 76, 84, 86-89, 95-96, 98-99, 106-108, 112-113, 116, 121-122, 132, 134, 137-141, 144-151, 181-182, 184, 186, 188, 199-206, 213-219, 221-223, 249-252, 254-255, 257-258, 260, 262, 264, 269-274, 277-279, 281, 283-284, 289-290, 292-295, 298-301, 303)
src/pytest_llm_report/llm/base.py 37 lines (ranges: 65-66, 87-89, 97, 105, 134, 137-138, 155, 163, 174, 185, 188, 191-198, 200, 212, 214, 216, 219-221, 384, 386, 388, 391, 396-397, 399)
src/pytest_llm_report/llm/batching.py 33 lines (ranges: 34, 39, 53, 55, 92-93, 95, 103-106, 108-110, 112-116, 136, 156-157, 160, 162, 181-185, 187-188, 190, 224)
src/pytest_llm_report/llm/litellm_provider.py 44 lines (ranges: 37-38, 41, 60, 62, 82-83, 89, 92, 95-96, 100-101, 104, 106-107, 112, 114, 116-117, 120, 135, 137, 170-174, 176-178, 182, 186-187, 190, 221-222, 224, 227-229, 242-243, 245)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 136 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-325, 327-328, 332-336, 340, 342, 344, 348, 352, 356, 360, 362, 364, 366, 368, 372, 374, 378, 380, 382, 384, 386, 388, 390, 392, 396, 400, 402, 404, 408, 412, 416, 418, 420, 426, 430, 436, 438, 444, 446, 460, 463, 466, 470, 472-473, 476-477, 482-484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 316 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362-364, 366-367, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-494, 497, 499, 502-507, 512-514, 516-517, 523-531, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/prompts.py 29 lines (ranges: 33, 49, 52, 55, 58-59, 65, 78-79, 82-83, 86-87, 92, 94, 98-101, 103-109, 111-112, 116)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 111 lines (ranges: 55, 67-73, 85-86, 98-99, 102, 105-108, 113, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-296, 298-299, 301-302, 304-305, 307, 319, 321-322, 324-325, 337, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestMarkers::test_llm_opt_out_marker
43ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 40 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181-182, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214-216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 110 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestMarkers::test_requirement_marker
43ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 40 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-200, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201, 203, 205, 207, 210, 212, 214, 216, 218, 220, 222-224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 110 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestOutcomes::test_multiple_xfail_outcomes
47ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 47 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-116, 119, 121-122, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 212, 216, 250-251, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201-203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 113 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324, 326, 328, 330-331, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestOutcomes::test_skip_outcome
42ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 43 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 106-107, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 250-251, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201-203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 112 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324, 326, 328-329, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestOutcomes::test_xfail_outcome
46ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 47 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-116, 119, 121-122, 124, 127, 132-133, 140, 155-159, 163, 167-169, 171, 181, 185-186, 198-199, 209-210, 212, 216, 250-251, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201-203, 205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 113 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324, 326, 328, 330-331, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestParametrization::test_parametrized_tests
47ms 🛡️ 7
Coverage
src/pytest_llm_report/collector.py 40 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163-164, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 76 lines (ranges: 190, 194-199, 201, 203-205, 207, 210, 212, 214, 216, 218, 220, 222, 224, 376-392, 394, 397, 399, 402-405, 407, 409, 411, 413, 415, 419, 437, 467-475, 477, 479, 518, 520-524, 526, 528, 530, 532, 534, 536, 538, 540)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484-486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/report_writer.py 110 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222-223, 226, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 347, 350-352, 355-356, 359-361, 364, 367-371, 477-478, 502, 504, 506-508, 510, 513)
PASSED tests/test_smoke_pytester.py::TestPluginRegistration::test_help_contains_examples
38ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 89 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 240 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 558-559, 562, 566-568)
PASSED tests/test_smoke_pytester.py::TestPluginRegistration::test_markers_registered
33ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 89 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 240 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 558-559, 562, 566-568)
PASSED tests/test_smoke_pytester.py::TestPluginRegistration::test_plugin_registered
39ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/options.py 89 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482, 484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 240 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 558-559, 562, 566-568)
PASSED tests/test_smoke_pytester.py::TestSpecialCharacters::test_special_chars_in_nodeid
71ms 🛡️ 8
Coverage
src/pytest_llm_report/collector.py 40 lines (ranges: 78-79, 90, 93-94, 96, 99-100, 104, 109-112, 114-115, 124, 127, 132-133, 140, 155-159, 163-164, 167-169, 171, 181, 185-186, 198-199, 209-210, 277, 285)
src/pytest_llm_report/coverage_map.py 12 lines (ranges: 44-45, 58-60, 72-73, 83, 86, 88-90)
src/pytest_llm_report/errors.py 4 lines (ranges: 142-145)
src/pytest_llm_report/models.py 1 lines (ranges: 190)
src/pytest_llm_report/options.py 90 lines (ranges: 123, 171, 199, 202-203, 209-210, 217-218, 225-226, 233-234, 241, 245, 247, 249, 251, 253, 257-258, 265-266, 271, 273, 276, 284, 308, 311-312, 320-322, 460, 463, 466, 470, 472-473, 476-477, 482-484, 486, 488, 490, 492, 494, 499-500, 504-505, 511-512, 516-517, 521-522, 528-529, 534, 537-538, 542-543, 547-548, 554-555, 561-562, 566-567, 572, 575-576, 581, 583, 588-589, 593-594, 599, 601, 603, 605, 607, 611, 613)
src/pytest_llm_report/plugin.py 288 lines (ranges: 41, 44-48, 50-54, 56-60, 62-66, 68-72, 74-79, 81-86, 90-94, 96-100, 102-106, 108-112, 114-118, 122-126, 128-132, 134-138, 142-146, 148-153, 155-159, 161-165, 169-174, 176-181, 185-190, 192-197, 199-204, 208-213, 215-219, 223-227, 229-233, 235-239, 241-245, 247-252, 254-258, 260-264, 268-272, 274-279, 283-287, 289-293, 297-302, 304-309, 311-315, 328-330, 332-334, 336-338, 342, 346-347, 349, 351, 354-355, 362, 371-373, 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485, 491-492, 534-544, 558-559, 562, 566-568, 579, 583, 602, 606-608, 619, 623, 626, 628-629)
src/pytest_llm_report/render.py 25 lines (ranges: 30-31, 40, 42-46, 50-51, 53, 65, 67, 79-85, 87, 99, 101-102, 107)
src/pytest_llm_report/report_writer.py 106 lines (ranges: 55, 67-73, 85-86, 98-100, 127-128, 130, 156-158, 186, 192-193, 197-198, 202, 211-218, 222, 226-227, 230, 233, 254, 256-259, 262-264, 266, 268-275, 277-278, 280-289, 291-294, 296-297, 299-300, 302-303, 305-307, 319, 321-322, 324-325, 337, 383, 385-386, 389, 392, 395, 398-402, 477-478, 502, 504, 506-508, 510, 513)
📄 tests/test_time.py 15 tests
PASSED tests/test_time.py::TestFormatDuration::test_boundary_one_minute
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 6 lines (ranges: 39, 41, 43, 46-48)
PASSED tests/test_time.py::TestFormatDuration::test_microseconds_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 2 lines (ranges: 39-40)
PASSED tests/test_time.py::TestFormatDuration::test_milliseconds_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 3 lines (ranges: 39, 41-42)
PASSED tests/test_time.py::TestFormatDuration::test_minutes_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 6 lines (ranges: 39, 41, 43, 46-48)
PASSED tests/test_time.py::TestFormatDuration::test_multiple_minutes
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 6 lines (ranges: 39, 41, 43, 46-48)
PASSED tests/test_time.py::TestFormatDuration::test_one_second
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 4 lines (ranges: 39, 41, 43-44)
PASSED tests/test_time.py::TestFormatDuration::test_seconds_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 4 lines (ranges: 39, 41, 43-44)
PASSED tests/test_time.py::TestFormatDuration::test_small_milliseconds
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 3 lines (ranges: 39, 41-42)
PASSED tests/test_time.py::TestFormatDuration::test_very_small_microseconds
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 2 lines (ranges: 39-40)
PASSED tests/test_time.py::TestIsoFormat::test_formats_datetime_with_utc
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 1 lines (ranges: 27)
PASSED tests/test_time.py::TestIsoFormat::test_formats_naive_datetime
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 1 lines (ranges: 27)
PASSED tests/test_time.py::TestIsoFormat::test_formats_with_microseconds
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 1 lines (ranges: 27)
PASSED tests/test_time.py::TestUtcNow::test_has_utc_timezone
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 1 lines (ranges: 15)
PASSED tests/test_time.py::TestUtcNow::test_is_current_time
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 1 lines (ranges: 15)
PASSED tests/test_time.py::TestUtcNow::test_returns_datetime
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
src/pytest_llm_report/util/time.py 1 lines (ranges: 15)
📄 tests/test_token_refresh.py 12 tests
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_command_failure
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 20 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101-104, 113, 115)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_empty_output
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 20 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101, 107-109, 113, 115)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_force_refresh
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 25 lines (ranges: 59-60, 63, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_get_token_json_custom_key
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 29 lines (ranges: 59-60, 63, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132-135, 139, 143-144, 148)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_get_token_json_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 29 lines (ranges: 59-60, 63, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132-135, 139, 143-144, 148)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_get_token_text_format
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 25 lines (ranges: 59-60, 63, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_invalid_json
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 25 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101, 107-108, 111, 113, 115, 132-134, 149-150)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_invalidate
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 28 lines (ranges: 59-60, 63, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156, 160-162)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_missing_json_key
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 28 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101, 107-108, 111, 113, 115, 132-135, 139-141, 149)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_thread_safety
51ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 28 lines (ranges: 59-60, 63-66, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_timeout_handling
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 16 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 113-114)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh.py::TestTokenRefresher::test_token_caching
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 28 lines (ranges: 59-60, 63-66, 69-72, 83, 85-86, 90, 93-98, 101, 107-108, 111, 132, 153-154, 156)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_token_refresh_coverage.py 9 tests
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_command_failure_no_stderr
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 20 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101-104, 113, 115)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_empty_command_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 11 lines (ranges: 59-60, 63, 69, 83, 85-86, 90-91, 113, 115)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_invalid_command_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 11 lines (ranges: 59-60, 63, 69, 83, 85-88, 113, 115)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_json_not_dict
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 27 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101, 107-108, 111, 113, 115, 132-137, 149)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_json_token_empty_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 30 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101, 107-108, 111, 113, 115, 132-135, 139, 143-146, 149)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_json_token_not_string
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 30 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 101, 107-108, 111, 113, 115, 132-135, 139, 143-146, 149)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_oserror_on_execution
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 19 lines (ranges: 59-60, 63, 69, 83, 85-86, 90, 93-98, 113, 115-118)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_text_only_whitespace_lines
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 4 lines (ranges: 132, 153-155)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
PASSED tests/test_token_refresh_coverage.py::TestTokenRefresherEdgeCases::test_whitespace_only_command
1ms 🛡️ 3
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/llm/token_refresh.py 11 lines (ranges: 59-60, 63, 69, 83, 85-86, 90-91, 113, 115)
src/pytest_llm_report/plugin.py 6 lines (ranges: 558-559, 562, 566-568)
📄 tests/test_token_usage.py 1 tests
PASSED tests/test_token_usage.py::test_token_usage_aggregation
4ms 🛡️ 2
Coverage
src/pytest_llm_report/collector.py 14 lines (ranges: 90, 93, 96, 99, 110-112, 114-115, 124, 127, 140, 209-210)
src/pytest_llm_report/plugin.py 73 lines (ranges: 399, 403, 407, 410, 429-430, 437-438, 441-442, 444-445, 448-452, 454, 457-458, 460, 463-464, 485-487, 491-494, 497, 499, 502-506, 509, 512-514, 516-521, 523-531, 534-544, 558-559, 562, 566-568)