Skip to content

Commit a1d7c2d

Browse files
committed
add monomorphization tests
1 parent 986d3c0 commit a1d7c2d

1 file changed

Lines changed: 164 additions & 0 deletions

File tree

golem-common/src/base_model/card/monomorphization.rs

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,3 +545,167 @@ impl MonomorphizeOwner<ToolOwnerPattern> for PolymorphicToolOwnerPattern {
545545
}
546546
}
547547
}
548+
549+
#[cfg(test)]
550+
mod tests {
551+
use super::*;
552+
use crate::model::account::AccountEmail;
553+
use crate::model::agent::AgentTypeName;
554+
use crate::model::application::ApplicationName;
555+
use crate::model::card::recipient::RecipientPattern;
556+
use crate::model::card::{
557+
AgentClass, AgentResourcePattern, AgentVerb, ClassPermissionTarget, ComponentClass,
558+
ComponentResourcePattern, ComponentVerb, EffectiveSurface, EnvironmentClass,
559+
EnvironmentResourcePattern, EnvironmentVerb, PermissionTarget,
560+
PolymorphicClassPermissionPattern, PolymorphicPermissionPattern,
561+
};
562+
use crate::model::component::ComponentName;
563+
use crate::model::component_metadata::AgentInitialPermissionTemplate;
564+
use crate::model::environment::EnvironmentName;
565+
use test_r::test;
566+
567+
fn context() -> AgentPermissionMonomorphizationContext {
568+
AgentPermissionMonomorphizationContext {
569+
account: AccountEmail::from("owner@example.com"),
570+
application: ApplicationName::try_from("shop").unwrap(),
571+
environment: EnvironmentName::try_from("prod").unwrap(),
572+
component: ComponentName("cart-svc".to_string()),
573+
agent_name: "Cart(alice)".to_string(),
574+
agent_type: AgentTypeName("Cart".to_string()),
575+
}
576+
}
577+
578+
fn holder() -> RecipientPattern {
579+
RecipientPattern::parse("owner@example.com/shop/prod/cart-svc/Cart(alice)").unwrap()
580+
}
581+
582+
fn environment_view_target(owner: &str) -> PermissionTarget {
583+
PermissionTarget::Environment(ClassPermissionTarget::<EnvironmentClass> {
584+
verb: Some(EnvironmentVerb::View),
585+
owner: EnvironmentOwnerPattern::parse(owner).unwrap(),
586+
resource: EnvironmentResourcePattern::Any,
587+
})
588+
}
589+
590+
fn component_view_target(owner: &str) -> PermissionTarget {
591+
PermissionTarget::Component(ClassPermissionTarget::<ComponentClass> {
592+
verb: Some(ComponentVerb::View),
593+
owner: ComponentOwnerPattern::parse(owner).unwrap(),
594+
resource: ComponentResourcePattern::Any,
595+
})
596+
}
597+
598+
fn agent_target(owner: &str, verb: AgentVerb) -> PermissionTarget {
599+
PermissionTarget::Agent(ClassPermissionTarget::<AgentClass> {
600+
verb: Some(verb),
601+
owner: AgentOwnerPattern::parse(owner).unwrap(),
602+
resource: AgentResourcePattern::Any,
603+
})
604+
}
605+
606+
#[test]
607+
fn monomorphizes_holder_relative_agent_initial_template_slots() {
608+
let context = context();
609+
let recipient = RecipientPattern::Any;
610+
let card = monomorphize_agent_initial_card(
611+
&[
612+
PolymorphicPermissionPattern::Environment(PolymorphicClassPermissionPattern {
613+
owner: PolymorphicEnvironmentOwnerPattern::Env,
614+
recipient: recipient.clone(),
615+
verb: Some(EnvironmentVerb::View),
616+
resource: EnvironmentResourcePattern::Any,
617+
}),
618+
PolymorphicPermissionPattern::Component(PolymorphicClassPermissionPattern {
619+
owner: PolymorphicComponentOwnerPattern::Component,
620+
recipient: recipient.clone(),
621+
verb: Some(ComponentVerb::View),
622+
resource: ComponentResourcePattern::Any,
623+
}),
624+
PolymorphicPermissionPattern::Agent(PolymorphicClassPermissionPattern {
625+
owner: PolymorphicAgentOwnerPattern::Agent,
626+
recipient,
627+
verb: Some(AgentVerb::View),
628+
resource: AgentResourcePattern::Any,
629+
}),
630+
],
631+
&[],
632+
&[],
633+
&[],
634+
&context,
635+
)
636+
.unwrap();
637+
638+
assert_eq!(card.card_id, CardId(uuid::Uuid::nil()));
639+
assert_eq!(card.lower_positive.len(), 3);
640+
assert!(
641+
card.lower_positive[0]
642+
.subsumes_target(&environment_view_target("owner@example.com/shop/prod"))
643+
);
644+
assert!(
645+
card.lower_positive[1].subsumes_target(&component_view_target(
646+
"owner@example.com/shop/prod/cart-svc"
647+
))
648+
);
649+
assert!(card.lower_positive[2].subsumes_target(&agent_target(
650+
"owner@example.com/shop/prod/cart-svc/Cart(alice)",
651+
AgentVerb::View,
652+
)));
653+
assert!(!card.lower_positive[2].subsumes_target(&agent_target(
654+
"owner@example.com/shop/prod/cart-svc/Cart(bob)",
655+
AgentVerb::View,
656+
)));
657+
}
658+
659+
#[test]
660+
fn default_agent_initial_template_is_current_component_scoped() {
661+
let context = context();
662+
let template =
663+
AgentInitialPermissionTemplate::default_for(&context.environment, &context.component);
664+
let card = monomorphize_agent_initial_card(
665+
&template.lower_positive,
666+
&template.lower_negative,
667+
&template.upper_positive,
668+
&template.upper_negative,
669+
&context,
670+
)
671+
.unwrap();
672+
let surface = EffectiveSurface::from_cards(&[card], &holder()).unwrap();
673+
674+
assert!(
675+
surface
676+
.authorize(&environment_view_target("owner@example.com/shop/prod"))
677+
.unwrap()
678+
);
679+
assert!(
680+
surface
681+
.authorize(&component_view_target(
682+
"owner@example.com/shop/prod/cart-svc"
683+
))
684+
.unwrap()
685+
);
686+
assert!(
687+
surface
688+
.authorize(&agent_target(
689+
"owner@example.com/shop/prod/cart-svc/Cart(bob)",
690+
AgentVerb::Invoke,
691+
))
692+
.unwrap()
693+
);
694+
assert!(
695+
!surface
696+
.authorize(&agent_target(
697+
"owner@example.com/shop/prod/inventory-svc/Inventory(bob)",
698+
AgentVerb::Invoke,
699+
))
700+
.unwrap()
701+
);
702+
assert!(
703+
!surface
704+
.authorize(&agent_target(
705+
"owner@example.com/shop/dev/cart-svc/Cart(bob)",
706+
AgentVerb::Invoke,
707+
))
708+
.unwrap()
709+
);
710+
}
711+
}

0 commit comments

Comments
 (0)