Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import uk.co.compendiumdev.thingifier.api.docgen.ApiRoutingDefinition;
import uk.co.compendiumdev.thingifier.api.docgen.RoutingDefinition;
import uk.co.compendiumdev.thingifier.api.docgen.RoutingVerb;

class ConfiguredWriteMethodsDocumentationTest {
Expand Down Expand Up @@ -39,9 +40,12 @@ void blocksPutAndPatchOnTheCollectionRoute() {
@Test
void exposesPatchAndPutUpdateOnTheInstanceRoute() {
final ApiRoutingDefinition definition = documentation();
final RoutingDefinition patchRoute = route(definition, RoutingVerb.PATCH, "notes/:id");

Assertions.assertTrue(
route(definition, RoutingVerb.PATCH, "notes/:id").status().isReturnedFromCall());
Assertions.assertTrue(patchRoute.status().isReturnedFromCall());
Assertions.assertEquals(
"patch a specific instance of note with a body containing the patch details",
patchRoute.getDocumentation());
Assertions.assertTrue(
route(definition, RoutingVerb.PUT, "notes/:id").status().isReturnedFromCall());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ void exposesPatchAndPutUpdateOnlyOnTheInstanceRoute() {
Assertions.assertNull(instance.getPost());
Assertions.assertNotNull(instance.getPatch());
Assertions.assertNotNull(instance.getPut());
Assertions.assertEquals(
"patch a specific instance of note with a body containing the patch details",
instance.getPatch().getSummary());
Assertions.assertEquals(
"patch a specific instance of note with a body containing the patch details",
instance.getPatch().getDescription());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,11 @@ private void returnedEntityWriteRoute(
ensureStatus(route, 409);
route.returnPayload(200, entityName);
route.requestPayload(entityName);
replaceMethodNotAllowedDocumentation(
route,
String.format(
"patch a specific instance of %s with a body containing the patch details",
entityName));
}

private void returnedEntityPutRoute(
Expand Down Expand Up @@ -198,6 +203,13 @@ private void methodNotAllowed(final RoutingDefinition route) {
route.replaceStatus(RoutingStatus.returnValue(405));
}

private void replaceMethodNotAllowedDocumentation(
final RoutingDefinition route, final String documentation) {
if ("method not allowed".equals(route.getDocumentation())) {
route.addDocumentation(documentation);
}
}

private void ensureStatus(final RoutingDefinition route, final int statusCode) {
for (RoutingStatus status : route.getPossibleStatusReponses()) {
if (status.value() == statusCode) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package uk.co.compendiumdev.thingifier.htmlgui.htmlgen;

import static uk.co.compendiumdev.thingifier.apiconfig.EntityPatchUpdateStyle.PARTIAL_JSON_UPDATE;

import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -98,6 +100,35 @@ void apiDocumentationShowsEntityDescriptions() {
+ "<li>Value must be a Boolean (true, false) value</li>"));
}

@Test
void apiDocumentationShowsConfiguredPatchInstanceRouteAsSupported() {
final Thingifier thingifier = new Thingifier();
thingifier.setDocumentation("Task API", "Task API docs.");
final EntityDefinition task = thingifier.defineThing("task", "tasks");
task.addAsPrimaryKeyField(Field.is("id", FieldType.AUTO_INCREMENT));
task.addField(Field.is("title", FieldType.STRING));
thingifier.apiConfig().writeMethods().entities().patchCan(PARTIAL_JSON_UPDATE);

final String docs =
new RestApiDocumentationGenerator(thingifier, new DefaultGUIHTML())
.getApiDocumentation(
new ApiRoutingDefinitionDocGenerator(thingifier).generate("/api"),
List.of(),
new ThingifierApiDocumentationDefn(),
"/api",
"https://example.com/api/docs");

Assertions.assertTrue(docs.contains("<strong>PATCH /api/tasks/:id</strong>"));
Assertions.assertTrue(
docs.contains(
"patch a specific instance of task with a body containing the patch"
+ " details"));
Assertions.assertFalse(
docs.contains(
"<strong>PATCH /api/tasks/:id</strong><ul><li class='normal'>method not"
+ " allowed</li></ul>"));
}

@Test
void apiDocumentationShowsTwoWayRelationshipsAsSeparateDirections() {
final Thingifier thingifier = new Thingifier();
Expand Down
Loading