diff --git a/opendcs-rest-api/src/main/java/org/opendcs/odcsapi/res/RoutingResources.java b/opendcs-rest-api/src/main/java/org/opendcs/odcsapi/res/RoutingResources.java index de17e061..37443270 100644 --- a/opendcs-rest-api/src/main/java/org/opendcs/odcsapi/res/RoutingResources.java +++ b/opendcs-rest-api/src/main/java/org/opendcs/odcsapi/res/RoutingResources.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import java.util.TimeZone; +import java.util.Vector; import javax.annotation.security.RolesAllowed; import javax.servlet.http.HttpServletRequest; @@ -35,17 +36,20 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import decodes.db.DataSource; import decodes.db.DatabaseException; import decodes.db.DatabaseIO; import decodes.db.RoutingSpec; import decodes.db.RoutingSpecList; import decodes.db.ScheduleEntry; +import decodes.db.ScheduleEntryStatus; import decodes.polling.DacqEvent; import decodes.sql.DbKey; import decodes.tsdb.DbIoException; import opendcs.dai.DacqEventDAI; import opendcs.dai.ScheduleEntryDAI; import org.opendcs.odcsapi.beans.ApiRouting; +import org.opendcs.odcsapi.beans.ApiRoutingExecStatus; import org.opendcs.odcsapi.beans.ApiRoutingRef; import org.opendcs.odcsapi.beans.ApiScheduleEntry; import org.opendcs.odcsapi.beans.ApiScheduleEntryRef; @@ -68,6 +72,7 @@ public Response getRoutingRefs() throws DbException { try { + //TODO: Fix this endpoint. Currently, it is returning an empty list. DatabaseIO dbio = getLegacyDatabase(); RoutingSpecList rsList = new RoutingSpecList(); dbio.readRoutingSpecList(rsList); @@ -159,16 +164,42 @@ static RoutingSpec map(ApiRouting routing) throws DbException try { RoutingSpec spec = new RoutingSpec(); - spec.setId(DbKey.createDbKey(routing.getRoutingId())); + if (routing.getRoutingId() != null) + { + spec.setId(DbKey.createDbKey(routing.getRoutingId())); + } spec.setName(routing.getName()); + spec.usePerformanceMeasurements = false; spec.lastModifyTime = routing.getLastModified(); if (routing.getOutputTZ() != null) { + spec.outputTimeZoneAbbr = routing.getOutputTZ(); spec.outputTimeZone = TimeZone.getTimeZone(ZoneId.of(routing.getOutputTZ())); } routing.getNetlistNames().forEach(spec::addNetworkListName); spec.outputFormat = routing.getOutputFormat(); spec.enableEquations = routing.isEnableEquations(); + spec.presentationGroupName = routing.getPresGroupName(); + spec.isProduction = routing.isProduction(); + spec.consumerArg = routing.getDestinationArg(); + spec.consumerType = routing.getDestinationType(); + if (routing.getSince() != null) + { + spec.sinceTime = routing.getSince(); + } + if (routing.getUntil() != null) + { + spec.untilTime = routing.getUntil(); + } + spec.setProperties(routing.getProperties()); + if (routing.getDataSourceId() != null) + { + DataSource dataSource = new DataSource(); + dataSource.setId(DbKey.createDbKey(routing.getDataSourceId())); + dataSource.setName(routing.getDataSourceName()); + spec.dataSource = dataSource; + } + spec.networkListNames = new Vector<>(routing.getNetlistNames()); return spec; } catch(DatabaseException e) @@ -276,7 +307,9 @@ public Response postSchedule(ApiScheduleEntry schedule) { ScheduleEntry entry = map(schedule); dai.writeScheduleEntry(entry); - return Response.status(HttpServletResponse.SC_OK).build(); + return Response.status(HttpServletResponse.SC_OK) + .entity(String.format("Successfully stored schedule entry with name: %s", schedule.getName())) + .build(); } catch (DbIoException e) { @@ -288,17 +321,25 @@ static ScheduleEntry map(ApiScheduleEntry schedule) throws DbException { try { - ScheduleEntry entry = new ScheduleEntry(DbKey.createDbKey(schedule.getSchedEntryId())); + ScheduleEntry entry = new ScheduleEntry(schedule.getName()); + if (schedule.getSchedEntryId() != null) + { + entry.setId(DbKey.createDbKey(schedule.getSchedEntryId())); + } entry.setStartTime(schedule.getStartTime()); entry.setTimezone(schedule.getTimeZone()); - entry.setLoadingAppId(DbKey.createDbKey(schedule.getAppId())); - entry.setRoutingSpecId(DbKey.createDbKey(schedule.getRoutingSpecId())); - entry.setLoadingAppName(schedule.getAppName()); - entry.setRoutingSpecName(schedule.getRoutingSpecName()); + if (schedule.getAppId() != null) + { + entry.setLoadingAppId(DbKey.createDbKey(schedule.getAppId())); + entry.setLoadingAppName(schedule.getAppName()); + } + if (schedule.getRoutingSpecId() != null) + { + entry.setRoutingSpecId(DbKey.createDbKey(schedule.getRoutingSpecId())); + entry.setRoutingSpecName(schedule.getRoutingSpecName()); + } entry.setRunInterval(schedule.getRunInterval()); - entry.setName(schedule.getName()); entry.setLastModified(schedule.getLastModified()); - entry.setId(DbKey.createDbKey(schedule.getSchedEntryId())); return entry; } catch (DatabaseException e) @@ -336,12 +377,33 @@ public Response deleteSchedule(@QueryParam("scheduleid") Long scheduleId) public Response getRoutingStats() throws DbException { -// try (DbInterface dbi = new DbInterface(); -// ApiRoutingDAO dao = new ApiRoutingDAO(dbi)) -// { -// return ApiHttpUtil.createResponse(dao.getRsStatus()); -// } - return Response.status(HttpServletResponse.SC_NOT_IMPLEMENTED).build(); + try (ScheduleEntryDAI dai = getLegacyDatabase().makeScheduleEntryDAO()) + { + return Response.status(HttpServletResponse.SC_OK) + .entity(map(dai.listScheduleEntries(null))).build(); + } + catch (DbIoException e) + { + throw new DbException("Unable to retrieve routing status", e); + } + } + + static ArrayList map(ArrayList entries) + { + ArrayList refs = new ArrayList<>(); + for (ScheduleEntry entry : entries) + { + ApiScheduleEntryRef ref = new ApiScheduleEntryRef(); + ref.setSchedEntryId(entry.getId().getValue()); + ref.setEnabled(entry.isEnabled()); + ref.setAppName(entry.getLoadingAppName()); + ref.setName(entry.getName()); + ref.setLastModified(entry.getLastModified()); + ref.setRoutingSpecName(entry.getRoutingSpecName()); + refs.add(ref); + } + + return refs; } @GET @@ -353,13 +415,37 @@ public Response getRoutingExecStatus(@QueryParam("scheduleentryid") Long schedul { if (scheduleEntryId == null) throw new WebAppException(ErrorCodes.MISSING_ID, "missing required scheduleentryid argument."); - -// try (DbInterface dbi = new DbInterface(); -// ApiRoutingDAO dao = new ApiRoutingDAO(dbi)) -// { -// return ApiHttpUtil.createResponse(dao.getRoutingExecStatus(scheduleEntryId)); -// } - return Response.status(HttpServletResponse.SC_NOT_IMPLEMENTED).build(); + + try (ScheduleEntryDAI dai = getLegacyDatabase().makeScheduleEntryDAO()) + { + ScheduleEntry entry = new ScheduleEntry(DbKey.createDbKey(scheduleEntryId)); + return Response.status(HttpServletResponse.SC_OK) + .entity(statusMap(dai.readScheduleStatus(entry))).build(); + } + catch (DbIoException e) + { + throw new DbException("Unable to retrieve routing exec status", e); + } + } + + static ArrayList statusMap(ArrayList statuses) + { + ArrayList execStatuses = new ArrayList<>(); + for (ScheduleEntryStatus status : statuses) + { + ApiRoutingExecStatus execStatus = new ApiRoutingExecStatus(); + execStatus.setScheduleEntryId(status.getScheduleEntryId().getValue()); + execStatus.setHostname(status.getHostname()); + execStatus.setNumErrors(status.getNumDecodesErrors()); + execStatus.setRunStatus(status.getRunStatus()); + execStatus.setRunStop(status.getRunStop()); + execStatus.setRunStart(status.getRunStart()); + execStatus.setNumPlatforms(status.getNumPlatforms()); + execStatus.setNumMessages(status.getNumMessages()); + execStatus.setLastActivity(status.getLastModified()); + execStatuses.add(execStatus); + } + return execStatuses; } @GET diff --git a/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/RoutingResourcesTest.java b/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/RoutingResourcesTest.java index 77acb3ea..48072ab0 100644 --- a/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/RoutingResourcesTest.java +++ b/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/RoutingResourcesTest.java @@ -11,9 +11,11 @@ import decodes.db.RoutingSpec; import decodes.db.RoutingSpecList; import decodes.db.ScheduleEntry; +import decodes.db.ScheduleEntryStatus; import decodes.sql.DbKey; import org.junit.jupiter.api.Test; import org.opendcs.odcsapi.beans.ApiRouting; +import org.opendcs.odcsapi.beans.ApiRoutingExecStatus; import org.opendcs.odcsapi.beans.ApiRoutingRef; import org.opendcs.odcsapi.beans.ApiScheduleEntry; import org.opendcs.odcsapi.beans.ApiScheduleEntryRef; @@ -22,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; import static org.opendcs.odcsapi.res.RoutingResources.map; +import static org.opendcs.odcsapi.res.RoutingResources.statusMap; final class RoutingResourcesTest { @@ -130,6 +133,69 @@ void testScheduleEntryMap() throws Exception assertEquals(scheduleEntry.getRunInterval(), apiScheduleEntry.getRunInterval()); } + @Test + void testApiScheduleEntryMap() + { + ArrayList scheduleEntries = new ArrayList<>(); + ScheduleEntry scheduleEntry = new ScheduleEntry(DbKey.createDbKey(1234L)); + scheduleEntry.setName("TestScheduleEntry"); + scheduleEntry.setLoadingAppName("TestAppName"); + scheduleEntry.setRoutingSpecName("TestRoutingSpec"); + scheduleEntry.setLastModified(Date.from(Instant.parse("2021-02-01T00:00:00Z"))); + scheduleEntry.setLoadingAppId(DbKey.createDbKey(5678L)); + scheduleEntry.setRoutingSpecId(DbKey.createDbKey(9012L)); + scheduleEntry.setStartTime(Date.from(Instant.parse("2021-01-01T00:00:00Z"))); + scheduleEntry.setEnabled(true); + scheduleEntry.setTimezone("UTC"); + scheduleEntry.setRunInterval("1h"); + scheduleEntries.add(scheduleEntry); + + ArrayList results = map(scheduleEntries); + + assertNotNull(results); + assertEquals(1, results.size()); + ApiScheduleEntryRef result = results.get(0); + assertNotNull(result); + assertEquals(scheduleEntry.getKey().getValue(), result.getSchedEntryId()); + assertEquals(scheduleEntry.getName(), result.getName()); + assertEquals(scheduleEntry.getLoadingAppName(), result.getAppName()); + assertEquals(scheduleEntry.getRoutingSpecName(), result.getRoutingSpecName()); + assertEquals(scheduleEntry.getLastModified(), result.getLastModified()); + } + + @Test + void testRoutingStatusMap() + { + ArrayList scheduleEntries = new ArrayList<>(); + ScheduleEntryStatus scheduleEntry = new ScheduleEntryStatus(DbKey.createDbKey(1234L)); + scheduleEntry.setScheduleEntryName("TestScheduleEntry"); + scheduleEntry.setLastModified(Date.from(Instant.parse("2021-02-01T00:00:00Z"))); + scheduleEntry.setHostname("TestHost"); + scheduleEntry.setRunStatus("TestStatus"); + scheduleEntry.setNumDecodesErrors(10); + scheduleEntry.setNumMessages(20); + scheduleEntry.setNumPlatforms(30); + scheduleEntry.setRunStop(Date.from(Instant.parse("2021-03-01T00:00:00Z"))); + scheduleEntry.setRunStart(Date.from(Instant.parse("2021-02-01T00:00:00Z"))); + scheduleEntry.setLastModified(Date.from(Instant.parse("2021-04-01T00:00:00Z"))); + scheduleEntries.add(scheduleEntry); + + ArrayList results = statusMap(scheduleEntries); + assertNotNull(results); + assertEquals(1, results.size()); + ApiRoutingExecStatus result = results.get(0); + assertNotNull(result); + assertEquals(scheduleEntry.getScheduleEntryId().getValue(), result.getScheduleEntryId()); + assertEquals(scheduleEntry.getHostname(), result.getHostname()); + assertEquals(scheduleEntry.getRunStatus(), result.getRunStatus()); + assertEquals(scheduleEntry.getNumDecodesErrors(), result.getNumErrors()); + assertEquals(scheduleEntry.getNumMessages(), result.getNumMessages()); + assertEquals(scheduleEntry.getNumPlatforms(), result.getNumPlatforms()); + assertEquals(scheduleEntry.getRunStop(), result.getRunStop()); + assertEquals(scheduleEntry.getRunStart(), result.getRunStart()); + assertEquals(scheduleEntry.getLastModified(), result.getLastActivity()); + } + private RoutingSpec buildRoutingSpec() throws Exception { RoutingSpec routingSpec = new RoutingSpec(); diff --git a/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/it/RoutingResourcesTestIT.java b/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/it/RoutingResourcesTestIT.java index ae982630..7ffb2d16 100644 --- a/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/it/RoutingResourcesTestIT.java +++ b/opendcs-rest-api/src/test/java/org/opendcs/odcsapi/res/it/RoutingResourcesTestIT.java @@ -1,13 +1,17 @@ package org.opendcs.odcsapi.res.it; import java.sql.Date; -import java.util.Base64; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Properties; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; import io.restassured.filter.log.LogDetail; import io.restassured.filter.session.SessionFilter; +import io.restassured.response.ExtractableResponse; +import io.restassured.response.Response; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -17,40 +21,37 @@ import org.opendcs.odcsapi.beans.ApiRouting; import org.opendcs.odcsapi.beans.ApiScheduleEntry; import org.opendcs.odcsapi.fixtures.DatabaseContextProvider; -import org.opendcs.odcsapi.hydrojson.DbInterface; -import org.opendcs.odcsapi.sec.basicauth.Credentials; +import org.opendcs.odcsapi.fixtures.ResourcesTestBase; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.is; @Tag("integration") @ExtendWith(DatabaseContextProvider.class) -final class RoutingResourcesTestIT +final class RoutingResourcesTestIT extends ResourcesTestBase { - private static String credentialsJson = null; - private static final String AUTH_HEADER_PREFIX = "Basic "; private static SessionFilter sessionFilter; - private static final long ROUTING_ID = 18892151L; - private static final long SCHEDULE_ID = 71829L; + private static Long routingId; + private static Long scheduleId; + private static final ObjectMapper objectMapper = new ObjectMapper(); @BeforeAll static void setUp() { - DbInterface.decodesProperties.setProperty("opendcs.rest.api.authorization.type", "basic"); - Credentials credentials = new Credentials(); - credentials.setUsername("tsdbadm"); - credentials.setPassword("postgres_pass"); - - credentialsJson = Base64.getEncoder() - .encodeToString(String.format("%s:%s", credentials.getUsername(), credentials.getPassword()).getBytes()); - sessionFilter = new SessionFilter(); + } + + @BeforeEach + void setUpEach() throws Exception + { + setUpCreds(); + given() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) + .header("Authorization", authHeader) .filter(sessionFilter) .when() .redirects().follow(true) @@ -61,18 +62,23 @@ static void setUp() .assertThat() .statusCode(is(HttpServletResponse.SC_OK)) ; - } - - @BeforeEach - void setUpEach() throws Exception - { - - ObjectMapper objectMapper = new ObjectMapper(); + ApiRouting apiRouting = new ApiRouting(); - apiRouting.setRoutingId(ROUTING_ID); apiRouting.setName("Test Routing"); apiRouting.setDestinationType("TSDB"); - apiRouting.setLastModified(Date.valueOf("2021-01-01T12:15:34Z")); + apiRouting.setDataSourceName("Test DS"); + apiRouting.setDataSourceId(1L); + apiRouting.setEnableEquations(true); + apiRouting.setOutputFormat("JSON"); + apiRouting.setOutputTZ("UTC"); + apiRouting.setPresGroupName("Test Pres Group"); + apiRouting.setProduction(false); + apiRouting.setDestinationArg("Test Arg"); + apiRouting.setDestinationType("TSDB"); + apiRouting.setLastModified(Date.from(Instant.parse("2021-01-01T12:15:34Z"))); + apiRouting.setRoutingId(1L); + apiRouting.setSince("2021-01-01T12:15:34Z"); + apiRouting.setUntil("2021-01-01T12:15:34Z"); String routingJson = objectMapper.writeValueAsString(apiRouting); @@ -80,8 +86,7 @@ void setUpEach() throws Exception .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("routingid", ROUTING_ID) + .header("Authorization", authHeader) .filter(sessionFilter) .body(routingJson) .when() @@ -94,15 +99,19 @@ void setUpEach() throws Exception .statusCode(is(HttpServletResponse.SC_OK)) ; + routingId = getRoutingId(apiRouting.getName()); + ApiScheduleEntry apiScheduleEntry = new ApiScheduleEntry(); apiScheduleEntry.setRunInterval("60"); + apiScheduleEntry.setName("Test Schedule"); + apiScheduleEntry.setRoutingSpecName("Test Routing"); + apiScheduleEntry.setRoutingSpecId(routingId); apiScheduleEntry.setEnabled(true); apiScheduleEntry.setTimeZone("UTC"); apiScheduleEntry.setAppId(55112L); apiScheduleEntry.setAppName("Test App"); - apiScheduleEntry.setLastModified(Date.valueOf("2021-01-01T12:15:34Z")); - apiScheduleEntry.setRoutingSpecName("Test Routing"); - apiScheduleEntry.setStartTime(Date.valueOf("2021-01-01T12:15:34Z")); + apiScheduleEntry.setLastModified(Date.from(Instant.parse("2021-01-01T12:15:34Z"))); + apiScheduleEntry.setStartTime(Date.from(Instant.parse("2021-01-01T12:15:34Z"))); String scheduleJson = objectMapper.writeValueAsString(apiScheduleEntry); @@ -110,8 +119,7 @@ void setUpEach() throws Exception .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("schedule", SCHEDULE_ID) + .header("Authorization", authHeader) .filter(sessionFilter) .body(scheduleJson) .when() @@ -123,44 +131,46 @@ void setUpEach() throws Exception .assertThat() .statusCode(is(HttpServletResponse.SC_OK)) ; + + scheduleId = getScheduleId(apiScheduleEntry.getAppName()); } @AfterEach void tearDownEach() { - given() - .log().ifValidationFails(LogDetail.ALL, true) - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("routingid", ROUTING_ID) - .filter(sessionFilter) - .when() - .redirects().follow(true) - .redirects().max(3) - .delete("routing") - .then() - .log().ifValidationFails(LogDetail.ALL, true) - .assertThat() - .statusCode(is(HttpServletResponse.SC_OK)) - ; - - given() - .log().ifValidationFails(LogDetail.ALL, true) - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("scheduleid", SCHEDULE_ID) - .filter(sessionFilter) - .when() - .redirects().follow(true) - .redirects().max(3) - .delete("schedule") - .then() - .log().ifValidationFails(LogDetail.ALL, true) - .assertThat() - .statusCode(is(HttpServletResponse.SC_OK)) - ; +// given() +// .log().ifValidationFails(LogDetail.ALL, true) +// .accept(MediaType.APPLICATION_JSON) +// .contentType(MediaType.APPLICATION_JSON) +// .header("Authorization", authHeader) +// .queryParam("routingid", routingId) +// .filter(sessionFilter) +// .when() +// .redirects().follow(true) +// .redirects().max(3) +// .delete("routing") +// .then() +// .log().ifValidationFails(LogDetail.ALL, true) +// .assertThat() +// .statusCode(is(HttpServletResponse.SC_OK)) +// ; +// +// given() +// .log().ifValidationFails(LogDetail.ALL, true) +// .accept(MediaType.APPLICATION_JSON) +// .contentType(MediaType.APPLICATION_JSON) +// .header("Authorization", authHeader) +// .queryParam("scheduleid", scheduleId) +// .filter(sessionFilter) +// .when() +// .redirects().follow(true) +// .redirects().max(3) +// .delete("schedule") +// .then() +// .log().ifValidationFails(LogDetail.ALL, true) +// .assertThat() +// .statusCode(is(HttpServletResponse.SC_OK)) +// ; } @TestTemplate @@ -170,7 +180,7 @@ void testGetRoutingRefs() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) + .header("Authorization", authHeader) .filter(sessionFilter) .when() .redirects().follow(true) @@ -190,8 +200,8 @@ void testGetRouting() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("routingid", ROUTING_ID) + .header("Authorization", authHeader) + .queryParam("routingid", routingId) .filter(sessionFilter) .when() .redirects().follow(true) @@ -207,12 +217,36 @@ void testGetRouting() @TestTemplate void testPostAndDeleteRouting() throws Exception { - ObjectMapper objectMapper = new ObjectMapper(); ApiRouting apiRouting = new ApiRouting(); - apiRouting.setRoutingId(66635L); apiRouting.setName("Test Routing 2"); apiRouting.setDestinationType("TSDB 2"); - apiRouting.setLastModified(Date.valueOf("2021-01-02T12:15:34Z")); + apiRouting.setDataSourceName("Test DS"); + apiRouting.setLastModified(Date.from(Instant.parse("2021-01-02T12:15:34Z"))); + apiRouting.setEnableEquations(true); + apiRouting.setOutputFormat("JSON"); + apiRouting.setOutputTZ("UTC"); + apiRouting.setPresGroupName("Test Pres Group"); + apiRouting.setProduction(false); + apiRouting.setDestinationArg("Test Arg"); + apiRouting.setDestinationType("TSDB"); + apiRouting.setSince("2021-01-01T12:15:34Z"); + apiRouting.setUntil("2021-01-01T12:15:34Z"); + Properties properties = new Properties(); + properties.setProperty("test", "test1"); + apiRouting.setProperties(properties); + ArrayList goesChannels = new ArrayList<>(); + goesChannels.add(1); + goesChannels.add(2); + goesChannels.add(3); + apiRouting.setGoesChannels(goesChannels); + apiRouting.setGoesRandom(true); + ArrayList netlistNames = new ArrayList<>(); + netlistNames.add("Test Netlist 1"); + netlistNames.add("Test Netlist 2"); + netlistNames.add("Test Netlist 3"); + apiRouting.setNetlistNames(netlistNames); + apiRouting.setGoesSelfTimed(false); + apiRouting.setQualityNotifications(true); String routingJson = objectMapper.writeValueAsString(apiRouting); @@ -220,8 +254,7 @@ void testPostAndDeleteRouting() throws Exception .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("routingid", apiRouting.getRoutingId()) + .header("Authorization", authHeader) .filter(sessionFilter) .body(routingJson) .when() @@ -234,12 +267,14 @@ void testPostAndDeleteRouting() throws Exception .statusCode(is(HttpServletResponse.SC_OK)) ; + Long newRoutingId = getRoutingId(apiRouting.getName()); + given() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("routingid", apiRouting.getRoutingId()) + .header("Authorization", authHeader) + .queryParam("routingid", newRoutingId) .filter(sessionFilter) .when() .redirects().follow(true) @@ -259,8 +294,8 @@ void testGetSchedule() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("scheduleid", SCHEDULE_ID) + .header("Authorization", authHeader) + .queryParam("scheduleid", scheduleId) .filter(sessionFilter) .when() .redirects().follow(true) @@ -280,7 +315,7 @@ void testGetRoutingStatus() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) + .header("Authorization", authHeader) .filter(sessionFilter) .when() .redirects().follow(true) @@ -300,8 +335,8 @@ void testGetRoutingExecStatus() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) - .queryParam("scheduleentryid", SCHEDULE_ID) + .header("Authorization", authHeader) + .queryParam("scheduleentryid", scheduleId) .filter(sessionFilter) .when() .redirects().follow(true) @@ -321,7 +356,7 @@ void testGetDACQEvents() .log().ifValidationFails(LogDetail.ALL, true) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) - .header("Authorization", AUTH_HEADER_PREFIX + credentialsJson) + .header("Authorization", authHeader) // TODO: Add query parameter values .queryParam("appid", "1") .queryParam("routingexecid", "1") @@ -338,4 +373,124 @@ void testGetDACQEvents() .statusCode(is(HttpServletResponse.SC_OK)) ; } + + @TestTemplate + void testPostAndDeleteSchedule() throws Exception + { + ApiScheduleEntry apiScheduleEntry = new ApiScheduleEntry(); + apiScheduleEntry.setRunInterval("62"); + apiScheduleEntry.setName("Test Schedule 2"); + apiScheduleEntry.setRoutingSpecName("Test Routing 2"); + apiScheduleEntry.setRoutingSpecId(routingId); + apiScheduleEntry.setEnabled(true); + apiScheduleEntry.setTimeZone("UTC"); + apiScheduleEntry.setAppId(55113L); + apiScheduleEntry.setAppName("Test App 2"); + apiScheduleEntry.setLastModified(Date.from(Instant.parse("2021-02-01T12:15:34Z"))); + apiScheduleEntry.setStartTime(Date.from(Instant.parse("2021-01-02T12:15:34Z"))); + + String scheduleJson = objectMapper.writeValueAsString(apiScheduleEntry); + + given() + .log().ifValidationFails(LogDetail.ALL, true) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", authHeader) + .filter(sessionFilter) + .body(scheduleJson) + .when() + .redirects().follow(true) + .redirects().max(3) + .post("schedule") + .then() + .log().ifValidationFails(LogDetail.ALL, true) + .assertThat() + .statusCode(is(HttpServletResponse.SC_OK)) + ; + + Long newScheduleId = getScheduleId(apiScheduleEntry.getAppName()); + + given() + .log().ifValidationFails(LogDetail.ALL, true) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", authHeader) + .queryParam("scheduleid", newScheduleId) + .filter(sessionFilter) + .body(scheduleJson) + .when() + .redirects().follow(true) + .redirects().max(3) + .delete("schedule") + .then() + .log().ifValidationFails(LogDetail.ALL, true) + .assertThat() + .statusCode(is(HttpServletResponse.SC_OK)) + ; + } + + private Long getRoutingId(String routName) + { + ExtractableResponse response = given() + .log().ifValidationFails(LogDetail.ALL, true) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", authHeader) + .filter(sessionFilter) + .when() + .redirects().follow(true) + .redirects().max(3) + .get("routingrefs") + .then() + .log().ifValidationFails(LogDetail.ALL, true) + .assertThat() + .statusCode(is(HttpServletResponse.SC_OK)) + .extract() + ; + if (response.body().jsonPath().getList("").isEmpty()) + { + return null; + } + + + for (int i = 0; i < response.body().jsonPath().getList("").size(); i++) + { + + if ((response.body().jsonPath().getString("[" + i + "].name")).equalsIgnoreCase(routName)) + { + return response.body().jsonPath().getLong("[" + i + "].routingId"); + } + } + return null; + } + + private Long getScheduleId(String scheduleName) + { + ExtractableResponse response = given() + .log().ifValidationFails(LogDetail.ALL, true) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", authHeader) + .filter(sessionFilter) + .when() + .redirects().follow(true) + .redirects().max(3) + .get("schedulerefs") + .then() + .log().ifValidationFails(LogDetail.ALL, true) + .assertThat() + .statusCode(is(HttpServletResponse.SC_OK)) + .extract() + ; + + for (int i = 0; i < response.body().jsonPath().getList("").size(); i++) + { + + if ((response.body().jsonPath().getString("[" + i + "].name")).equalsIgnoreCase(scheduleName)) + { + return response.body().jsonPath().getLong("[" + i + "].scheduleId"); + } + } + return null; + } }