Files
JIMRI/java/test/jmri/server/json/signalmast/JsonSignalMastHttpServiceTest.java
T
2026-06-17 14:00:51 +02:00

159 lines
7.7 KiB
Java

package jmri.server.json.signalmast;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.NullNode;
import jmri.InstanceManager;
import jmri.JmriException;
import jmri.SignalHeadManager;
import jmri.SignalMast;
import jmri.SignalMastManager;
import jmri.implementation.VirtualSignalHead;
import jmri.server.json.JSON;
import jmri.server.json.JsonException;
import jmri.server.json.JsonNamedBeanHttpServiceTestBase;
import jmri.server.json.JsonRequest;
import jmri.util.JUnitUtil;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
*
* @author Paul Bender
* @author Randall Wood
* @author Steve Todd
*/
public class JsonSignalMastHttpServiceTest extends JsonNamedBeanHttpServiceTestBase<SignalMast, JsonSignalMastHttpService>{
@Test
@Override
public void testDoGet() throws JmriException, JsonException {
// create a signalmast for testing
String sysName = "IF$shsm:basic:one-searchlight:IH2";
String userName = "SM2";
InstanceManager.getDefault(SignalHeadManager.class).register(new VirtualSignalHead("IH2"));
SignalMast s = InstanceManager.getDefault(SignalMastManager.class).provideSignalMast(sysName);
s.setUserName(userName);
JsonNode result;
// retrieve by systemname
result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42));
validate(result);
assertEquals(JsonSignalMast.SIGNAL_MAST, result.path(JSON.TYPE).asText());
assertEquals(sysName, result.path(JSON.DATA).path(JSON.NAME).asText());
// verify initial aspect/state is "Unknown"
assertEquals(JSON.ASPECT_UNKNOWN, result.path(JSON.DATA).path(JSON.STATE).asText());
// retrieve by username
result = service.doGet(JsonSignalMast.SIGNAL_MAST, userName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42));
validate(result);
assertEquals(JsonSignalMast.SIGNAL_MAST, result.path(JSON.TYPE).asText());
assertEquals(sysName, result.path(JSON.DATA).path(JSON.NAME).asText());
// change to Clear, then verify change
s.setAspect("Clear");
result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42));
assertEquals("Clear", result.path(JSON.DATA).path(JSON.STATE).asText());
assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText());
// change to Held, then verify change
s.setHeld(true);
result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42));
assertEquals(JSON.ASPECT_HELD, result.path(JSON.DATA).path(JSON.STATE).asText());
assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText());
// change to Dark, then verify change
s.setHeld(false);
s.setLit(false);
result = service.doGet(JsonSignalMast.SIGNAL_MAST, sysName, NullNode.getInstance(), new JsonRequest(locale, JSON.V5, JSON.GET, 42));
assertEquals(JSON.ASPECT_DARK, result.path(JSON.DATA).path(JSON.STATE).asText());
assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText());
}
@Test
public void testDoPost() throws JmriException, JsonException {
// create a signalmast for testing
String sysName = "IF$shsm:basic:one-searchlight:IH2";
String userName = "SM2";
InstanceManager.getDefault(SignalHeadManager.class).register(new VirtualSignalHead("IH2"));
SignalMast s = InstanceManager.getDefault(SignalMastManager.class).provideSignalMast(sysName);
assertNotNull(s);
s.setUserName(userName);
JsonNode result;
JsonNode message;
// set signalmast to Clear and verify change
message = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, "Clear");
result = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42));
validate(result);
assertEquals("Clear", s.getAspect());
assertEquals("Clear", result.path(JSON.DATA).path(JSON.STATE).asText());
assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText());
// try to set to UNKNOWN, which should not be allowed, so state should not change
JsonException ex = assertThrows( JsonException.class, () -> {
JsonNode messageEx = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, JSON.ASPECT_UNKNOWN);
JsonNode resultEx = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, messageEx, new JsonRequest(locale, JSON.V5, JSON.GET, 42));
assertNotNull(resultEx);
});
assertEquals( 400, ex.getCode(), "Error code is HTTP 400");
assertEquals( "Attempting to set object type signalMast to unknown state Unknown.",
ex.getMessage(), "Error message");
// set to HELD and verify change
message = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, JSON.ASPECT_HELD);
result = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42));
validate(result);
assertTrue( s.getHeld(), "Signalmast is held");
assertEquals("Clear", s.getAspect());
assertEquals(JSON.ASPECT_HELD, result.path(JSON.DATA).path(JSON.STATE).asText());
assertEquals("Clear", result.path(JSON.DATA).path(JSON.ASPECT).asText());
// set to STOP and verify change
message = mapper.createObjectNode().put(JSON.NAME, sysName).put(JSON.STATE, "Stop");
result = service.doPost(JsonSignalMast.SIGNAL_MAST, sysName, message, new JsonRequest(locale, JSON.V5, JSON.GET, 42));
validate(result);
assertFalse( s.getHeld(), "Signalmast is not held");
assertEquals("Stop", s.getAspect());
assertEquals("Stop", result.path(JSON.DATA).path(JSON.STATE).asText());
assertEquals("Stop", result.path(JSON.DATA).path(JSON.ASPECT).asText());
}
@Test
public void testDoGetList() throws JsonException {
SignalHeadManager headManager = InstanceManager.getDefault(SignalHeadManager.class);
SignalMastManager mastManager = InstanceManager.getDefault(SignalMastManager.class);
JsonNode result;
result = service.doGetList(JsonSignalMast.SIGNAL_MAST, mapper.createObjectNode(), new JsonRequest(locale, JSON.V5, JSON.GET, 0));
validate(result);
assertEquals(0, result.size());
headManager.register(new VirtualSignalHead("IH1"));
mastManager.provideSignalMast("IF$shsm:basic:one-searchlight:IH1");
headManager.register(new VirtualSignalHead("IH2"));
mastManager.provideSignalMast("IF$shsm:basic:one-searchlight:IH2");
result = service.doGetList(JsonSignalMast.SIGNAL_MAST, mapper.createObjectNode(), new JsonRequest(locale, JSON.V5, JSON.GET, 0));
validate(result);
assertEquals(2, result.size());
}
@BeforeEach
@Override
public void setUp() throws Exception {
super.setUp();
service = new JsonSignalMastHttpService(mapper);
JUnitUtil.initInternalSignalHeadManager();
JUnitUtil.initDefaultSignalMastManager();
JUnitUtil.initSignalMastLogicManager();
}
@AfterEach
@Override
public void tearDown() throws Exception {
super.tearDown();
}
}