From 31075aa0c6f3fa2fc32fcb14f39c362218f56a81 Mon Sep 17 00:00:00 2001 From: Mateusz Warowny Date: Mon, 19 Jun 2023 13:08:55 +0200 Subject: [PATCH 1/1] JAL-4199 Test basic service parameter construction --- j11lib/slivka-client.jar | Bin 132275 -> 82066 bytes .../ws2/client/slivka/SlivkaWSDiscovererTest.java | 383 +++++++++++++++----- 2 files changed, 285 insertions(+), 98 deletions(-) diff --git a/j11lib/slivka-client.jar b/j11lib/slivka-client.jar index 3c5290d5bcdf6c004dfdde5fa975c2e2c2ee3c11..11b2f9341240b657daa3e75ace1ae23837eb09a6 100644 GIT binary patch delta 13112 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 R5rF=m;={m1vOrA?^MB|Oah3o8 delta 62558 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 ^t*e0XyPd3&LY7x(z|lY`utx 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 url.toString().equals("http://example.org") ? clientMock - : null); + url -> url.toString().equals("http://example.org") ? clientMock + : null); assertThat(discoverer.getStatusForUrl(new URL("http://example.org")), - is(WebServiceDiscovererI.STATUS_OK)); + is(WebServiceDiscovererI.STATUS_OK)); } @Test public void getStatusForUrl_noServicesReturned_statusIsNoServices() - throws Exception + throws Exception { when(clientMock.getServices()).thenReturn(List.of()); var discoverer = new SlivkaWSDiscoverer( - url -> url.toString().equals("http://example.org") ? clientMock - : null); + url -> url.toString().equals("http://example.org") ? clientMock + : null); assertThat(discoverer.getStatusForUrl(new URL("http://example.org")), - is(WebServiceDiscovererI.STATUS_NO_SERVICES)); + is(WebServiceDiscovererI.STATUS_NO_SERVICES)); } @Test public void getStatusForUrl_exceptionThrown_statusIsInvalid() - throws Exception + throws Exception { when(clientMock.getServices()).thenThrow(new IOException()); var discoverer = new SlivkaWSDiscoverer( - url -> url.toString().equals("http://example.org") ? clientMock - : null); + url -> url.toString().equals("http://example.org") ? clientMock + : null); assertThat(discoverer.getStatusForUrl(new URL("http://example.org")), - is(WebServiceDiscovererI.STATUS_INVALID)); + is(WebServiceDiscovererI.STATUS_INVALID)); } @Test public void testGetUrls_noPropEntry_defaultUrlReturned() - throws MalformedURLException + throws MalformedURLException { var discoverer = SlivkaWSDiscoverer.getInstance(); assertThat(discoverer.getUrls(), - contains(new URL("https://www.compbio.dundee.ac.uk/slivka/"))); + contains(new URL("https://www.compbio.dundee.ac.uk/slivka/"))); } @DataProvider @@ -102,7 +109,7 @@ public class SlivkaWSDiscovererTest List.of(new URL("https://example.org/slivka/")) }, { "https://www.compbio.dundee.ac.uk/,http://www.example.org/", List.of(new URL("https://www.compbio.dundee.ac.uk/"), - new URL("http://www.example.org/")) }, + new URL("http://www.example.org/")) }, { "http://example.org/,", List.of(new URL("http://example.org/")) }, { ",http://example.org", List.of(new URL("http://example.org")) }, { "", List.of() }, @@ -114,7 +121,7 @@ public class SlivkaWSDiscovererTest @Test(dataProvider = "urlPropertyValues") public void testGetUrls_urlsProperlyParsed(String propValue, - List expected) + List expected) { Cache.setProperty(URLS_PROPERTY_NAME, propValue); var discoverer = SlivkaWSDiscoverer.getInstance(); @@ -148,13 +155,13 @@ public class SlivkaWSDiscovererTest { List.of(new URL("http://example.org/slivka/")), "http://example.org/slivka/" }, { List.of(new URL("https://www.compbio.dundee.ac.uk/slivka/"), - new URL("http://example.org")), + new URL("http://example.org")), "https://www.compbio.dundee.ac.uk/slivka/,http://example.org" }, }; } @Test(dataProvider = "urlsList") public void testSetUrls_urlsPropertySet(List urls, String expected) - throws MalformedURLException + throws MalformedURLException { var discoverer = SlivkaWSDiscoverer.getInstance(); discoverer.setUrls(urls); @@ -163,27 +170,27 @@ public class SlivkaWSDiscovererTest @Test public void testFetchServices_oneService_basicDataMatches() - throws IOException + throws IOException { var service = new SlivkaService( - URI.create("http://example.org/api/services/example"), - "example", "Example name", "Example service description", - "John Smith", "1.0", "MIT License", - List.of("operation::analysis::multiple sequence alignment"), - List.of(), List.of(), null); + URI.create("http://example.org/api/services/example"), + "example", "Example name", "Example service description", + "John Smith", "1.0", "MIT License", + List.of("operation::analysis::multiple sequence alignment"), + List.of(), List.of(), null); when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices, hasSize(1)); var webService = webServices.get(0); assertThat(webService.getUrl(), - equalTo(new URL("http://example.org/"))); + equalTo(new URL("http://example.org/"))); assertThat(webService.getClientName(), equalTo("slivka")); assertThat(webService.getName(), equalTo("Example name")); assertThat(webService.getDescription(), - equalTo("Example service description")); + equalTo("Example service description")); } @DataProvider @@ -207,119 +214,121 @@ public class SlivkaWSDiscovererTest @Test(dataProvider = "validMultipleSequenceAlignmentClassifiers") public void testFetchServices_multipleSequenceAlignmentClassifier_serviceTypeIsMSA( - String classifier) throws IOException + String classifier) throws IOException { var service = new SlivkaService(URI.create("http://example.org/"), - "example", "name", "description", "author", "1.0", "MIT", - List.of(classifier), List.of(), List.of(), null); + "example", "name", "description", "author", "1.0", "MIT", + List.of(classifier), List.of(), List.of(), null); when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices, hasSize(1)); assertThat(webServices.get(0).getCategory(), equalTo("Alignment")); assertThat(webServices.get(0).getActionClass(), - typeCompatibleWith(AlignmentAction.class)); + typeCompatibleWith(AlignmentAction.class)); } @DataProvider public SlivkaService[] multipleSequenceAlignmentService() { - return new SlivkaService[] { new SlivkaService( + return new SlivkaService[] { + new SlivkaService( URI.create("http://example.org/"), "example", "Examaple name", "Example description", "John Smith", "1.0", "MIT", List.of("Operation :: Analysis :: Multiple sequence alignment"), List.of(), List.of(), null), new SlivkaService( - URI.create("http://example.org/api/services/muscle"), - "muscle", "MUSCLE", - "MUltiple Sequence Comparison by Log- Expectation", - "Robert C. Edgar", "3.8.31", "Public domain", - List.of("Topic :: Computational biology :: Sequence analysis", - "Operation :: Analysis :: Sequence analysis :: Sequence alignment :: Multiple sequence alignment"), - List.of(), List.of(), null), + URI.create("http://example.org/api/services/muscle"), + "muscle", "MUSCLE", + "MUltiple Sequence Comparison by Log- Expectation", + "Robert C. Edgar", "3.8.31", "Public domain", + List.of("Topic :: Computational biology :: Sequence analysis", + "Operation :: Analysis :: Sequence analysis :: Sequence alignment :: Multiple sequence alignment"), + List.of(), List.of(), null), new SlivkaService( - URI.create("http://example.org/api/services/tcoffee"), - "tcoffee", "TCoffee", - "Tree-based Consistency Objective Function for Alignment Evaluation", - "Cedric Notredame", "13.41.0", "GNU GPL", - List.of("Topic :: Computational biology :: Sequence analysis", - "Operation :: Analysis :: Sequence analysis :: Sequence alignment :: Multiple sequence alignment"), - List.of(), List.of(), null) }; + URI.create("http://example.org/api/services/tcoffee"), + "tcoffee", "TCoffee", + "Tree-based Consistency Objective Function for Alignment Evaluation", + "Cedric Notredame", "13.41.0", "GNU GPL", + List.of("Topic :: Computational biology :: Sequence analysis", + "Operation :: Analysis :: Sequence analysis :: Sequence alignment :: Multiple sequence alignment"), + List.of(), List.of(), null) }; } @Test(dataProvider = "multipleSequenceAlignmentService") public void testFetchServices_multipleSequenceAlignmentService_actionTypeIsAlignment( - SlivkaService service) throws IOException + SlivkaService service) throws IOException { when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices.get(0).getCategory(), equalTo("Alignment")); assertThat(webServices.get(0).getActionClass(), - typeCompatibleWith(AlignmentAction.class)); + typeCompatibleWith(AlignmentAction.class)); } @Test(dataProvider = "multipleSequenceAlignmentService") public void testFetchServices_multipleSequenceAlignmentService_serviceIsNonInteractive( - SlivkaService service) throws IOException + SlivkaService service) throws IOException { when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices.get(0).isInteractive(), is(false)); } @DataProvider public SlivkaService[] clustalFamilyService() { - return new SlivkaService[] { new SlivkaService( + return new SlivkaService[] { + new SlivkaService( URI.create("http://example.org/api/services/clustalo"), "clustalo", "ClustalO", "Clustal Omega is the latest addition to the Clustal family.", "Fabian Sievers, et al.", "1.2.4", "GNU GPL ver. 2", List.of("Topic :: Computational biology :: Sequence analysis", - "Operation :: Analysis :: Sequence analysis :: Sequence alignment :: Multiple sequence alignment"), + "Operation :: Analysis :: Sequence analysis :: Sequence alignment :: Multiple sequence alignment"), List.of(), List.of(), null), new SlivkaService( - URI.create("http://example.org/api/services/clustalw"), - "clustalw", "ClustalW", - "ClustalW is a general purpose multiple alignment program.", - "Larkin MA, et al.", "2.1", "GNU GPL ver. 3", - List.of("Topic :: Computation biology :: Sequence analysis", - "Operation :: Analysis :: Multiple sequence alignment"), - List.of(), List.of(), null), + URI.create("http://example.org/api/services/clustalw"), + "clustalw", "ClustalW", + "ClustalW is a general purpose multiple alignment program.", + "Larkin MA, et al.", "2.1", "GNU GPL ver. 3", + List.of("Topic :: Computation biology :: Sequence analysis", + "Operation :: Analysis :: Multiple sequence alignment"), + List.of(), List.of(), null), new SlivkaService( - URI.create("http://example.org/api/services/clustalw2"), - "clustalw2", "ClustalW2", - "ClustalW is a general purpose multiple alignment program.", - "Larkin MA, et al.", "2.1", "GNU GPL ver. 3", - List.of("Topic :: Computation biology :: Sequence analysis", - "Operation :: Analysis :: Multiple sequence alignment"), - List.of(), List.of(), null), }; + URI.create("http://example.org/api/services/clustalw2"), + "clustalw2", "ClustalW2", + "ClustalW is a general purpose multiple alignment program.", + "Larkin MA, et al.", "2.1", "GNU GPL ver. 3", + List.of("Topic :: Computation biology :: Sequence analysis", + "Operation :: Analysis :: Multiple sequence alignment"), + List.of(), List.of(), null), }; } @Test(dataProvider = "clustalFamilyService") public void testFetchService_clustalFamilyService_containsTwoActions( - SlivkaService service) throws IOException + SlivkaService service) throws IOException { when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org")); + .fetchServices(new URL("http://example.org")); var actions = webServices.get(0).getActions(); assertThat(actions, hasSize(2)); assertThat(actions.get(0), allOf(hasProperty("name", is("Alignment")), - hasProperty("subcategory", is("Align")))); + hasProperty("subcategory", is("Align")))); assertThat(actions.get(1), - allOf(hasProperty("name", is("Re-alignment")), - hasProperty("subcategory", is("Realign")))); + allOf(hasProperty("name", is("Re-alignment")), + hasProperty("subcategory", is("Realign")))); } @DataProvider @@ -347,26 +356,26 @@ public class SlivkaWSDiscovererTest for (var classifier : validRNASecondaryStructurePredictionClassifiers()) { services.add(new SlivkaService(URI.create("http://example.org/"), - "example", "name", "description", "author", "1.0", "MIT", - List.of(classifier), List.of(), List.of(), null)); + "example", "name", "description", "author", "1.0", "MIT", + List.of(classifier), List.of(), List.of(), null)); } return services.iterator(); } @Test(dataProvider = "RNASecondaryStructurePredictionService") public void testFetchServices_RNASecStrPredClassifier_serviceTypeIsRNASecStrPred( - SlivkaService service) throws IOException + SlivkaService service) throws IOException { when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices, hasSize(1)); assertThat(webServices.get(0).getCategory(), - equalTo("Secondary Structure Prediction")); + equalTo("Secondary Structure Prediction")); assertThat(webServices.get(0).getActionClass(), - typeCompatibleWith(AnnotationAction.class)); + typeCompatibleWith(AnnotationAction.class)); } @DataProvider @@ -387,28 +396,28 @@ public class SlivkaWSDiscovererTest for (var classifier : validConservationAnalysisClassifiers()) { services.add(new SlivkaService(URI.create("http://example.org/"), - "example", "name", "description", "author", "1.0", "MIT", - List.of(classifier), List.of(), List.of(), null)); + "example", "name", "description", "author", "1.0", "MIT", + List.of(classifier), List.of(), List.of(), null)); } return services.iterator(); } @Test(dataProvider = "validConservationAnalysisClassifiers") public void testFetchServices_conservationAnalysisClassifier_serviceTypeIsConservation( - String classifier) throws IOException + String classifier) throws IOException { var service = new SlivkaService(URI.create("http://example.org/"), - "example", "name", "description", "author", "1.0", "MIT", - List.of(classifier), List.of(), List.of(), null); + "example", "name", "description", "author", "1.0", "MIT", + List.of(classifier), List.of(), List.of(), null); when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices, hasSize(1)); assertThat(webServices.get(0).getCategory(), equalTo("Conservation")); assertThat(webServices.get(0).getActionClass(), - typeCompatibleWith(AnnotationAction.class)); + typeCompatibleWith(AnnotationAction.class)); } @DataProvider @@ -420,21 +429,21 @@ public class SlivkaWSDiscovererTest @Test(dataProvider = "validProteinSequenceAnalysisClassifiers") public void testFetchServices_proteinSequenceAnalysisClassifier_serviceTypeIsProtSeqAnalysis( - String classifier) throws IOException + String classifier) throws IOException { var service = new SlivkaService(URI.create("http://example.org/"), - "example", "name", "description", "author", "1.0", "MIT", - List.of(classifier), List.of(), List.of(), null); + "example", "name", "description", "author", "1.0", "MIT", + List.of(classifier), List.of(), List.of(), null); when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices, hasSize(1)); assertThat(webServices.get(0).getCategory(), - equalTo("Protein Disorder")); + equalTo("Protein Disorder")); assertThat(webServices.get(0).getActionClass(), - typeCompatibleWith(AnnotationAction.class)); + typeCompatibleWith(AnnotationAction.class)); } @DataProvider @@ -453,20 +462,198 @@ public class SlivkaWSDiscovererTest enabled = false, // sec. str. pred. not implemented for slivka dataProvider = "validProteinSecondaryStructurePredictionClassifiers") public void testFetchServices_proteinSecStrPredClassifier_serviceTypeIsProtSecStrPred( - String classifier) throws IOException + String classifier) throws IOException { var service = new SlivkaService(URI.create("http://example.org/"), - "example", "name", "description", "author", "1.0", "MIT", - List.of(classifier), List.of(), List.of(), null); + "example", "name", "description", "author", "1.0", "MIT", + List.of(classifier), List.of(), List.of(), null); when(clientMock.getServices()).thenReturn(List.of(service)); when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); var discoverer = new SlivkaWSDiscoverer(url -> clientMock); var webServices = discoverer - .fetchServices(new URL("http://example.org/")); + .fetchServices(new URL("http://example.org/")); assertThat(webServices, hasSize(1)); assertThat(webServices.get(0).getCategory(), - equalTo("Protein Disorder")); + equalTo("Protein Disorder")); assertThat(webServices.get(0).getActionClass(), - typeCompatibleWith(AnnotationAction.class)); + typeCompatibleWith(AnnotationAction.class)); + } + + @DataProvider + public SlivkaService[] unrecognisedService() + { + return new SlivkaService[] { + new SlivkaService(URI.create("http://example.org/"), "example", + "Example name", "Example description", "John Smith", + "1.0.0", "Apache License, version 2.0", + List.of("This :: Classifier :: Does not exist"), List.of(), + List.of(), null) }; + } + + @Test(dataProvider = "unrecognisedService") + public void testFetchServices_unrecognisedService_noServiceDiscovered( + SlivkaService service) throws IOException + { + when(clientMock.getServices()).thenReturn(List.of(service)); + when(clientMock.getUrl()).thenReturn(URI.create("http://example.org")); + var discoverer = new SlivkaWSDiscoverer(url -> clientMock); + var webServices = discoverer + .fetchServices(new URL("http://example.org")); + assertThat(webServices, hasSize(0)); + } + + @DataProvider + public Object[] serviceParameterAndMappedClass() + { + return new Object[][] { + { + new Parameter.IntegerParameter("param", "Parameter", "Description", + true, false, null, Map.of(), null, null), + IntegerParameter.class + }, + { + new Parameter.DecimalParameter("param", "Parameter", + "Description", true, false, null, Map.of(), null, null, + false, false), + DoubleParameter.class + }, + { + new Parameter.TextParameter("param", "Parameter", "Description", + true, false, null, Map.of(), 0, null), + StringParameter.class + }, + { + new Parameter.FlagParameter("param", "Parameter", "Description", + true, false, null, Map.of()), + StringParameter.class + }, + { + new Parameter.ChoiceParameter("param", "Parameter", "Description", + true, false, null, Map.of(), List.of()), + StringParameter.class + }, + }; + } + + @Test(dataProvider = "serviceParameterAndMappedClass") + public void testServiceParameter_slivkaParameterMappedToJalviewParameter( + Parameter slivkaParameter, Class expectedClass) + throws IOException + { + var service = new SlivkaService(URI.create("http://example.org"), + "example", "name", "description", "author", "1.0", + "MIT License", + List.of("Operation :: Analysis :: Multiple sequence alignment"), + List.of(slivkaParameter), List.of(), null); + when(clientMock.getServices()).thenReturn(List.of(service)); + when(clientMock.getUrl()).thenReturn(URI.create("http://example.org")); + var discoverer = new SlivkaWSDiscoverer(url -> clientMock); + var webServices = discoverer + .fetchServices(new URL("http://example.org")); + var paramDatastore = webServices.get(0).getParamDatastore(); + var arguments = paramDatastore.getServiceParameters(); + assertThat(arguments.get(0), instanceOf(expectedClass)); + } + + @DataProvider + public Object[][] serviceParametersAndPropertyMatcher() + { + return new Object[][] { + { + new Parameter.IntegerParameter("param1", "Parameter 1", + "Description of parameter 1", true, false, null, Map.of(), + null, null), + allOf( + hasProperty("name", equalTo("param1")), + hasProperty("label", equalTo("Parameter 1")), + hasProperty("description", equalTo("Description of parameter 1")), + hasProperty("required", is(true)), + hasProperty("value", nullValue())) + }, + { + new Parameter.IntegerParameter("param2", null, null, true, false, + null, Map.of(), null, null), + allOf( + hasProperty("name", equalTo("param2")), + hasProperty("label", equalTo("param2")), + hasProperty("description", nullValue()), + hasProperty("required", is(true)), + hasProperty("value", nullValue())) + }, + { + new Parameter.IntegerParameter("param3", "Parameter 3", "", false, + false, 12, Map.of(), null, null), + allOf( + hasProperty("name", equalTo("param3")), + hasProperty("label", equalTo("Parameter 3")), + hasProperty("description", equalTo("")), + hasProperty("required", is(false)), + hasProperty("value", equalTo("12"))) + }, + }; + } + + @Test(dataProvider = "serviceParametersAndInfoMatcher") + public void testServiceParameters_testBasicParameterProperties( + Parameter parameter, Matcher matcher) throws IOException + { + var service = new SlivkaService(URI.create("http://example.org/"), + "example", "Example name", "Example description", "John Smith", + "1.0", "MIT", + List.of("Operation :: Analysis :: Multiple sequence alignment"), + List.of(parameter), List.of(), null); + when(clientMock.getServices()).thenReturn(List.of(service)); + when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); + var discoverer = new SlivkaWSDiscoverer(url -> clientMock); + var webServices = discoverer + .fetchServices(new URL("http://example.org/")); + var paramDatastore = webServices.get(0).getParamDatastore(); + var arguments = paramDatastore.getServiceParameters(); + assertThat(arguments.get(0), matcher); + } + + @DataProvider + public Object[][] integerParametersAndPropertyMatcher() + { + return new Object[][] { + { + new Parameter.IntegerParameter("param", null, null, true, false, + null, Map.of(), null, null), + hasProperty("validValue", hasProperty("type", is(ValueType.Integer))) + }, + { + new Parameter.IntegerParameter("param", null, null, true, false, + null, Map.of(), null, null), + hasProperty("validValue", allOf( + hasProperty("min", nullValue()), + hasProperty("max", nullValue()))), + }, + { + new Parameter.IntegerParameter("param", null, null, true, false, + null, Map.of(), -12, 42), + hasProperty("validValue", allOf( + hasProperty("min", is(-12)), + hasProperty("max", is(42)))) + }, + }; + } + + @Test(dataProvider = "integerParametersAndPropertyMatcher") + public void testServiceParameters_testIntegerProperties( + Parameter parameter, Matcher matcher) throws IOException + { + var service = new SlivkaService(URI.create("http://example.org"), + "example", "Example name", "Example description", "John Smith", + "1.0", "MIT", + List.of("Operation :: Analysis :: Multiple Sequence Alignment"), + List.of(parameter), List.of(), null); + when(clientMock.getServices()).thenReturn(List.of(service)); + when(clientMock.getUrl()).thenReturn(URI.create("http://example.org/")); + var discoverer = new SlivkaWSDiscoverer(url -> clientMock); + var webServices = discoverer + .fetchServices(new URL("http://example.org/")); + var paramDatastore = webServices.get(0).getParamDatastore(); + var arguments = paramDatastore.getServiceParameters(); + assertThat(arguments.get(0), matcher); } } -- 1.7.10.2