Skip to content

Commit c7844ff

Browse files
committed
Extract fed resolution tests
1 parent 11eccc6 commit c7844ff

File tree

5 files changed

+770
-644
lines changed

5 files changed

+770
-644
lines changed

src/composition/supergraph/config/federation.rs

+115-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl FederationVersionResolver<state::FromSubgraphs> {
126126
/// Resolves the [`FederationVersion`] against user input and the subgraph SDLs provided
127127
pub fn resolve<'a>(
128128
&self,
129-
subgraphs: &'a mut impl Iterator<Item = (&'a String, &'a FullyResolvedSubgraph)>,
129+
subgraphs: impl Iterator<Item = (&'a String, &'a FullyResolvedSubgraph)>,
130130
) -> Result<FederationVersion, FederationVersionMismatch> {
131131
let fed_two_subgraphs = subgraphs
132132
.filter_map(|(subgraph_name, subgraph)| {
@@ -158,3 +158,117 @@ impl FederationVersionResolver<state::FromSubgraphs> {
158158
}
159159
}
160160
}
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+
}

src/composition/supergraph/config/full/supergraph.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl FullyResolvedSupergraphConfig {
6767
let subgraphs = BTreeMap::from_iter(subgraphs);
6868
let federation_version = unresolved_supergraph_config
6969
.federation_version_resolver()
70-
.resolve(&mut subgraphs.iter())?;
70+
.resolve(subgraphs.iter())?;
7171
Ok(FullyResolvedSupergraphConfig {
7272
origin_path: unresolved_supergraph_config.origin_path().clone(),
7373
subgraphs,

0 commit comments

Comments
 (0)