@@ -126,7 +126,7 @@ impl FederationVersionResolver<state::FromSubgraphs> {
126
126
/// Resolves the [`FederationVersion`] against user input and the subgraph SDLs provided
127
127
pub fn resolve < ' a > (
128
128
& self ,
129
- subgraphs : & ' a mut impl Iterator < Item = ( & ' a String , & ' a FullyResolvedSubgraph ) > ,
129
+ subgraphs : impl Iterator < Item = ( & ' a String , & ' a FullyResolvedSubgraph ) > ,
130
130
) -> Result < FederationVersion , FederationVersionMismatch > {
131
131
let fed_two_subgraphs = subgraphs
132
132
. filter_map ( |( subgraph_name, subgraph) | {
@@ -158,3 +158,117 @@ impl FederationVersionResolver<state::FromSubgraphs> {
158
158
}
159
159
}
160
160
}
161
+
162
+ #[ cfg( test) ]
163
+ mod tests {
164
+ use std:: collections:: BTreeMap ;
165
+
166
+ use apollo_federation_types:: config:: { FederationVersion , SubgraphConfig , SupergraphConfig } ;
167
+ use speculoos:: prelude:: * ;
168
+
169
+ use crate :: composition:: supergraph:: config:: { full:: FullyResolvedSubgraph , scenario:: * } ;
170
+
171
+ use super :: FederationVersionResolverFromSupergraphConfig ;
172
+
173
+ /// Test showing that federation version is selected from the user-specified fed version
174
+ /// over local supergraph config or resolved subgraphs
175
+ #[ test]
176
+ fn test_resolve_from_user_selection ( ) {
177
+ let subgraph_name = subgraph_name ( ) ;
178
+ let subgraph_scenario = sdl_subgraph_scenario (
179
+ sdl ( ) ,
180
+ subgraph_name. to_string ( ) ,
181
+ SubgraphFederationVersion :: One ,
182
+ ) ;
183
+ let unresolved_subgraphs = BTreeMap :: from_iter ( [ (
184
+ subgraph_name. to_string ( ) ,
185
+ SubgraphConfig :: from ( subgraph_scenario. unresolved_subgraph . clone ( ) ) ,
186
+ ) ] ) ;
187
+ let federation_version_resolver =
188
+ FederationVersionResolverFromSupergraphConfig :: new ( FederationVersion :: LatestFedTwo ) ;
189
+ let supergraph_config =
190
+ SupergraphConfig :: new ( unresolved_subgraphs, Some ( FederationVersion :: LatestFedOne ) ) ;
191
+
192
+ let resolved_subgraphs = vec ! [ (
193
+ subgraph_name. to_string( ) ,
194
+ FullyResolvedSubgraph :: builder( )
195
+ . schema( subgraph_scenario. sdl)
196
+ . and_routing_url( subgraph_scenario. unresolved_subgraph. routing_url( ) . clone( ) )
197
+ . is_fed_two( false )
198
+ . build( ) ,
199
+ ) ] ;
200
+ let federation_version = federation_version_resolver
201
+ . from_supergraph_config ( Some ( & supergraph_config) )
202
+ . resolve ( resolved_subgraphs. iter ( ) . map ( |( k, v) | ( k, v) ) ) ;
203
+ assert_that ! ( federation_version)
204
+ . is_ok ( )
205
+ . is_equal_to ( FederationVersion :: LatestFedTwo ) ;
206
+ }
207
+
208
+ /// Test showing that federation version is selected from the supergraph config
209
+ /// over resolved subgraphs when it is not specified by the user
210
+ #[ test]
211
+ fn test_resolve_from_supergraph_config ( ) {
212
+ let subgraph_name = subgraph_name ( ) ;
213
+ let subgraph_scenario = sdl_subgraph_scenario (
214
+ sdl ( ) ,
215
+ subgraph_name. to_string ( ) ,
216
+ SubgraphFederationVersion :: One ,
217
+ ) ;
218
+ let unresolved_subgraphs = BTreeMap :: from_iter ( [ (
219
+ subgraph_name. to_string ( ) ,
220
+ SubgraphConfig :: from ( subgraph_scenario. unresolved_subgraph . clone ( ) ) ,
221
+ ) ] ) ;
222
+ let federation_version_resolver = FederationVersionResolverFromSupergraphConfig :: default ( ) ;
223
+ let supergraph_config =
224
+ SupergraphConfig :: new ( unresolved_subgraphs, Some ( FederationVersion :: LatestFedTwo ) ) ;
225
+
226
+ let resolved_subgraphs = vec ! [ (
227
+ subgraph_name. to_string( ) ,
228
+ FullyResolvedSubgraph :: builder( )
229
+ . schema( subgraph_scenario. sdl)
230
+ . and_routing_url( subgraph_scenario. unresolved_subgraph. routing_url( ) . clone( ) )
231
+ . is_fed_two( false )
232
+ . build( ) ,
233
+ ) ] ;
234
+ let federation_version = federation_version_resolver
235
+ . from_supergraph_config ( Some ( & supergraph_config) )
236
+ . resolve ( resolved_subgraphs. iter ( ) . map ( |( k, v) | ( k, v) ) ) ;
237
+ assert_that ! ( federation_version)
238
+ . is_ok ( )
239
+ . is_equal_to ( FederationVersion :: LatestFedTwo ) ;
240
+ }
241
+
242
+ /// Test showing that federation version is selected from resolved subgraphs
243
+ /// when it is not specified by the user or in a supergraph config
244
+ #[ test]
245
+ fn test_resolve_from_resolved_subgraphs ( ) {
246
+ let subgraph_name = subgraph_name ( ) ;
247
+ let subgraph_scenario = sdl_subgraph_scenario (
248
+ sdl_fed2 ( sdl ( ) ) ,
249
+ subgraph_name. to_string ( ) ,
250
+ SubgraphFederationVersion :: Two ,
251
+ ) ;
252
+ let unresolved_subgraphs = BTreeMap :: from_iter ( [ (
253
+ subgraph_name. to_string ( ) ,
254
+ SubgraphConfig :: from ( subgraph_scenario. unresolved_subgraph . clone ( ) ) ,
255
+ ) ] ) ;
256
+ let federation_version_resolver = FederationVersionResolverFromSupergraphConfig :: default ( ) ;
257
+ let supergraph_config = SupergraphConfig :: new ( unresolved_subgraphs, None ) ;
258
+
259
+ let resolved_subgraphs = vec ! [ (
260
+ subgraph_name. to_string( ) ,
261
+ FullyResolvedSubgraph :: builder( )
262
+ . schema( subgraph_scenario. sdl)
263
+ . and_routing_url( subgraph_scenario. unresolved_subgraph. routing_url( ) . clone( ) )
264
+ . is_fed_two( true )
265
+ . build( ) ,
266
+ ) ] ;
267
+ let federation_version = federation_version_resolver
268
+ . from_supergraph_config ( Some ( & supergraph_config) )
269
+ . resolve ( resolved_subgraphs. iter ( ) . map ( |( k, v) | ( k, v) ) ) ;
270
+ assert_that ! ( federation_version)
271
+ . is_ok ( )
272
+ . is_equal_to ( FederationVersion :: LatestFedTwo ) ;
273
+ }
274
+ }
0 commit comments