File size: 2,307 Bytes
b92d20c
 
 
 
 
 
 
 
 
 
 
 
2d2c6e4
 
 
b92d20c
2d2c6e4
 
 
b92d20c
 
 
 
2d2c6e4
 
 
b92d20c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d2c6e4
 
 
b92d20c
 
 
 
 
 
 
 
 
2d2c6e4
 
 
b92d20c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from codereview_env.models import CodeReviewAction, CodeReviewState, ReviewFinding


def test_reset_returns_task_observation(env):
    observation = env.reset(task_id="pagination-regression")
    assert observation.task_id == "pagination-regression"
    assert observation.done is False
    assert len(observation.available_artifacts) >= 2


def test_open_artifact_gives_partial_reward(env):
    env.reset(task_id="pagination-regression")
    observation = env.step(
        CodeReviewAction(action_type="open_artifact", artifact_id="test_log")
    )
    assert 0.0 < observation.reward <= 0.2
    assert any(
        artifact.artifact_id == "test_log" for artifact in observation.opened_artifacts
    )


def test_submit_review_finishes_episode_with_score(env):
    env.reset(task_id="tenant-export-auth")
    env.step(
        CodeReviewAction(action_type="open_artifact", artifact_id="auth_middleware")
    )
    observation = env.step(
        CodeReviewAction(
            action_type="submit_review",
            findings=[
                ReviewFinding(
                    title="Missing tenant scope",
                    file_path="api/admin_exports.py",
                    line_hint="export_invoices",
                    severity="critical",
                    rationale="The handler trusts account_id from a query parameter and can leak another tenant's invoice data.",
                    recommendation="Call require_admin and require_account_scope before exporting the CSV.",
                )
            ],
        )
    )
    assert observation.done is True
    assert 0.0 <= observation.score <= 1.0
    assert observation.score > 0.4


def test_state_reports_progress(env):
    env.reset(task_id="refund-idempotency")
    env.step(
        CodeReviewAction(action_type="open_artifact", artifact_id="payment_client")
    )
    state = env.state
    assert isinstance(state, CodeReviewState)
    assert state.step_count == 1
    assert "payment_client" in state.opened_artifact_ids


def test_step_limit_ends_episode(env):
    observation = env.reset(task_id="pagination-regression")
    for _ in range(observation.step_limit):
        observation = env.step(
            CodeReviewAction(action_type="open_artifact", artifact_id="ticket")
        )
    assert observation.done is True