package com.battery.business.service; import static org.junit.jupiter.api.Assertions.*; import java.nio.file.*; import java.util.UUID; import com.ruoyi.common.exception.ServiceException; import org.h2.jdbcx.JdbcDataSource; import org.junit.jupiter.api.Test; import org.springframework.jdbc.core.JdbcTemplate; class TodoServiceTest { @Test void onlyOwnerCanReadHandleAndRemoveEvenWhenNamesMatch() throws Exception { var database = new JdbcDataSource(); database.setURL("jdbc:h2:mem:todo_" + UUID.randomUUID() + ";MODE=MySQL;DB_CLOSE_DELAY=-1"); var jdbc = new JdbcTemplate(database); jdbc.execute("CREATE TABLE sys_user(user_id BIGINT, user_name VARCHAR(100), nick_name VARCHAR(100), status CHAR(1), del_flag CHAR(1))"); jdbc.update("INSERT INTO sys_user VALUES(1,'creator','同名','0','0'),(2,'owner','同名','0','0'),(3,'disabled','停用','1','0')"); var ddl = Files.readString(Path.of("src/main/resources/db/migration-final/V20__todo_records.sql")); jdbc.execute(ddl.substring(0, ddl.indexOf("ENGINE=InnoDB"))); var service = new TodoService(database); long id = service.create(" 工作事项 ", 2, 1, "创建人"); assertTrue(service.list(1).isEmpty()); assertEquals("工作事项", service.list(2).get(0).content()); assertEquals(id, service.list(2).get(0).id()); assertEquals(2, service.owners().size()); assertThrows(ServiceException.class, () -> service.create("事项", 3, 1, "创建人")); assertThrows(ServiceException.class, () -> service.handle(id, 1, "管理员或创建人不可越权")); assertThrows(ServiceException.class, () -> service.remove(id, 1)); assertThrows(ServiceException.class, () -> service.handle(id, 2, " ")); service.handle(id, 2, "已完成"); var reopened = new TodoService(database).list(2).get(0); assertEquals("已处理", reopened.status()); assertEquals("已完成", reopened.handleRemark()); assertThrows(ServiceException.class, () -> service.handle(id, 2, "再次处理")); service.remove(id, 2); assertTrue(service.list(2).isEmpty()); } }