55 lines
1.9 KiB
Kotlin
55 lines
1.9 KiB
Kotlin
import com.correx.core.approvals.Tier
|
|
import com.correx.core.approvals.domain.DefaultApprovalEngine
|
|
import com.correx.core.approvals.model.ApprovalContext
|
|
import com.correx.core.approvals.model.ApprovalGrant
|
|
import com.correx.core.approvals.model.ApprovalScopeIdentity
|
|
import com.correx.core.approvals.GrantScope
|
|
import com.correx.core.sessions.ApprovalMode
|
|
import com.correx.core.events.types.GrantId
|
|
import com.correx.core.events.types.SessionId
|
|
import com.correx.testing.fixtures.request
|
|
import kotlinx.datetime.Instant
|
|
import org.junit.jupiter.api.Assertions
|
|
import org.junit.jupiter.api.Test
|
|
|
|
class TierImmutabilityTest {
|
|
|
|
private val engine = DefaultApprovalEngine()
|
|
|
|
@Test
|
|
fun `engine never modifies tier - always returns original`() {
|
|
val tiers = listOf(Tier.T0, Tier.T1, Tier.T2, Tier.T3, Tier.T4)
|
|
val ctx = ApprovalContext(
|
|
ApprovalScopeIdentity(SessionId("s1"), null, null),
|
|
ApprovalMode.YOLO
|
|
)
|
|
val now = Instant.parse("2026-01-01T00:00:01Z")
|
|
|
|
tiers.forEach { tier ->
|
|
val req = request("r1", tier)
|
|
val decision = engine.evaluate(req, ctx, emptyList(), now)
|
|
Assertions.assertEquals(tier, decision.tier, "Tier must remain unchanged")
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun `grant does not change tier in decision`() {
|
|
val tier = Tier.T3
|
|
val req = request("r1", tier)
|
|
val grant = ApprovalGrant(
|
|
id = GrantId("g1"),
|
|
scope = GrantScope.SESSION,
|
|
permittedTiers = setOf(tier),
|
|
reason = "test",
|
|
timestamp = Instant.parse("2026-01-01T00:00:00Z")
|
|
)
|
|
val ctx = ApprovalContext(
|
|
ApprovalScopeIdentity(SessionId("s1"), null, null),
|
|
ApprovalMode.DENY
|
|
)
|
|
val now = Instant.parse("2026-01-01T00:00:01Z")
|
|
|
|
val decision = engine.evaluate(req, ctx, listOf(grant), now)
|
|
Assertions.assertEquals(tier, decision.tier)
|
|
}
|
|
} |