1- import type { EvaluationDetails , HookContext } from '@openfeature/server-sdk' ;
1+ import type { EvaluationDetails , HookContext } from '@openfeature/core' ;
2+ import { ErrorCode } from '@openfeature/core' ;
23
34const addEvent = jest . fn ( ) ;
45const recordException = jest . fn ( ) ;
@@ -13,6 +14,7 @@ jest.mock('@opentelemetry/api', () => ({
1314
1415// Import must be after the mocks
1516import { TracingHook } from './tracing-hook' ;
17+ import { ALL_EVENT_ATTRS } from '../conventions' ;
1618
1719describe ( 'OpenTelemetry Hooks' , ( ) => {
1820 const hookContext : HookContext = {
@@ -56,28 +58,52 @@ describe('OpenTelemetry Hooks', () => {
5658
5759 expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
5860 'feature_flag.key' : 'testFlagKey' ,
59- 'feature_flag.provider_name ' : 'testProvider' ,
60- 'feature_flag.variant' : 'enabled' ,
61+ 'feature_flag.provider.name ' : 'testProvider' ,
62+ 'feature_flag.result. variant' : 'enabled' ,
6163 } ) ;
6264 } ) ;
6365
64- it ( 'should use a stringified value as the variant value on the span event' , ( ) => {
66+ it ( 'should use the error values on the span event' , ( ) => {
6567 const evaluationDetails : EvaluationDetails < boolean > = {
68+ value : false ,
6669 flagKey : hookContext . flagKey ,
67- value : true ,
70+ errorCode : ErrorCode . PROVIDER_FATAL ,
71+ errorMessage : 'fake error message' ,
6872 flagMetadata : { } ,
6973 } ;
7074
7175 tracingHook . after ( hookContext , evaluationDetails ) ;
7276
7377 expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
7478 'feature_flag.key' : 'testFlagKey' ,
75- 'feature_flag.provider_name' : 'testProvider' ,
76- 'feature_flag.variant' : 'true' ,
79+ 'feature_flag.provider.name' : 'testProvider' ,
80+ 'feature_flag.error.type' : ErrorCode . PROVIDER_FATAL . toLowerCase ( ) ,
81+ 'feature_flag.error.message' : 'fake error message' ,
82+ } ) ;
83+ } ) ;
84+
85+ it ( 'should not call addEvent because there is no active span' , ( ) => {
86+ getActiveSpan . mockReturnValueOnce ( undefined ) ;
87+ const evaluationDetails : EvaluationDetails < boolean > = {
88+ flagKey : hookContext . flagKey ,
89+ value : true ,
90+ variant : 'enabled' ,
91+ flagMetadata : { } ,
92+ } ;
93+
94+ tracingHook . after ( hookContext , evaluationDetails ) ;
95+ expect ( addEvent ) . not . toBeCalled ( ) ;
96+ } ) ;
97+ } ) ;
98+
99+ describe ( 'with value attribute' , ( ) => {
100+ beforeEach ( ( ) => {
101+ tracingHook = new TracingHook ( {
102+ includeAttributes : ALL_EVENT_ATTRS ,
77103 } ) ;
78104 } ) ;
79105
80- it ( 'should set the value without extra quotes if value is already a string ' , ( ) => {
106+ it ( 'should set the value' , ( ) => {
81107 const evaluationDetails : EvaluationDetails < string > = {
82108 flagKey : hookContext . flagKey ,
83109 value : 'already-string' ,
@@ -87,22 +113,29 @@ describe('OpenTelemetry Hooks', () => {
87113
88114 expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
89115 'feature_flag.key' : 'testFlagKey' ,
90- 'feature_flag.provider_name ' : 'testProvider' ,
91- 'feature_flag.variant ' : 'already-string' ,
116+ 'feature_flag.provider.name ' : 'testProvider' ,
117+ 'feature_flag.result.value ' : 'already-string' ,
92118 } ) ;
93119 } ) ;
94120
95- it ( 'should not call addEvent because there is no active span' , ( ) => {
96- getActiveSpan . mockReturnValueOnce ( undefined ) ;
121+ it ( 'should use the error values and value on the span event' , ( ) => {
97122 const evaluationDetails : EvaluationDetails < boolean > = {
123+ value : false ,
98124 flagKey : hookContext . flagKey ,
99- value : true ,
100- variant : 'enabled ' ,
125+ errorCode : ErrorCode . PROVIDER_FATAL ,
126+ errorMessage : 'fake error message ' ,
101127 flagMetadata : { } ,
102128 } ;
103129
104130 tracingHook . after ( hookContext , evaluationDetails ) ;
105- expect ( addEvent ) . not . toBeCalled ( ) ;
131+
132+ expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
133+ 'feature_flag.key' : 'testFlagKey' ,
134+ 'feature_flag.provider.name' : 'testProvider' ,
135+ 'feature_flag.result.value' : false ,
136+ 'feature_flag.error.type' : ErrorCode . PROVIDER_FATAL . toLowerCase ( ) ,
137+ 'feature_flag.error.message' : 'fake error message' ,
138+ } ) ;
106139 } ) ;
107140 } ) ;
108141
@@ -136,8 +169,8 @@ describe('OpenTelemetry Hooks', () => {
136169
137170 expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
138171 'feature_flag.key' : 'testFlagKey' ,
139- 'feature_flag.provider_name ' : 'testProvider' ,
140- 'feature_flag.variant' : 'enabled' ,
172+ 'feature_flag.provider.name ' : 'testProvider' ,
173+ 'feature_flag.result. variant' : 'enabled' ,
141174 customAttr1 : 'one' ,
142175 customAttr2 : 2 ,
143176 customAttr3 : true ,
@@ -170,8 +203,8 @@ describe('OpenTelemetry Hooks', () => {
170203
171204 expect ( addEvent ) . toBeCalledWith ( 'feature_flag' , {
172205 'feature_flag.key' : 'testFlagKey' ,
173- 'feature_flag.provider_name ' : 'testProvider' ,
174- 'feature_flag.variant' : 'enabled' ,
206+ 'feature_flag.provider.name ' : 'testProvider' ,
207+ 'feature_flag.result. variant' : 'enabled' ,
175208 } ) ;
176209 } ) ;
177210 } ) ;
0 commit comments