You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

124 lines
5.2 KiB

package com.inspect.nvr.hik.service;
import com.inspect.nvr.domain.Infrared.NvrInfo;
import com.inspect.nvr.hik.domain.HikNvrCameraTarget;
import com.inspect.nvr.hik.exception.HikNvrPlaybackException;
import com.inspect.nvr.ivs.mapper.IvsCameraMapper;
import com.inspect.nvr.ivs.mapper.IvsNvrMapper;
import com.inspect.nvr.ivs.pojo.IvsCamera;
import com.inspect.nvr.ivs.pojo.IvsNvr;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.http.HttpStatus;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
/**
* 验证页面完整 cameraCode 只会解析到数据库中真实存在的摄像机、NVR 和通道。
*/
@RunWith(MockitoJUnitRunner.class)
public class HikNvrCameraTargetServiceTest {
/** 测试使用的完整 IVS 摄像机编码,最后三位表示通道 2。 */
private static final String CAMERA_CODE =
"22078710632508667002#domain-a";
/** 从测试 cameraCode 去掉末三位通道后得到的所属 NVR 编码。 */
private static final String NVR_CODE =
"22078710632508667#domain-a";
/** 模拟 ivs_camera 精确编码查询。 */
@Mock
private IvsCameraMapper ivsCameraMapper;
/** 模拟 basedata_eqpbook_nvr 设备查询。 */
@Mock
private IvsNvrMapper ivsNvrMapper;
/** 模拟服务端数据库 NVR 凭据解析。 */
@Mock
private HikNvrCredentialService credentialService;
/** 待测试的 cameraCode 解析服务。 */
private HikNvrCameraTargetService service;
/** 创建服务并注入数据库查询替身。 */
@Before
public void setUp() {
service = new HikNvrCameraTargetService();
// 手工注入三个替身,确保测试不会访问真实数据库或设备。
ReflectionTestUtils.setField(service, "ivsCameraMapper", ivsCameraMapper);
ReflectionTestUtils.setField(service, "ivsNvrMapper", ivsNvrMapper);
ReflectionTestUtils.setField(
service, "credentialService", credentialService);
}
/** 完整 cameraCode 应精确解析所属启用 NVR、通道号和服务端凭据。 */
@Test
public void resolvesCameraCodeToDatabaseNvrAndChannel() {
// ivs_camera 必须以完整编码精确命中真实摄像机。
IvsCamera camera = new IvsCamera();
camera.setCode(CAMERA_CODE);
when(ivsCameraMapper.selectByCode(CAMERA_CODE)).thenReturn(camera);
// NVR 编码与 cameraCode 去掉末三位通道后的结果完全一致。
IvsNvr nvr = new IvsNvr();
nvr.setNvrCode(NVR_CODE);
nvr.setNvrIp("192.168.1.249");
nvr.setEnabled(1);
when(ivsNvrMapper.selectAll()).thenReturn(Collections.singletonList(nvr));
// 完整连接参数仍由既有凭据服务从数据库读取,浏览器无法传入密码。
NvrInfo nvrInfo = new NvrInfo();
nvrInfo.setNvrIp("192.168.1.249");
when(credentialService.resolveByIp("192.168.1.249"))
.thenReturn(nvrInfo);
HikNvrCameraTarget target = service.resolve(" " + CAMERA_CODE + " ");
assertEquals(CAMERA_CODE, target.getCameraCode());
assertEquals(Integer.valueOf(2), target.getChannel());
assertSame(nvrInfo, target.getNvrInfo());
verify(ivsCameraMapper).selectByCode(CAMERA_CODE);
verify(credentialService).resolveByIp("192.168.1.249");
}
/** 缺少 cameraCode 时必须在访问数据库前立即返回参数错误。 */
@Test
public void rejectsMissingCameraCodeBeforeDatabaseLookup() {
try {
// 空白输入既不能唯一定位摄像机,也不允许回退到第一台设备。
service.resolve(" ");
fail("Expected HikNvrPlaybackException");
} catch (HikNvrPlaybackException exception) {
assertEquals(HttpStatus.BAD_REQUEST, exception.getStatus());
assertEquals("cameraCode不能为空", exception.getMessage());
}
// 参数结构无效时不应触发摄像机、NVR 或凭据数据库查询。
verifyNoInteractions(
ivsCameraMapper, ivsNvrMapper, credentialService);
}
/** 数据库没有精确 cameraCode 时不得仅凭编码末三位推断设备。 */
@Test
public void rejectsCameraCodeMissingFromIvsCamera() {
// 精确查询无结果,模拟页面提交已经删除或伪造的摄像机编码。
when(ivsCameraMapper.selectByCode(CAMERA_CODE)).thenReturn(null);
try {
service.resolve(CAMERA_CODE);
fail("Expected HikNvrPlaybackException");
} catch (HikNvrPlaybackException exception) {
assertEquals(HttpStatus.NOT_FOUND, exception.getStatus());
}
// 摄像机不存在时不能继续扫描 NVR 或读取任何设备凭据。
verifyNoInteractions(ivsNvrMapper, credentialService);
}
}