BatchGetKVRequest<ComplexResourceKey<TestRecord, TestRecord>, TestRecord> batchingRequest =
BatchGetRequestBuilder.batchKV(Arrays.asList(batchRequest1, batchRequest2));
URI actualProtocol1Uri = RestliUriBuilderUtil.createUriBuilder(batchingRequest, AllProtocolVersions.RESTLI_PROTOCOL_1_0_0.getProtocolVersion()).build();
MultivaluedMap actualParams = UriComponent.decodeQuery(actualProtocol1Uri, true);
MultivaluedMap expectedUriParams =
UriComponent.decodeQuery(URI.create(expectedProtocol1Uri), true);
DataMap expectedParamsDataMap = null;
DataMap actualParamsDataMap = null;
try
{
expectedParamsDataMap = QueryParamsDataMap.parseDataMapKeys(expectedUriParams);
actualParamsDataMap = QueryParamsDataMap.parseDataMapKeys(actualParams);
}
catch (PathSegmentSyntaxException e)
{
// Should never happen
Assert.fail("Failed to parse data map keys!");
}
Assert.assertEquals(actualProtocol1Uri.getPath(), "/");
// Apparently due to using set to compact the list of ids in
// BatchGetRequestBuilder.batch() the order of the parameters on the url is no longer
// reliable.
DataList actualIds =
(DataList) actualParamsDataMap.remove(RestConstants.QUERY_BATCH_IDS_PARAM);
DataList expectedIds =
(DataList) expectedParamsDataMap.remove(RestConstants.QUERY_BATCH_IDS_PARAM);
Assert.assertEquals(new HashSet<Object>(actualIds), new HashSet<Object>(expectedIds));
Assert.assertEquals(actualParamsDataMap, expectedParamsDataMap);
Assert.assertEquals(batchingRequest.getBaseUriTemplate(), batchRequest1.getBaseUriTemplate());
Assert.assertEquals(batchingRequest.getPathKeys(), batchRequest1.getPathKeys());
Assert.assertEquals(batchingRequest.getFields(),
new HashSet<PathSpec>(Arrays.asList(FIELDS.id(), FIELDS.message())));
Assert.assertEquals(batchingRequest.getObjectIds(), new HashSet<Object>(Arrays.asList(complexKey1, complexKey2, complexKey3)));
String expectedProtocol2Uri =
"/?fields=id,message&ids=List(($params:(id:1,message:paramMessage1),id:1,message:keyMessage1),($params:(id:2,message:paramMessage2),id:2,message:keyMessage2),($params:(id:3,message:paramMessage3),id:3,message:keyMessage3))¶m1=value1¶m2=value2";
URI actualProtocol2Uri = RestliUriBuilderUtil.createUriBuilder(batchingRequest, AllProtocolVersions.RESTLI_PROTOCOL_2_0_0.getProtocolVersion()).build();
Assert.assertEquals(actualProtocol2Uri.getPath(), "/");
actualParams = UriComponent.decodeQuery(actualProtocol2Uri, true);
MultivaluedMap expectedParams = UriComponent.decodeQuery(URI.create(expectedProtocol2Uri), true);
// we can't compare the query param "ids" directly as ID ordering is not preserved while batching in
// BatchGetRequestBuilder.batch()
Assert.assertEquals(actualParams.get("ids").size(), 1);
Assert.assertEquals(actualParams.get("ids").size(), expectedParams.get("ids").size());
// parse out the "ids" param into a DataList and then convert it into a set
String actualProtocol2IdsAsString = actualParams.remove("ids").get(0);
String expectedProtocol2IdsAsString = expectedParams.remove("ids").get(0);
DataList actualProtocol2Ids = (DataList) URIElementParser.parse(actualProtocol2IdsAsString);
DataList expectedProtocol2Ids = (DataList) URIElementParser.parse(expectedProtocol2IdsAsString);
Assert.assertEquals(new HashSet<Object>(actualProtocol2Ids.values()),
new HashSet<Object>(expectedProtocol2Ids.values()));