diff --git a/spec/openapi.yaml b/spec/openapi.yaml index 94586bb344e4a1b7e9bf54f15644f4d51c0fb2e3..0c22b7d6df2a78a644d74cdf26a96d215e48d0f0 100644 --- a/spec/openapi.yaml +++ b/spec/openapi.yaml @@ -109,7 +109,9 @@ components: type: string description: the URL for the homepage of this working group WorkingGroupParticipationAgreement: - type: object + type: + - object + - 'null' properties: document_id: $ref: '#/components/schemas/ObjectID' diff --git a/src/main/java/org/eclipsefoundation/wg/resources/WorkingGroupsResource.java b/src/main/java/org/eclipsefoundation/wg/resources/WorkingGroupsResource.java index afed9223ee8038963f196b1320f935b50f3ac0c8..7f39f4900752a94fdb512a6008083c2393ca367d 100644 --- a/src/main/java/org/eclipsefoundation/wg/resources/WorkingGroupsResource.java +++ b/src/main/java/org/eclipsefoundation/wg/resources/WorkingGroupsResource.java @@ -13,6 +13,7 @@ package org.eclipsefoundation.wg.resources; import java.util.List; +import java.util.Objects; import javax.inject.Inject; import javax.ws.rs.Consumes; @@ -24,6 +25,7 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.eclipsefoundation.wg.models.WorkingGroupMap.WorkingGroup; import org.eclipsefoundation.wg.services.WorkingGroupsService; /** @@ -46,9 +48,14 @@ public class WorkingGroupsResource { } @GET - @Path("{name}") - public Response getWorkingGroup(@PathParam("name") String name) { - // return the results as a response - return Response.ok(wgService.getByName(name)).build(); + @Path("{alias}") + public Response getWorkingGroup(@PathParam("alias") String alias) { + WorkingGroup wg = wgService.getByAlias(alias); + + if(Objects.isNull(wg)) { + return Response.status(404).build(); + } + + return Response.ok(wg).build(); } } diff --git a/src/main/java/org/eclipsefoundation/wg/services/WorkingGroupsService.java b/src/main/java/org/eclipsefoundation/wg/services/WorkingGroupsService.java index d536e7ba61e492eb3ccc1ccc6a8e6871ffb442de..db1b37d9d180229a21df7c62bb1ad1ec79c71539 100644 --- a/src/main/java/org/eclipsefoundation/wg/services/WorkingGroupsService.java +++ b/src/main/java/org/eclipsefoundation/wg/services/WorkingGroupsService.java @@ -28,14 +28,14 @@ import org.eclipsefoundation.wg.models.WorkingGroupMap; public interface WorkingGroupsService { /** - * Returns a set of working groups, with an optional filter of the parent organization and project status. + * Returns a set of working groups, with an optional filter of the project status. * * @param projectStatus optional, statuses to include in result set * @return set of working groups matching optional filters if present, otherwise all available working groups */ public Set get(List projectStatus); - public WorkingGroupMap.WorkingGroup getByName(String name); + public WorkingGroupMap.WorkingGroup getByAlias(String alias); public Map> getWGPADocumentIDs(); } diff --git a/src/main/java/org/eclipsefoundation/wg/services/impl/DefaultWorkingGroupsService.java b/src/main/java/org/eclipsefoundation/wg/services/impl/DefaultWorkingGroupsService.java index e9d915e4034f0df711578f9f4a3ce0c4db1b9a45..e46efe19f5d70638449695f03d6dc63226b37b96 100644 --- a/src/main/java/org/eclipsefoundation/wg/services/impl/DefaultWorkingGroupsService.java +++ b/src/main/java/org/eclipsefoundation/wg/services/impl/DefaultWorkingGroupsService.java @@ -87,8 +87,8 @@ public class DefaultWorkingGroupsService implements WorkingGroupsService { } @Override - public WorkingGroup getByName(String name) { - return workingGroups.get(name); + public WorkingGroup getByAlias(String alias) { + return workingGroups.get(alias); } @Override diff --git a/src/test/java/org/eclipsefoundation/wg/resources/WorkingGroupsResource.java b/src/test/java/org/eclipsefoundation/wg/resources/WorkingGroupsResource.java deleted file mode 100644 index 088cfdf11518b9932210948e7d6c9a9ced3af6f3..0000000000000000000000000000000000000000 --- a/src/test/java/org/eclipsefoundation/wg/resources/WorkingGroupsResource.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.eclipsefoundation.wg.resources; - -public class WorkingGroupsResource { - -} diff --git a/src/test/java/org/eclipsefoundation/wg/resources/WorkingGroupsResourceTest.java b/src/test/java/org/eclipsefoundation/wg/resources/WorkingGroupsResourceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ee27311a9113803250775d25d56a020d62c86ed9 --- /dev/null +++ b/src/test/java/org/eclipsefoundation/wg/resources/WorkingGroupsResourceTest.java @@ -0,0 +1,208 @@ +package org.eclipsefoundation.wg.resources; + +import static io.restassured.RestAssured.given; +import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath; + +import org.eclipsefoundation.wg.test.helpers.SchemaNamespaceHelper; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.http.ContentType; + + +@QuarkusTest +class WorkingGroupsResourceTest { + + public final static String WGS_BASE_URL = "/working_groups"; + + public final static String WG_BASE_URL = WGS_BASE_URL + "/{alias}"; + public final static String WG_STATUS_URL = WGS_BASE_URL + "?status={param}"; + public final static String WG_STATUSES_URL = WGS_BASE_URL + "?status={param1}&status={param2}"; + + @Test + void getAll_success() { + given() + .when() + .get(WGS_BASE_URL) + .then() + .statusCode(200); + } + + @Test + void getAll_success_validRequestFormat() { + given() + .contentType(ContentType.JSON) + .when() + .get(WGS_BASE_URL) + .then() + .statusCode(200); + } + + @Test + void getAll_success_validResponseFormat() { + given() + .when() + .get(WGS_BASE_URL) + .then() + .contentType(ContentType.JSON) + .statusCode(200); + } + + @Test + void getAll_success_matchingSpec() { + given() + .when() + .get(WGS_BASE_URL) + .then() + .assertThat() + .body(matchesJsonSchemaInClasspath(SchemaNamespaceHelper.WORKING_GROUPS_SCHEMA_PATH)); + } + + @Test + void getAll_failure_invalidFormat() { + given() + .contentType(ContentType.JSON) + .accept(ContentType.TEXT) + .when() + .get(WGS_BASE_URL) + .then() + .statusCode(500); + } + + @Test + void getAllBySingleStatus_success() { + given() + .when() + .get(WG_STATUS_URL, "active") + .then() + .statusCode(200); + } + + @Test + void getAllBySingleStatus_success_validRequestFormat() { + given() + .contentType(ContentType.JSON) + .when() + .get(WG_STATUS_URL, "active") + .then() + .statusCode(200); + } + + @Test + void getAllBySingleStatus_success_validResponseFormat() { + given() + .when() + .get(WG_STATUS_URL, "active") + .then() + .contentType(ContentType.JSON) + .statusCode(200); + } + + @Test + void getAllBySingleStatus_success_matchingSpec() { + given() + .when() + .get(WG_STATUS_URL, "active") + .then() + .assertThat() + .body(matchesJsonSchemaInClasspath(SchemaNamespaceHelper.WORKING_GROUPS_SCHEMA_PATH)); + } + + @Test + void getAllByMultiStatus_success() { + given() + .when() + .get(WG_STATUSES_URL, "active", "archived") + .then() + .statusCode(200); + } + + @Test + void getAllByMultiStatus_success_validRequestFormat() { + given() + .contentType(ContentType.JSON) + .when() + .get(WG_STATUSES_URL, "active", "archived") + .then() + .statusCode(200); + } + + @Test + void getAllByMultiStatus_success_validResponseFormat() { + given() + .when() + .get(WG_STATUSES_URL, "active", "archived") + .then() + .contentType(ContentType.JSON) + .statusCode(200); + } + + @Test + void getAllByMultiStatus_success_matchingSpec() { + given() + .when() + .get(WG_STATUSES_URL, "active", "archived") + .then() + .assertThat() + .body(matchesJsonSchemaInClasspath(SchemaNamespaceHelper.WORKING_GROUPS_SCHEMA_PATH)); + } + + @Test + void getByAlias_success() { + given() + .when() + .get(WG_BASE_URL, "important-group") + .then() + .statusCode(200); + } + + @Test + void getByAlias_success_validRequestFormat() { + given() + .contentType(ContentType.JSON) + .when() + .get(WG_BASE_URL, "important-group") + .then() + .statusCode(200); + } + + @Test + void getByAlias_success_validResponseFormat() { + given() + .when() + .get(WG_BASE_URL, "important-group") + .then() + .contentType(ContentType.JSON) + .statusCode(200); + } + + @Test + void getByAlias_success_matchingSpec() { + given() + .when() + .get(WG_BASE_URL, "important-group") + .then() + .assertThat() + .body(matchesJsonSchemaInClasspath(SchemaNamespaceHelper.WORKING_GROUP_SCHEMA_PATH)); + } + + @Test + void getByAlias_failure_invalidName() { + given() + .when() + .get(WG_BASE_URL, "JimBob") + .then() + .statusCode(404); + } + + @Test + void getByAlias_failure_invalidFormat() { + given() + .contentType(ContentType.JSON) + .accept(ContentType.TEXT) + .when() + .get(WG_BASE_URL, "important-group") + .then() + .statusCode(500); + } +} diff --git a/src/test/java/org/eclipsefoundation/wg/test/helpers/SchemaNamespaceHelper.java b/src/test/java/org/eclipsefoundation/wg/test/helpers/SchemaNamespaceHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..691be9fa0ef4c50697e96f5a6f005058a4d83028 --- /dev/null +++ b/src/test/java/org/eclipsefoundation/wg/test/helpers/SchemaNamespaceHelper.java @@ -0,0 +1,12 @@ +package org.eclipsefoundation.wg.test.helpers; + +public class SchemaNamespaceHelper { + + public static final String BASE_SCHEMA_PATH = "schemas/"; + public static final String BASE_SCHEMA_PATH_SUFFIX = "-schema.json"; + + public static final String WORKING_GROUP_SCHEMA_PATH = BASE_SCHEMA_PATH + "working-group" + + BASE_SCHEMA_PATH_SUFFIX; + public static final String WORKING_GROUPS_SCHEMA_PATH = BASE_SCHEMA_PATH + "working-groups" + + BASE_SCHEMA_PATH_SUFFIX; +} diff --git a/src/test/resources/working_groups.json b/src/test/resources/working_groups.json new file mode 100644 index 0000000000000000000000000000000000000000..423e11dbe96d7c271b676b82fcdf609c07c432c7 --- /dev/null +++ b/src/test/resources/working_groups.json @@ -0,0 +1,136 @@ +{ + "working_groups": { + "important-group": { + "alias": "important-group", + "title": "Super Important Group", + "status": "active", + "parent_organization": "eclipse", + "logo": "https://www.google.com", + "description": "This group is super important. And don't you forget it.", + "resources": { + "charter": "https://www.google.com", + "participation_agreements": { + "individual": null, + "organization": { + "document_id": "cacsoivnp23o423r", + "pdf": "https://www.google.com" + } + }, + "website": "https://www.google.com", + "members": "https://www.google.com", + "sponsorship": "https://www.google.com", + "contact_form": "https://www.google.com" + }, + "levels": [ + { + "relation": "WGSD", + "description": "Strategic Member" + }, + { + "relation": "WGDSA", + "description": "Enterprise Member" + }, + { + "relation": "WGAPS", + "description": "Participant Member" + }, + { + "relation": "WGFHA", + "description": "Committer Member" + }, + { + "relation": "WGSAP", + "description": "Guest Member" + } + ] + }, + "mediocre-group": { + "alias": "mediocre-group", + "title": "Mediocre Group", + "status": "incubating", + "parent_organization": "random-group", + "logo": "https://www.google.com", + "description": "This group is super important. And don't you forget it.", + "resources": { + "charter": "https://www.google.com", + "participation_agreements": { + "individual": null, + "organization": { + "document_id": "cacsoivnp23o423r", + "pdf": "https://www.google.com" + } + }, + "website": "https://www.google.com", + "members": "https://www.google.com", + "sponsorship": "https://www.google.com", + "contact_form": "https://www.google.com" + }, + "levels": [ + { + "relation": "WGSD", + "description": "Strategic Member" + }, + { + "relation": "WGDSA", + "description": "Enterprise Member" + }, + { + "relation": "WGAPS", + "description": "Participant Member" + }, + { + "relation": "WGFHA", + "description": "Committer Member" + }, + { + "relation": "WGSAP", + "description": "Guest Member" + } + ] + }, + "awful-group": { + "alias": "awful-group", + "title": "Awful Group", + "status": "archived", + "parent_organization": "some-other-org", + "logo": "https://www.google.com", + "description": "This group isn't that great, actually. But that's ok", + "resources": { + "charter": "https://www.google.com", + "participation_agreements": { + "individual": null, + "organization": { + "document_id": "8ufdaoisdhf3298jf", + "pdf": "https://www.google.com" + } + }, + "website": "https://www.google.com", + "members": "https://www.google.com", + "sponsorship": "https://www.google.com", + "contact_form": "https://www.google.com" + }, + "levels": [ + { + "relation": "WGSD", + "description": "Strategic Member" + }, + { + "relation": "WGDSA", + "description": "Enterprise Member" + }, + { + "relation": "WGAPS", + "description": "Participant Member" + }, + { + "relation": "WGFHA", + "description": "Committer Member" + }, + { + "relation": "WGSAP", + "description": "Guest Member" + } + ] + } + } +} \ No newline at end of file