diff --git a/src/test/java/org/commonjava/indy/service/repository/ftests/admin/AddGroupConstituentTest.java b/src/test/java/org/commonjava/indy/service/repository/ftests/admin/AddGroupConstituentTest.java
new file mode 100644
index 00000000..d8ba5d34
--- /dev/null
+++ b/src/test/java/org/commonjava/indy/service/repository/ftests/admin/AddGroupConstituentTest.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (C) 2022-2023 Red Hat, Inc. (https://github.com/Commonjava/indy-repository-service)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.commonjava.indy.service.repository.ftests.admin;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.TestProfile;
+import org.commonjava.indy.service.repository.ftests.AbstractStoreManagementTest;
+import org.commonjava.indy.service.repository.ftests.matchers.RepoEqualMatcher;
+import org.commonjava.indy.service.repository.ftests.profile.MemoryFunctionProfile;
+import org.commonjava.indy.service.repository.model.Group;
+import org.commonjava.indy.service.repository.model.RemoteRepository;
+import org.commonjava.test.http.expect.ExpectationServer;
+import org.commonjava.test.http.quarkus.InjectExpected;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
+import static jakarta.ws.rs.core.Response.Status.OK;
+import static org.commonjava.indy.service.repository.model.pkg.MavenPackageTypeDescriptor.MAVEN_PKG_KEY;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * This case tests the group member add
+ *
+ *
+ * GIVEN:
+ *
+ * - create group G repo
+ * - create remote M repo
+ *
+ *
+ *
+ * WHEN:
+ *
+ * - add remote M as member into group G>
+ *
+ *
+ *
+ * THEN:
+ *
+ * - get the group G and verify the member M existence
+ *
+ */
+@QuarkusTest
+@TestProfile( MemoryFunctionProfile.class )
+@Tag( "function" )
+public class AddGroupConstituentTest
+ extends AbstractStoreManagementTest
+{
+
+ @InjectExpected()
+ public final ExpectationServer server = new ExpectationServer();
+
+ @Test
+ public void addGroupConstituentIt()
+ throws Exception
+ {
+ final String name = "G";
+ final Group group = new Group( MAVEN_PKG_KEY, name );
+ String json = mapper.writeValueAsString( group );
+ given().body( json )
+ .contentType( APPLICATION_JSON )
+ .post( getRepoTypeUrl( group.getKey() ) )
+ .then()
+ .body( new RepoEqualMatcher<>( mapper, group, Group.class ) );
+
+ final String urlName = "urltest";
+ final String url = server.formatUrl( urlName );
+ final RemoteRepository member = new RemoteRepository( MAVEN_PKG_KEY, "M", url );
+ json = mapper.writeValueAsString( member );
+ given().body( json )
+ .contentType( APPLICATION_JSON )
+ .post( getRepoTypeUrl( member.getKey() ) )
+ .then()
+ .body( new RepoEqualMatcher<>( mapper, member, RemoteRepository.class ) );
+
+ final String repoUrl = getRepoUrl( group.getKey() );
+ given().body( json )
+ .contentType( APPLICATION_JSON )
+ .put( repoUrl + "addConstituent" )
+ .then()
+ .statusCode( OK.getStatusCode() );
+
+ String result = given().get( repoUrl )
+ .then()
+ .statusCode( OK.getStatusCode() )
+ .body( new RepoEqualMatcher<>( mapper, group, Group.class ) )
+ .extract()
+ .asString();
+ assertTrue( result.contains( "\"constituents\" : [ \"maven:remote:M\" ]" ) );
+ }
+}
diff --git a/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryAdminResourcesTest.java b/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryAdminResourcesTest.java
index b927c1e7..79dee54f 100644
--- a/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryAdminResourcesTest.java
+++ b/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryAdminResourcesTest.java
@@ -20,9 +20,9 @@
import io.quarkus.test.security.TestSecurity;
import io.restassured.RestAssured;
import io.restassured.parsing.Parser;
+import jakarta.ws.rs.core.MediaType;
import org.junit.jupiter.api.Test;
-import jakarta.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.Map;
@@ -37,8 +37,8 @@
import static jakarta.ws.rs.core.Response.Status.NOT_MODIFIED;
import static jakarta.ws.rs.core.Response.Status.NO_CONTENT;
import static jakarta.ws.rs.core.Response.Status.OK;
-import static org.hamcrest.CoreMatchers.is;
import static org.commonjava.indy.service.repository.util.PathUtils.normalize;
+import static org.hamcrest.CoreMatchers.is;
@QuarkusTest
@TestProfile( MockTestProfile.class )
@@ -332,4 +332,56 @@ public void testGetAllInValidErrorType()
.contentType( MediaType.APPLICATION_JSON )
.body( "error", is( "Not supporte repository type of hosted" ) );
}
+
+ @Test
+ public void testAddGroupConstituentSuccess()
+ {
+ Map member = new HashMap<>();
+ member.put( "packageType", "maven" );
+ member.put( "type", "remote" );
+ member.put( "name", "member" );
+ member.put( "url", "http://repo.member" );
+ member.put( "key", "maven:remote:member" );
+
+ given().when()
+ .body( member )
+ .contentType( APPLICATION_JSON )
+ .put( normalize( BASE_STORE_PATH, "maven/group/success/addConstituent" ) )
+ .then()
+ .statusCode( OK.getStatusCode() );
+ }
+
+ @Test
+ public void testAddGroupConstituentNonSuccess()
+ {
+ Map member = new HashMap<>();
+ member.put( "packageType", "maven" );
+ member.put( "type", "remote" );
+ member.put( "name", "member" );
+ member.put( "url", "http://repo.member" );
+ member.put( "key", "maven:remote:member" );
+ given().when()
+ .body( member )
+ .contentType( APPLICATION_JSON )
+ .put( normalize( BASE_STORE_PATH, "maven/group/nonsuccess/addConstituent" ) )
+ .then()
+ .statusCode( NOT_MODIFIED.getStatusCode() );
+ }
+
+ @Test
+ public void testAddGroupConstituentError()
+ {
+ Map member = new HashMap<>();
+ member.put( "packageType", "maven" );
+ member.put( "type", "remote" );
+ member.put( "name", "member" );
+ member.put( "url", "http://repo.member" );
+ member.put( "key", "maven:remote:member" );
+ given().when()
+ .body( member )
+ .contentType( APPLICATION_JSON )
+ .put( normalize( BASE_STORE_PATH, "maven/group/error/addConstituent" ) )
+ .then()
+ .statusCode( INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
}
diff --git a/src/test/java/org/commonjava/indy/service/repository/jaxrs/mock/MockAdminController.java b/src/test/java/org/commonjava/indy/service/repository/jaxrs/mock/MockAdminController.java
index 4bea60bf..70acfc94 100644
--- a/src/test/java/org/commonjava/indy/service/repository/jaxrs/mock/MockAdminController.java
+++ b/src/test/java/org/commonjava/indy/service/repository/jaxrs/mock/MockAdminController.java
@@ -15,6 +15,9 @@
*/
package org.commonjava.indy.service.repository.jaxrs.mock;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Alternative;
+import jakarta.ws.rs.core.Response;
import org.commonjava.indy.service.repository.controller.AdminController;
import org.commonjava.indy.service.repository.exception.IndyWorkflowException;
import org.commonjava.indy.service.repository.model.ArtifactStore;
@@ -26,9 +29,6 @@
import org.commonjava.indy.service.repository.model.StoreType;
import org.junit.jupiter.api.Test;
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.enterprise.inject.Alternative;
-import jakarta.ws.rs.core.Response;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -141,4 +141,21 @@ public List getAllStores()
Group group = new Group( MAVEN_PKG_KEY, "test3", repo1.getKey(), repo2.getKey() );
return Arrays.asList( repo1, repo2, group );
}
+
+ @Override
+ public boolean addConstituentToGroup( final StoreKey key, final StoreKey member )
+ throws IndyWorkflowException
+ {
+ if ( key.equals( StoreKey.fromString( "maven:group:success" ) ) && member.equals(
+ StoreKey.fromString( "maven:remote:member" ) ) )
+ {
+ return true;
+ }
+ if ( key.equals( StoreKey.fromString( "maven:group:error" ) ) && member.equals(
+ StoreKey.fromString( "maven:remote:member" ) ) )
+ {
+ throw new IndyWorkflowException( "error happened" );
+ }
+ return false;
+ }
}