1212use Sentry \State \Scope ;
1313use Sentry \Tracing \DynamicSamplingContext ;
1414use Sentry \Tracing \PropagationContext ;
15+ use Sentry \Tracing \Span ;
1516use Sentry \Tracing \SpanContext ;
1617use Sentry \Tracing \SpanId ;
1718use Sentry \Tracing \TraceId ;
@@ -77,6 +78,88 @@ public function testRemoveTag(): void
7778 $ this ->assertSame (['bar ' => 'baz ' ], $ event ->getTags ());
7879 }
7980
81+ public function testSetFlag (): void
82+ {
83+ $ scope = new Scope ();
84+ $ event = $ scope ->applyToEvent (Event::createEvent ());
85+
86+ $ this ->assertNotNull ($ event );
87+ $ this ->assertArrayNotHasKey ('flags ' , $ event ->getContexts ());
88+
89+ $ scope ->addFeatureFlag ('foo ' , true );
90+ $ scope ->addFeatureFlag ('bar ' , false );
91+
92+ $ event = $ scope ->applyToEvent (Event::createEvent ());
93+
94+ $ this ->assertNotNull ($ event );
95+ $ this ->assertArrayHasKey ('flags ' , $ event ->getContexts ());
96+ $ this ->assertEquals ([
97+ 'values ' => [
98+ [
99+ 'flag ' => 'foo ' ,
100+ 'result ' => true ,
101+ ],
102+ [
103+ 'flag ' => 'bar ' ,
104+ 'result ' => false ,
105+ ],
106+ ],
107+ ], $ event ->getContexts ()['flags ' ]);
108+ }
109+
110+ public function testSetFlagLimit (): void
111+ {
112+ $ scope = new Scope ();
113+ $ event = $ scope ->applyToEvent (Event::createEvent ());
114+
115+ $ this ->assertNotNull ($ event );
116+ $ this ->assertArrayNotHasKey ('flags ' , $ event ->getContexts ());
117+
118+ $ expectedFlags = [];
119+
120+ foreach (range (1 , Scope::MAX_FLAGS ) as $ i ) {
121+ $ scope ->addFeatureFlag ("feature {$ i }" , true );
122+
123+ $ expectedFlags [] = [
124+ 'flag ' => "feature {$ i }" ,
125+ 'result ' => true ,
126+ ];
127+ }
128+
129+ $ event = $ scope ->applyToEvent (Event::createEvent ());
130+
131+ $ this ->assertNotNull ($ event );
132+ $ this ->assertArrayHasKey ('flags ' , $ event ->getContexts ());
133+ $ this ->assertEquals (['values ' => $ expectedFlags ], $ event ->getContexts ()['flags ' ]);
134+
135+ array_shift ($ expectedFlags );
136+
137+ $ scope ->addFeatureFlag ('should-not-be-discarded ' , true );
138+
139+ $ expectedFlags [] = [
140+ 'flag ' => 'should-not-be-discarded ' ,
141+ 'result ' => true ,
142+ ];
143+
144+ $ event = $ scope ->applyToEvent (Event::createEvent ());
145+
146+ $ this ->assertNotNull ($ event );
147+ $ this ->assertArrayHasKey ('flags ' , $ event ->getContexts ());
148+ $ this ->assertEquals (['values ' => $ expectedFlags ], $ event ->getContexts ()['flags ' ]);
149+ }
150+
151+ public function testSetFlagPropagatesToSpan (): void
152+ {
153+ $ span = new Span ();
154+
155+ $ scope = new Scope ();
156+ $ scope ->setSpan ($ span );
157+
158+ $ scope ->addFeatureFlag ('feature ' , true );
159+
160+ $ this ->assertSame (['flag.evaluation.feature ' => true ], $ span ->getData ());
161+ }
162+
80163 public function testSetAndRemoveContext (): void
81164 {
82165 $ propgationContext = PropagationContext::fromDefaults ();
@@ -364,6 +447,7 @@ public function testClear(): void
364447 $ scope ->setFingerprint (['foo ' ]);
365448 $ scope ->setExtras (['foo ' => 'bar ' ]);
366449 $ scope ->setTags (['bar ' => 'foo ' ]);
450+ $ scope ->addFeatureFlag ('feature ' , true );
367451 $ scope ->setUser (UserDataBag::createFromUserIdentifier ('unique_id ' ));
368452 $ scope ->clear ();
369453
@@ -376,6 +460,7 @@ public function testClear(): void
376460 $ this ->assertEmpty ($ event ->getExtra ());
377461 $ this ->assertEmpty ($ event ->getTags ());
378462 $ this ->assertEmpty ($ event ->getUser ());
463+ $ this ->assertArrayNotHasKey ('flags ' , $ event ->getContexts ());
379464 }
380465
381466 public function testApplyToEvent (): void
@@ -403,6 +488,7 @@ public function testApplyToEvent(): void
403488 $ scope ->setUser ($ user );
404489 $ scope ->setContext ('foocontext ' , ['foo ' => 'bar ' ]);
405490 $ scope ->setContext ('barcontext ' , ['bar ' => 'foo ' ]);
491+ $ scope ->addFeatureFlag ('feature ' , true );
406492 $ scope ->setSpan ($ span );
407493
408494 $ this ->assertSame ($ event , $ scope ->applyToEvent ($ event ));
@@ -417,6 +503,14 @@ public function testApplyToEvent(): void
417503 'foo ' => 'foo ' ,
418504 'bar ' => 'bar ' ,
419505 ],
506+ 'flags ' => [
507+ 'values ' => [
508+ [
509+ 'flag ' => 'feature ' ,
510+ 'result ' => true ,
511+ ],
512+ ],
513+ ],
420514 'trace ' => [
421515 'span_id ' => '566e3688a61d4bc8 ' ,
422516 'trace_id ' => '566e3688a61d4bc888951642d6f14a19 ' ,
0 commit comments