@@ -18,10 +18,14 @@ import (
1818// RemoteMCPEnthusiasticGreeting is a dummy test feature flag .
1919const RemoteMCPEnthusiasticGreeting = "remote_mcp_enthusiastic_greeting"
2020
21- // FeatureChecker is an interface for checking if a feature flag is enabled.
22- type FeatureChecker interface {
23- // IsFeatureEnabled checks if a feature flag is enabled.
24- IsFeatureEnabled (ctx context.Context , flagName string ) bool
21+ func featureCheckerFor (enabledFlags ... string ) func (context.Context , string ) (bool , error ) {
22+ enabled := make (map [string ]bool , len (enabledFlags ))
23+ for _ , flag := range enabledFlags {
24+ enabled [flag ] = true
25+ }
26+ return func (_ context.Context , flagName string ) (bool , error ) {
27+ return enabled [flagName ], nil
28+ }
2529}
2630
2731// HelloWorld returns a simple greeting tool that demonstrates feature flag conditional behavior.
@@ -45,9 +49,6 @@ func HelloWorldTool(t translations.TranslationHelperFunc) inventory.ServerTool {
4549 if deps .IsFeatureEnabled (ctx , RemoteMCPEnthusiasticGreeting ) {
4650 greeting += " Welcome to the future of MCP! 🎉"
4751 }
48- if deps .GetFlags (ctx ).InsidersMode {
49- greeting += " Experimental features are enabled! 🚀"
50- }
5152
5253 // Build response
5354 response := map [string ]any {
@@ -89,12 +90,9 @@ func TestHelloWorld_ConditionalBehavior_Featureflag(t *testing.T) {
8990 t .Run (tt .name , func (t * testing.T ) {
9091 t .Parallel ()
9192
92- // Create feature checker based on test case
93- checker := func (_ context.Context , flagName string ) (bool , error ) {
94- if flagName == RemoteMCPEnthusiasticGreeting {
95- return tt .featureFlagEnabled , nil
96- }
97- return false , nil
93+ var enabledFlags []string
94+ if tt .featureFlagEnabled {
95+ enabledFlags = append (enabledFlags , RemoteMCPEnthusiasticGreeting )
9896 }
9997
10098 // Create deps with the checker
@@ -103,7 +101,7 @@ func TestHelloWorld_ConditionalBehavior_Featureflag(t *testing.T) {
103101 translations .NullTranslationHelper ,
104102 FeatureFlags {},
105103 0 ,
106- checker ,
104+ featureCheckerFor ( enabledFlags ... ) ,
107105 stubExporters (),
108106 )
109107
@@ -142,54 +140,62 @@ func TestResolveFeatureFlags(t *testing.T) {
142140 tests := []struct {
143141 name string
144142 enabledFeatures []string
145- insidersMode bool
143+ metaFeatures [] string
146144 expectedFlags []string
147145 unexpectedFlags []string
148146 }{
149147 {
150148 name : "no features, no insiders" ,
151149 enabledFeatures : nil ,
152- insidersMode : false ,
153150 expectedFlags : nil ,
154- unexpectedFlags : []string {MCPAppsFeatureFlag },
151+ unexpectedFlags : []string {MCPAppsFeatureFlag , FeatureFlagIFCLabels },
155152 },
156153 {
157154 name : "explicit feature enabled" ,
158155 enabledFeatures : []string {MCPAppsFeatureFlag },
159- insidersMode : false ,
160156 expectedFlags : []string {MCPAppsFeatureFlag },
161157 },
162158 {
163- name : "insiders mode enables insiders flags" ,
159+ name : "insiders meta feature enables insiders flags" ,
164160 enabledFeatures : nil ,
165- insidersMode : true ,
161+ metaFeatures : [] string { MetaFeatureFlagInsiders } ,
166162 expectedFlags : InsidersFeatureFlags ,
167163 },
164+ {
165+ name : "insiders meta feature enables internal-only flags" ,
166+ enabledFeatures : nil ,
167+ metaFeatures : []string {MetaFeatureFlagInsiders },
168+ expectedFlags : []string {FeatureFlagIFCLabels },
169+ },
170+ {
171+ name : "internal-only flags are not directly enabled" ,
172+ enabledFeatures : []string {FeatureFlagIFCLabels },
173+ expectedFlags : nil ,
174+ unexpectedFlags : []string {FeatureFlagIFCLabels },
175+ },
168176 {
169177 name : "unknown flags are filtered out" ,
170178 enabledFeatures : []string {"unknown_flag" , "another_unknown" },
171- insidersMode : false ,
172179 unexpectedFlags : []string {"unknown_flag" , "another_unknown" },
173180 },
174181 {
175182 name : "mix of known and unknown flags" ,
176183 enabledFeatures : []string {MCPAppsFeatureFlag , "unknown_flag" },
177- insidersMode : false ,
178184 expectedFlags : []string {MCPAppsFeatureFlag },
179185 unexpectedFlags : []string {"unknown_flag" },
180186 },
181187 {
182188 name : "explicit plus insiders deduplicates" ,
183189 enabledFeatures : []string {MCPAppsFeatureFlag },
184- insidersMode : true ,
185- expectedFlags : [] string { MCPAppsFeatureFlag } ,
190+ metaFeatures : [] string { MetaFeatureFlagInsiders } ,
191+ expectedFlags : InsidersFeatureFlags ,
186192 },
187193 }
188194
189195 for _ , tt := range tests {
190196 t .Run (tt .name , func (t * testing.T ) {
191197 t .Parallel ()
192- result := ResolveFeatureFlags (tt .enabledFeatures , tt .insidersMode )
198+ result := ResolveFeatureFlags (tt .enabledFeatures , tt .metaFeatures ... )
193199 for _ , flag := range tt .expectedFlags {
194200 assert .True (t , result [flag ], "expected flag %q to be enabled" , flag )
195201 }
@@ -199,66 +205,3 @@ func TestResolveFeatureFlags(t *testing.T) {
199205 })
200206 }
201207}
202-
203- func TestHelloWorld_ConditionalBehavior_Config (t * testing.T ) {
204- t .Parallel ()
205-
206- tests := []struct {
207- name string
208- insidersMode bool
209- expectedGreeting string
210- }{
211- {
212- name : "Experimental disabled - default greeting" ,
213- insidersMode : false ,
214- expectedGreeting : "Hello, world!" ,
215- },
216- {
217- name : "Experimental enabled - experimental greeting" ,
218- insidersMode : true ,
219- expectedGreeting : "Hello, world! Experimental features are enabled! 🚀" ,
220- },
221- }
222-
223- for _ , tt := range tests {
224- t .Run (tt .name , func (t * testing.T ) {
225- t .Parallel ()
226-
227- // Create deps with the checker
228- deps := NewBaseDeps (
229- nil , nil , nil , nil ,
230- translations .NullTranslationHelper ,
231- FeatureFlags {InsidersMode : tt .insidersMode },
232- 0 ,
233- nil ,
234- stubExporters (),
235- )
236-
237- // Get the tool and its handler
238- tool := HelloWorldTool (translations .NullTranslationHelper )
239- handler := tool .Handler (deps )
240-
241- // Call the handler with deps in context
242- ctx := ContextWithDeps (context .Background (), deps )
243- result , err := handler (ctx , & mcp.CallToolRequest {
244- Params : & mcp.CallToolParamsRaw {
245- Arguments : json .RawMessage (`{}` ),
246- },
247- })
248- require .NoError (t , err )
249- require .NotNil (t , result )
250- require .Len (t , result .Content , 1 )
251-
252- // Parse the response - should be TextContent
253- textContent , ok := result .Content [0 ].(* mcp.TextContent )
254- require .True (t , ok , "expected content to be TextContent" )
255-
256- var response map [string ]any
257- err = json .Unmarshal ([]byte (textContent .Text ), & response )
258- require .NoError (t , err )
259-
260- // Verify the greeting matches expected based on feature flag
261- assert .Equal (t , tt .expectedGreeting , response ["greeting" ])
262- })
263- }
264- }
0 commit comments